0.8.0 - 2026-09-23
Release Notes
Agent-harness + runtime release (36 commits since 0.7.0): repo intelligence, risk-gated Critic pipeline, provenance/KB/history/structural index, agent runtime rework with sessions/checkpoints/resume, converged store + project skills, unified run budget, TUI performance/search/input hardening, five ready gateways, reliability/honesty fixes, and CI/visual gate repairs. Claims below are backed by tests, mock-LLM e2e, or the VHS visual gate unless noted as docs/launch material.
Added
- Repository intelligence (
[repo_intel],niki inspect [--json]): deterministicRepoManifest(languages, entry points, tests, build files, vendor exclusion, risk cues). Fail-soft; indexing can no longer abort a run unlesson_failure = "fail". - Run provenance (
[snapshot],manifest.jsonper task,niki status [id] --with-provenance): repo HEAD/branch/remote, config content hash, toolchain versions, result branch + costs. - Project KB (
niki architecture build,.niki/kb/): snapshot-stamped Markdown + provenance-wrapped JSON sidecars, rebuilt from scratch. - History miner (
.niki/history/, cache-as-truth with rewrite detection): keyword-classified commit learnings rebuilt from cache every run. - Structural index (
niki index build|query,.niki/kb/structural_index/): content-addressed per-file units, AST→regex→coverage backend ladder (tree-sitter behind the default-onastCargo feature;--no-default-featureskeeps the regex baseline). Advisory only — grep stays authoritative. - Bounded Planner context (
[general] max_context_chars, default 48000): manifest + KB + symbol excerpts + learnings, priority-ordered with an explicit truncation marker. - Risk-based pipeline (
[risk],[critic]): deterministic TaskSpec classifier (low/normal/high/security) injects the Critic after the Reviewer on Normal+ and forces a SecurityAuditor on High/Security. Explicit[pipeline].stagestopologies are never rewritten. - Critic stage: narrow verdict-grounding checker (
prompts/critic.md,schemas/critique.schema.json); a Reject forces exactly one Reviewer retry, then a closing judgment. Recorded, never a gate of its own. - Post-run reflection (
src/orchestrator/reflect.rs):verification_failure,review_correction, andsecurity_fixlearnings into.niki/learnings.jsonl, flowing back to the Planner via the KB. - Reviewer test-evidence gate: failures/skips (or zero executed tests) on
business-logic tests must yield
revision_needed, neverapproved. - Agent runtime rework (
src/runtime/):AgentSession/AgentTurn/AgentStepexecution loop, bounded priority-sortedContextStorewith compaction, typedAgentEventstream,ToolPolicy+ tool registry split (tools.rs), cancellation tokens, and session checkpoints under.niki/sessions/. niki resume <session-id>: resume an interrupted agent session from a checkpoint (role/turn/step, artifacts, context fragments, active branch).niki skills(list|candidates|promote|retire|show|diff): two-step distillation — Approved green run stages a candidate, human promotes to a versioned skill (SKILL.md+metadata.json+skills-lock.json). Nothing auto-activates; stale source snapshots are flagged, never served as fresh. Served viaskill_list/skill_loadalongside~/.agents/skills/.- Converged store (
src/store/, ADR-002): rebuildable hybrid index over learnings + role/user memory + run records — keyword (0.45) + trigram vector cosine (0.35) + recency (0.10) + authority (0.10). File-backed, zero new deps; index size honors[repo_intel] disk_budget_mb; deleting<output_dir>/store/is always safe (live-scan fallback). - Unified run hysteresis budget (
[budget]/RunBudget): one step/cost/wallclock ceiling across retries, repairs, revisions, tool-loop steps, and goal iterations. Exhaustion → typedBudgetExhaustedrecorded intask.json. CLI overrides:niki run --max-steps --max-usd --max-wallclock-secs.max_usdfalls back tospend_cap_usdwhen unset. - Optional executable tool loop (
[tools] experimental_tool_loop, default off): one bounded research step throughrun_tool_loopbefore the Planner; inherits[permissions] mode(Ask tools fail closed headless). - MCP end-to-end path:
from_configloads[[mcp.servers]]+ governance; live connections retained forcall_tool;annotations.readOnlyHint→read_only(unmarked tools denied under default read-only governance); domain allowlist applies to web-fetch-shaped tools. - Failover structured-output routing:
FailoverProvidernow propagatessupports_structured_outputand routesrequest_structuredthrough the chain (structured output no longer silently degrades on failover). - Hook timeouts:
[hooks] timeout_seconds(default 30); overlong hooks are killed and treated as Noop with a warning (0 = wait forever). - TUI (goal c81d04): central keybinding table with
[ui.keybindings]overrides + conflict report; transcript search (Ctrl+F); fuzzy@filesranking with Tab apply; sharedScrollState(fixes stuck auto-scroll, wires tool-detail modal);NIKI_TUI_DEBUGper-frame log; headlesstests/tui_perf.rsrender budgets; stage-markdown + processed-diff memos; fleet refresh throttle (500ms); mouse motion/SGR always-on with Ctrl+E toggle; width-aware markdown tables; OSC-8 hyperlinks gated by terminal caps /NIKI_HYPERLINKS. Optional[ui],[ui.tips],[ui.transcript]tables. - Providers / onboarding: five ready gateways — Ollama first-class
keyless (wizard option 0, live
/api/tagsprobe, auth/doctor reachability) plus Zen / Kimi / Kilo (OpenAI-compatible, named constructors,OPENCODE/KIMI/KILO_API_KEYenv wiring); single-pick init wizard that rewrites all four[agents.*]provider lines and preselects an installed Ollama model; headlesschat --messageplain-text reply (was silent TUI teardown). niki smoke --backend: local smoke path selectable without a container runtime (Path A quick-start: Ollama + worktree, no key/container).- Cinematic README demo: deterministic frame-rendered 80s TUI walkthrough
(
scripts/render_demo_cinematic.py); themesand()fixed to warm SAND_500 (was cyan),theme::cyan()for INFO_BLUE. - Launch material: PH kit (
docs/launch/checklist, maker first-comment, gallery), social assets (assets/social/ph-thumbnail.png,ph-gallery-run.gif), launch playbook (plans/noctty-launch-playbook.md) with trust-boundary-aligned copy; TUI extraction plan status (docs/tui/pi-extraction-plan.md). - Eval grades: four seeded defect cases graded (100% maintainer agreement).
- CI gates: MSRV (1.85) +
--no-default-featuresjobs; clippy-D warnings; artifact-contract + run-lifecycle tests required before the full suite;STATE_LAYOUT.mdfile contract; agent-harness plan docs (plans/niki-agent-harness-plan.md, ADRs 001/002).
Fixed
- Hooks: payload write ignores EPIPE so a fast hook that exits without reading stdin can no longer mask Block as Noop/Allow (exit-code interpretation always runs); 100× stress regression test.
[general] max_diff_linesfromniki.tomlis now honored (it was parsed but never merged into the active config).- TUI: multi-byte cursor panics/caret corruption (char-boundary clamp +
byte↔char click mapping); 1-column click offset; fleet refresh no longer
block_ons Tokio locks every frame; long-transcript auto-scroll stuck at top (write-onlyauto_scroll/ bottom-anchored selection math); tool detail modal state existed but never painted; permission-modal option rows off-by-2+ and clipped (content-driven height); command-menu hit-test drift vs filtered count; byte-slice panics on tool cards, stage error headers, and chat input echo; long commands truncated to modal width. - Empty-diff runs no longer leave HEAD on an empty
niki/<id>branch; worktree teardown no longer leaksgit fatal()noise to stderr. - Version/logo strings use
CARGO_PKG_VERSION(showed stalev0.4.0). providers check: all OpenAI-compatible slugs use named constructors (groq/together/deepepseek previously reportedOPENAI_API_KEY); Ollama health check resolves an installed model (was permanent 400 + empty model).- Init wizard rewrites all four
[agents.*]provider lines to the picked provider (template Anthropic defaults no longer survive and break fresh machines); Ollama pick preselects an installed coding model (was hardcodedqwen2.5-coder, which 404s when only tagged variants exist). - Solo coder gets one bounded repair attempt on patch-apply failure
(exact error + verbatim-SEARCH rules; same spend-cap/hooks/metrics
accounting as the first attempt);
code_diffsearch/replace schema bans regex/anchors/paraphrase (propagates to all coder prompts). - Artifacts writer keeps every attempt (
coder.json,coder-2.json, …) instead of overwriting — failed attempts stay inspectable. - Failover no longer reports
supports_structured_output = false(trait default); structured output routed through the chain with circuit breakers. - VHS/visual CI: onboarding tapes force the modal via
NIKI_FORCE_ONBOARDING(CI auto-suppress broke references); ttyd + ffmpeg installed for tape rendering; render engine tests headless (TestBackend— no TTY on runners). - Release/CI plumbing: package manifests (Homebrew/Scoop/Winget) pinned to
v0.7.0 with real sha256 (v0.4.0 Windows zip never existed / 404);
artifact actions aligned to v7 (v8 tag does not exist);
cargo distallow-dirtyfor hand-maintained artifact pins;@nikireview workflowneeds-keysgate moved off job-levelif:(workflow failed to load);auditjob restored after being swallowed into a comment; VHS/pillow install order fixed for runners. - Mock-pipeline e2e (kb_pipeline / critic path) drops the
nodejsbinary alias from the sandbox tool check (CI hasnodeonly).
Changed
- README / trust copy: sequential stages intentionally share one execution
sandbox so the diff persists Coder → Tester → Reviewer; independence is
at the LLM-session layer. Committed branches are never repointed or
rewritten; the host working tree receives the finished diff for review.
readonly_rootfsdocumented as optional and off by default; sandbox claim narrowed to CapDrop ALL + network disabled + optional read-only rootfs. extra_packagesclarified: despite the name, nothing is installed — entries extend the startupcommand -vchecklist against the pre-baked image.network_allowlisthonesty: per-domain filtering is NOT implemented — container egress is all-or-nothing; only"*"opens egress; a non-empty domain list warns at startup and behaves as block-all.- Init wizard rewritten as a single-pick menu (was 11 sequential prompts).
- Config examples:
[ui]tips/transcript nested tables;[compaction]default threshold 80% +auto_compact; pipeline topology values lowercased (auto/multiagent/singleagent). - Launch copy aligned with trust boundaries (
docs/launch-audit.md, first-comment).
Security
- Deny-list always wins over overlapping allow entries (coder
rmstill cannotrm -rf /;git diffallow no longer bypasses agitdeny). - Diffs scoped to agent-produced changes: pre-existing dirty/untracked
host files stay out of
changes.patchand the commit; new agent files appear via scoped intent-to-add (both backends); edit-format application is all-or-nothing per stage. - Same-task worktree collision fails loudly instead of deleting a concurrent run’s directory; Drop/panic paths still tear down worktrees and containers (best-effort); stale prune never removes a live worktree.
- Failed runs create no
niki/*branch and leavetask.jsonFailed with the error; conflict markers abort branch creation instead of committing. - MCP: unmarked tools denied under default read-only governance (deny-by- default, never assumed safe); web-fetch tools gated by domain allowlist; untrusted servers error instead of connecting implicitly.
- Hooks timeout kills overlong processes so a hung hook cannot stall or mask a Block decision forever.
Install niki 0.8.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/RavaniRoshan/niki/releases/download/v0.8.0/niki-installer.sh | sh
Install prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/RavaniRoshan/niki/releases/download/v0.8.0/niki-installer.ps1 | iex"
Download niki 0.8.0
| File | Platform | Checksum |
|---|---|---|
| niki-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| niki-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| niki-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| niki-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| niki-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |