skill: agents reach the mind through the huginn CLI, not the eureka-state MCP

Ruling eureka-body:ruling:cli-over-mcp-agent-surface. Exact command forms in
campaign-state.md; MCP kept as the fallback for shell-less clients. persona_get
and persona_put have no CLI verb: recorded as a known gap. tools/mind.py and
tools/recall.py (MCP-bound scripts) are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Eureka 2026-10-31 04:33:28 +01:00
commit 5a03635431
6 changed files with 44 additions and 32 deletions

View file

@ -43,11 +43,11 @@ This block is the one definition of rehydration; the other files point here.
## Rehydrate
```
Campaign state lives in the instance's mind, through the eureka-state tools
(whoami, admit, view, query). Recipes are in references/campaign-state.md.
0. If those tools are not in your tool surface, stop and report that. Never
Campaign state lives in the instance's mind, through the huginn CLI
(huginn whoami, admit, view, query; `huginn --help`). Recipes are in references/campaign-state.md.
0. If `huginn` does not run in your shell, stop and report that. Never
work from prose or memory instead.
1. Call whoami. On Unavailable, retry once; if it still does not answer, stop
1. Run `huginn whoami`. On Unavailable, retry once; if it still does not answer, stop
and report the error. Self will continue you once the mind answers.
2. Run the campaigns recipe. If there is no campaign, or <c> is not among
them, stop and report which.
@ -68,7 +68,7 @@ call again, otherwise revise the batch.
Self's own checklist; Self admits as `SelfFaculty`.
```
Open: check the eureka-state tools are present, then whoami (the mind's
Open: check `huginn` runs, then `huginn whoami` (the mind's
instance document, <instance>:instance:self, already exists). Write the target
document and commit it on the working branch. Then admit the campaign
(slug, title, every repo a cut may touch, working_branch, target_doc = a

View file

@ -4,7 +4,7 @@ A campaign keeps its state in two places, and nothing lives in both.
- **The mind.** Questions, rulings, cut specs, reports, verdicts, findings,
follow-ups and resolutions are typed documents in the instance's mind, held by
Huginn and reached through the `eureka-state` MCP tools. Status is derived
Huginn and reached through the `huginn` CLI. Status is derived
from them on every read; nobody writes it.
- **The prose.** A target document and a map document, committed in the repo
the campaign changes. They keep only what no kind carries: body facts (probes
@ -15,17 +15,20 @@ The shapes below are the leaf's (`epiphany-pipeline`, pinned by Huginn) and the
organ's (`huginn-mind`). Where this page and the tools' own schemas disagree,
the tools are right and this page is stale.
## The tools
## The CLI
The instance and the daemon are the server's configuration
(`EUREKA_INSTANCE`, `HUGINN_ENDPOINT`), never an argument.
The instance and the daemon are the environment (`EUREKA_INSTANCE`,
`HUGINN_ENDPOINT`), never an argument. The table names each tool's input and
answer; the CLI form is in the first column. `huginn --help` and
`huginn schema [kind]` are the source. A client without a shell may use the
`eureka-state` MCP, whose tools these are, until a native `huginn` is installed.
| Tool | Input | Answer |
| CLI | Input | Answer |
|---|---|---|
| `whoami` | `{}` | `{ instance, endpoint, reachable, status }`. `status` is `{ instance, schema_epoch, documents, receipts, index }`, and `index` is `Current`, `Reconciling`, `Behind`, `Failing` or `Refused`. When unreachable, `error` says why. |
| `admit` | `{ faculty, agent, session, documents }` | `Committed { receipt_id, committed_at, writes }`, `AlreadyAdmitted { receipt_id }`, `Conflict { identities }` or `Refused(<refusal>)`. One to 64 documents, admitted whole or not at all. |
| `view` | `{ id: { kind, id } }` | `{ id, document, admission, status }`, or `null`. |
| `query` | `{ selection, semantic? }` | `{ matched, as_of, next, items, edges }`. `items` is `Headers([...])` or `Documents([...])`. |
| `huginn whoami` | none | `{ instance, endpoint, reachable, status }`. `status` is `{ instance, schema_epoch, documents, receipts, index }`, and `index` is `Current`, `Reconciling`, `Behind`, `Failing` or `Refused`. When unreachable, `error` says why. |
| `huginn admit --faculty F --agent A --session S <file or ->` | a JSON array of 1 to 64 `{kind, value}` documents (file or stdin) | `Committed { receipt_id, committed_at, writes }`, `AlreadyAdmitted { receipt_id }`, `Conflict { identities }` or `Refused(<refusal>)`. One to 64 documents, admitted whole or not at all. |
| `huginn view <root:kind:local> [--raw]` | the document id | `{ id, document, admission, status }`, or `null`. |
| `huginn query '<selection json>' [--near TEXT --top-k N] [--documents]` (or `@file`, or `-`) | the selection alone; `--near` is `semantic` | `{ matched, as_of, next, items, edges }`. `items` is `Headers([...])` or `Documents([...])`. |
- `faculty` is one of `SelfFaculty`, `Imagination`, `Hands`, `Soul`,
`Life`, `Eyes`, `Operator`. It is attribution, not authority.
@ -51,9 +54,8 @@ The instance and the daemon are the server's configuration
This is the one rule for every faculty.
1. **The tools are missing** from the session's tool surface: stop and tell the
operator (a subagent tells Self). A server registered after the session
started appears only in a new session. Never fall back to prose.
1. **`huginn` does not run** in the session's shell: stop and tell the
operator (a subagent tells Self). Never fall back to prose.
2. **`Unavailable`:** retry the same call once. A cold semantic embed after an
idle spell took over 15 s live, which is the client's whole timeout.
Retrying `admit` is safe, because an exact replay answers `AlreadyAdmitted`.
@ -192,7 +194,7 @@ or `view` one id, to read the prose fields.
## Recipes
These are the campaign's progress view. `<c>` is the campaign slug. Each recipe is
the `query` tool's whole input. Agents run them from the Rehydrate block in
the `selection` value of `huginn query`; the CLI takes the object inside the `selection` key, and `--near`/`--top-k` replace `semantic`. Named verbs (`huginn campaigns`, `rulings`, `open`, `findings`, `unreported`, `unjudged`, `cut`, `precedent`) run the common recipes. Agents run them from the Rehydrate block in
`briefs.md`, which is the one definition of rehydration.
**Campaigns:**
@ -358,3 +360,10 @@ invariants, not-in-scope list and canonical implementations are the typed
- **Prefer normalizers that parse the format.** Ones that split on text leave
false diffs, as the census normalizer did when it split on `, ` and glued the
first maker to its kind column.
## Known CLI gap
The `eureka-state` MCP also offers `persona_get` and `persona_put`. The `huginn`
CLI has no persona verb (`huginn --help` lists none). Persona state stays on the
MCP until Huginn grows one; this is a Huginn follow-up, not something to fake
with `admit`.