feat(cli): okf project/consume/check/skill, and a generated skill with no path into a checkout
The reading direction existed only for someone standing in a clone. `consume`, `contract_check` and `skill` moved from `tools/` into the package and are reachable as `okf consume`, `okf check` and `okf skill`; `okf project` is new and does the whole thing in one command. The red measurement: a consumption skill generated from a checkout carried 4 lines naming that checkout by absolute path, 2 of them the commands the skill tells a reader to run. It now names `okf consume` and `okf check`, and a test asserts this repository appears in it nowhere, with a known-positive so the zero is a measurement rather than a search that could not find. The `tools/` files stay as ALIASES, not re-exports: a re-export binds copies of the names into a second module object, so a caller patching one patches a binding the implementation never reads. Two tests that monkeypatch okf_consume went green again only under the alias. Every published reproduction block runs unchanged. The template and docs/consumption-contract.md (the section 7.4 known-positive) are force-included into the wheel from the file they are authored in, so both travel with the commands that cannot run without them and there is still one authored copy of each. Step 0, before any of it: okf build's default gained Arm E (--table-grid), with --no-table-grid as its opt-out. The default moved to D plus F earlier the same day on Arm F's published 5 of 12 -- a figure measured with Arm E ON. Without it the fold has no joined table to fold, and the shipped default scored 2 of 12 with docx 0 of 3. Measured on the operator's folder: 30 md / 15 concepts on the new default against 43 / 28 without Arm E. Install measurement from a fresh uv tool install, empty folder, this repository nowhere on PYTHONPATH: 5 documents in, 15 concepts out, 0 references to tools/ in the generated skill, okf check conformant (15 rules, 0 findings). Deviation stated rather than hidden: the order asked that tests/test_okf_consume.py be left untouched. Two assertions in it read a PATH, which is the one thing this work changes. Both were moved and the second made stronger -- it now asserts every command the README recipe names is a subcommand the CLI registers, which a file existing on disk never proved. Suite 1414 -> 1427. ruff clean, mypy --strict clean over 21 files. Record: docs/2026-09-08-o5-okf-project.md Co-Authored-By: Claude <claude-opus-5>
This commit is contained in:
parent
efa92ce170
commit
f6fea13299
21 changed files with 4017 additions and 2833 deletions
58
CHANGELOG.md
58
CHANGELOG.md
|
|
@ -7,8 +7,65 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.6.0] — 2026-09-08
|
||||
|
||||
The first tag since `v0.5.0a2`, so everything that had accumulated as
|
||||
Unreleased is in it — those sections are kept below, under their own heading,
|
||||
rather than folded together. What follows first is what O5 added, and why the
|
||||
release needed a minor of its own: the installed command grew from one
|
||||
subcommand to five, and one build default moved.
|
||||
|
||||
### Added
|
||||
|
||||
- **`okf consume`, `okf check`, `okf skill` and `okf project` are subcommands
|
||||
of the installed `okf` command.** Until now the pre-pass, the contract
|
||||
checker and the skill generator lived in `tools/` and were reachable only
|
||||
from a clone; a consumer who installed this library could build a bundle and
|
||||
had no way to read one back. Measured before the move: a consumption skill
|
||||
generated from a checkout carried **four** lines naming that checkout by
|
||||
absolute path, two of them the commands the skill tells a reader to run, so
|
||||
the skill could not be moved, shared, or run by anyone else. The generated
|
||||
skill now names `okf consume` and `okf check` — names on PATH — and a test
|
||||
asserts the repository appears in it nowhere, with a known-positive so the
|
||||
zero is a measurement rather than a search that could not find.
|
||||
`tools/okf_consume.py`, `tools/okf_contract_check.py` and `tools/okf_skill.py`
|
||||
remain as thin aliases, so every published reproduction block still runs.
|
||||
- **`okf project <folder>`: a folder of documents to a bundle you can ask a
|
||||
question of, in one command.** It runs `okf build` with this package's
|
||||
default into `<out>/.okf/<id>/`, generates the skill into
|
||||
`<out>/.claude/skills/<id>-consume/`, and prints what it read, what it wrote,
|
||||
which documents are in the folder but not in the bundle, and which landed
|
||||
whole as a single concept — the two cases a question can only be answered
|
||||
`[sourced-not-sufficient]` in. `<out>` defaults to the current directory and
|
||||
`<id>` to the folder's name reduced to `[a-z0-9-]`. It owns no flag that
|
||||
changes a bundle's bytes, and a test holds the project bundle byte-equal to
|
||||
the `okf build` bundle of the same folder.
|
||||
- **`skills/okf-prosjekt/`**, a Claude Code skill (Norwegian) that wraps
|
||||
`okf project` and reads its summary back.
|
||||
- **The template and the contract document travel in the wheel.** `okf skill`
|
||||
instantiates `skills/okf-consume-template/SKILL.md` and `okf consume`
|
||||
measures `docs/consumption-contract.md` as its section 7.4 known-positive;
|
||||
neither was installable before. Both are force-included from the file they
|
||||
are authored in, so there is still exactly one copy of each.
|
||||
|
||||
### Changed
|
||||
|
||||
- **`okf build`'s default now includes Arm E (`--table-grid`), with
|
||||
`--no-table-grid` as its opt-out.** The default moved to Arm D plus Arm F
|
||||
earlier in the same day; measured afterwards, that combination is Arm F with
|
||||
nothing to fold. The fold's table clause folds a table back into the heading
|
||||
that introduces it, and with Arm E off a grid table is not one block but one
|
||||
block per rule line. On the operator's twelve-document reference the shipped
|
||||
default scored **2 of 12** and `docx` **0 of 3**, against the **5 of 12** the
|
||||
fold was published with — which had been measured with Arm E on. Three arms
|
||||
are now on by default, each with an explicit opt-out; `--outline-run 0
|
||||
--no-table-grid --no-unit-fold` reproduces the pre-2026-09-08 bytes.
|
||||
- **This tag does not make OKF v0.2 generally available.** `OKF_LATEST` is
|
||||
unchanged.
|
||||
|
||||
### Also in this release: everything that had accumulated since v0.5.0a2
|
||||
|
||||
|
||||
- **The corpus harness (`tools/okf_corpus_run.py`) can replay segmentation
|
||||
plans, and it writes the bundle's `log.md`.** `--plans-dir` names the
|
||||
proposals to replay and the profile follows from it; `--bundle-id` and
|
||||
|
|
@ -600,6 +657,7 @@ Phase 1 (Door A) implemented against the normative `ingest-spec.md` owned by
|
|||
- The Door A public surface: `materialize_bundle` plus the typed error hierarchy
|
||||
rooted in `IngestError`.
|
||||
|
||||
[0.6.0]: https://git.fromaitochitta.com/open/llm-ingestion-okf/compare/v0.5.0a2...v0.6.0
|
||||
[0.5.0a2]: https://git.fromaitochitta.com/open/llm-ingestion-okf/compare/v0.5.0a1...v0.5.0a2
|
||||
[0.5.0a1]: https://git.fromaitochitta.com/open/llm-ingestion-okf/compare/v0.4.0...v0.5.0a1
|
||||
[0.4.0]: https://git.fromaitochitta.com/open/llm-ingestion-okf/compare/v0.3.2...v0.4.0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue