feat(consume): a table fragment is read under the heading it stands under

C3, the remaining half. The proposer names a table block with no heading of
its own after the line it starts on (`Tabell linje <n>`). A position, not a
name: searched, it matched no question, and shown, it told a reader nothing
about what the table is.

`consume.inherit_table_titles` reads such a concept under the title of the
nearest concept ABOVE it in the same source document -- in reading order, the
heading the table stands under -- ordered by `source_offset`, else
`source_lines`, one key per document and never mixed. Applied where the bundle
is loaded, so the ranking, the excerpt and the near misses all see the same
title; the excerpt keeps the file's own as `own_title`, so the name shown is
never mistaken for the one in the file. A table with nothing named above it,
or a document whose concepts do not all carry one position key, is left as it
is.

Chose to do it in the reading and not in the build: no bundle byte moves, no
collection has to be rebuilt, and the proposer's goldens stay pinned.
`consume.MECHANICAL_TITLE` is held against the proposer's own output by a test.

Suite on a clean tree after `git add`: 2418 passed, 2 skipped, 4 xfailed.
ruff, ruff format, mypy --strict clean. The search gate's table for the
previous commit is kept in local state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-21 08:26:20 +02:00
commit f7cd84c5e6
4 changed files with 235 additions and 9 deletions

View file

@ -827,6 +827,12 @@ the passage that answers, under the nearest heading above it, marked with
they widen a signal (`--cost-vocabulary`, `--rarity-weight`) belong to it and
are refused without it. The rest of this section describes the fusion.
**A table fragment is read under the heading it stands under.** When the
builder can only name a table block by the line it starts on (`Tabell linje
N`), `okf consume` reads it under the title of the nearest concept above it in
the same document — in what it ranks and in what the excerpt shows — and the
excerpt keeps the file's own title as `own_title`. No bundle byte moves.
**The payload says when the bundle looks like it does not cover a question.**
`coverage.absent_terms` lists the question's words the bundle holds in no form
— not as written and not through a relative it uses — and `coverage.weak` is