chore(release): prepare 1.1.0 — version sync, changelog, front-page limitations

Version 1.1.0 in pyproject, the package, uv.lock and every README install
line; the "current tag" entry moves to v1.1.0 and v1.0.0 becomes history.
The CHANGELOG states what a user notices: BM25 ranking on passages and
titles, sub-questions in one call, a map per bundle, a weak-coverage
signal, one generic skill plus the server as the standard way in over a
folder, --gate in okf project, and okf-consumption/2 as BREAKING for a
reader of withheld. Known limitations gain the vocabulary route through
the map, the retrieval gate's red rows as they stand under BM25, the
answer smoke test (no corpus content, no counts) and unmeasured speed.

eval/svar/ is ignored the way eval/soek's sets are: answers about a
consumer's corpus are inputs, never committed. No tag, no push.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-21 12:18:54 +02:00
commit 43499c0ca5
6 changed files with 118 additions and 14 deletions

View file

@ -5,6 +5,81 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.1.0] — 2026-09-21
The reading side. Nothing here changes how a bundle is built from a folder;
what changes is how a question finds its way into one, and how many bundles
one question can reach.
### Changed
- **A new default ranking: BM25 over passages and titles.** A concept is scored
on its best 500-character passage and on a title/path-weighted field, and the
two are fused by rank. A concept longer than 4 000 characters is delivered as
its answering passage, with `passage: {start, end, of}` saying where in the
concept it sits. The previous fusion stays reachable as `--ranking fusion`.
A reader will see different excerpts, in a different order, for the same
question on the same bundle.
- **BREAKING for anyone who reads the payload: the contract is
`okf-consumption/2`.** `withheld` is no longer a list with one entry per
concept left out; it is a mapping with `total`, `by_rule`, `nearest` (the
best-ranked drops by name, title and source document, 20 by default) and
`complete`. Measured on a large real bundle, the old list was about two
thirds of the written payload and none of it counted against the budget the
payload reported. `--withheld-full` brings the whole list back. The revision
was bumped so that code indexing `withheld` as a list fails loudly instead of
reading the wrong thing. `--withheld-titles` is retired.
- **The server and the generic skill are the standard way in, over a whole
folder.** `okf project` and the front page say it in that order: register
`okf mcp --root` once, on user scope, and every project can ask every bundle
under it; the skill beside a bundle is the supplement for someone who would
rather register nothing. Neither is made again when a bundle is rebuilt.
- **`okf skill` writes ONE generic skill by default**, carrying a working
method and an answer form and no bundle's numbers, so it does not go stale
when a bundle is rebuilt. `--for-bundle` keeps the per-bundle form.
`okf project` puts it at `.claude/skills/okf-consume-any/`.
### Added
- **Several sub-questions in one call.** `okf consume --question A --question
B` (and `questions` on the server's `okf_ask`) reads the bundle once, cuts
each sub-question as if asked alone and interleaves the deliveries under the
same `k` and byte limit. One question gives exactly the payload it gave
before.
- **A map per bundle.** `okf card` and the server's `okf_describe` carry
`map`: one line per source document with its concept titles in document
order, a numbered series folded into one line. The working method is to read
the map first and ask two to four sub-questions in the map's own words.
- **A signal for weak coverage.** The payload's `coverage` carries
`absent_terms` (question words the bundle holds in no form) and `weak` (one
such word, or nothing delivered). It is a reading, not a verdict.
- **A folder of bundles in one command.** `okf card <folder>` shows every
bundle under it, `okf consume <folder>` asks every bundle in one call
(`--bundle-id` narrows it to one), and `okf check` reads that reply, holding
each payload to all 19 rules on its own. These are the same functions the
server runs.
- **A table fragment is read under its heading.** A concept carrying the
proposer's mechanical table title is ranked and shown under the nearest
concept above it in its document; the excerpt keeps `own_title`. No bundle
byte moves.
- **`okf project --gate`**: the gate can be chosen when building a project,
and the bundle's `log.md` names which one ran.
- `okf check` gains `passage_malformed` and `subquestions_unindexed`
(19 rules).
### Removed
- **The old test track tied to one reference corpus is retired.** Its gate
row, its adapters and the tests that read those bundles are gone; public
tests and gates run on invented material. The retrieval gate's premises were
re-measured for BM25.
### Known limitations added
See [Known limitations](README.md#known-limitations): a question worded
differently from the bundle reaches it first through the map's words, the
retrieval gate is red on rows 5, 7 and 8, and speed was not measured.
## [1.0.0] — 2026-09-20
### Added