ktg-plugin-marketplace/test/okf-parity-corpus/manifest.json
Kjell Tore Guttormsen d2169a42c3 test(catalog): flip red-nested-key -> green-nested-key (okr's checker converged)
okr closed patch-lane #2 (commit 35a0bb8): scripts/okf-check.mjs now reads
type: at root level only, so a type nested only in a sources[] entry no
longer passes as typed. Both implementations now agree the fixture's
concept is untyped, so the manifest's own note2 prediction ("flips to
'agree' only if okr scopes the checker's reader without touching inject")
has come true. Renamed the fixture (manifest key + corpus directory) to
match the red-*/green-* naming convention the parity unit test enforces,
and updated okf-frontmatter.mjs's header comment to match.

check-okf-parity.mjs: 10/10 fixtures pass. Full suite: 120/120.
2026-08-09 20:49:32 +02:00

68 lines
6 KiB
JSON

{
"_doc": "Expected per-fixture parity outcome for check-okf-parity.mjs. The runner COMPARES actual vs this expectation; it does not judge the fasit. 'diverge' fixtures are the red-proof: the gate MUST go red on them, else the gate itself is broken. Axes are catalog-owned (trinn F D4), spec-adversarial, defined over DEFAULT read-mode (strictIngest OFF).",
"fixtures": {
"green-baseline": {
"axis": "baseline",
"expected": "agree",
"note": "Clean UTF-8/LF conforming bundle. Sanity anchor: proves the gate is not red-on-everything."
},
"red-byte-bom": {
"axis": "byte",
"expected": "diverge",
"note": "Concept file with UTF-8 BOM + CRLF that HAS type: -> catalog's /^---\\n/ fence misses the BOM (falsely untyped), okr normalizes (frontmatter.mjs:23) and reads the type. Diverges on the untyped-set with an IDENTICAL count (the 'agree OK / disagree on members' case)."
},
"red-tree-innboks": {
"axis": "tree",
"expected": "diverge",
"note": "innboks/ drop-zone with a raw frontmatter-less file -> catalog walks it and counts it a concept, okr skips innboks (okf-check.mjs:37-39). Diverges on conceptCount + untyped-set."
},
"red-tree-dotdir": {
"axis": "tree",
"expected": "diverge",
"note": ".hidden/ dot-dir with an untyped .md -> catalog descends, okr skips dot-dirs. Diverges on conceptCount + untyped-set."
},
"red-combined": {
"axis": "byte+tree",
"expected": "diverge",
"note": "The record's canon fixture (svar-catalog.local.md:48): a BOM+CRLF typed concept AND an innboks/ raw file in one bundle -> catalog FAIL(2 untyped) vs okr OK(0 untyped), opposite exit codes. Byte and tree axes each carry their own red proof."
},
"red-marker-layout": {
"axis": "marker",
"expected": "diverge",
"note": "Root index.md carries a layout snapshot (kb-layout-2026-06) in okf_version instead of the upstream version -> catalog enforces the §3 shape rule and FAILs, okr still pure-echoes the value and passes (their CHANGELOG 1.8.1: 'verdiene valideres fortsatt ikke'). Otherwise clean, so the divergence isolates the marker axis. EXPECTED TO FLIP TO 'agree' once okr mirrors the enforcement — this expectation encodes okr's lag, not a permanent design split.",
"note2": "This axis was invisible until the parity signature carried the shape VERDICT: comparing the okf_version value alone reads 'agree' precisely when the impls disagree about whether that value is acceptable."
},
"green-nested-key": {
"axis": "key-scope",
"expected": "agree",
"note": "A concept with NO top-level `type:` whose only `type:` sits in a block-form `sources[]` entry -> catalog anchors the key at column 0 (okf-frontmatter.mjs, 2026-08-01) and reports it untyped + FAILs. okr's `scripts/okf-check.mjs` used to read the nested `sources[].type` via a `^\\s*key:` scan and pass it as typed; okr's patch-lane #2 (commit 35a0bb8) scoped the CHECKER's reader to root-level fields only, so it now agrees with catalog that the file is untyped. §4.1 makes `type` the only always-required field, and SPEC.md:467-469 names top-level `resource` and `sources[].resource` as DISTINCT fields — the nested match was a false negative on the required axis; that false negative is now closed on okr's side.",
"note2": "The nested-tolerant reader still exists in okr's shared `lib/frontmatter.mjs` and stays load-bearing for their injector (inject:69) — patch-lane #2 scoped only the CHECKER's caller (okf-check.mjs:101), exactly the split this fixture's prior note predicted as the only path to 'agree'. Flips back to 'diverge' only if okr's injector-side nested lookup ever leaks into the checker again."
},
"green-hierarchical": {
"axis": "tree-hierarchical",
"expected": "agree",
"note": "okr's added requirement (trinn-e-analyse:277): subdir pointers, per-level index.md, a cross-level body relation. No adversarial trigger -> both walk the hierarchy identically. Guards against a corpus that is accidentally flat."
},
"green-nodemodules": {
"axis": "tree",
"expected": "agree",
"note": "SHARED GAP, pinned deliberately: an untyped .md inside node_modules/. BOTH catalog and okr descend into it (okr's isWalkableDir skips only dot-dirs + innboks, not node_modules). They agree today; flagged here for future hardening of both walkers."
},
"green-dupname": {
"axis": "tree",
"expected": "agree",
"note": "Same basename (note.md) at two sibling levels -> both impls key on the full relative path, no basename-collapse. Guards the path.name-collapses-hierarchy class."
}
},
"coveredByRuntimeTests": {
"_doc": "These axes are git/FS-hostile as committed files on macOS, so they live as runtime-materialized meta-tests in check-okf-parity.test.mjs (temp dir), not in this committed corpus.",
"symlink": "Symlinked .md, symlinked dir, and a symlink loop -> both impls skip symlinks (Dirent isFile/isDirectory are false), no crash/hang. Materialized because a committed symlink degrades to a plain path-string file where core.symlinks=false.",
"nfc-nfd-filename": "Precomposed (NFC) vs combining (NFD) filename bytes. platform-sensitive + soft-gated: git core.precomposeunicode normalizes NFD->NFC on macOS checkout, so the divergence cannot be pinned as a committed filename. The test logs if the FS normalized it away and does not hard-fail on this axis alone."
},
"withdrawn": {
"verbatim-trailing-newline": "Trinn E §1 (svar-catalog.local.md:742) withdrew it: linkedin-studio's newline-free serializer applies to ingest/published/, which is excluded from the OKF bundle by design; brain/ files DO get \\n. Re-classified a writer-parameter, not a form axis."
},
"outOfScope": {
"sti-former": "Path-forms (~-expansion, Windows separators, plugin-root anchoring). Trinn E (authoritative over STATE) does not re-list it in the D4 axis enumeration; folded into the §1.2 resolution-order spec text -> STEG 5 discovery convention, not the STEG 3 parity corpus."
}
}