feat(consume): one call over a folder asks every bundle under it

`okf consume <folder>` is the server's `okf_ask` with no bundle named,
byte for byte: no ranking of its own, every excerpt carrying its bundle
id. `--bundle-id` asks one bundle under the folder. A flag that acts on
one bundle's cut is refused by name over a folder rather than dropped,
because the server takes none of them. A bundle path reads as before.

v1.1 order F, part F2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-21 10:29:10 +02:00
commit 718c064279
4 changed files with 194 additions and 4 deletions

View file

@ -1532,6 +1532,14 @@ R761 **8** (S1-S6 + KP + KN), vegnormal **32** questions / **43**
held by a test comparing the printed bytes against the two functions. A
bundle path prints its card exactly as before. Tests over two invented
bundles: `tests/test_folder_of_bundles.py`.
- **`okf consume <folder>` ASKS EVERY BUNDLE UNDER IT IN ONE CALL (v1.1 F2).**
The reply is `mcp_server.call_ask` with no bundle named (or `--bundle-id` as
its `bundle_id`), serialised by the pre-pass's own `serialise` -- no ranking
of its own, held by a test comparing the bytes. `--question` repeats as
before. Every other flag acts on ONE bundle's cut and the server takes none
of them, so over a folder it is REFUSED by name with exit 2
(`consume.FOLDER_FLAGS` is the allowlist), never dropped; `--bundle-id` on a
bundle path is refused the same way. A bundle path reads exactly as before.
- **`okf card <bundle>` and the generic skill are the one-to-many form.** The card is one bundle's identity, concept count,
conditional-field counts and whole-bundle cost as JSON, **DERIVED on every run
and never written into the bundle** -- storing it would move the bytes of all