feat(propose): --shell-parent points a heading-only section at the ancestor holding its text
A plan entry whose span holds its heading alone gets `parent_id` naming the nearest preceding entry at a smaller level whose own span holds text, passing over an ancestor that is empty too; the door writes the existing `parent:` key. Nothing is copied and no boundary moves. The rule reads the plan's level and order, never the row. Off by default: `okf consume` reads no `parent` key, so no payload ranks differently, while the flag moves the bytes of every bundle holding a heading-only section. Measured before building on one 2 761-concept process code: 710 concepts are heading-only; the level route names the ancestor the document's own <sec> nesting names on 708 of 710 (two sit at depth 7, clipped to 6, and point one level too high), where reading section numbers gets 686 (`12` begins with `1`); 35 have no ancestor holding text and get none. The red test expected only concept files to move. The index is a projection of the frontmatter and shows the key as a facet, so the test now holds both; the facet renders a segment id as unresolved (`p1?`), because `structure` reads `parent` as a document number -- named in README, CLAUDE.md and the CHANGELOG, not repaired here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
f7fd0d4a43
commit
edd3b70a90
6 changed files with 140 additions and 4 deletions
|
|
@ -23,6 +23,7 @@ sentence from any source.
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from llm_ingestion_okf import cli, extract, propose
|
||||
|
|
@ -167,13 +168,16 @@ def test_a_build_without_the_flag_is_the_build_with_the_opt_out(tmp_path: Path)
|
|||
assert files == sorted(p.relative_to(opted_out) for p in opted_out.rglob("*") if p.is_file())
|
||||
for relative in files:
|
||||
assert (default / relative).read_bytes() == (opted_out / relative).read_bytes()
|
||||
# The flag adds exactly one `parent:` line to each shell with an ancestor.
|
||||
# The flag adds one `parent:` line to each shell with an ancestor, and the
|
||||
# index -- a projection of the frontmatter -- shows the same key as a facet
|
||||
# on that shell's entry. Nothing else moves.
|
||||
added = 0
|
||||
for relative in files:
|
||||
before = (default / relative).read_text(encoding="utf-8").split("\n")
|
||||
after = (flagged / relative).read_text(encoding="utf-8").split("\n")
|
||||
extra = [line for line in after if line not in before]
|
||||
assert all(line.startswith("parent: ") for line in extra)
|
||||
if relative.name == "index.md":
|
||||
assert [re.sub(r"parent: p\d+\?; ", "", line) for line in after] == before
|
||||
continue
|
||||
assert [line for line in after if not line.startswith("parent: ")] == before
|
||||
added += len(extra)
|
||||
added += sum(1 for line in after if line.startswith("parent: "))
|
||||
assert added == sum(1 for ancestor in EXPECTED.values() if ancestor is not None)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue