`okf project` built a bundle two rules behind `okf build`. `cli.build`'s signature defaulted `keep_table_heading` and `sheet_section_rows` to `False` while argparse defaulted both to `True`, and `project.create` calls `build()` as a function. Measured on a five-document folder: 15 concepts / 30 files where `okf build` wrote 26 / 52, the whole difference in the priced sheet -- the document a question about price has to reach. The invariant test could not see it: it compared `project.create` against the same function, and its two fixture documents had neither a table nor a sheet. Both gaps are tests now, and the two paths are byte-equal on that folder (`diff -rq`, 0 differences). README opens with what / one install line / two commands / the three shapes of request; the phase-status paragraph moved down, nothing deleted. One tag is pinned everywhere: README pinned v0.4.0 on its install lines and v0.6.0 below, llms.txt pinned v0.4.0, so an agent reading from the top installed a tag without `okf project`. The skill states three modes -- question, hypothesis (per premise, `confirmed` / `refuted` / `undecidable-from-bundle`), and a task producing a document (source per claim in the artefact, an ungrounded paragraph written and marked rather than dropped, the cut declared inside the document). The five markings are untouched. Generated skills state relative paths in the project layout: `okf consume .okf/<id>` and `okf check --skill .claude/skills/<id>-consume/SKILL.md`, runnable from where `okf project` tells the reader to start `claude`. Two absolute paths to zero, measured with a query shown capable of finding first -- O5's published "4 -> 0" used `grep -c "^/"` against paths indented by two spaces. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
34 lines
1.5 KiB
Text
34 lines
1.5 KiB
Text
# llm-ingestion-okf
|
|
|
|
> Turn a folder of documents (PDF, DOCX, XLSX, PPTX, MD) into a bundle a model can answer from with a source on every claim. Offline and deterministic: no model call anywhere in the run path. Security is delegated to llm-ingestion-guard.
|
|
|
|
Requires Python 3.10+ and [uv](https://docs.astral.sh/uv/). Neither this package
|
|
nor the guard it depends on is on a package index yet; one command resolves both:
|
|
|
|
```sh
|
|
uv tool install "llm-ingestion-okf[extract] @ git+https://git.fromaitochitta.com/open/llm-ingestion-okf.git@v0.7.0"
|
|
```
|
|
|
|
Then, in the folder you want to work from:
|
|
|
|
```sh
|
|
okf project ~/my-documents
|
|
claude
|
|
```
|
|
|
|
`okf project` writes the bundle to `.okf/<id>/` and a Claude Code skill to
|
|
`.claude/skills/<id>-consume/` in the current directory. Start `claude` there
|
|
and ask in plain language. Three shapes of request are supported and the
|
|
generated skill states the rules for each: a **question**, a **hypothesis**
|
|
(answered per premise as `confirmed` / `refuted` / `undecidable-from-bundle`),
|
|
and a **task whose answer is a document** (every claim in the written file
|
|
carries its source; an ungrounded paragraph is written and marked, never
|
|
dropped).
|
|
|
|
## Docs
|
|
|
|
- [Consume in Claude Code](README.md#consume-in-claude-code): the same thing in
|
|
steps, several bundles in one project, and what was measured.
|
|
- [README](README.md): the pip-only fallback if uv is unavailable, the guard
|
|
pairing per tag, the build flags, phase status, and the upstream OKF version
|
|
policy.
|