fix(spec): section 7 stated its own premise and then applied itself beyond it
Section 7 justified the fixture-is-ground-truth ordering with "Two implementations that return different verdicts" and then stated the rule with no scope. For signatures/active-content.json there is no second implementation, and the seed runtime has stated the classification behind it is calibration it does not freeze. As written, section 7 turned a change they reserved into a bug on their side. New section 7.1 keys the scope on a structural property, never on a table name: a scope only one runtime implements, whose payload that runtime authored. It creates no fourth verdict - the declaration schema closes result with additionalProperties:false over four counts, so a fifth would break every consumer's parser. The case still fails and is still named in failed_cases; what changes is what the failure licenses concluding. Two limits are stated rather than left to inference: it does not reach a third-party implementer of the same table, and it is not a licence for a runtime to self-declare its own divergence as calibration. manifest.json 0.6.1 -> 0.6.2 retires the open-question sentence, quoted rather than dropped. The retirement is partial: "section 7 is NOT amended by this block" stays true, because the spec was amended by its own release. Neighbours measured over the whole repository, widened past "ground truth" to the second paragraph's own wording. CONVENTIONS.md and CLAUDE.md carried the premise and are changed; SECURITY.md gets a cross-reference only, since its claim is about a fixture expecting too little and 7.1 does not narrow that direction; README.md and docs/extraction-plan.md are named as deliberately untouched. Breaking in category, minor in number - 0.x, per the reading [0.3.0] recorded. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012pZ2FLQ6xkWvj2VcwgwnQv
This commit is contained in:
parent
c75c546614
commit
f0a511369d
6 changed files with 157 additions and 5 deletions
97
CHANGELOG.md
97
CHANGELOG.md
|
|
@ -9,6 +9,103 @@ Versioning note: the repository tag versions **the contract** (file set, key nam
|
|||
case ids, disposition semantics). Each JSON file additionally carries its own
|
||||
`"version"` field, bumped when that file changes.
|
||||
|
||||
## [0.9.0] — 2026-08-13
|
||||
|
||||
**A normative rule stated its own premise and then applied itself beyond it.**
|
||||
`spec/conformance-corpus.md` §7 justified the fixture-is-ground-truth ordering with *"**Two
|
||||
implementations** that return different verdicts…"* and then stated the rule with no scope at
|
||||
all. For `signatures/active-content.json` there is no second implementation — the seed runtime
|
||||
authored both the payloads and the table — and that runtime has stated that the classification
|
||||
behind it is calibration it does not freeze. §7 as written made a reserved change on their side
|
||||
into a bug on their side.
|
||||
|
||||
**Breaking in category, minor in number.** This changes disposition semantics, which the
|
||||
versioning note at the top of this file counts as contract. The repository is in 0.x, where a
|
||||
breaking change is a minor bump by the rules — the same reading `[0.3.0]` recorded: *read the
|
||||
entry, not the version number*.
|
||||
|
||||
### Changed
|
||||
|
||||
- **`spec/conformance-corpus.md` — new §7.1, *Where the second paragraph does not hold*.** The
|
||||
scope is keyed on a **structural property**, never on a table name: a case whose scope is a
|
||||
table only one runtime implements, whose payload that runtime authored. A rule naming
|
||||
`active-content` would rot the day a second runtime implements it. §7's own second paragraph
|
||||
already carried the premise; §7.1 makes it explicit and states the disposition for the case
|
||||
the premise excludes — the fixture is not rewritten on the divergence alone, the divergence is
|
||||
recorded against the version pinned, and re-pinning is a separate release. That is the
|
||||
disposition §5 already applies to a stale `observed_out_of_scope` entry, extended to the one
|
||||
place where it can reach a verdict.
|
||||
|
||||
**It creates no fourth verdict, and that constraint shaped the wording.**
|
||||
`schema/conformance-declaration.schema.json` closes `result` with `additionalProperties: false`
|
||||
over four counts plus two arithmetic invariants; a fifth verdict would have broken every
|
||||
consumer's parser, which is a worse break than the one intended. A case whose expected findings
|
||||
are not produced still **fails** and is still named in `failed_cases`. What §7.1 changes is what
|
||||
the failure licenses concluding, not what is reported.
|
||||
|
||||
Two limits stated in the section rather than left to be inferred: it does **not** reach a
|
||||
third-party implementer of the same table — against them the fixture is the contract, exactly
|
||||
as §7 says, and that is the only thing these cases can prove while one runtime is all there is
|
||||
— and it is **not** a licence for a runtime to self-declare, since the exemption is carried by
|
||||
the corpus's provenance record for the scope and not asserted per case by whoever failed.
|
||||
|
||||
Superseded text is named rather than edited away, following §6's own pattern: *"Through corpus
|
||||
version 0.8.1 this section stated the rule above with no scope at all."*
|
||||
|
||||
**The competing reading was tested and disposed of**, because it is the one that would have
|
||||
avoided this release: that §7's existing hatch (*"unless the fixture itself is proven wrong"*)
|
||||
already covered it. It does not. The hatch's consequence is that **the fixture changes**, and
|
||||
the manifest field asserts the opposite — pinned, not rewritten, re-pinning a separate
|
||||
decision. And a runtime recalibrating does not prove the earlier classification wrong: the
|
||||
fixture measured `de09711` / `0.4.0` correctly, and a later release does not reach back and
|
||||
falsify an earlier measurement. The case fits neither of §7's two dispositions, which is the
|
||||
defect.
|
||||
|
||||
- **`conformance/manifest.json` `0.6.1` → `0.6.2` —
|
||||
`active_content_provenance.pins_a_version_not_a_frozen_classification` no longer records an
|
||||
open question.** The retirement is **partial and it is quoted, not dropped**, per the house
|
||||
style this field established one release ago (*"a correction that does not say what it corrects
|
||||
cannot be audited"*). What falls is only the open-question status; the clause *"section 7 …
|
||||
is NOT amended by this block"* **stays true and is kept**, because §7 was amended by its own
|
||||
release and not by a data file. Value change only — read back from disk against `HEAD` with a
|
||||
flattened key diff: `added: 0, removed: 0, changed: 2` (the field and `version`), and the new
|
||||
string printed and read rather than inferred from the count, since a value edit reports
|
||||
`changed: 1` whatever it wrote.
|
||||
|
||||
Six prose dashes in the new text were written `--` and promoted to `—` before commit: `--` is
|
||||
the variant-suffix separator token of §6's case-id grammar, and every other occurrence of it in
|
||||
this file is that token, a real case id, or a CLI flag.
|
||||
|
||||
### Neighbours — measured, and the ones left alone are named
|
||||
|
||||
A sweep for the retired premise was run over the whole repository, widened past *"ground truth"*
|
||||
to the second paragraph's own wording (*"one of them has a bug"*, *"two implementations"*), since
|
||||
a restatement in that phrasing would have survived the first search.
|
||||
|
||||
- **`CONVENTIONS.md` — changed.** Carried the rule unscoped and called the proven-wrong hatch
|
||||
*"the one way that reverses"*. There are now two, and both are listed.
|
||||
- **`CLAUDE.md` — changed.** The Norwegian restatement that governs sessions in this repository
|
||||
carried the same unscoped rule; left alone, the next session here would have acted on it.
|
||||
- **`SECURITY.md` §2 — minimal cross-reference only.** Its claim is about a fixture that expects
|
||||
**too little**, and §7.1 narrows *who the rule reaches*, not that direction. The conclusion
|
||||
survives intact, so it was not rewritten.
|
||||
- **`SECURITY.md` "Why a confirmed defect is usually not fixed here first" — untouched.** Its
|
||||
*"two implementations answering differently"* is about extracted **data** diverging from its
|
||||
source, not about fixtures.
|
||||
- **`README.md` — untouched.** Its conformance row says *"Ground truth"* as a descriptor and does
|
||||
not restate the disagreement rule, and it already names the asymmetry it would otherwise hide:
|
||||
the seven active-content cases are *"measured against the one runtime that implements that
|
||||
table"*. Nothing there became false.
|
||||
- **`docs/extraction-plan.md` — untouched, and it is supporting evidence rather than a stale
|
||||
neighbour.** It already records that the calibration file *"inverts this repository's central
|
||||
rule"* — so this is the second place the unscoped rule was known not to hold, and the first was
|
||||
documented before this release.
|
||||
|
||||
### Not in this release
|
||||
|
||||
Whether the seven active-content cases still pass at the seed runtime's `v1.1.0` is **unmeasured**,
|
||||
and §7.1 is silent on it. No case was minted, no data file touched, no id string proposed.
|
||||
|
||||
## [0.8.1] — 2026-08-13
|
||||
|
||||
**The field 0.8.0 added to make the exposure precise stated it with a hand-derived count, and the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue