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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +113 -0
- package/README.md +1 -1
- package/commands/council.md +1 -1
- package/docs/DISTRIBUTION.md +38 -11
- package/docs/ROADMAP.md +40 -8
- package/docs/publishing.md +1 -1
- package/docs/usage.md +1 -1
- package/package.json +3 -2
- package/schemas/council-run.schema.json +20 -0
- package/schemas/council-verdict.schema.json +20 -0
- package/schemas/doctor.schema.json +23 -1
- package/skills/second-opinion/MODEL-NOTES.md +182 -35
- package/src/cli-council-run-render.js +51 -0
- package/src/cli-handlers-council-run.js +45 -44
- package/src/cli-handlers-council.js +9 -3
- package/src/cli-handlers-doctor.js +16 -37
- package/src/cli-handlers-watch.js +1 -1
- package/src/cli.js +1 -1
- package/src/council/ledger.js +5 -1
- package/src/council/report-html.js +16 -1
- package/src/council/report.js +25 -1
- package/src/council/run-assemble.js +25 -7
- package/src/council/run-budget.js +14 -8
- package/src/council/run-chair.js +21 -4
- package/src/council/run-debate-stage.js +115 -0
- package/src/council/run-degrade.js +44 -0
- package/src/council/run-finalize.js +18 -3
- package/src/council/run-launch.js +4 -0
- package/src/council/run-retry-notes.js +74 -0
- package/src/council/run-retry.js +280 -0
- package/src/council/run-server.js +24 -7
- package/src/council/run-stage2.js +10 -2
- package/src/council/run-stages.js +59 -27
- package/src/council/run.js +39 -67
- package/src/council/verdict.js +81 -8
- package/src/mcp-council-bench.js +45 -0
- package/src/mcp-council-run.js +11 -28
- package/src/mcp-server.js +22 -3
- package/src/mcp-tools.js +13 -1
- package/src/utils/degrade.js +69 -0
- package/src/utils/doctor-degrade.js +51 -0
- package/src/utils/doctor-electron-mcp-check.js +64 -5
- package/src/utils/doctor-engine-check.js +14 -3
- package/src/utils/doctor-mcp-checks.js +10 -3
- package/src/utils/known-flags.js +2 -1
- package/src/utils/remediation-hints.js +20 -14
- package/src/utils/result-schema.js +6 -2
- package/src/utils/session-index-tmp-sweep.js +2 -1
- package/src/utils/update-notice.js +171 -0
- package/src/workspace/run-scan.js +5 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "amicus",
|
|
3
|
-
"version": "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
package/commands/council.md
CHANGED
|
@@ -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
|
|
package/docs/DISTRIBUTION.md
CHANGED
|
@@ -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 .
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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.
|
|
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.
|
|
14
|
-
record of what landed, not a plan. **v4.
|
|
15
|
-
rev
|
|
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.
|
|
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 — "
|
|
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.
|
|
119
|
-
> is NOT executed as-written — v4.
|
|
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
|
|
package/docs/publishing.md
CHANGED
|
@@ -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`);
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "amicus",
|
|
3
|
-
"version": "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
|
}
|