amicus 4.5.4 → 4.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +113 -0
  3. package/README.md +1 -1
  4. package/commands/council.md +1 -1
  5. package/docs/DISTRIBUTION.md +38 -11
  6. package/docs/ROADMAP.md +40 -8
  7. package/docs/publishing.md +1 -1
  8. package/docs/usage.md +1 -1
  9. package/package.json +3 -2
  10. package/schemas/council-run.schema.json +20 -0
  11. package/schemas/council-verdict.schema.json +20 -0
  12. package/schemas/doctor.schema.json +23 -1
  13. package/skills/second-opinion/MODEL-NOTES.md +182 -35
  14. package/src/cli-council-run-render.js +51 -0
  15. package/src/cli-handlers-council-run.js +45 -44
  16. package/src/cli-handlers-council.js +9 -3
  17. package/src/cli-handlers-doctor.js +16 -37
  18. package/src/cli-handlers-watch.js +1 -1
  19. package/src/cli.js +1 -1
  20. package/src/council/ledger.js +5 -1
  21. package/src/council/report-html.js +16 -1
  22. package/src/council/report.js +25 -1
  23. package/src/council/run-assemble.js +25 -7
  24. package/src/council/run-budget.js +14 -8
  25. package/src/council/run-chair.js +21 -4
  26. package/src/council/run-debate-stage.js +115 -0
  27. package/src/council/run-degrade.js +44 -0
  28. package/src/council/run-finalize.js +18 -3
  29. package/src/council/run-launch.js +4 -0
  30. package/src/council/run-retry-notes.js +74 -0
  31. package/src/council/run-retry.js +280 -0
  32. package/src/council/run-server.js +24 -7
  33. package/src/council/run-stage2.js +10 -2
  34. package/src/council/run-stages.js +59 -27
  35. package/src/council/run.js +39 -67
  36. package/src/council/verdict.js +81 -8
  37. package/src/mcp-council-bench.js +45 -0
  38. package/src/mcp-council-run.js +11 -28
  39. package/src/mcp-server.js +22 -3
  40. package/src/mcp-tools.js +13 -1
  41. package/src/utils/degrade.js +69 -0
  42. package/src/utils/doctor-degrade.js +51 -0
  43. package/src/utils/doctor-electron-mcp-check.js +64 -5
  44. package/src/utils/doctor-engine-check.js +14 -3
  45. package/src/utils/doctor-mcp-checks.js +10 -3
  46. package/src/utils/known-flags.js +2 -1
  47. package/src/utils/remediation-hints.js +20 -14
  48. package/src/utils/result-schema.js +6 -2
  49. package/src/utils/session-index-tmp-sweep.js +2 -1
  50. package/src/utils/update-notice.js +171 -0
  51. package/src/workspace/run-scan.js +5 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "4.5.4",
3
+ "version": "4.6.1",
4
4
  "description": "Multi-model LLM Council + parallel AI window for Claude Code. Run structured council reviews across Gemini, GPT, DeepSeek and more — or fork a conversation to any model and fold the results back.",
5
5
  "author": {
6
6
  "name": "Christian Wagner"
package/CHANGELOG.md CHANGED
@@ -3,6 +3,119 @@
3
3
  All notable changes to Amicus are documented here. Format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow semver.
5
5
 
6
+ ## [Unreleased]
7
+
8
+ ## [4.6.1] - 2026-08-03
9
+
10
+ ### Added
11
+
12
+ - **The MCP channel finally hears about new versions** (spec 2026-08-03). The MCP server now
13
+ runs the update check at startup and appends one flavor-aware notice block to the first
14
+ successful tool result of each server process (once per session, latched); `amicus_guide`
15
+ carries an always-on update line, and one `[amicus] update available` line lands in the
16
+ client's MCP log on stderr. The instruction is chosen config-first (`npx -y amicus@latest`
17
+ registrations are told a restart suffices; cached/pinned npx copies get the re-point-or-
18
+ clear-cache hint in the unverified voice; global installs get `npm install -g amicus`, from
19
+ where #33's stale-version warning takes over). Words only — no auto-update over MCP, no
20
+ periodic re-check; `NO_UPDATE_NOTIFIER=1` still disables the check entirely.
21
+ - **A lost Stage-1 seat gets one more chance (SL-2).** A council sub-wave that dies before
22
+ its legs exist, or a leg that ends with no usable output, is relaunched exactly once —
23
+ serially, after the surviving launches settle. Recovery announces in the one voice
24
+ (`Recovered: seat X reviewed on retry — …`, a `stage1-retry` heal on
25
+ `run.json`/`verdict.json` `degrades[]`) and the run stays exit 0; a seat still dead after
26
+ its retry degrades exactly as before, with both attempts named in the why. Unconditional;
27
+ gated on the run's `--max-cost` position (an over-budget run skips the retry and records
28
+ the loss byte-identically to v4.6.0). Retry legs and their spend-ledger rows carry
29
+ `retryOfWaveId`. A healed critic counts as seated in `verdict.seatLoss`.
30
+
31
+ ### Changed
32
+
33
+ - **The shipped second-opinion MODEL-NOTES seed was corrected and enriched** (owner-ruled
34
+ fold-back, PR #93): the haiku "hard-404" warning re-caused to the `ANTHROPIC_BASE_URL` `/v1`
35
+ convention split, GLM's stale reliability caution withdrawn on the v4.4.1 fence-extractor
36
+ replay evidence, pre-degrade-era claims re-grounded in the current announce/retry contract,
37
+ and three model sections plus the "peer consensus ≠ evidence on published numbers" rule added
38
+ from the field.
39
+
40
+ ### Removed
41
+
42
+ - **The unused `rebuildElectron` remediation hint** (owner ruling 2026-08-03, closing Plan 3's
43
+ queued hint-voice question). It had no live call site — `doctor --fix`, the in-place Electron
44
+ self-heal, is its stated convergence target — and its prose asserted unverified causes ("after
45
+ an ABI mismatch or partial unpack"). Absence-pinned in `tests/remediation-hints.test.js`; a
46
+ reintroduction must adopt the unverified-cause voice. The same ruling keeps
47
+ `sweepSessionIndexTmp`'s confident voice: its cause is definitional (an atomic-write tmp orphan
48
+ has no other producer), not a guess.
49
+
50
+ ## [4.6.0] - 2026-08-02
51
+
52
+ ### Added (v4.6 milestone — the degrade announcement invariant, plans 1-4)
53
+
54
+ - **The ten-channel degrade announcement contract.** A council run can no longer degrade its
55
+ exit code without announcing what was lost: every loss routes through one sink
56
+ (`src/council/run-degrade.js`, the only code allowed to flip `degraded.value` — enforced by a
57
+ source-scan invariant test) and lands with mandatory *what/why/effect* on stderr,
58
+ `run.json.degrades[]`, `verdict.json.degrades[]`, and the report's new **"What was lost"**
59
+ section, all rendered in one voice.
60
+ - **`verdict.seatLoss` is now derived from the degrade records** (closes #84) — a dead critic
61
+ *leg* finally flips `criticSeated`, and `seatLoss` can no longer disagree with `degrades[]`.
62
+ The v4.5.2 seatLoss shape is unchanged (its tests passed byte-unedited).
63
+ - **Stage-2 judge legs get `runStats` rows** (closes #83) — per-leg cost attribution for ~38%
64
+ of a run's spend that had none, judge-tagged in the report's cost table.
65
+ - **`doctor` speaks the same language**: `doctor --json` gains additive `degrades[]`;
66
+ `doctor --fix` prints `Recovered:` lines for every repair; the engine hints state causes as
67
+ **unverified** instead of asserting an antivirus guess.
68
+ - **The Workspace is discoverable from the CLI**: `watch` usage names `--ui` (closes #80), and
69
+ a CLI council run with Electron present prints how to open the live Workspace (closes #81 —
70
+ the silence half; auto-open parity remains a product decision).
71
+
72
+ ### Changed (v4.6 — deliberate behavior changes)
73
+
74
+ - **A dropped preset member now degrades the run to exit 2 on every transport** (was: exit 0
75
+ with a `--json`-blind stderr notice). The loss is announced per-member with its reason.
76
+ - **A shared-server acquisition failure now exits degraded (2)** (was: stderr + run.json only,
77
+ exit 0) — the per-wave fallback is the racy configuration and the run says so.
78
+ - **Reported cost totals rise** for identical runs versus v4.5.x: judge legs now appear in
79
+ `runStats`. Consumers keying `runStats` by model must exclude `role: 'judge'` (as the
80
+ ledger's reliability join now does).
81
+ - In-run degrade notices hedge the exit-code claim truthfully ("will exit degraded (2)");
82
+ `engineMissing`/`reinstallEngineAv` hint prose changed to the unverified voice (commands
83
+ byte-identical).
84
+
85
+ ### Fixed (v4.6)
86
+
87
+ - **A dead Stage-1 leg was announced on no surface at all** (closes #85) — the only trace was
88
+ its absence from the stage entry's `taskIds`. Now named everywhere, with a regression pin.
89
+ - **The Stage-5 verdict rebuild silently destroyed `seatLoss`/`degrades[]`** (closes #87) —
90
+ `tally.json` carries neither, so the decisions flow dropped both; now preserved from the run
91
+ folder's verdict the same way the chair's synthesis already was, on both CLI and MCP.
92
+ - **`watch --ui` against an `--out-dir` run failed with a symptom, not a cause** (closes #82) —
93
+ the error now names the launch-directory pointer and the working invocation.
94
+
95
+ ### Fixed
96
+
97
+ - **`/amicus:council` lost all of its frontmatter at load time.** `commands/council.md`'s
98
+ `argument-hint` value began with `[material, path, or URL] [...]`, which YAML reads as a flow
99
+ sequence followed by a second, unexpected `[` — the whole block failed to parse, so the command
100
+ loaded with empty metadata: no description, no argument hint, and `disable-model-invocation:
101
+ true` silently dropped (the command was model-invocable, the opposite of the intent). The value
102
+ is now single-quoted. Present since `3900429` (Phase 9a, 2026-07-02); `claude plugin validate
103
+ .claude-plugin/plugin.json` failed on it, non-strict, that entire time.
104
+ - **The preflight that should have caught it was validating the wrong file.** With `.claude-plugin/`
105
+ holding both manifests, `claude plugin validate .` resolves the *marketplace* manifest and
106
+ reports `✔ Validation passed` without ever inspecting the plugin. `docs/DISTRIBUTION.md` §2 now
107
+ documents the path trap, prescribes `claude plugin validate .claude-plugin/plugin.json`, and
108
+ records why `--strict` is expected to fail here (the deliberately retained root-`CLAUDE.md`
109
+ warning).
110
+
111
+ ### Changed
112
+
113
+ - **`tests/plugin-commands.test.js` now YAML-parses frontmatter** for `commands/council.md` and
114
+ both skills, asserting `description`, `argument-hint` (as a *string*), and
115
+ `disable-model-invocation: true` survive parsing. The previous
116
+ `expect(md).toContain('argument-hint:')` substring checks passed happily against a file that
117
+ could not parse. `yaml` added as a devDependency for this.
118
+
6
119
  ## [4.5.4] - 2026-08-01
7
120
 
8
121
  ### Fixed
package/README.md CHANGED
@@ -441,7 +441,7 @@ $ amicus status demo123 --json
441
441
  "taskId": "demo123",
442
442
  "status": "complete",
443
443
  "elapsed": "5m 0s",
444
- "version": "4.5.4",
444
+ "version": "4.6.1",
445
445
  "model": "google/gemini-2.5-flash",
446
446
  "phase": "terminal"
447
447
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Run a structured multi-model LLM council review of the given material — wraps the second-opinion skill (independent reviews → anonymous cross-review → non-Claude chair verdict → accept/deny decisions).
3
- argument-hint: [material, path, or URL] [analysis request + criteria] [optional elements — e.g. "with a critic seat", "debate mode", "expert lenses", "chair verdict scale"]
3
+ argument-hint: '[material, path, or URL] [analysis request + criteria] [optional elements — e.g. "with a critic seat", "debate mode", "expert lenses", "chair verdict scale"]'
4
4
  disable-model-invocation: true
5
5
  ---
6
6
 
@@ -50,17 +50,36 @@ users only see a version bump when we bump it, not on every commit. Treat
50
50
  ### Preflight (run before every submission or major post-listing update)
51
51
 
52
52
  ```bash
53
- claude plugin validate . --strict
53
+ claude plugin validate .claude-plugin/plugin.json # the PLUGIN check — see the path trap below
54
+ claude plugin validate . # the marketplace manifest (separate check)
54
55
  claude --plugin-dir . # smoke: /amicus:council, /amicus:sidecar, /amicus:second-opinion, MCP tools
55
56
  npm test
56
57
  ```
57
58
 
58
- - `claude plugin validate . --strict` is the same structural check the
59
- review pipeline runs; `--strict` promotes unrecognized-field warnings to
60
- errors so nothing slips through that CI would later flag. It needs the
61
- Claude Code CLI installed locally it is **not** wired into this repo's
62
- CI (runners have no `claude` auth), so `tests/plugin-manifest.test.js` is
63
- the CI-side proxy for manifest completeness.
59
+ - **Path trap — `claude plugin validate .` does NOT validate the plugin.**
60
+ This repo's `.claude-plugin/` holds *both* `marketplace.json` and
61
+ `plugin.json`; given `.`, the CLI resolves the marketplace manifest, prints
62
+ `Validating marketplace manifest:` / `✔ Validation passed`, and never looks
63
+ at the plugin, its commands, or its skills. Always pass
64
+ `.claude-plugin/plugin.json` explicitly for the plugin check — that is the
65
+ surface the review pipeline evaluates. (This masked a real defect for a
66
+ month: `commands/council.md` shipped an unparseable `argument-hint` from
67
+ 2026-07-02 until 2026-08-01 while `.` reported clean. Read the first line
68
+ of the output — it names which manifest was actually checked.)
69
+ - `claude plugin validate` is the same structural check the review pipeline
70
+ runs. It needs the Claude Code CLI installed locally — it is **not** wired
71
+ into this repo's CI (runners have no `claude` auth), so
72
+ `tests/plugin-manifest.test.js` and `tests/plugin-commands.test.js` are the
73
+ CI-side proxies. The latter now YAML-parses the command and skill
74
+ frontmatter (`yaml` is a devDependency for exactly this); substring
75
+ assertions like `toContain('argument-hint:')` cannot see a parse failure,
76
+ which is how the `council.md` defect passed CI.
77
+ - **`--strict` is expected to FAIL here, by design.** It promotes the
78
+ root-`CLAUDE.md` warning ("not loaded as project context") to an error. The
79
+ plugin root is the repo root, and `CLAUDE.md` is this repo's development
80
+ context — we keep it deliberately. Use the non-strict run as the gate and
81
+ read the warning list by eye; a *new* warning is the signal, not the
82
+ `CLAUDE.md` one.
64
83
  - `claude --plugin-dir .` loads the plugin from the working tree so you can
65
84
  manually confirm `/amicus:council`, `/amicus:sidecar`, and
66
85
  `/amicus:second-opinion` all appear in the command picker exactly once,
@@ -68,10 +87,18 @@ npm test
68
87
  - `npm test` must be green, specifically `tests/plugin-manifest.test.js`
69
88
  and `tests/plugin-commands.test.js`.
70
89
 
71
- **Known current-tree preflight result (checked 2026-07-02, `p9/distribution`
72
- at a1bea3c):** `claude plugin validate . --strict` passes clean, exit 0.
73
- (History: `--strict` previously flagged an unknown `plugin.json → bugs`
74
- field; that field was removed in commit `4207485`, so the warning is gone.)
90
+ **Known current-tree preflight result (checked 2026-08-01, on
91
+ `fix/plugin-frontmatter-validation`):**
92
+ `claude plugin validate .claude-plugin/plugin.json`exit 0,
93
+ `✔ Validation passed with warnings` (the one retained root-`CLAUDE.md`
94
+ warning). With `--strict` → exit 1 on that same warning, as documented above.
95
+ `claude plugin validate .` → exit 0 on the marketplace manifest.
96
+
97
+ History of this line: it previously read "`claude plugin validate . --strict`
98
+ passes clean, exit 0" as of 2026-07-02 — measured against the *marketplace*
99
+ manifest via the path trap above, while the plugin itself had a hard
100
+ frontmatter error in `commands/council.md`. Older still: `--strict` flagged an
101
+ unknown `plugin.json → bugs` field, removed in commit `4207485`.
75
102
 
76
103
  ### Submit
77
104
 
package/docs/ROADMAP.md CHANGED
@@ -7,12 +7,14 @@ major jump, gated on funding/cofounder. The observability arc is split so the **
7
7
  first (v4.3)** and the **Electron "Council Workspace" (v4.4)** rides on top of it. `--dry-run` cost
8
8
  preview dropped to the backlog.
9
9
 
10
- Amicus is at **v4.5.0** (tagged 2026-07-28). Each 4.x rev below leads with the benefit, not the
10
+ Amicus is at **v4.6.0** (tagged 2026-08-02). Each 4.x rev below leads with the benefit, not the
11
11
  plumbing.
12
12
 
13
- **Status:** v4.0 through **v4.5.0** have **shipped** — everything down to the v4.6 heading is a
14
- record of what landed, not a plan. **v4.6 (composition + tagging + GUI ergonomics) is the next
15
- rev.** v5.0 remains forward-looking.
13
+ **Status:** v4.0 through **v4.6.0** have **shipped** — everything down to the v4.7 heading is a
14
+ record of what landed, not a plan. **v4.7 (composition + tagging + GUI ergonomics) is the next
15
+ planned rev** — that scope carried the number v4.6 here until the degrade-announcement-invariant
16
+ milestone took the v4.6.0 release (2026-08-02); renumbered, not descoped. v5.0 remains
17
+ forward-looking.
16
18
 
17
19
  > 📁 **Reading this from an npm install?** Some references below point at working documents that
18
20
  > live in the git repository and are deliberately **not** in the published package — anything under
@@ -95,7 +97,7 @@ stops hiding. Design: `docs/superpowers/specs/2026-07-27-v4.5-save-and-share-des
95
97
  client best able to show it. *(S–M; the pieces exist — see the design notes below.)*
96
98
  - **Council policy packs + full run-profiles** (bench + lenses + options + briefing template, invoke by name) — B7/F5 *(M)*
97
99
  - **Briefing templates + library** (F9) *(S–M)* — the foundation packs reference; the `{{input}}`
98
- chaining variable and the `critique`/`refine` built-ins arrive with v4.6
100
+ chaining variable and the `critique`/`refine` built-ins arrive with the composition rev (now v4.7)
99
101
  - **Ride-along fixes** — FR-1 (a failed council seat can render perpetually live), the FR-2 ruling,
100
102
  RN-1/RN-5/RN-11 Workspace renderer fixes, TST-3 real-CDP abort pass *(S each; dispositions for
101
103
  all 17 open items are tabled in the design doc's §8)*
@@ -103,7 +105,37 @@ stops hiding. Design: `docs/superpowers/specs/2026-07-27-v4.5-save-and-share-des
103
105
  > Why here: save/share velocity multipliers that only pay off once councils are a command (v4.0)
104
106
  > and observable (v4.3/v4.4); auto-open makes the v4.4 surface discoverable on its best client.
105
107
 
106
- ## v4.6 — "Compose your councils" *(specced after v4.5 shipsanti-rot rule)*
108
+ ## v4.6 — "A loss announces itself" *(the degrade announcement invariant)*✅ SHIPPED v4.6.0, 2026-08-02
109
+ **Benefit:** a council run can no longer degrade quietly — every loss states what was lost, why,
110
+ and what it does to the run, in one voice, on every surface (stderr, `run.json`, `verdict.json`,
111
+ the report, `doctor`). The north star made mechanical: a correct-but-silent degrade fails the bar
112
+ as hard as a crash.
113
+ - **The ten-channel degrade announcement contract** — every loss routes through one sink
114
+ (`src/council/run-degrade.js`, the only code allowed to flip `degraded.value`, enforced by a
115
+ source-scan invariant test) and lands with mandatory what/why/effect on every surface, including
116
+ the report's new **"What was lost"** section — #85 *(L)*
117
+ - **`verdict.seatLoss` derived from the degrade records** (#84 — a dead critic *leg* finally flips
118
+ `criticSeated`; the v4.5.2 seatLoss suites passed byte-unedited) + **Stage-2 judge legs get
119
+ `runStats` cost rows** (#83 — per-leg attribution for ~38% of a run's spend that had none) *(M)*
120
+ - **`doctor` speaks the vocabulary** — `doctor --json` gains additive `degrades[]`, `--fix` prints
121
+ `Recovered:` lines in the one voice, and the engine hints state causes as **unverified** instead
122
+ of asserting an antivirus guess *(M)*
123
+ - **Workspace discoverability from the CLI** — `watch` usage names `--ui` (#80), a CLI council run
124
+ with Electron present prints how to open the live Workspace (#81), `watch --ui` against an
125
+ `--out-dir` run names its cause (#82), and the Stage-5 verdict rebuild preserves
126
+ `seatLoss`/`degrades[]` (#87) *(S each)*
127
+ - **Deliberate behavior changes** — dropped preset members and shared-server acquisition failures
128
+ now exit degraded (2) on every transport; judge rows raise reported cost totals vs v4.5.x
129
+ (`runStats` consumers keying by model must exclude `role: 'judge'`).
130
+ - **Docs** — the full record is `CHANGELOG.md` §4.6.0; spec
131
+ `docs/superpowers/specs/2026-08-01-degrade-announcement-invariant-design.md`; plans 1–4 under
132
+ `docs/superpowers/plans/` (`2026-08-0*-v4.6-degrade-invariant-plan-*.md`).
133
+ > Why it jumped the queue (2026-08-01): the v4.5.x field reports showed the engine was not losing
134
+ > legs (11 four-seat council runs on v4.5.4, 10 clean) — but when a seat *was* lost, nothing told
135
+ > the user which one. That silent-degrade class was ruled a north-star violation and took the rev
136
+ > number; the composition scope below moved to v4.7.
137
+
138
+ ## v4.7 — "Compose your councils" *(renumbered from v4.6, 2026-08-02 — spec + fresh plan at kickoff per the anti-rot rule)*
107
139
  **Benefit:** councils chain — generate → critique → refine with no manual copy-paste — and history
108
140
  becomes navigable.
109
141
  - **Composable/chained waves** (`--input-from <id>` / `--prompt-file -` pipe + per-source digests) —
@@ -115,8 +147,8 @@ becomes navigable.
115
147
  remainder of TST-7
116
148
  - **README + docs update** *(S)*
117
149
  > The 2026-07-19 combined spec (`2026-07-19-v4.5-policy-packs-composition-design.md`) holds the
118
- > approved chaining/tagging/F10 design detail and is the primary input to the v4.6 brainstorm; it
119
- > is NOT executed as-written — v4.6 gets its own spec + fresh plan once v4.5 ships.
150
+ > approved chaining/tagging/F10 design detail and is the primary input to the v4.7 brainstorm; it
151
+ > is NOT executed as-written — v4.7 gets its own spec + fresh plan at kickoff.
120
152
 
121
153
  ### Deferred out of v4.4.1 into v4.5 (2026-07-27)
122
154
 
@@ -48,7 +48,7 @@ Provenance is implied under trusted publishing.
48
48
 
49
49
  Run top-to-bottom before `npm version`:
50
50
 
51
- 1. **MODEL-NOTES fold-back:** diff the machine-local ledger (`~/.claude/skills/second-opinion/MODEL-NOTES.md`) against the shipped seed (`skills/second-opinion/MODEL-NOTES.md`); port durable, machine-independent lessons into the shipped file (merge/prune, keep it tight — no run-ledger numbers, those live in `amicus council stats`).
51
+ 1. **MODEL-NOTES fold-back:** diff the machine-local ledger (`~/.claude/skills/second-opinion/MODEL-NOTES.md`) against the shipped seed (`skills/second-opinion/MODEL-NOTES.md`); cherry-pick generalizable lessons from the local ledger into the shipped seed — **per-section judgment, both directions, never a bulk copy** (the divergence is two-directional: adopt seed-side corrections back into the local ledger too). Merge/prune, keep it tight — no run-ledger numbers, those live in `amicus council stats`. Standing practice per the owner's ruling, 2026-08-03: shipped = curated seed, local = lab notebook.
52
52
  2. `npm test` green; `npm run lint` clean.
53
53
  3. **Integration tier, both rails:**
54
54
  - `npm run test:integration` (keyless) — must be **0 failures**. This is the same thing the `integration` job in `ci.yml` runs on every push, so it should already be green.
package/docs/usage.md CHANGED
@@ -443,7 +443,7 @@ $ amicus status demo123 --json
443
443
  "taskId": "demo123",
444
444
  "status": "complete",
445
445
  "elapsed": "5m 0s",
446
- "version": "4.5.4",
446
+ "version": "4.6.1",
447
447
  "model": "google/gemini-2.5-flash",
448
448
  "phase": "terminal"
449
449
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amicus",
3
- "version": "4.5.4",
3
+ "version": "4.6.1",
4
4
  "mcpName": "io.github.BourbonDog/amicus",
5
5
  "description": "Multi-model LLM Council + parallel AI window for Claude Code. Run structured council reviews across Gemini, GPT, DeepSeek and more — or fork a conversation to any model and fold the results back.",
6
6
  "keywords": [
@@ -95,7 +95,8 @@
95
95
  "lint-staged": "^16.3.2",
96
96
  "puppeteer": "^24.36.0",
97
97
  "sharp": "^0.35.3",
98
- "ws": "^8.19.0"
98
+ "ws": "^8.19.0",
99
+ "yaml": "^2.9.0"
99
100
  },
100
101
  "engines": {
101
102
  "node": ">=22.12.0"
@@ -82,6 +82,26 @@
82
82
  "at": { "type": "string" }
83
83
  }
84
84
  },
85
+ "degrades": {
86
+ "description": "v4.6 Plan 1: every degrade/heal the sink announced — additive, written by run-degrade.js.",
87
+ "type": "array",
88
+ "items": {
89
+ "type": "object",
90
+ "required": ["kind", "channel", "what", "why", "effect"],
91
+ "properties": {
92
+ "kind": { "enum": ["degrade", "heal"] },
93
+ "channel": { "type": "string" },
94
+ "what": { "type": "string" },
95
+ "why": { "type": "string" },
96
+ "effect": { "type": "string" },
97
+ "remedy": { "type": "string" },
98
+ "data": {
99
+ "type": "object",
100
+ "description": "v4.6 Plan 2: optional structured facts for derivations (e.g. dead-leg {seat,status,reason}, dead-wave {waveId,models,reason}). Prose fields stay the human surface."
101
+ }
102
+ }
103
+ }
104
+ },
85
105
  "debate": {
86
106
  "type": "object",
87
107
  "properties": {
@@ -205,6 +205,26 @@
205
205
  "criticRequested",
206
206
  "criticSeated"
207
207
  ]
208
+ },
209
+ "degrades": {
210
+ "description": "v4.6 Plan 2: what this run lost — copied verbatim from the sink at verdict assembly. Additive; absent on a clean run.",
211
+ "type": "array",
212
+ "items": {
213
+ "type": "object",
214
+ "required": ["kind", "channel", "what", "why", "effect"],
215
+ "properties": {
216
+ "kind": { "enum": ["degrade", "heal"] },
217
+ "channel": { "type": "string" },
218
+ "what": { "type": "string" },
219
+ "why": { "type": "string" },
220
+ "effect": { "type": "string" },
221
+ "remedy": { "type": "string" },
222
+ "data": {
223
+ "type": "object",
224
+ "description": "v4.6 Plan 2: optional structured facts for derivations (e.g. dead-leg {seat,status,reason}, dead-wave {waveId,models,reason}). Prose fields stay the human surface."
225
+ }
226
+ }
227
+ }
208
228
  }
209
229
  }
210
230
  }
@@ -21,7 +21,29 @@
21
21
  "name": { "type": "string" },
22
22
  "status": { "type": "string" },
23
23
  "message": { "type": ["string", "null"] },
24
- "hint": { "type": ["string", "null"] }
24
+ "hint": { "type": ["string", "null"] },
25
+ "fixed": { "type": "boolean" },
26
+ "fixDetail": { "type": "string" }
27
+ }
28
+ }
29
+ },
30
+ "degrades": {
31
+ "description": "v4.6 Plan 3: failed checks and --fix repairs in the shared degrade/heal vocabulary — additive, absent when clean.",
32
+ "type": "array",
33
+ "items": {
34
+ "type": "object",
35
+ "required": ["kind", "channel", "what", "why", "effect"],
36
+ "properties": {
37
+ "kind": { "enum": ["degrade", "heal"] },
38
+ "channel": { "type": "string" },
39
+ "what": { "type": "string" },
40
+ "why": { "type": "string" },
41
+ "effect": { "type": "string" },
42
+ "remedy": { "type": "string" },
43
+ "data": {
44
+ "type": "object",
45
+ "description": "v4.6 Plan 3: optional structured facts for derivations (doctor: {checkId}). Prose fields stay the human surface."
46
+ }
25
47
  }
26
48
  }
27
49
  }