the-high-council 0.6.0 → 0.7.5

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/README.md CHANGED
@@ -139,7 +139,31 @@ Fill in `.env` with only the keys your chosen chain needs. Supported providers:
139
139
  `OPENROUTER_API_KEY` · `ZAI_API_KEY` · `XAI_API_KEY`
140
140
 
141
141
  The CLI refuses to start if any seat in the chosen chain is missing its key, rather than failing
142
- halfway through a paid run.
142
+ halfway through a paid run. `ollama` (below) is the one exception - it needs no key at all.
143
+
144
+ ### Local models (Ollama, LM Studio, ...)
145
+
146
+ A seat can run on a model you're hosting yourself instead of a paid API. Set its provider to
147
+ `ollama`:
148
+
149
+ ```json
150
+ { "provider": "ollama", "model": "llama3.1" }
151
+ ```
152
+
153
+ This talks to Ollama's own OpenAI-compatibility endpoint (`http://localhost:11434/v1` by
154
+ default) - no `OLLAMA_API_KEY` needed; Ollama's docs describe a key as "required, but unused."
155
+ If your local runner listens somewhere else (LM Studio, a different port, a remote box), add
156
+ `baseUrl` to that seat:
157
+
158
+ ```json
159
+ { "provider": "ollama", "model": "mistral", "baseUrl": "http://localhost:1234/v1" }
160
+ ```
161
+
162
+ A local seat prices at $0 in every estimate and run report - `dry_run` shows it as priced, not
163
+ "unpriced," and it can never trip the spend cap. See `chains/local-ollama.json` for a full
164
+ example chain with every seat local. As with every other seat in this project: BYOK is really
165
+ BYO-compute here, and no efficacy claim is made about local models versus hosted ones - nothing
166
+ has been measured.
143
167
 
144
168
  ## Quick start (CLI)
145
169
 
@@ -280,6 +304,7 @@ Then drive it with these tools:
280
304
  | `run_status` | Stage reached, panel verdicts, scoreboard, cost, budget remaining |
281
305
  | `spend_report` | What every run has cost across a window of days, plus `session_cost_today` (calendar-day, per-model breakdown), derived from disk |
282
306
  | `verdict_stats` | How the debate mechanism itself is doing, per chain and per lab: sign-off rate, rounds, objections, dropouts, cost/wall time, largest prompt files - derived from disk |
307
+ | `metrics_report` | Descriptive telemetry only (never an evaluation or baseline): amendment rate, withdrawal rate, objection-follow-through rate, tool-call usage, consensus-induced-regression count - derived from disk. See [`docs/paid-comparison-run.md`](docs/paid-comparison-run.md) for what a *real* comparison against a single model would need - not built, not this metric |
283
308
  | `external_prompt` | The prompt a paused external stage is waiting on - **read it with this, not by opening the file**; the prompts are routinely tens of thousands of tokens and most clients silently truncate a file read |
284
309
  | `prepare_stage_prompt` | Write a self-contained bundle for a paused stage, so a driving session doing other work at the same time can dispatch it to a fresh subagent instead of authoring it inline - see [`docs/dispatch-pattern.md`](docs/dispatch-pattern.md) |
285
310
  | `submit_stage` | Answer a paused stage and resume. Optional `claimed_by` records who's answering; a second submission for an already-answered stage no longer errors - it's kept as `<stage>.late.md` with a warning instead of being rejected |
@@ -417,6 +442,16 @@ claiming 29 chains and 12 tools when there were 30 and 11.
417
442
 
418
443
  No claim is made here that any of this produces better plans. It has not been measured.
419
444
 
445
+ ## Skills
446
+
447
+ `skills/` carries two Claude Code skill files shipped alongside this harness, not part of it:
448
+ `backend-developer` and `frontend-developer` - general backend and frontend engineering rules
449
+ (contract-first design, save/persistence integrity, accessibility, verification discipline) that
450
+ apply to any codebase, not just this one. Same MIT/BYOK ethos as the harness itself. They don't
451
+ claim to make code better; they describe what each rule guards against and why. Point Claude Code
452
+ at this repo's `skills/` directory (or copy the two folders into your own project's
453
+ `.claude/skills/`) to use them.
454
+
420
455
  ## Known limits, stated plainly
421
456
 
422
457
  - The spend cap is enforced against a **worst case**, not a prediction: the whole prompt billed as
@@ -425,7 +460,9 @@ No claim is made here that any of this produces better plans. It has not been me
425
460
  left. That is the intended trade - resume it with a higher ceiling.
426
461
  - A seat whose model has no entry in `src/pricing.json` is **unpriced, and therefore uncapped**.
427
462
  It contributes $0 to the running total no matter what it really costs. Check `dry_run` output
428
- for `unpriced` before trusting a ceiling.
463
+ for `unpriced` before trusting a ceiling. `ollama` seats are the one deliberate exception: they
464
+ price at an explicit $0 for any model name (they are genuinely free to run), so they never show
465
+ up in that `unpriced` list and never need a pricing.json entry.
429
466
  - Prices in `src/pricing.json` are hand-maintained list prices, last verified 2026-09-06. They are
430
467
  estimates, not invoices. Your provider's bill is the real number.
431
468
  - Chains with many labs and high round caps get expensive quickly. `plan-unanimous` at three rounds
@@ -43,3 +43,16 @@ lab actually returned. The run log also says why it was unreadable: truncated
43
43
  (hit its token cap), malformed JSON, or the provider itself returned an error
44
44
  mid-generation - each needs a different fix (a higher `maxTokens`, a smaller
45
45
  prompt, or just retrying).
46
+
47
+ ## COUNCIL-E005 - Policy refusal (fatal)
48
+
49
+ Either `policy.json` itself isn't valid JSON, or the chain you're about to run
50
+ violates one of its limits (an unlisted provider or region, over the per-run or
51
+ per-month spend cap, a missing required tag, or an unpriced seat when
52
+ `refuse_unpriced_seats` is set). A policy file is a locked, operator-set set of
53
+ limits checked before any provider is called - a run that would violate it never
54
+ starts, so nothing was spent.
55
+
56
+ **Fix:** if the file itself won't parse, fix its JSON syntax. Otherwise, either
57
+ change the chain so it no longer violates the listed limit(s), or change
58
+ `policy.json` if the limit itself was wrong. See [docs/policy.md](docs/policy.md).
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "eu-only",
3
+ "description": "Compliance chain (v7.x, procurement readiness): touches only anthropic, openai, mistral - none of the non-EU labs (deepseek, zai) the source procurement report flags. Region: EU. Two labs' worth of critique, same shape as verify.",
4
+ "maxRounds": 2,
5
+ "stopOnPass": true,
6
+ "compliance": {
7
+ "regions": ["EU"],
8
+ "providers": ["anthropic", "openai", "mistral"]
9
+ },
10
+ "estimate": {
11
+ "promptTokens": 4000,
12
+ "draftTokens": 6000,
13
+ "critiqueTokens": 1200
14
+ },
15
+ "seats": {
16
+ "criteria": {
17
+ "provider": "anthropic",
18
+ "model": "claude-opus-5",
19
+ "maxTokens": 2000
20
+ },
21
+ "builder": {
22
+ "provider": "anthropic",
23
+ "model": "claude-opus-5",
24
+ "maxTokens": 16000
25
+ },
26
+ "reviser": {
27
+ "provider": "anthropic",
28
+ "model": "claude-opus-5",
29
+ "maxTokens": 16000
30
+ },
31
+ "critics": [
32
+ {
33
+ "provider": "openai",
34
+ "model": "gpt-5",
35
+ "maxTokens": 20000
36
+ },
37
+ {
38
+ "provider": "mistral",
39
+ "model": "mistral-large-latest",
40
+ "maxTokens": 20000
41
+ }
42
+ ]
43
+ }
44
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "local-ollama",
3
+ "description": "BYO-hardware: every seat runs on a local Ollama instance. No API key, no spend - `dry_run` prices this chain at $0. Swap the model names for whatever you've pulled (`ollama pull <model>`); swap `baseUrl` if Ollama (or an LM Studio / other OpenAI-compatible local runner) listens somewhere other than the default `http://localhost:11434/v1`.",
4
+ "maxRounds": 2,
5
+ "stopOnPass": true,
6
+ "estimate": {
7
+ "promptTokens": 4000,
8
+ "draftTokens": 6000,
9
+ "critiqueTokens": 1200
10
+ },
11
+ "seats": {
12
+ "criteria": {
13
+ "provider": "ollama",
14
+ "model": "llama3.1",
15
+ "maxTokens": 2000
16
+ },
17
+ "builder": {
18
+ "provider": "ollama",
19
+ "model": "llama3.1",
20
+ "maxTokens": 16000
21
+ },
22
+ "reviser": {
23
+ "provider": "ollama",
24
+ "model": "llama3.1",
25
+ "maxTokens": 16000
26
+ },
27
+ "critics": [
28
+ {
29
+ "provider": "ollama",
30
+ "model": "qwen2.5",
31
+ "maxTokens": 8000,
32
+ "lab": "ollama-qwen"
33
+ },
34
+ {
35
+ "provider": "ollama",
36
+ "model": "mistral",
37
+ "maxTokens": 8000,
38
+ "baseUrl": "http://localhost:1234/v1",
39
+ "lab": "lmstudio-mistral"
40
+ }
41
+ ]
42
+ }
43
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plan-debate-roles-c1",
3
- "description": "v6 role-seat plan, phase 5 real-run candidate (docs/v6-decisions.md 'Phase 5 - role debate chain'). Same shape as plan-debate-open-c2, minus Kimi (five seats, not six, to match the plan's five lenses/five personas one-to-one). BUILD-FIX 2026-09-14: originally written against phase 1/2's seats.critics-does-double-duty shape, before the full v6 release integration split seats.proposers (proposes and debates, role-bearing) from seats.critics (panel/critique stage, role-free) as its own array - chain-lint's role-on-non-proposer-seat check (v6 phase 7) is correct that a role on seats.critics alone is a no-op under the current, intentional contract. Fixed by declaring both arrays explicitly: seats.proposers carries the five role-bearing debate seats; seats.critics is the same five labs for the later panel/critique stage, with role stripped (the panel stage must never see it, per v6 phase 2's stage-isolation guarantee - role appearing there at all would itself be a lint/architecture violation, not just redundant). SUBSTITUTION 2026-09-14: the gemini/adversary/parzival seat is now minimax (MiniMax M3, via openrouter) - Google AI Studio's prepayment credits were depleted mid-run (real HTTP 429, not a code bug); Muad chose swapping the lab over topping up credit so the run could happen the same night. Only this one seat changed; the other four labs and their pairings are unaffected. Reasoning for the replacement pick is in docs/v6-decisions.md, not repeated here. Pairings and their reasoning are in docs/v6-decisions.md, not repeated here so there is one place to keep them current.",
3
+ "description": "v6 role-seat plan, phase 5 real-run candidate (docs/v6-decisions.md 'Phase 5 - role debate chain'). Same shape as plan-debate-open-c2, minus Kimi (five critic seats, not six, to match the plan's five lenses/five personas one-to-one) - each critic seat now carries a role: {lens, persona} pair (v6 §1/§2, applied only to the debate-stage system prompt; the panel stage and every pipeline seat below are unaffected by construction). Pipeline seats (criteria/skeleton/builder/reviser/handoff) are untouched external Claude-Code seats, exactly as in the source chain - roles only ever apply to the critics array's debate-stage prompt. Pairings and their reasoning are in docs/v6-decisions.md, not repeated here so there is one place to keep them current.",
4
4
  "maxRounds": 3,
5
5
  "signoff": "unanimous",
6
6
  "proposals": {
@@ -35,7 +35,7 @@
35
35
  "provider": "external",
36
36
  "model": "claude-code-session"
37
37
  },
38
- "proposers": [
38
+ "critics": [
39
39
  {
40
40
  "provider": "together",
41
41
  "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
@@ -80,69 +80,12 @@
80
80
  "role": { "lens": "user-advocate", "persona": "van-gogh" }
81
81
  },
82
82
  {
83
- "provider": "openrouter",
84
- "model": "minimax/minimax-m3",
83
+ "provider": "google",
84
+ "model": "gemini-3.6-flash",
85
85
  "maxTokens": 20000,
86
- "extra": {
87
- "reasoning": {
88
- "enabled": false
89
- }
90
- },
91
- "lab": "minimax",
86
+ "lab": "gemini",
92
87
  "role": { "lens": "adversary", "persona": "parzival" }
93
88
  }
94
- ],
95
- "critics": [
96
- {
97
- "provider": "together",
98
- "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
99
- "maxTokens": 20000,
100
- "extra": {
101
- "chat_template_kwargs": {
102
- "thinking": false
103
- }
104
- },
105
- "lab": "deepseek"
106
- },
107
- {
108
- "provider": "openrouter",
109
- "model": "qwen/qwen3.5-plus-20260420",
110
- "maxTokens": 20000,
111
- "extra": {
112
- "reasoning": {
113
- "enabled": false
114
- }
115
- },
116
- "lab": "qwen"
117
- },
118
- {
119
- "provider": "openrouter",
120
- "model": "z-ai/glm-5.3-flash",
121
- "maxTokens": 20000,
122
- "lab": "glm",
123
- "extra": {
124
- "reasoning": {
125
- "effort": "low"
126
- }
127
- }
128
- },
129
- {
130
- "provider": "openrouter",
131
- "model": "mistralai/mistral-large-2512",
132
- "maxTokens": 20000,
133
- "lab": "mistral"
134
- },
135
- {
136
- "provider": "openrouter",
137
- "model": "minimax/minimax-m3",
138
- "maxTokens": 20000,
139
- "extra": {
140
- "reasoning": {
141
- "enabled": false
142
- }
143
- },
144
- "lab": "minimax"
145
- }
146
89
  ]
147
90
  },
148
91
  "scope": "open"
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "plan-two-strong",
3
+ "description": "Roster inversion (relay/runs/2026-09-14T14-56-18-834Z/deliverable.md, item 6). Two strong seats from different labs propose and debate one round; one strong adjudicator seat signs off. No cheap-tier critic roster at all. Additive-only - no existing chain references this file.",
4
+ "maxRounds": 1,
5
+ "signoff": "unanimous",
6
+ "roster": {
7
+ "minimal_two_strong": true
8
+ },
9
+ "proposals": {
10
+ "parts": 3,
11
+ "maxTokens": 1500
12
+ },
13
+ "debate": true,
14
+ "handoff": true,
15
+ "estimate": {
16
+ "promptTokens": 12000,
17
+ "draftTokens": 16000,
18
+ "critiqueTokens": 2000
19
+ },
20
+ "seats": {
21
+ "criteria": {
22
+ "provider": "anthropic",
23
+ "model": "claude-opus-5",
24
+ "maxTokens": 2000,
25
+ "lab": "anthropic"
26
+ },
27
+ "skeleton": {
28
+ "provider": "anthropic",
29
+ "model": "claude-opus-5",
30
+ "maxTokens": 6000,
31
+ "lab": "anthropic"
32
+ },
33
+ "builder": {
34
+ "provider": "anthropic",
35
+ "model": "claude-opus-5",
36
+ "maxTokens": 40000,
37
+ "lab": "anthropic"
38
+ },
39
+ "reviser": {
40
+ "provider": "anthropic",
41
+ "model": "claude-opus-5",
42
+ "maxTokens": 40000,
43
+ "lab": "anthropic"
44
+ },
45
+ "handoff": {
46
+ "provider": "anthropic",
47
+ "model": "claude-opus-5",
48
+ "maxTokens": 4000,
49
+ "lab": "anthropic"
50
+ },
51
+ "proposers": [
52
+ {
53
+ "provider": "anthropic",
54
+ "model": "claude-opus-5",
55
+ "maxTokens": 20000,
56
+ "lab": "anthropic"
57
+ },
58
+ {
59
+ "provider": "openai",
60
+ "model": "gpt-5",
61
+ "maxTokens": 20000,
62
+ "lab": "openai"
63
+ }
64
+ ],
65
+ "critics": [
66
+ {
67
+ "provider": "google",
68
+ "model": "gemini-2.5-pro",
69
+ "maxTokens": 20000,
70
+ "lab": "google"
71
+ }
72
+ ]
73
+ }
74
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "single-vendor-anthropic",
3
+ "description": "Compliance chain (v7.x, procurement readiness): every seat routes through anthropic (models claude-opus-5, claude-sonnet-5, claude-haiku-4-5-20251001), pinned to exact model versions in src/pricing.json - a single vendor account and a single provider key for the whole run.",
4
+ "maxRounds": 2,
5
+ "stopOnPass": true,
6
+ "compliance": {
7
+ "providers": ["anthropic"]
8
+ },
9
+ "estimate": {
10
+ "promptTokens": 4000,
11
+ "draftTokens": 6000,
12
+ "critiqueTokens": 1200
13
+ },
14
+ "seats": {
15
+ "criteria": {
16
+ "provider": "anthropic",
17
+ "model": "claude-opus-5",
18
+ "maxTokens": 2000
19
+ },
20
+ "builder": {
21
+ "provider": "anthropic",
22
+ "model": "claude-opus-5",
23
+ "maxTokens": 16000
24
+ },
25
+ "reviser": {
26
+ "provider": "anthropic",
27
+ "model": "claude-opus-5",
28
+ "maxTokens": 16000
29
+ },
30
+ "critics": [
31
+ {
32
+ "provider": "anthropic",
33
+ "model": "claude-sonnet-5",
34
+ "maxTokens": 20000
35
+ },
36
+ {
37
+ "provider": "anthropic",
38
+ "model": "claude-haiku-4-5-20251001",
39
+ "maxTokens": 20000
40
+ }
41
+ ]
42
+ }
43
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "single-vendor-openai",
3
+ "description": "Compliance chain (v7.x, procurement readiness): every seat routes through openai (models gpt-5, gpt-5-mini, gpt-5-nano), pinned to exact model versions in src/pricing.json - a single vendor account and a single provider key for the whole run.",
4
+ "maxRounds": 2,
5
+ "stopOnPass": true,
6
+ "compliance": {
7
+ "providers": ["openai"]
8
+ },
9
+ "estimate": {
10
+ "promptTokens": 4000,
11
+ "draftTokens": 6000,
12
+ "critiqueTokens": 1200
13
+ },
14
+ "seats": {
15
+ "criteria": {
16
+ "provider": "openai",
17
+ "model": "gpt-5",
18
+ "maxTokens": 2000
19
+ },
20
+ "builder": {
21
+ "provider": "openai",
22
+ "model": "gpt-5",
23
+ "maxTokens": 16000
24
+ },
25
+ "reviser": {
26
+ "provider": "openai",
27
+ "model": "gpt-5",
28
+ "maxTokens": 16000
29
+ },
30
+ "critics": [
31
+ {
32
+ "provider": "openai",
33
+ "model": "gpt-5-mini",
34
+ "maxTokens": 20000
35
+ },
36
+ {
37
+ "provider": "openai",
38
+ "model": "gpt-5-nano",
39
+ "maxTokens": 20000
40
+ }
41
+ ]
42
+ }
43
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "us-only",
3
+ "description": "Compliance chain (v7.x, procurement readiness): touches only anthropic, openai, xai, google - all US-based labs. Region: US. Two labs' worth of critique, same shape as verify.",
4
+ "maxRounds": 2,
5
+ "stopOnPass": true,
6
+ "compliance": {
7
+ "regions": ["US"],
8
+ "providers": ["anthropic", "openai", "xai", "google"]
9
+ },
10
+ "estimate": {
11
+ "promptTokens": 4000,
12
+ "draftTokens": 6000,
13
+ "critiqueTokens": 1200
14
+ },
15
+ "seats": {
16
+ "criteria": {
17
+ "provider": "anthropic",
18
+ "model": "claude-opus-5",
19
+ "maxTokens": 2000
20
+ },
21
+ "builder": {
22
+ "provider": "anthropic",
23
+ "model": "claude-opus-5",
24
+ "maxTokens": 16000
25
+ },
26
+ "reviser": {
27
+ "provider": "anthropic",
28
+ "model": "claude-opus-5",
29
+ "maxTokens": 16000
30
+ },
31
+ "critics": [
32
+ {
33
+ "provider": "openai",
34
+ "model": "gpt-5",
35
+ "maxTokens": 20000
36
+ },
37
+ {
38
+ "provider": "xai",
39
+ "model": "grok-4",
40
+ "maxTokens": 20000
41
+ },
42
+ {
43
+ "provider": "google",
44
+ "model": "gemini-2.5-pro",
45
+ "maxTokens": 20000
46
+ }
47
+ ]
48
+ }
49
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "the-high-council",
3
- "version": "0.6.0",
3
+ "version": "0.7.5",
4
4
  "description": "The High Council: a multi-model planning harness. One builder, independent critics from other labs, checkable acceptance criteria, a debate on the record, and a hard stop.",
5
5
  "type": "module",
6
6
  "license": "MIT",