llm-ingestion-okf/src/llm_ingestion_okf
Kjell Tore Guttormsen e3408435d0 feat(mcp): the server carries the working method, and describe fans out
**A subagent inherits its session's MCP tools; it does not inherit its skills.**
So the method A3 put in the skill reaches the main thread and no arm running
below it, and the one place every caller sees is the server's own
`instructions` and its tool descriptions. Both are truncated by Claude Code at
2 KB, and truncation is worse than rejection here -- a reader gets the first
half of a method and no sign the rest existed -- so what travels is the SHORT
form and the long one stays in the skill, which has no such cap. A test holds
it under the limit WITH a control, so the assertion is a measurement and not a
tautology.

`okf_describe` without `bundle_id` now describes every served bundle, where it
refused and `okf_ask` in the same position fanned out. The tool a caller is
told to read FIRST was the one requiring a name it did not have yet, and a
tool that refuses the call its sibling accepts is a shape a client must be
told out of band -- the configuration this server exists to remove. The named
call's shape is byte-unchanged, and so is every one-to-one server's: the
fan-out replaces an ERROR, so no caller's bytes move.

`okf project`'s closing lines and the README's first screen carry the one line
the USER runs to register the server on user scope, verified against Claude
Code's own MCP documentation (`claude mcp add [options] <name> -- <command>`).
Nothing here starts Claude Code, and the line says whose it is. Measured:
a project bundle at `<root>/<project>/.okf/<id>` is depth 3, inside
`MAX_DISCOVERY_DEPTH`, so a `--root` server finds what `okf project` wrote --
a test builds one and discovers it rather than reasoning about the walk.

A5, and it was free: `okf skill` without `--out` now refuses in the same
`refused (<code>)` form as every other refusal in this chain. The exit code
does not move -- 2 was already right, "the run did not happen" -- what was
wrong was that a caller parsing our form got argparse's line on the one flag
everybody forgets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 00:03:59 +02:00
..
__init__.py feat(build): name the documents the gate refused whole, and close as 1.0.0 2026-09-20 21:44:49 +02:00
_pandoc.py feat(extract): resolve the vendored converter and refuse an unpinned version 2026-09-02 14:07:20 +02:00
accounting.py fix(accounting,gate): the conversion claim comes from the run's ledger 2026-09-19 19:12:20 +02:00
assets.py fix(assets): an end-of-line escape at column 0 states no skip, and neither does a delta out of its row 2026-09-19 22:47:29 +02:00
cli.py feat(build): name the documents the gate refused whole, and close as 1.0.0 2026-09-20 21:44:49 +02:00
connectors.py fix(errors): type the NUL-byte path failure as SourceError 2026-07-20 10:30:42 +02:00
consume.py feat(skill): one generic skill by default, carrying a working method and an answer form 2026-09-20 23:53:34 +02:00
contract_check.py feat(skill): one generic skill by default, carrying a working method and an answer form 2026-09-20 23:53:34 +02:00
corpus.py feat(build): name the documents the gate refused whole, and close as 1.0.0 2026-09-20 21:44:49 +02:00
errors.py feat(assets): every carried image is one a model can be shown 2026-09-19 08:07:04 +02:00
extract.py feat(extract): one normalisation door removes U+00AD before the guard 2026-09-19 06:10:53 +02:00
guard_adapter.py fix(gate,propose): okf build runs a real guard; a code fence declares no structure 2026-09-16 00:19:50 +02:00
importer.py feat(assets): a bundle carries the images its sources declare (0.10.0) 2026-09-17 10:01:31 +02:00
inbox.py fix(accounting,gate): the conversion claim comes from the run's ledger 2026-09-19 19:12:20 +02:00
manifest.py feat(profiles): materialize_bundle takes a keyword-only profile (req 6) 2026-07-31 15:37:17 +02:00
materialize.py docs(k3): round 24, a reason that became false is struck and the emitter stays flow 2026-09-12 16:50:26 +02:00
mcp_server.py feat(mcp): the server carries the working method, and describe fans out 2026-09-21 00:03:59 +02:00
profiles.py feat(assets): a bundle carries the images its sources declare (0.10.0) 2026-09-17 10:01:31 +02:00
project.py feat(mcp): the server carries the working method, and describe fans out 2026-09-21 00:03:59 +02:00
propose.py feat(assets): a bundle carries the images its sources declare (0.10.0) 2026-09-17 10:01:31 +02:00
py.typed feat(typing): ship the PEP 561 py.typed marker 2026-07-17 03:46:51 +02:00
quality.py fix(consume): every read path into a bundle is contained, not just okf_fetch 2026-09-20 15:20:38 +02:00
render.py feat(errors): stable machine-readable codes on IngestError 2026-07-17 04:01:04 +02:00
segmentation.py feat(consume): parent reaches the reader -- excerpt field, body link, checker rule 2026-09-11 12:36:23 +02:00
skill.py feat(mcp): the server carries the working method, and describe fans out 2026-09-21 00:03:59 +02:00
structure.py feat(assets): a bundle carries the images its sources declare (0.10.0) 2026-09-17 10:01:31 +02:00