fix(skills): eksempelet brøt skillens egen regel — undecided, ikke survived

Tre defekter i ff7b9b7, funnet i review. Ingen av dem ville blitt fanget av
json.tool eller framework-guardene — alle tre er semantiske.

1. example-evidence.json sa `"judgement": "survived"` samtidig som ledger-noten sa at
   det ene konseptet som kunne båret en refutasjon var UNREADABLE. SKILL.md sier
   ordrett at `undecided` er «what you return when the evidence needed to refute the
   claim was not readable». Det ene arbeidseksempelet — det en nedstrøms agent leser
   som mønsteret, og det §11-testen materialiserer — demonstrerte altså nøyaktig
   inversjonen skillen finnes for å hindre: et hull i kunnskapsbasen konvertert til
   støtte for påstanden. Rettet til `undecided` + `judgement_note` som sier hvorfor.
   Eksempelet er bedre etterpå: det er nå den utførte demonstrasjonen av tilstanden
   skillen sier leseren mest trenger å kunne skille ut.

2. De to representasjonene i eksempelet var uenige med seg selv. Konsept 2s
   `frontmatter`-dict utelater `sources` (korrekt — en blokkliste er ikke uttrykkbar
   som én `key: value`-streng), mens `frontmatter_verbatim` har den. En §11-test som
   materialiserer fra dict-en ville utledet `state: absent`, ikke `unreadable`, og
   dermed mistet nøyaktig caset eksempelet finnes for. Grønn-men-død-formen §11 er
   til for å hindre. Nytt `materialisation_note`: `frontmatter_verbatim` er
   AUTORITATIV, `frontmatter` er dens linjeorienterte projeksjon og informativ.

3. method-spec.md skrev «Measured 2026-09-01 on the reference corpus: 2 of 5 keys …»
   i commons' EGEN stemme. Commons målte det ikke. Driftsregelen er eksplisitt —
   andres målinger føres som DERES — og teksten skal til en publisert flate. Tallet
   siteres nå ordrett fra ordren som bestilte A1, attribuert dit, med en setning om
   at mekanismen bærer A1 uten det: figuren er støtte, ikke grunn. Samme i CHANGELOG.
   Merk at konvensjonen er tvetydig i kildene: PM-dommen sier «produsenten skriver 2
   av 5 noekler», ordren sier «2 av 5 nøkler på ÉN kilde» — ulike påstander. Ordrens
   ordlyd er den siterte, og at det er et sitat er nå synlig.

Verifisering re-kjørt: konsumentens _FRAMEWORK_NAMES + _FORBIDDEN over 6 filer → 0
treff (kjent-positiv PASS); 'OKF bundle' 0 i skillen; json.tool OK; Steg 1-8 + MUST
intakt. Fortsatt IKKE PUSHET — origin/main..HEAD og open/main..HEAD begge 2 etter denne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-02 17:11:39 +02:00
commit f35a22a304
3 changed files with 18 additions and 9 deletions

View file

@ -28,8 +28,10 @@ affected by this file.
relaxation of it. A single mapping normalises to a one-element tuple, so one source and relaxation of it. A single mapping normalises to a one-element tuple, so one source and
several sources read the same way and last-write-wins never arises. Rationale, measured: several sources read the same way and last-write-wins never arises. Rationale, measured:
line-oriented parsing carries one value per key, so a multi-source concept written as a block line-oriented parsing carries one value per key, so a multi-source concept written as a block
list loses every entry but one *silently*; on the reference corpus 2026-09-01, **2 of 5 keys list loses every entry but one *silently*. The supporting figure — 2 of 5 keys on a single
were carried on a single source**. Added the matching `sources` row to §12. source, reference corpus 2026-09-01 — is **the commissioning order's measurement, reported as
theirs**, not one this repository made; the mechanism carries A1 without it. Added the matching
`sources` row to §12.
- **Axis note, in the spec:** A1 binds **emission**. It does not reclassify a block list as - **Axis note, in the spec:** A1 binds **emission**. It does not reclassify a block list as
malformed OKF, and the reference consumer's own decoder is quoted verbatim saying it is malformed OKF, and the reference consumer's own decoder is quoted verbatim saying it is
conformant-but-outside-the-accepted-subset. conformant-but-outside-the-accepted-subset.
@ -48,8 +50,11 @@ affected by this file.
`(state, reason, items_seen)` and **discounted, never rejected**), and the rule that a `(state, reason, items_seen)` and **discounted, never rejected**), and the rule that a
refutation naming no refuter is not a refutation. refutation naming no refuter is not a refutation.
[`references/example-evidence.json`](skills/falsification-reviewer/references/example-evidence.json) [`references/example-evidence.json`](skills/falsification-reviewer/references/example-evidence.json)
carries the frontmatter verbatim, so the form question A1 settles is decidable from the carries the frontmatter **verbatim and authoritative** (the line-oriented `frontmatter`
example itself. projection beside it is informative and by construction cannot hold a block form), so the form
question A1 settles is decidable from the example itself. The worked example returns
`undecided`, not `survived`: the one concept that could have carried a refutation was
unreadable, and a claim that was never attacked has not survived.
## [0.1.0] - 2026-08-17 ## [0.1.0] - 2026-08-17

View file

@ -121,9 +121,11 @@ it) into the prompt:
**Informative note — what A1 fixes, and the axis it does not speak on.** The form was pinned **Informative note — what A1 fixes, and the axis it does not speak on.** The form was pinned
because line-oriented `key: value` has exactly one value per key, so a multi-source concept because line-oriented `key: value` has exactly one value per key, so a multi-source concept
written as a block list loses every entry but one, silently — the failure mode a consumer written as a block list loses every entry but one, silently — the failure mode a consumer
cannot detect after the fact. Measured 2026-09-01 on the reference corpus: **2 of 5 keys were cannot detect after the fact. The amendment also carries a figure this repository did not
carried on a single source**, which is a ceiling on how far a claim can be corroborated, not measure and reports as its author's: the order that commissioned A1 states, of the reference
a property of the material. A1 binds **emission** — what a producer MUST write. It does not corpus on 2026-09-01, *"K5-taket målt 01.09: 2 av 5 nøkler på ÉN kilde"* — a ceiling on how far
a claim can be corroborated rather than a property of the material. The mechanism above carries
A1 on its own; the figure is support, not the ground. A1 binds **emission** — what a producer MUST write. It does not
say a block list is malformed as such: a consumer's own decoder is entitled to accept a say a block list is malformed as such: a consumer's own decoder is entitled to accept a
narrower subset than it is handed, and the reference consumer records exactly that of its narrower subset than it is handed, and the reference consumer records exactly that of its
accepted subset — *"A block sequence and a block mapping are both **conformant** OKF; they accepted subset — *"A block sequence and a block mapping are both **conformant** OKF; they

View file

@ -1,7 +1,9 @@
{ {
"claim": "Trinnstyring i innkjoeringssonen gir 18 % lavere energibruk enn dagens fastnivaa.", "claim": "Trinnstyring i innkjoeringssonen gir 18 % lavere energibruk enn dagens fastnivaa.",
"judgement": "survived", "judgement": "undecided",
"refuter": null, "refuter": null,
"judgement_note": "undecided, not survived. The one concept that could have carried a refutation was unreadable, so the claim was not actually attacked -- and a claim that was not attacked has not survived. Returning survived here would convert a gap in the knowledge base into support for the claim, which is the inversion this role exists to prevent.",
"materialisation_note": "frontmatter_verbatim is AUTHORITATIVE: it is the bytes a test materialises into a throwaway concept file before reading them back. frontmatter is its line-oriented projection and is informative only -- by construction it cannot carry a block form, which is why concept 2 has no sources key there. Materialising from frontmatter would derive state: absent and silently lose the unreadable case this example exists to demonstrate.",
"concepts": [ "concepts": [
{ {
"concept_id": "kilder-tunnelbelysning-realisering", "concept_id": "kilder-tunnelbelysning-realisering",
@ -45,7 +47,7 @@
"note": "Two independent reasons to discount, reported separately rather than merged. The sources value is written as a block list, which is not the accepted form: the state is unreadable, the shape is named, and two entries were seen. Independently, no verified key means the tier derives as unverified, and no adjudication key means unknown -- not proposed. Discounted, not rejected: the concept remains readable and its prose was read." "note": "Two independent reasons to discount, reported separately rather than merged. The sources value is written as a block list, which is not the accepted form: the state is unreadable, the shape is named, and two entries were seen. Independently, no verified key means the tier derives as unverified, and no adjudication key means unknown -- not proposed. Discounted, not rejected: the concept remains readable and its prose was read."
} }
], ],
"ledger_note": "Had tiltak-trinnstyring-innkjoringssone held, its driftslogg entry would have been the first place to look for a refutation of the 18 % figure. It is reported as (unreadable, block-sequence, 2) rather than as absent evidence, because 'written in a form I could not read' and 'not there' point at different repairs.", "ledger_note": "tiltak-trinnstyring-innkjoringssone's driftslogg entry would have been the first place to look for a refutation of the 18 % figure. It is reported as (unreadable, block-sequence, 2) rather than as absent evidence, because 'written in a form I could not read' and 'not there' point at different repairs -- and because it was unreadable rather than exhausted, the judgement is undecided rather than survived.",
"denominator": { "denominator": {
"concepts_considered": 7, "concepts_considered": 7,
"concepts_consulted": 2, "concepts_consulted": 2,