Skip to content

v4.4.1

Choose a tag to compare

@github-actions github-actions released this 27 Jul 23:59
66ff750

What's Changed

Critical Fixes

  • Fence extraction now parses correctly: The closing-fence pattern was unanchored, causing the first triple-backtick inside a JSON body to end the match. This truncated reviews of markdown across three of four seats on a paid council, losing 15 of 17 findings. The extractor now enumerates every fenced opener independently and lets JSON.parse arbitrate, with the last valid parse winning.

  • Council runs no longer race for OpenCode's database: Previous versions spawned 10+ OpenCode servers per run, causing concurrent database lock failures. A run now acquires one shared server for all stages, falling back to per-wave servers only if the shared acquisition fails. Lock-class failures retry up to 3 times over 750ms, eliminating the coin-flip behavior that made --critic unreliable.

  • Repair path now carries the artifact being repaired: Judge, chair, defense and re-vote repair prompts omitted the text they were asked to fix, forcing models to correct something they had never seen. All repair calls now embed the original artifact verbatim, tracked across attempts so errors and context always describe the same generation.

Behavior Changes

  • Empty findings are now valid: A review with zero findings but a non-empty overall statement now passes validation. This removes the structural pressure that forced models to invent findings, contradicting the shipped anti-sycophancy clause. An all-clean bench degrades gracefully, with judges and chairs stating the empty index rather than rendering headings over nothing.

  • Tool-settle grace ceiling now aborts OpenCode sessions: Legs exceeding the ceiling previously completed but left their sessions running and billing for unread output. Sessions are now aborted after child-session walk (preserving cost attribution) and before server close, with toolSettleAborted recorded as true or false to signal success or failure.

  • Inexact totals under a cost ceiling now exit with code 2: A fully-unpriced council under --max-cost previously exited 0 despite being unable to enforce the ceiling. Runs with inexact totals now exit 2 when a ceiling is set, matching the degraded path used for budget refusals. The ceiling still only bounds known spend and never blocks a run.

Correctness Improvements

  • Cache-only legs report unknown cost instead of false zero: Observations with only cache tokens (no input/output tokens) previously resolved to estimated $0.0000, the exact false zero the release exists to eliminate. They now correctly report as unknown.

  • Failed legs no longer show green checks: Seats that errored or timed out could display completion indicators because timed-out was missing from terminal-state lists. The terminal-state handling is now symmetric, with failed legs writing terminal progress records instead of leaving stale ones.

  • Permission failures no longer masquerade as missing: Unreadable run artifacts were indistinguishable from ones the run had not produced, causing silent chairless folds reporting {ok: true}. Readers now surface the actual permission error instead of silently succeeding.

  • Stage-1 waves that die before launching now degrade loudly: Waves failing before their legs started wrote no wave.json, making failure indistinguishable from "not reported yet". Such waves now degrade the run loudly with a clear error.

  • Spend ledger now matches council run output: amicus spend was reporting exact totals that council run called inexact, due to unattributable subtree rows being priced instead of flagged. Rows are now marked as unattributedSubtreeRows alongside unpricedRows, and the unknown-spend notice re-announces on a growing count instead of sticking after the first occurrence.

Workspace & UI

  • Markdown renderer robustness improved: The workspace renderer no longer re-slices input on every inline token, eliminating a V8 string-representation dependency. Heading text is trimmed to remove trailing blanks, and an unreachable heading-level clamp is removed with a guard ensuring future widening fails loudly.

  • Workspace read-only invariant is now enforced: The workspace's promise never to write into run directories is now verified by AST parsing rather than assertion, checking that no write API appears in the code and that the registered IPC channel set is exactly the seven known channels.

  • Workspace markdown renderer certified by paid council: The component responsible for converting another model's prose into DOM was previously uncertified. A paid council reviewed it and found no exploitable DOM injection or prototype pollution, with certification recorded and adversarial coverage pinned.

Documentation & Installation

  • Documentation now ships with npm installs: The package previously excluded docs/ entirely, making troubleshooting text unreachable when users need it most. The 15 top-level docs/*.md files now ship with npm i -g amicus, though larger assets like images remain unshipped for size efficiency.

  • Haiku alias diagnosis corrected: The hard-404 failures were attributed to a bad model ID, but the real cause is a missing /v1 suffix in ANTHROPIC_BASE_URL. Documented correctly as an environment misconfiguration rather than a broken alias.

  • Cost cliff terminology clarified: Documentation now correctly states that --max-cost bounds known spend only, and cost source glyphs no longer redundantly repeat "estimated" or "unknown" in adjacent text.

Tooling & Environment

  • Electron/workspace-ui linting enabled with pragmatic scope: The workspace UI now runs under the lint gate with ESLint config added for browser environment. 265 errors were resolved; 159 var declarations are deferred to a post-release rewrite since the renderer ships raw under CSP with no build step.

  • Line endings normalized repo-wide: All text files now normalize to LF in both object database and working tree, fixing an issue where core.autocrlf caused lint-staged to fail on stashed files. Executable shebangs remain unbroken across platforms by using eol=lf universally.

  • Integration suite timer cleared: The live rail integration test no longer leaks SIGKILL escalation timers, allowing the CDP suite to properly release the event loop.

Testing

  • Live test suite now passes end to end: The free-local $0 path and the full end-to-end flow are now verified, clearing the live rail green.

  • Fixture path resolution corrected: Fence test fixtures now resolve paths correctly so SEC-3's assertion sees one breach instead of two.

Full Changelog: v4.4.0...v4.4.1