feat(consume): parent reaches the reader -- excerpt field, body link, checker rule
K3-21 A. `okf consume` resolves a concept's `parent:` pointer -- a
`segment_id`, unique only inside one document's plan -- among the concepts
sharing its `source_file` (`consume.link_parents`, one pass, no file opened
again) and an excerpt carries `parent: { concept_id, title }`. Conditional
like `req_number`: a concept with no `parent` key moves no byte. A pointer
that lands nowhere is named `parent_unresolved: true`, never dropped.
The door writes ONE line into a heading-only body whose entry has a parent:
`Enclosing section: [<title>](/<bundle-relative path>)` (SPEC SS 5.1 lineage
through links, SS 6.1 the recommended absolute form and the kind in the
prose). Only such a body, so the segmented goldens' declared parents -- bodies
holding text -- are untouched. Appended AFTER structure derivation and
screened on its own (`_screened`, the `description` rule): read as body text
the link was derived into a second, unresolved `references` edge, measured on
the fixture. `segmentation.heading_only` is the one predicate the proposer and
the door share.
`okf check` gains its seventeenth rule, `parent_unfollowable`: a `parent`
that is not a concept_id and title, names its own excerpt, or names a concept
in neither `excerpts` nor `withheld` (together every considered concept).
Contract SS 8 point 6 added, the figure carries `parent`, and "additional
members are not read by the checker" now says the checker reads only the
members SS 8 names. The template tells the reader what `parent` is and that
SS 2.2 lets it read that one concept; `skill.CONDITIONAL_FIELDS` gains
`parent`. README and CLAUDE.md say what consume now reads.
Moved on purpose, each named: the SS 7.4 known-positive IS the contract
document, so `budget.known_positive` moves in every payload (13 238 / 12 893
/ 345 -> 14 455 / 14 083 / 372); `skills/okf-consume/` regenerated from the
segmented golden, whose plan declares s1 and s2 under s0 -- its example
payload now carries both parents; `test_bundle_identity` 16 -> 17 rules;
`test_shell_parent`'s byte test also accounts for the link line.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
a5cd7c5688
commit
4f7bd61500
16 changed files with 319 additions and 58 deletions
|
|
@ -13,7 +13,8 @@ passes the UNFILLED template against a real payload (exit 0, 15 rules, 0
|
|||
findings), and passes a skill built for a different bundle against this one's
|
||||
payload. `contract_check.rule_bundle_identity` now compares the identity a
|
||||
skill declares with the identity its payload declares, so all three measured
|
||||
pairs are refused at exit 1 with one `bundle_mismatch` finding over 16 rules:
|
||||
pairs are refused at exit 1 with one `bundle_mismatch` finding over 16 rules
|
||||
(17 since K3-21's `parent_unfollowable`):
|
||||
a skill against another bundle's payload, the unfilled template against a real
|
||||
payload, and -- the arm an id comparison would miss -- a payload sharing the
|
||||
skill's `bundle_id` at a foreign `ref`. The right pair is untouched at exit 0
|
||||
|
|
@ -99,6 +100,7 @@ CONDITIONAL_FIELDS = (
|
|||
"verified",
|
||||
"req_number",
|
||||
"sources",
|
||||
"parent",
|
||||
)
|
||||
|
||||
#: Tokens too short to carry a question. The same floor the pre-pass's own
|
||||
|
|
@ -337,14 +339,16 @@ def render(
|
|||
bundle_id = okf_consume.root_bundle_id_of(bundle_root, profile=profile)
|
||||
ref = okf_consume.bundle_ref(bundle_root, profile=profile)
|
||||
concept_ids = okf_consume.enumerate_concepts(bundle_root, profile=profile)
|
||||
concepts = [
|
||||
okf_consume.read_concept(
|
||||
bundle_root / f"{concept_id}{profile.paths.concept_suffix}",
|
||||
bundle_root=bundle_root,
|
||||
root_bundle_id=bundle_id,
|
||||
)
|
||||
for concept_id in concept_ids
|
||||
]
|
||||
concepts = okf_consume.link_parents(
|
||||
[
|
||||
okf_consume.read_concept(
|
||||
bundle_root / f"{concept_id}{profile.paths.concept_suffix}",
|
||||
bundle_root=bundle_root,
|
||||
root_bundle_id=bundle_id,
|
||||
)
|
||||
for concept_id in concept_ids
|
||||
]
|
||||
)
|
||||
if not concepts:
|
||||
raise SkillError(
|
||||
f"{bundle_root} has an index but no concept under it; a skill for an "
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue