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 CHANGED
@@ -1,28 +1,28 @@
1
1
  # The High Council
2
2
 
3
- > **Repository status (2026-09-22): going private until the open-source release.** Development
4
- > continues in a private repository, and the public open-source release is planned for later this
5
- > year. Until then, the published npm package `the-high-council` (0.7.6) stays installable as it
6
- > is, and the `npx github:...` lines below only work for someone with access to this repository.
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
- Add it to Claude Code as an MCP server the same way:
14
-
15
- claude mcp add council -- npx -y the-high-council council --mcp
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
- *(With access to this repository, `npx github:muad-yasin/the-high-council-mcp council demo` runs
18
- the current source instead of the published package.)*
18
+ Add it to Claude Code as an MCP server:
19
19
 
20
- A planning harness that runs one idea past several AI models from different labs, makes them
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
- **A visual walkthrough of all of this - the stages, one real run's debate board, and what that run
37
- cost - is at [muad-yasin.github.io/the-high-council-mcp](https://muad-yasin.github.io/the-high-council-mcp/).**
38
- A different write-up, built around one run's actual debate board, is at
39
- [sower-industries.de/en/MCP/](https://sower-industries.de/en/MCP/).
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
- "signoff": [ { "provider": "qwen", "model": "...", "signedOff": false,
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
- on your own disk. Nothing transmits it anywhere - but if you are rendering a board onto a public
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
- git clone https://github.com/muad-yasin/the-high-council-mcp.git
144
- cd the-high-council-mcp
145
- npm install
146
- cp .env.example .env
215
+ npm install -g the-high-council
216
+ council doctor
147
217
  ```
148
218
 
149
- Fill in `.env` with only the keys your chosen chain needs. Supported providers:
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
- node src/cli.js --help
222
- npm run dry -- --task tasks/your-idea.md --chain verify
307
+ council --help
308
+ council --task tasks/your-idea.md --chain verify --dry-run
223
309
 
224
310
  # a real run
225
- node src/cli.js --task tasks/your-idea.md --chain verify
311
+ council --task tasks/your-idea.md --chain verify
226
312
  ```
227
313
 
228
- `tasks/` and `runs/` are both gitignored. Your requests and everything the council writes about
229
- them stay on your machine - if you fork this repo, you will not accidentally publish them.
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 cheap default: two labs, a hard two-round cap. Start there.
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
- node src/cli.js --task tasks/x.md --max-usd 2 # this run stops at $2
291
- node src/cli.js --task tasks/x.md --max-usd none # no ceiling
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
- node src/cli.js --resume runs/<id> --max-usd 10
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
- node src/cli.js --spend # today
316
- node src/cli.js --spend --days 7 # the last week
317
- node src/cli.js --cost-today # today by calendar day, with a per-model breakdown
318
- node src/cli.js --cost-today --date 2026-09-01
319
- node src/cli.js --stats --days 30 # how the debate mechanism itself is doing
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
- node src/cli.js --task tasks/your-idea.md --chain mock-budget --max-usd 1
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
- node src/cli.js --resume runs/<id>
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
- With access to this repository (private until the open-source release), the same line with
351
- `npx -y github:muad-yasin/the-high-council-mcp` runs the current source instead. The clone and
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
- An npm package is also live:
382
-
383
- ```bash
384
- claude mcp add high-council -- npx -y the-high-council --mcp
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, from a clone:
475
+ To run it by hand:
392
476
 
393
477
  ```bash
394
- npm run mcp # or: node src/cli.js --mcp
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
- 48 chain configs live in `chains/`. Each one is plain JSON - the seat roster, which models fill
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 and the [demo page](https://muad-yasin.github.io/the-high-council-mcp/demo.html)
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 (`docs/`, moving from GitHub Pages to sower-industries.de while this
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
- Write to [contact@sower-industries.de](mailto:contact@sower-industries.de). (GitHub issues open
650
- again with the public release; while the repository is private, email is the only route.)
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
 
@@ -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.6",
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
  }