docs(k3): round 25, the default reading drops the door's link line
What the default was and is, the three signatures, the naming choice against
the module's other eight constants, the CLI-flag decision with its zero, both
gates with this round's numbers beside round 23's, the consumer list with its
denominator, and the honesty limits.
The deviation is stated first and it is the order's own acceptance row: `S1
spent 28 020 B at the default k` is round 23's X column -- the flagged bundle
with the line SCORED -- and the new default is round 23's Y, whose published
value for that cell is 31 031. Measured here in one process on one bundle:
`link_in_signal=True` gives 28 020 and the default gives 31 031, the unflagged
build gives 31 031 too. 16 of 16 cells of the Y column reproduce to the byte,
so neither failure the stop-rule guards against is present; the row was
transcribed from the column being retired.
Also corrects one label in round 23's own file, which is otherwise untouched
because a report is a measurement with a date. The row reading "distinct tokens
the path ever contributed" carried 31/22/8, which is the QUESTION-token count:
the path's segments are `r761` and `prosesskoden`, and `prosess` is a question
token that reaches the second through the stem prefix rule -- measured,
`consume.tokens_match('prosess', 'prosesskoden')` is True at
`MIN_SHARED_PREFIX = 4`. The label is what was wrong, and correcting it is what
makes the table agree with the paragraph under it, which already explains
`prosess` that way. The numbers stand, and no CHANGELOG figure is touched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
38320cd509
commit
06c057ff39
2 changed files with 179 additions and 1 deletions
|
|
@ -146,7 +146,7 @@ because the concepts around them did.
|
|||
| newcomers that gained a question token from the link | **39** | 39 link-bearing newcomers |
|
||||
| of those, the gain came from the **PATH** | **37 path only + 2 path and title** | 39 |
|
||||
| of those, the gain came from the **TITLE** alone | **0** | 39 |
|
||||
| distinct tokens the path ever contributed | `prosesskoden` (31), `r761` (22), `prosess` (8) | 61 token hits |
|
||||
| distinct QUESTION tokens the path ever matched | `prosesskoden` (31), `r761` (22), `prosess` (8) | 61 token hits |
|
||||
|
||||
**Every token the link line ever added is a segment of the document's own
|
||||
directory** -- `r761-prosesskoden` -- and `prosess` reaches it by the stem
|
||||
|
|
|
|||
178
docs/2026-09-12-k3-runde25-standardlesingen-uten-lenkelinja.md
Normal file
178
docs/2026-09-12-k3-runde25-standardlesingen-uten-lenkelinja.md
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
# K3 round 25: the default reading drops the door's link line
|
||||
|
||||
**Date:** 2026-09-12 · **Base:** `7faa380` · **Commits:** `3816ed5` (red),
|
||||
`38320cd` (the default) · **Measured from:** a frozen `git archive` export of
|
||||
`38320cd` synced into a scratch virtualenv (`__file__` under
|
||||
`/private/tmp/okf-k3-25-scratch/`, never `/Users/ktg/repos`, never the `okf` on
|
||||
PATH), Python 3.14, guard 1.4.0. One document: R761 Prosesskoden:2025, built
|
||||
twice in scratch from the publisher's own NISO-STS source, once with
|
||||
`--shell-parent` and once without. The consumer repository was read only:
|
||||
`git status --porcelain` empty before and after, `build/ferdig/` listing
|
||||
identical including mtimes, measured twice.
|
||||
|
||||
Round 23 decomposed the cost of `--shell-parent`'s link line and recommended
|
||||
one of three exits: make the reading WITHOUT the line `consume`'s default,
|
||||
because the cost is the bundle-absolute PATH inside the link and not the link.
|
||||
This round is that recommendation as code, and nothing else.
|
||||
|
||||
## 0. Where this measurement differs from what it was given, first
|
||||
|
||||
**The order's acceptance row `S1 spent 28 020 B at the default k` cites the
|
||||
column being retired.** 28 020 is round 23's **X** -- the flagged bundle with
|
||||
the line SCORED. The new default is round 23's **Y**, and Y's published value
|
||||
for that cell is **31 031**. Measured here on the same bundle in one process:
|
||||
|
||||
| reading | S1 delivered | S1 `spent` |
|
||||
|---|---|---|
|
||||
| `link_in_signal=True` (X, retired) | 7 | **28 020** |
|
||||
| default since this round (Y) | 7 | **31 031** |
|
||||
| unflagged build, default (Z) | 7 | **31 031** |
|
||||
|
||||
So 28 020 is not reachable at the new default by construction, and it is not a
|
||||
regression: **16 of 16** cells of round 23's Y column reproduce here to the
|
||||
byte, `spent` and delivered count alike, at both `k`. The stop-rule the order
|
||||
set protects against two things -- round 23's numbers failing to reproduce, and
|
||||
the default switch doing something the parameter did not -- and both are
|
||||
measured absent. The row was transcribed from the wrong column.
|
||||
|
||||
**Everything else reproduces.** 2 761 concepts in both builds, 675 files
|
||||
carrying the door's line in the flagged one and 0 in the unflagged one.
|
||||
|
||||
## 1. What moved
|
||||
|
||||
`link_in_signal` was a naked literal `True` on three signatures. It is now
|
||||
`DEFAULT_LINK_IN_SIGNAL = False`, read by all three:
|
||||
|
||||
| entry point | before | after |
|
||||
|---|---|---|
|
||||
| `consume.searchable_text` | `link_in_signal: bool = True` | `= DEFAULT_LINK_IN_SIGNAL` |
|
||||
| `consume.concept_scores` | `link_in_signal: bool = True` | `= DEFAULT_LINK_IN_SIGNAL` |
|
||||
| `consume.build_payload` | `link_in_signal: bool = True` | `= DEFAULT_LINK_IN_SIGNAL` |
|
||||
|
||||
**The naming choice, with the number.** `consume.py` holds 8 module constants
|
||||
for defaults (`DEFAULT_PROFILE`, `DEFAULT_LIMIT`, `DEFAULT_TIE_SHARED_RANK`,
|
||||
`DEFAULT_STEM_PREFIX`, `DEFAULT_TITLE_COVERED`, `DEFAULT_SOURCE_QUOTA`,
|
||||
`DEFAULT_FOLLOW_PARENT`, `DEFAULT_K`) and this was the one default written out
|
||||
three times: **8 of 9** followed the house convention and this did not. A
|
||||
constant costs one declaration and buys two things -- the convention, and a
|
||||
test that can fall on the rule from the module that owns it.
|
||||
|
||||
**The CLI-flag decision, with the number.** `grep -n '"--.*link'` over
|
||||
`src/llm_ingestion_okf/*.py` gives **0 hits** before and after, and
|
||||
`consume.main` never passed the parameter, so the CLI inherits the function
|
||||
default and not one flag line changed. No flag was ADDED: round 23 withheld one
|
||||
because the choice was the measurement's, and that reason is spent -- but a
|
||||
spent reason is not a reason to add one. **0 of 3** call sites outside
|
||||
`consume.py` could be named as needing the older reading. The older reading
|
||||
stays reachable in Python (`link_in_signal=True`); after this round there is no
|
||||
CLI route to it, and that is stated rather than hidden.
|
||||
|
||||
## 2. The red test
|
||||
|
||||
Ten cases, each red on `7faa380` for its own reason, all measuring BEHAVIOUR --
|
||||
the entry points are called with no parameter at all and what came back is
|
||||
read. No `inspect.signature`. Reds: three on the entry points reading a
|
||||
stripped body; one `ImportError` inside the test body (never at collection) for
|
||||
the named constant, spent immediately on a payload comparison; Y = Z in
|
||||
miniature (the flagged fixture delivered `[menneske, midt, skall]` where the
|
||||
unflagged one delivered `[menneske, midt]`); the old reading still reachable AND
|
||||
producing a different payload; the two known-negatives restated against the
|
||||
default path; and rank-not-form (the two readings differ in the delivered set
|
||||
while a concept delivered by both keeps identical excerpt bytes).
|
||||
|
||||
Two are green on both sides on purpose and are named as such: the
|
||||
known-positive -- a bundle where no body ends in the door's form is
|
||||
byte-identical under both readings, section 3's gate in miniature -- and the
|
||||
characterisation of what the line does, which is an invariant about the line.
|
||||
|
||||
**One existing test changed with the code**, and it is the whole test-caller
|
||||
denominator: `tests/` holds **112** call occurrences of the four functions
|
||||
across **10** files, of which **13** pass the parameter explicitly. Exactly
|
||||
**1 of 112** changed result -- the characterisation that called
|
||||
`concept_scores` with no parameter because the reading it characterises used to
|
||||
be the default. It now names that reading; same fixture, same number. The two
|
||||
other test files whose fixtures carry the door's form
|
||||
(`test_parent_reaches_reader.py`, `test_shell_parent.py`) did **not** move: the
|
||||
first asks a question the shells answer through their own titles, the second
|
||||
never calls `consume`.
|
||||
|
||||
## 3. Gate A -- the exposure, on bytes
|
||||
|
||||
Read-only over the consumer's `build/ferdig/`. Denominator = concept files.
|
||||
|
||||
| bundle | concept files | files carrying the door's line | payload byte-identical across the move |
|
||||
|---|---|---|---|
|
||||
| N100 | 446 | **0** | yes (70 536 B) |
|
||||
| N200 | 1 133 | **0** | yes (159 210 B) |
|
||||
| N500 | 270 | **0** | yes (50 499 B) |
|
||||
| R761 as shipped | 2 756 | **0** | yes (387 552 B) |
|
||||
| R761 generic | 2 761 | **0** | yes (463 068 B) |
|
||||
|
||||
**0 of 5 and 5 of 5.** The same question string for every bundle, serialised
|
||||
before the change and after it, compared with `cmp`.
|
||||
|
||||
## 4. Gate B -- the ranking, on the one document that has shells
|
||||
|
||||
Both builds read at the shipped defaults, no parameter passed anywhere.
|
||||
|
||||
| row | result | denominator |
|
||||
|---|---|---|
|
||||
| flagged read by default == unflagged read by default: list, ORDER and `spent` | **16 of 16** rows | 16 (8 questions x 2 `k`) |
|
||||
| hit@1 / hit@8 / hit@50, both `k`, both bundles | **6/6 · 6/6 · 6/6** | 6 questions |
|
||||
| known-positive rank, `k` 8 and `k` 50 | **1 / 1** | -- |
|
||||
| S1 `spent` at the default `k` | **31 031** (round 23's Y; 28 020 was X) | -- |
|
||||
| `okf check` | **32 of 32** payloads rc 0, **17 rules**, 0 findings | 32 |
|
||||
|
||||
Round 23's claim was that under this reading a `--shell-parent` bundle delivers
|
||||
exactly what the unflagged build delivers. It does, to the byte, on every row.
|
||||
|
||||
## 5. The consumers, measured
|
||||
|
||||
`grep` over `build_payload(`, `concept_scores(`, `searchable_text(` and
|
||||
`body_without_link_line(`, excluding `.git`, `tests/` and `.venv`: **129** hits
|
||||
in total, of which **4** fall outside `consume.py` and one of those is prose in
|
||||
`CLAUDE.md`. **3 call sites in 2 files**, plus the CLI's own `main` inside the
|
||||
module:
|
||||
|
||||
| call site | what it is | passes the parameter | what the change means for it |
|
||||
|---|---|---|---|
|
||||
| `src/llm_ingestion_okf/skill.py:360` | the generated skill's answering path | no | a bundle carrying the line ranks differently; excerpt bytes unchanged, so the skill's own prose about the line still holds |
|
||||
| `tools/okf_consume_measure.py:155` | the harness, per question | no | scores the new reading; figures measured before today are figures of the old one |
|
||||
| `tools/okf_consume_measure.py:247` | the harness, over a fasit file | no | same |
|
||||
| `src/llm_ingestion_okf/consume.py:2404` | the CLI's `main` | no | `okf consume` inherits the default; no flag moved |
|
||||
|
||||
All four change behaviour on any bundle carrying the door's line and on no
|
||||
other bundle. **0 of 5** bundles anyone ships today carries it.
|
||||
|
||||
## 6. Acceptance
|
||||
|
||||
Suite **1 826 passed / 1 skipped, rc 0**, against a baseline of **1 816 / 1**
|
||||
measured on `7faa380` first; the skipped one is `OKF_HTML_CORPUS` in both. Run
|
||||
from the repository root, after `git add` and after commit. `mypy --strict`
|
||||
clean over 21 source files, `ruff check` and `ruff format --check` clean over
|
||||
132 files. The four goldens and the K2 pin: **11 passed, 0 skipped** -- run
|
||||
where the pin's `GOLD_SET` exists, so it was measured and not skipped. No
|
||||
golden moved.
|
||||
|
||||
## Honesty limits
|
||||
|
||||
- **N = 1 document.** Gate B is one 2 761-concept standard from one publisher,
|
||||
and 6 of its 8 questions never move under any reading, so the scored evidence
|
||||
is two rows. What generalises is the MECHANISM -- a bundle-absolute path
|
||||
repeating the document's own directory in every linked body -- not the size.
|
||||
- **The consumption half is not measured.** This round measures delivery and
|
||||
rank. Whether a reader ANSWERS better is a judged reading, and round 21's own
|
||||
consumption rows were one non-deterministic draw per question.
|
||||
- **`5 of 5` is a statement about the bundles that exist TODAY.** The day a
|
||||
producer ships a bundle built with `--shell-parent`, this stops being free
|
||||
and becomes a rank change that reaches someone. That is the trade this round
|
||||
took deliberately: it is cheap now and it will not be later.
|
||||
- **The instrument is the consumer's**, `hitk_sk2.py` at their HEAD `ee4d7e1`,
|
||||
copied to scratch with the hard-coded payload path changed because a
|
||||
concurrent session writes the same `/tmp` file. It scores a title or a
|
||||
section-number pair, not an answer.
|
||||
- **`--shell-parent` is still OFF** and this round did not touch it. Round 23
|
||||
measured that its acceptance would read 0 / 0 / 0 under this default on this
|
||||
document; a build default is a promise to every consumer and not to one.
|
||||
- **Conformance is the floor and never the proof.** The known-negative
|
||||
question's payloads are conformant too, and they answer nothing.
|
||||
Loading…
Add table
Add a link
Reference in a new issue