feat(check): a skill and a payload naming different bundles is a finding
`okf check` had fifteen rules and none asked whether the skill and the payload
were talking about the same bundle. Reproduced on this HEAD before any code
moved: three pairs reported `conformant: 15 rules over 8 excerpts and 438
withheld entries, 0 findings` -- a skill generated from one corpus against
another corpus's payload, the unfilled template against that payload, and a
payload sharing the skill's `bundle_id` at a foreign `ref`. All three now exit 1
with one `bundle_mismatch` finding over 16 rules.
BOTH halves are compared and the `ref` half is load-bearing: three distinct
builds on this machine carry one `bundle_id`, so an id comparison would pass a
stale skill. SS 3.3: "a version is the producer's assertion; a ref is a fact
about bytes". An identity the rule cannot read is a finding, never a silent
pass -- that is what refuses the unfilled template.
No new field: the identity was already in the generated skill's prose, now
factored into `skill.identity_line` and read back by
`contract_check.skill_identity`. Generated skill bytes unchanged, measured on
both tracked bundles on one interpreter.
The rule's first real find is this repository's own hand-made
`skills/okf-consume/SKILL.md`, which predates `okf skill` and declares no
identity a reader can act on: 1 of 1. Nine tests that asserted the old, false
conformance now pair a skill with its own bundle's payload.
Measured, nothing else moved: `~/okf-test/dokumenter` `diff -r` empty old
source vs new on one interpreter (52 files, 26 concepts), `okf project` still
byte-equal to `okf build`, K2 pin unmodified and green (453 concepts, ranks
1,1,1,1,1,5), known-negative `{}` unchanged at 9 findings.
Report: docs/2026-09-10-k3-runde15-bundle-mismatch.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
b5df3355c5
commit
7cca9e079e
9 changed files with 468 additions and 56 deletions
|
|
@ -2,9 +2,15 @@
|
|||
|
||||
`tools/okf_skill.py` turns one OKF bundle into one instantiated `SKILL.md` that
|
||||
`tools/okf_contract_check.py` accepts. The discipline here is the one measurement
|
||||
that decided the form: **the checker cannot tell an instantiated skill from an
|
||||
unfilled template**, and passes a skill built for a different bundle against this
|
||||
that decided the form: the checker could not tell an instantiated skill from an
|
||||
unfilled template, and passed a skill built for a different bundle against this
|
||||
one's payload. So every gate the checker does not have is a test here.
|
||||
|
||||
**That measurement is closed on its identity half since 2026-09-10.** The
|
||||
`bundle_mismatch` rule refuses both forms, and `tests/test_bundle_identity.py`
|
||||
holds the arms. The gates below are the ones it still does not have: what the
|
||||
generated skill MEASURES -- the per-bundle denominators, the breaking point,
|
||||
the conditional-field list -- is not something any static pairing check reaches.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue