the-high-council 0.7.6 → 0.7.7
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 +146 -113
- package/TROUBLESHOOTING.md +48 -0
- package/chains/mock-criteria-kinds.json +19 -0
- package/package.json +16 -2
- package/schemas/report-v1.json +784 -0
- package/schemas/verdict-diff.json +41 -0
- package/src/api.js +190 -0
- package/src/argued.js +286 -0
- package/src/chain-lint.js +13 -0
- package/src/chain.js +229 -16
- package/src/cli.js +211 -53
- package/src/cost.js +4 -0
- package/src/council-replay.js +11 -2
- package/src/criteria-kinds.js +169 -0
- package/src/invocation.js +25 -0
- package/src/mcp/server.js +45 -6
- package/src/mock-demo.js +237 -0
- package/src/providers.js +97 -5
- package/src/report-shape.js +88 -9
- package/src/roles.js +73 -12
- package/src/stage-contract.js +7 -0
- package/src/version.js +10 -3
- package/types/index.d.ts +122 -0
package/README.md
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
# The High Council
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> The licence of everything already released stays MIT.
|
|
3
|
+
A planning harness that runs one idea past several AI models from different labs, makes them
|
|
4
|
+
argue about software engineering, architecture, specific features, roadmaps and philosophy, and
|
|
5
|
+
stops at a checkable result at an estimated price, with a variable number of debate rounds, model
|
|
6
|
+
seats and labs (except xAI) and variable token limits per response and model.
|
|
8
7
|
|
|
9
8
|
See it work right now - no keys, no setup, no cost:
|
|
10
9
|
|
|
11
10
|
npx the-high-council council demo
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
The demo takes one example request (a tool that renames holiday photos by date) through every
|
|
13
|
+
stage: blind proposals, an anonymised debate in which one proposal is withdrawn and two are
|
|
14
|
+
amended, a panel that splits in round 1 and signs off in round 2, and the handoff file. Every
|
|
15
|
+
model reply in it is written in advance; what is real is the code that runs the stages around
|
|
16
|
+
them.
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
the current source instead of the published package.)*
|
|
18
|
+
Add it to Claude Code as an MCP server:
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
argue about it on the record, and stops at a checkable result.
|
|
20
|
+
claude mcp add council -- npx -y the-high-council council --mcp
|
|
22
21
|
|
|
23
22
|
Runs as an **MCP server** (so an agent like Claude Code can drive it) or as a **CLI**. Bring your
|
|
24
23
|
own API keys. Nothing is resold, nothing is hosted for you, and your keys go only to the
|
|
25
24
|
providers you choose, never to us.
|
|
25
|
+
|
|
26
26
|
Run `npx the-high-council council doctor` to see which of your own keys are
|
|
27
27
|
set, which shipped chains you can already run with them, and what each would cost - before
|
|
28
28
|
spending anything.
|
|
@@ -33,10 +33,65 @@ spending anything.
|
|
|
33
33
|
> disagreement between models *visible and recorded* instead of averaged away - you can read who
|
|
34
34
|
> objected to what, who withdrew a proposal under argument, and who held their position.
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
## Your first ten minutes
|
|
37
|
+
|
|
38
|
+
New to API keys, or to this? This path costs nothing until step 4, and step 4 tells you the price
|
|
39
|
+
before anything is spent.
|
|
40
|
+
|
|
41
|
+
1. **Watch one.** `npx the-high-council demo` walks an example request through every stage with
|
|
42
|
+
scripted replies. No key, no network, $0.
|
|
43
|
+
2. **Make it yours.** `npx the-high-council init` writes `tasks/my-first-task.md` (edit it into
|
|
44
|
+
your own idea, in plain words) and `chains/my-first-chain.json`, and runs a $0 mock pass so
|
|
45
|
+
you can look inside a real run folder.
|
|
46
|
+
3. **Find the least setup.** `npx the-high-council doctor` lists what your keys can run. Its
|
|
47
|
+
"Start here" block names the chains that need **one key only**: a single `OPENROUTER_API_KEY`
|
|
48
|
+
(one account at [openrouter.ai](https://openrouter.ai) that reaches many labs' models) is
|
|
49
|
+
enough for a seven-lab panel. Put the key in a file called `.env` in the folder you run from,
|
|
50
|
+
as `OPENROUTER_API_KEY=...`, and add `.env` to your `.gitignore` so it is never committed.
|
|
51
|
+
4. **Price it, then run it.** Add `--dry-run` to see the worst-case price for your task, then run
|
|
52
|
+
it without:
|
|
53
|
+
|
|
54
|
+
npx the-high-council --task tasks/my-first-task.md --chain cheap-7-v2 --dry-run
|
|
55
|
+
npx the-high-council --task tasks/my-first-task.md --chain cheap-7-v2
|
|
56
|
+
|
|
57
|
+
Every run stops before it would pass its spend cap ($7 unless you set `--max-usd`). A run
|
|
58
|
+
stopped by the cap keeps what it paid for but has no plan yet, so pick a cap at or above the
|
|
59
|
+
dry run's price. A panel that signs off early costs less than the worst case.
|
|
60
|
+
|
|
61
|
+
The plan lands in `runs/<time>/deliverable.md`; the argument behind it is in `BOARD.md`.
|
|
62
|
+
|
|
63
|
+
No key and no budget? A chain can run on models on your own machine through
|
|
64
|
+
[Ollama](#local-models-ollama-lm-studio-) at $0, if your computer can run them.
|
|
65
|
+
Everywhere below, `council` means `npx the-high-council` unless you installed it globally.
|
|
66
|
+
|
|
67
|
+
## Words used here
|
|
68
|
+
|
|
69
|
+
- **Lab** - a company that makes AI models (Anthropic, OpenAI, Google, DeepSeek, ...). "Different
|
|
70
|
+
labs" means models trained by different companies.
|
|
71
|
+
- **Provider** - where a call goes and who bills it: a lab's own API, OpenRouter (many labs, one
|
|
72
|
+
key and one bill), or `ollama` (your own machine).
|
|
73
|
+
- **API key** - a secret string from a provider that lets a program use your account there. You
|
|
74
|
+
pay the provider for what the program uses; nobody else sees the key.
|
|
75
|
+
- **Seat** - one job in a run, filled by one model: the one that writes criteria, the builder, a
|
|
76
|
+
critic, and so on.
|
|
77
|
+
- **Chain** - a JSON file that says which model sits in which seat and which stages run. Pick one
|
|
78
|
+
with `--chain`; `council doctor` lists them all.
|
|
79
|
+
- **Task** - your request, a plain text file in `tasks/`. No format.
|
|
80
|
+
- **Criteria** - yes/no checks the plan has to pass, written from your task before anyone plans.
|
|
81
|
+
- **Proposal, debate** - each lab suggests parts of the plan without seeing the others, then
|
|
82
|
+
they read each other's (with names hidden) and object, support or merge.
|
|
83
|
+
- **Panel, round, sign-off** - the critics grade the draft against the criteria; each failed check
|
|
84
|
+
goes back for a revision, which is one round. Sign-off means a critic found nothing failing.
|
|
85
|
+
- **Dry run** - `--dry-run`: price a run, call nothing.
|
|
86
|
+
- **Spend cap** - the most one run may cost. It is checked before every paid call.
|
|
87
|
+
- **Mock** - a fake provider with scripted replies, for trying the machinery for free.
|
|
88
|
+
- **External** - a seat that waits for a person or another agent (such as your Claude Code session)
|
|
89
|
+
to answer it from a file.
|
|
90
|
+
- **Handoff** - `HANDOFF.md`, the build instructions a coding agent works from.
|
|
91
|
+
|
|
92
|
+
**A visual write-up of all of this, built around one real run, is at
|
|
93
|
+
[sower-industries.de/MCP](https://sower-industries.de/MCP).** What changed in each release:
|
|
94
|
+
[CHANGELOG.md](CHANGELOG.md).
|
|
40
95
|
|
|
41
96
|
## How it works
|
|
42
97
|
|
|
@@ -63,11 +118,13 @@ withdrawal), `HANDOFF.md`, a per-lab scoreboard, and the real token/cost account
|
|
|
63
118
|
### Reading a run with a program
|
|
64
119
|
|
|
65
120
|
`BOARD.md` is for people. **`report.json` is the same board, structured** - if you are building
|
|
66
|
-
anything on top of a run, read that instead. Do not parse the markdown.
|
|
121
|
+
anything on top of a run, read that instead. Do not parse the markdown. The format is versioned
|
|
122
|
+
(`schemaVersion`) and published as a JSON Schema, `schemas/report-v1.json`; which fields are stable,
|
|
123
|
+
which are experimental, and how versions change: [docs/report-format.md](docs/report-format.md).
|
|
67
124
|
|
|
68
125
|
```jsonc
|
|
69
126
|
{
|
|
70
|
-
"runId": "...", "chain": "...", "passed": false, "maxUsd": 5,
|
|
127
|
+
"schemaVersion": 1, "runId": "...", "chain": "...", "passed": false, "maxUsd": 5,
|
|
71
128
|
"criteria": [ "each acceptance criterion, as written before the debate" ],
|
|
72
129
|
"questions": [ { "question": "...", "why": "...", "default": "..." } ], // null if the chain skipped them
|
|
73
130
|
"proposals": [ { "id": "DEEPSEEK-1", "lab": "deepseek", "model": "...",
|
|
@@ -90,7 +147,17 @@ anything on top of a run, read that instead. Do not parse the markdown.
|
|
|
90
147
|
"replies": [ { "id": "GLM-ALT", "action": "keep|amend|withdraw", "text": "..." } ],
|
|
91
148
|
"dropouts": [ { "lab": "...", "model": "...", "stage": "alternatives", "reason": "..." } ]
|
|
92
149
|
},
|
|
93
|
-
|
|
150
|
+
// Only on chains with `argued: { enabled: true }` (off by default, on in no shipped chain): the
|
|
151
|
+
// "How this plan was argued" section, written to ARGUED.md next to deliverable.md (never inside it)
|
|
152
|
+
// by the handoff seat, from a fact pack of this run's own record. unknown_refs / unknown_labs are
|
|
153
|
+
// ids and labs it named that the run never had; each is also a line in WARNINGS.md.
|
|
154
|
+
"argued": {
|
|
155
|
+
"file": "ARGUED.md",
|
|
156
|
+
"facts_counts": { "labs": 7, "alternatives": 7, "proposals": 14, "objections": 9, "...": 0 },
|
|
157
|
+
"unknown_refs": [], "unknown_labs": [], "missing_labs": [], "missing_sections": [],
|
|
158
|
+
"refs_cited": 23, "ok": true
|
|
159
|
+
},
|
|
160
|
+
"signoff": [ { "lab": "qwen", "provider": "qwen", "model": "...", "signedOff": false,
|
|
94
161
|
"objections": [ { "criterion": "...", "problem": "...", "fix": "..." } ] } ],
|
|
95
162
|
"lastCritique": { "meets": false, "failures": [ { "criterion": "...", "lab": "qwen" } ] },
|
|
96
163
|
"scoreboard": {
|
|
@@ -122,6 +189,8 @@ those plus `text` and may carry more (an `amend` often brings a `how`). `replace
|
|
|
122
189
|
when the action is `withdraw`. `proposals[]` likewise carries `withdrawn` / `amended` /
|
|
123
190
|
`replaced_by` only when they apply. Read defensively: check for a field, do not assume it.
|
|
124
191
|
|
|
192
|
+
`signoff[].lab` is the seat's lab; `signoff[].provider` holds the same value under an older,
|
|
193
|
+
misleading name and is deprecated (kept until the report format's version 2).
|
|
125
194
|
`signoff[].objections` is why a seat declined, on the seat's own record. `signedOff: null` means
|
|
126
195
|
the seat gave no usable reply and abstained - neither a pass nor an objection, and `objections` is
|
|
127
196
|
`null` rather than empty so the two stay apart. A seat that agreed has an empty list.
|
|
@@ -129,7 +198,7 @@ The same objections also appear flattened in `lastCritique.failures[]`, tagged w
|
|
|
129
198
|
the reviser wants the union across the whole panel. Both are built in one pass; they cannot drift.
|
|
130
199
|
|
|
131
200
|
**Before you publish a run,** note that `report.json` records `task` as the path to your task file
|
|
132
|
-
|
|
201
|
+
(relative to where you started the run, never absolute). Nothing transmits it anywhere - but if you are rendering a board onto a public
|
|
133
202
|
page, drop that field. The debate itself is the part worth showing.
|
|
134
203
|
|
|
135
204
|
## Requirements
|
|
@@ -139,14 +208,18 @@ page, drop that field. The debate itself is the part worth showing.
|
|
|
139
208
|
|
|
140
209
|
## Setup
|
|
141
210
|
|
|
211
|
+
Nothing to install beyond Node: `npx the-high-council council <command>` fetches the published
|
|
212
|
+
package and runs it. To keep a `council` command on your PATH instead:
|
|
213
|
+
|
|
142
214
|
```bash
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
npm install
|
|
146
|
-
cp .env.example .env
|
|
215
|
+
npm install -g the-high-council
|
|
216
|
+
council doctor
|
|
147
217
|
```
|
|
148
218
|
|
|
149
|
-
|
|
219
|
+
`council` reads and writes in the directory you run it from: `.env` for keys, `tasks/` for
|
|
220
|
+
requests, `runs/` for output, and a `chains/` of your own there takes precedence over the bundled
|
|
221
|
+
ones. Put only the keys your chosen chain needs in that `.env`, one `NAME=value` per line
|
|
222
|
+
(`.env.example` in the package lists them all). Supported providers:
|
|
150
223
|
|
|
151
224
|
`ANTHROPIC_API_KEY` · `OPENAI_API_KEY` · `GOOGLE_API_KEY` · `MISTRAL_API_KEY` ·
|
|
152
225
|
`DEEPSEEK_API_KEY` · `GROQ_API_KEY` · `TOGETHER_API_KEY` · `COHERE_API_KEY` ·
|
|
@@ -159,6 +232,19 @@ refuses such a seat, with no override. There is no `xai` provider.
|
|
|
159
232
|
The CLI refuses to start if any seat in the chosen chain is missing its key, rather than failing
|
|
160
233
|
halfway through a paid run. `ollama` (below) is the one exception - it needs no key at all.
|
|
161
234
|
|
|
235
|
+
### From source
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
git clone https://github.com/muad-yasin/the-high-council-mcp.git
|
|
239
|
+
cd the-high-council-mcp
|
|
240
|
+
npm install
|
|
241
|
+
cp .env.example .env
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
In a clone, `node src/cli.js` does what `council` does, on the current source rather than the
|
|
245
|
+
published package. `npx github:muad-yasin/the-high-council-mcp council demo` runs the current
|
|
246
|
+
source without cloning.
|
|
247
|
+
|
|
162
248
|
### Standalone binaries (build them yourself)
|
|
163
249
|
|
|
164
250
|
There are no published binary downloads yet. From a clone you can build a single-file `council`
|
|
@@ -218,17 +304,20 @@ mkdir -p tasks
|
|
|
218
304
|
echo "Plan the data model for a bookmarking app. Single user, offline-first." > tasks/your-idea.md
|
|
219
305
|
|
|
220
306
|
# see what's available and what it would cost
|
|
221
|
-
|
|
222
|
-
|
|
307
|
+
council --help
|
|
308
|
+
council --task tasks/your-idea.md --chain verify --dry-run
|
|
223
309
|
|
|
224
310
|
# a real run
|
|
225
|
-
|
|
311
|
+
council --task tasks/your-idea.md --chain verify
|
|
226
312
|
```
|
|
227
313
|
|
|
228
|
-
|
|
229
|
-
|
|
314
|
+
Your requests and everything the council writes about them stay on your machine, in `tasks/` and
|
|
315
|
+
`runs/` under the directory you ran from. In a clone of this repo both are gitignored, so a fork
|
|
316
|
+
will not accidentally publish them.
|
|
230
317
|
|
|
231
|
-
`verify` is the
|
|
318
|
+
`verify` is the default when you name no chain: a panel of two labs, a hard two-round cap. It
|
|
319
|
+
needs three keys (Anthropic, OpenAI and Google, one account each). With one OpenRouter key, start
|
|
320
|
+
with `cheap-7-v2` instead; `council doctor` lists every chain that runs on the keys you have.
|
|
232
321
|
|
|
233
322
|
### Exit codes
|
|
234
323
|
|
|
@@ -287,8 +376,8 @@ stage - a stage that could take the run past the ceiling is never called, so the
|
|
|
287
376
|
than reporting the overspend afterwards.
|
|
288
377
|
|
|
289
378
|
```bash
|
|
290
|
-
|
|
291
|
-
|
|
379
|
+
council --task tasks/x.md --max-usd 2 # this run stops at $2
|
|
380
|
+
council --task tasks/x.md --max-usd none # no ceiling
|
|
292
381
|
export MAX_USD_PER_RUN=20 # change the default
|
|
293
382
|
```
|
|
294
383
|
|
|
@@ -298,7 +387,7 @@ stage it stopped at, and what that stage would have cost. Nothing is half-writte
|
|
|
298
387
|
with a higher ceiling - completed stages replay from disk and cost nothing the second time:
|
|
299
388
|
|
|
300
389
|
```bash
|
|
301
|
-
|
|
390
|
+
council --resume runs/<id> --max-usd 10
|
|
302
391
|
```
|
|
303
392
|
|
|
304
393
|
A stage replays only if it would be asked the same thing again: the task text, the chain config
|
|
@@ -312,11 +401,11 @@ changed prompt: it is set aside the same way and the run asks you again.
|
|
|
312
401
|
The cap governs one run. To see what you have spent across all of them:
|
|
313
402
|
|
|
314
403
|
```bash
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
404
|
+
council --spend # today
|
|
405
|
+
council --spend --days 7 # the last week
|
|
406
|
+
council --cost-today # today by calendar day, with a per-model breakdown
|
|
407
|
+
council --cost-today --date 2026-09-01
|
|
408
|
+
council --stats --days 30 # how the debate mechanism itself is doing
|
|
320
409
|
```
|
|
321
410
|
|
|
322
411
|
That is read back off the run folders on disk - there is no ledger file, nothing is recorded
|
|
@@ -328,7 +417,7 @@ To watch this work without spending anything, the `mock-budget` chain calls no A
|
|
|
328
417
|
fixture prices:
|
|
329
418
|
|
|
330
419
|
```bash
|
|
331
|
-
|
|
420
|
+
council --task tasks/your-idea.md --chain mock-budget --max-usd 1
|
|
332
421
|
```
|
|
333
422
|
|
|
334
423
|
If a chain pauses for your input, it writes `NEEDS-<stage>.md` into the run folder and tells you
|
|
@@ -336,7 +425,7 @@ how to resume:
|
|
|
336
425
|
|
|
337
426
|
```bash
|
|
338
427
|
# write your answer to runs/<id>/answers.md, then:
|
|
339
|
-
|
|
428
|
+
council --resume runs/<id>
|
|
340
429
|
```
|
|
341
430
|
|
|
342
431
|
## Quick start (MCP)
|
|
@@ -347,9 +436,8 @@ Register the server with your MCP client. No clone needed - from the published n
|
|
|
347
436
|
claude mcp add council -- npx -y the-high-council council --mcp
|
|
348
437
|
```
|
|
349
438
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
plugin-marketplace routes below need that access too.
|
|
439
|
+
The same line with `npx -y github:muad-yasin/the-high-council-mcp` runs the current source
|
|
440
|
+
instead.
|
|
353
441
|
|
|
354
442
|
Or from a clone of this repo:
|
|
355
443
|
|
|
@@ -378,20 +466,16 @@ clone itself, so run `npm install` in it first.
|
|
|
378
466
|
Registering with a client other than Claude Code (DeepSeek Harness, OpenHands, Cline, goose,
|
|
379
467
|
Continue): [docs/mcp-clients.md](docs/mcp-clients.md) has the real config for each.
|
|
380
468
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
Either way the server reads and writes in **your** working directory, not inside the package:
|
|
388
|
-
`.env` for keys, `tasks/` for requests, `runs/` for output, and a `chains/` of your own takes
|
|
389
|
-
precedence over the bundled ones.
|
|
469
|
+
Whichever way you add it, the server reads and writes in **your** working directory, not inside
|
|
470
|
+
the package: `.env` for keys, `tasks/` for requests, `runs/` for output, and a `chains/` of your
|
|
471
|
+
own takes precedence over the bundled ones. In a git project, add `.env` (and `runs/` if your
|
|
472
|
+
ideas are private) to `.gitignore` before an agent commits everything; `council doctor` warns
|
|
473
|
+
when `.env` is not ignored.
|
|
390
474
|
|
|
391
|
-
To run it by hand
|
|
475
|
+
To run it by hand:
|
|
392
476
|
|
|
393
477
|
```bash
|
|
394
|
-
|
|
478
|
+
council --mcp # from a clone: npm run mcp
|
|
395
479
|
```
|
|
396
480
|
|
|
397
481
|
Then drive it with these tools:
|
|
@@ -425,7 +509,7 @@ for anyone with a subscription, since the project's cost story depends on it.
|
|
|
425
509
|
|
|
426
510
|
## Chains
|
|
427
511
|
|
|
428
|
-
|
|
512
|
+
49 chain configs live in `chains/`. Each one is plain JSON - the seat roster, which models fill
|
|
429
513
|
which seat, the round cap, and whether proposals/debate/handoff stages run. They are meant to be
|
|
430
514
|
copied and edited.
|
|
431
515
|
|
|
@@ -461,57 +545,6 @@ Read a chain's `description` field before running it; they say what they cost yo
|
|
|
461
545
|
before. **No efficacy claim**: this ships the mechanism, not evidence that it helps - see
|
|
462
546
|
CHANGELOG.md's 0.6.0 entry.
|
|
463
547
|
|
|
464
|
-
## New in 0.6.0
|
|
465
|
-
|
|
466
|
-
- **Role-assigned debate seats** - see the `role` field above. Ships the mechanism only; whether
|
|
467
|
-
it changes anything about a real debate is untested by this release.
|
|
468
|
-
- **`report.json`'s `debate.diagnostics`** - four failure-mode signals computed from a run's own
|
|
469
|
-
real debate output (never from an offline probe): a seat quoting no evidence despite objecting
|
|
470
|
-
or merging, textual overlap between differently-lensed seats' posts on the same proposal, a
|
|
471
|
-
same-run gap between role-bearing and role-less seats' evidence quoting, and the share of a
|
|
472
|
-
seat's own words that fall inside quoted evidence versus voice. Present (with nulls/empty
|
|
473
|
-
flags where there's nothing to compute) on any run that had a debate stage; absent otherwise.
|
|
474
|
-
- **`debate.tie_break`** - a `report.json` field recording a weighted-tiebreak event, when one
|
|
475
|
-
fires. Not yet wired into a live vote-counting decision in this release.
|
|
476
|
-
- **`PERSONAS.md`** - the five default public persona names and their voice directives, and how
|
|
477
|
-
an operator replaces the whole set with their own via `COUNCIL_PERSONAS_FILE`.
|
|
478
|
-
|
|
479
|
-
## New in 0.5.0
|
|
480
|
-
|
|
481
|
-
- **`council init [--yes]`** - the first thing to run in a fresh clone with no keys yet. Prints a
|
|
482
|
-
key check, writes a starter chain and task file you own (`chains/my-first-chain.json`,
|
|
483
|
-
`tasks/my-first-task.md` - a rerun never overwrites an edit you made to either), prices the
|
|
484
|
-
starter chain with no network call, then runs a canned, all-mock, $0 task end to end so the
|
|
485
|
-
first thing you inspect is a real run folder, not just terminal output.
|
|
486
|
-
- **`council doctor --chain <file>`** - lints one chain config before you ever run it: a seat
|
|
487
|
-
under a misspelled key (never wired to any stage), a missing or empty `seats.critics` (the
|
|
488
|
-
review round can't run), or a seat naming a provider this codebase doesn't know. The same check
|
|
489
|
-
also runs automatically, fail-loud, the moment you try to actually run a broken chain - before
|
|
490
|
-
any paid call.
|
|
491
|
-
- **`council doctor --scan-artifacts`** - scans your `tasks/` and `chains/` for the key formats
|
|
492
|
-
listed in `src/secret-patterns.js` before you commit or share them. A format not on that list is
|
|
493
|
-
not caught. Reports the file and line, never the matched text.
|
|
494
|
-
- **`council --forecast-cost --chain <name> [--days N]`** - a realistic-case USD range for a
|
|
495
|
-
chain, built from its own historical runs on your machine and repriced at today's rates -
|
|
496
|
-
distinct from `--dry-run`'s worst-case estimate from a chain's declared token assumptions.
|
|
497
|
-
- **`council export-board --run <folder> --out <file>`** - a run's proposals, debate, replies and
|
|
498
|
-
verdict as one self-contained HTML file. No external assets, no server, `<details>` sections.
|
|
499
|
-
- **`council replay --run <folder> [--json]`** - a numbered, step-by-step transcript of a run's
|
|
500
|
-
reasoning in your terminal, with a `--json` mode for scripting.
|
|
501
|
-
- **A structured error catalog** (`COUNCIL-E001`-`COUNCIL-E005`, see [TROUBLESHOOTING.md](TROUBLESHOOTING.md))
|
|
502
|
-
for the hard-fail paths this project actually has - a missing key, an unpriced model, a
|
|
503
|
-
malformed chain file, an unreadable stage reply - each with a plain-words cause, a concrete fix
|
|
504
|
-
naming the real file, and a doc pointer. Degradable conditions exit 5; fatal ones exit 6.
|
|
505
|
-
- **Structured per-stage JSON logs** - every run now also writes `stage-log.jsonl` (one line per
|
|
506
|
-
stage: seat, lab, token counts, cost, timing - no prompt content) alongside the existing
|
|
507
|
-
markdown/`report.json` artifacts.
|
|
508
|
-
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - the three smallest landable contribution shapes, for
|
|
509
|
-
anyone who wants to send a PR rather than only file an issue.
|
|
510
|
-
|
|
511
|
-
None of the above change any existing chain's behaviour. `schemaVersion` and
|
|
512
|
-
`max_proposals_per_seat` are both opt-in; a chain file that predates 0.5.0 runs exactly as it did
|
|
513
|
-
before.
|
|
514
|
-
|
|
515
548
|
## How this was built
|
|
516
549
|
|
|
517
550
|
Vibecoded, with **Claude Code** doing the writing, by one person at
|
|
@@ -602,16 +635,14 @@ what each rule guards against and why. Copy the folders you want into your proje
|
|
|
602
635
|
|
|
603
636
|
## Privacy
|
|
604
637
|
|
|
605
|
-
This tool
|
|
606
|
-
collect nothing. Stated plainly, not as a claim about quality:
|
|
638
|
+
This tool collects nothing. Stated plainly, not as a claim about quality:
|
|
607
639
|
|
|
608
640
|
- No telemetry, no analytics, no tracking of any kind, anywhere in this repo.
|
|
609
641
|
- The only network calls this tool ever makes are to the AI provider APIs you configure with
|
|
610
642
|
your own keys (`ANTHROPIC_API_KEY`, `OPENROUTER_API_KEY`, and so on) - and only when you start
|
|
611
643
|
a real run with a non-mock, non-external seat. `council doctor` and `council demo` make zero
|
|
612
644
|
network calls; both are implemented to read only local files and environment variable names.
|
|
613
|
-
- The landing page
|
|
614
|
-
repository is private) ships no JavaScript and loads no third-party resource - see
|
|
645
|
+
- The landing page in `docs/` ships no JavaScript and loads no third-party resource - see
|
|
615
646
|
`test/landing-page.test.js`, which fails the build if either ever changes.
|
|
616
647
|
- Everything a run produces - the task, the debate, the deliverable, the cost - is written to a
|
|
617
648
|
folder on your own disk (`runs/<id>/`) and nowhere else. Deleting that folder deletes the
|
|
@@ -646,8 +677,10 @@ hand, 2026-09-13, on the live site:
|
|
|
646
677
|
|
|
647
678
|
## Reporting a bug
|
|
648
679
|
|
|
649
|
-
|
|
650
|
-
|
|
680
|
+
Open an issue at
|
|
681
|
+
[github.com/muad-yasin/the-high-council-mcp/issues](https://github.com/muad-yasin/the-high-council-mcp/issues).
|
|
682
|
+
For anything security-related, or that should not be public, write to
|
|
683
|
+
[contact@sower-industries.de](mailto:contact@sower-industries.de) instead.
|
|
651
684
|
|
|
652
685
|
## If this makes you money
|
|
653
686
|
|
package/TROUBLESHOOTING.md
CHANGED
|
@@ -56,3 +56,51 @@ starts, so nothing was spent.
|
|
|
56
56
|
**Fix:** if the file itself won't parse, fix its JSON syntax. Otherwise, either
|
|
57
57
|
change the chain so it no longer violates the listed limit(s), or change
|
|
58
58
|
`policy.json` if the limit itself was wrong. See [docs/policy.md](docs/policy.md).
|
|
59
|
+
|
|
60
|
+
## Before any code: first-run problems
|
|
61
|
+
|
|
62
|
+
These have no code of their own. Each is something a first-time user hit when the path was
|
|
63
|
+
walked from zero (2026-09-25).
|
|
64
|
+
|
|
65
|
+
### `council: command not found`
|
|
66
|
+
|
|
67
|
+
`council` is only a command after `npm install -g the-high-council`. With `npx`, type
|
|
68
|
+
`npx the-high-council` wherever the docs say `council` (for example
|
|
69
|
+
`npx the-high-council doctor`). The CLI's own hints use the `npx` form when you started it
|
|
70
|
+
with `npx`.
|
|
71
|
+
|
|
72
|
+
### `HTTP 401` - the key was not accepted
|
|
73
|
+
|
|
74
|
+
The provider rejected the key in the named variable (for example `OPENROUTER_API_KEY`). Check
|
|
75
|
+
that it was copied whole, with no quotes or spaces around it, that it is still active on the
|
|
76
|
+
provider's site, and that it belongs to that provider (an OpenAI key does not work as an
|
|
77
|
+
OpenRouter key). Fix `.env`, then `council --resume runs/<id>`.
|
|
78
|
+
|
|
79
|
+
### `HTTP 402` - no credit
|
|
80
|
+
|
|
81
|
+
The provider would not bill the call: the account has no credit or reached its own spend limit.
|
|
82
|
+
A new account usually needs credit added before paid models answer. Add it on the provider's
|
|
83
|
+
site, then resume. Completed stages replay for free.
|
|
84
|
+
|
|
85
|
+
### `HTTP 403` - refused
|
|
86
|
+
|
|
87
|
+
A disabled key, a model your account is not allowed to use, or a block on the provider's side.
|
|
88
|
+
Check the key and the model name on the provider's site.
|
|
89
|
+
|
|
90
|
+
### `nothing is listening at http://localhost:11434`
|
|
91
|
+
|
|
92
|
+
A seat uses `ollama` and no Ollama server is running. Start Ollama (the app, or `ollama serve`),
|
|
93
|
+
pull every model the chain names (`ollama pull llama3.1`), then resume. `council doctor` lists
|
|
94
|
+
local chains as runnable because they need no key, not because the server is up.
|
|
95
|
+
|
|
96
|
+
### A run stopped with `STOPPED: per-run spend cap reached` (exit 4)
|
|
97
|
+
|
|
98
|
+
The next stage's worst case would have crossed the cap. Nothing past the cap was spent, and no
|
|
99
|
+
plan was written yet. `council --resume runs/<id> --max-usd <higher>` continues from where it
|
|
100
|
+
stopped. The run tells you at the start when a chain's worst case is above your cap.
|
|
101
|
+
|
|
102
|
+
### `.env holds your API keys and git would commit it`
|
|
103
|
+
|
|
104
|
+
`council doctor` found a `.env` in a git repository that `.gitignore` does not cover. Add a line
|
|
105
|
+
`.env` to `.gitignore` before the next commit. If a key was ever committed or pushed, revoke it on
|
|
106
|
+
the provider's site and make a new one: deleting the file later does not remove it from history.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mock-criteria-kinds",
|
|
3
|
+
"description": "Offline. Calls no API and costs nothing. The mock chain with criterion kinds on: every criterion is checkable (with its command) or judgement, and the board counts them.",
|
|
4
|
+
"maxRounds": 2,
|
|
5
|
+
"stopOnPass": true,
|
|
6
|
+
"handoff": true,
|
|
7
|
+
"criteria_kinds": { "enabled": true },
|
|
8
|
+
"estimate": { "promptTokens": 1000, "draftTokens": 1000, "critiqueTokens": 300 },
|
|
9
|
+
"seats": {
|
|
10
|
+
"criteria": { "provider": "mock", "model": "mock-criteria" },
|
|
11
|
+
"builder": { "provider": "mock", "model": "mock-builder" },
|
|
12
|
+
"reviser": { "provider": "mock", "model": "mock-builder" },
|
|
13
|
+
"critics": [
|
|
14
|
+
{ "provider": "mock", "model": "mock-critic-a" },
|
|
15
|
+
{ "provider": "mock", "model": "mock-critic-bare-met" }
|
|
16
|
+
],
|
|
17
|
+
"handoff": { "provider": "mock", "model": "mock-builder" }
|
|
18
|
+
}
|
|
19
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "the-high-council",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.7",
|
|
4
|
+
"mcpName": "io.github.muad-yasin/the-high-council",
|
|
4
5
|
"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
6
|
"type": "module",
|
|
7
|
+
"main": "./src/api.js",
|
|
8
|
+
"types": "./types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./types/index.d.ts",
|
|
12
|
+
"import": "./src/api.js",
|
|
13
|
+
"default": "./src/api.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
6
17
|
"license": "MIT",
|
|
7
18
|
"bin": {
|
|
8
19
|
"council": "src/cli.js"
|
|
@@ -44,6 +55,8 @@
|
|
|
44
55
|
"files": [
|
|
45
56
|
"src/",
|
|
46
57
|
"chains/",
|
|
58
|
+
"schemas/",
|
|
59
|
+
"types/",
|
|
47
60
|
"README.md",
|
|
48
61
|
"TROUBLESHOOTING.md",
|
|
49
62
|
"CONTRIBUTING.md",
|
|
@@ -70,6 +83,7 @@
|
|
|
70
83
|
"cli"
|
|
71
84
|
],
|
|
72
85
|
"devDependencies": {
|
|
73
|
-
"@yao-pkg/pkg": "6.22.0"
|
|
86
|
+
"@yao-pkg/pkg": "6.22.0",
|
|
87
|
+
"ajv": "^8.20.0"
|
|
74
88
|
}
|
|
75
89
|
}
|