Tre maler i references/ lovet EN udifferensiert samlet score, i strid med
separasjonsregelen i okr-framework.md: committed og aspirational maales mot
ulike standarder og skal rapporteres hver for seg.
Rot-aarsak: vektings-listen i okr-framework.md oppga "noen KR-er committed og
andre aspirational" som en GRUNN TIL AA VEKTE -- seks linjer over seksjonen som
forbyr aa aggregere de to i det hele tatt. Malene lovet et samlet tall fordi
kanon sanksjonerte det. Bulleten er fjernet og erstattet av prosa som avgrenser
vekting til innenfor EN type.
Malene foelger naa generatorens form (lib/syklus-rapport.mjs): committed binaert
mot kravet, aspirational som snitt over N KR. ASCII-boksenes bredde er bevart.
(k)-vaktens skanne-sett utvidet fra commands/+agents/ til ogsaa references/.
Eksklusjonen var KATALOG-BRED for aa skaane per-Objective-aggregeringen i
kalkulatoren, og tok team-aggregatene med seg -- samme lekse som R4. Per-Objective
gaar fortsatt klar, men paa MOENSTERET i stedet for paa katalogen.
Ny vakt (k2) mot at kanon gjenoppretter sanksjonen. Strukturell, ikke semantisk:
et kulepunkt i vektings-listen som navngir begge typene er en sanksjon i kraft av
posisjon. Mutasjons-verifisert -- identisk ordlyd flyttet INN i listen feller
vakten, som beviser at den maaler posisjon og ikke ordlyd.
Suite 328 -> 329.
`get()`-regexens verdi-gren brukte `\s*`, som inkluderer linjeskift. Enhver
key med tom rest-av-linje slukte dermed den neste ikke-tomme linja. Utslaget
var bredere enn list-keys: en tom `title:` returnerte neste keys hele linje
("type: OKR"), og et tomt `description:` dempet okf-checks anbefalt-felt-
advarsel med data som tilhorte en annen key.
Verdi-grenen strammet til `[ \t]*`. Innrykk-ankeret (`^\s*`) er urort -- det
er load-bearing for inject-okr-context.mjs:69s nestede organisasjon:-lesing.
Kontrakt-kommentaren i :13-16 lovet allerede null for list-keys; den er naa
sann i stedet for aa bli rettet ned.
Sju RED-verifiserte tester: (L1) list-key gir null - (L2) tom skalar sluker
ikke neste rot-key - (L3) tom key foran list-blokk - (L4) innrykk-toleransen
bevart, forelder gir null - (L5) tab-separert verdi - (L6) tomt anbefalt felt
demper ikke okf-check-advarselen (rootLevelGet arvet defekten) - (L7)
broedtekst-fallbacken plukker ikke list-verdi fra frontmatter.
(L7) gjor S57s latente begrunnelse maalbar: uttrekket i okf-check.mjs:125 ble
beholdt mot nettopp denne defekten, og naar fm-laget endelig taper for
list-keys er `body = raw` foerste gang en roednende mutasjon.
Mutasjons-verifisert (M1 revert, M3 anker-fjerning, M4 uttrekk-fjerning). M2
viste at (L5) ikke vokter tegnklassen -- .trim() gjor `[ \t]*` og `[ ]*`
ekvivalente -- saa testen er omskrevet til aa paastaa det den faktisk viser.
Suite 321 -> 328.
parseFrontmatter.get() er bevisst innrykk-tolerant (`^\s*key:`) fordi nestet
oppslag er load-bearing for inject-okr-context.mjs. Gaten arvet toleransen og
leste en `type:` under `metadata:` som filas type -- en utypet fil passerte
(exit 0). Rot-nivaa-kravet ligger derfor i kalleren; lib/frontmatter.mjs er
uroert.
Ny rootLevelGet() filtrerer bort innrykkede linjer og re-parser visningen med
SAMME lib, saa sitering/kommentar-stripping har fortsatt en implementasjon.
Brukt paa alle OKF-felt i checkBundle (type/title/anbefalte) + paa rootMarkers'
frontmatter-gren, som ellers ga et annet svar enn den rot-ankrede
broedtekst-fallbacken i samme funksjon.
Fire utslag av samme defekt lukket: falsk negativ paa nestet type, nestet type
FOER rot-noekkelen skygget rot-verdien (first-match), falsk positiv naar en
NESTET title bar en lenke, og et nestet anbefalt felt dempet en advarsel.
Tester (N1)-(N5) verifisert roede FOER fiksen; mutasjons-verifisert etterpaa.
Suite 316 -> 321.
Ni flater: package.json, package-lock.json (2), .claude-plugin/plugin.json,
CLAUDE.md-tittel, README-badge + versjonstabell, begge SKILL.md og
tests/package-shape.test.mjs. Versjonsvakten ble kjoert roed mot en delvis
bumpet baum foer resten fulgte, saa den er bevist aa felle drift.
CHANGELOG: [Uutgitt] konvertert til [1.9.0] og utvidet med D4-D8. Egen
"Kjent avvik"-seksjon baerer trekreview-funnet om at arkivklars lesegrense
haandheves i path-confinement-modulen, ikke i tool-lista alene - briefen
krevde et Bash-fritt sett, planen skrev det om, og briefen ble aldri oppdatert.
check-versions staar med 1 WARN (katalog-ref v1.8.2 != 1.9.0, ingen tag ennaa).
Det er den forventede tilstanden mellom bump og release; release-plugin.mjs
lukker den.
python-markdown uten "meta" parser ikke YAML-frontmatter, saa OKF-noeklene
(type/resource/timestamp/...) ble rendret som <hr/><p>type: ...</p><hr/> oeverst
i eksporten. Hver fil i OKR-treet baerer frontmatter, saa maskinlaget lakk inn i
dokumenter som skal til virksomhetens sak-arkiv.
Vakten (p1) laaser extensionen paa den faktiske kallsiden i stedet for paa prosa
om den, og er RED-verifisert mot uendret kode foer fiksen.
1.8.2 unquotet parseExistingIndex (produsent-siden). okf-check sin
rootMarkers/pick returnerte fortsatt raa streng, saa samme fil ga to
lesninger av samme markoer:
paa disk: okf_version: "0.2" (upstreams eget eksempel, SPEC.md:773)
produsenten: 0.2 <- unquotet
checkeren: "0.2" <- raa
Catalog maalte divergensen direkte mot sin egen checker gjennom
evaluateBundle: begge implementasjonene AKSEPTERER -- avviket ligger paa
verdien, ikke paa dommen. Ingen gate rammes i dag fordi paritetskorpuset
ikke har en sitert fikstur, hvilket ogsaa betyr at paritetsgatens groenne
farge ikke dekket denne aksen: den var "ikke kjoert", ikke "som forventet".
Fiks: unquote() eksporteres fra okf-index.mjs og importeres av
okf-check.mjs -- EN regel delt, ikke to kopier som kan drifte fra
hverandre. Script-til-script-import foelger etablert moenster
(innboks-ingest.mjs:51).
Tester: 192 -> 197. Fire kjoert roede foer fiksen. Den femte
(ubalansert-vakten) var groenn foer fiksen -- raa streng bevarer "0.2
naturlig -- og er derfor mutasjons-verifisert: en graadig unquote roedner
baade produsent- og checker-vakten.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XKoS7Eb8YmAfeCf1EKZXt1
Slipper `85143be` (siterte markoerverdier korrumperte begge rot-markoerene)
som egen patch. Fiksen retter en datakorrumpering i released 1.8.1 og har
ligget ETTER tag v1.8.1 -- brukere paa katalog-ref har ikke faatt den.
Bumpede flater: package.json, package-lock.json (2), .claude-plugin/plugin.json,
README badge + versjonstabell, begge SKILL.md, CLAUDE.md-tittel,
tests/package-shape.test.mjs (2). CHANGELOG-seksjon lagt til.
Suite 192/192 groenn -- ingen kodeendring i denne commiten, kun versjonsflater.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016BDwL2pweAjLaHYZFjgYUa
Upstreams eneste kanoniske eksempel med verdi (okf/SPEC.md:773) skriver
`okf_version: "0.2"` -- sitert. parseExistingIndex fanget anfoerselstegnene
raatt, UPSTREAM_VERSION_RE avviste `"0.2"` som ikke-upstream-form, og
resolveMarkers behandlet den som en layout-verdi fra foer 1.8.1-splitten:
inn: okf_version: "0.2"
ut: okf_version: 0.1 <- nedgradert til vaar konstant
okf_layout: "0.2" <- ekte upstream-versjon i feil markoer
Begge markoerene oedelagt, og dataene ikke gjenopprettelige uten aa kjenne
originalen. Bugen er i released 1.8.1-kode og traff enhver bundle som hadde
skrevet markoeren slik upstream selv viser den.
Fiks: anfoerselstegnene er YAML-strengsyntaks, ikke del av verdien, saa de
strippes ved parse -- foer verdien tolkes og foer den emitteres. Verdien
emitteres normalisert (unquoted), slik at vaar egen utskrift bestaar en
form-sjekk som kjoeres paa raa streng. Unquote er konservativ: kun et
matchende par strippes, en halv sekvens bevares uroert.
Tester: 187 -> 192. Fire nye kjoert roede foer fiksen; den femte
(ubalansert-vakten) mutasjons-verifisert roed mot en graadig unquote.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NmXFhc6v9cs4YZ5AWFnQs8
Vår alfabetiske `.sort()` i okf-index.mjs lå på akse B (ingest-spec.md:178-181),
som krever manifestets ekstraksjonsrekkefølge fra kalleren og eksplisitt forbyr
«filesystem enumeration order». Ruling-dokumentet (portfolio-optimiser-commons
docs/plan/2026-07-25-ordering-axes-ruling.md §4 @ a67a243) navngir alfabetisk
sortering som deterministisk FEIL på denne aksen: B ber ikke om *en*
deterministisk rekkefølge, den ber om *kallerens*.
Kontrakt (operatør-valgt), implementert i orderEntries():
1. navn som alt står i indeksen -> beholder linjerekkefølgen (§6 «preserved
byte for byte»)
2. nye navn med kaller-rang -> kallerens ekstraksjonsrekkefølge
3. nye navn uten kaller-rang -> alfabetisk
(3) er en dokumentert genesis-fallback, ikke en B-etterlevelse: CLI-en tar kun
en katalog og har ingen kaller-liste å tre gjennom, og alternativet — rå
readdirSync-rekkefølge — er nettopp det B forbyr. Fallbacken gjelder bare ved
genesis; så snart en indeks finnes vinner (1), så et alfabetisk valg overstyrer
aldri en rekkefølge en kaller har etablert.
§5 i rulingen: den som arver B arver §6-idempotensen med den. `order` er derfor
KUN rangering — medlemskapet leses fortsatt fra disk (akse A, :175-177), så en
sti i lista kan aldri opprette eller gjenopplive en fil, og et gate-discardet
dokument kan ikke snike seg inn i indeksen. parseExistingIndex bærer nå
linkOrder eksplisitt framfor å hvile på JS-objekters innsettingsrekkefølge.
innboks-ingest.mjs trer sin faktiske ekstraksjonsrekkefølge gjennom; uten det
ville fiksen vært et ubrukt API.
Tester: 182 -> 187. Alle fem nye verifisert røde mot mutant (orderEntries ->
`[...names].sort()`), de 39 øvrige grønne under samme mutasjon. Ende-til-ende-
testen diskriminerer ved at dokumentrekkefølgen (Zulu før Alfa) er den motsatte
av den alfabetiske.
Ingen versjonsbump; release avventer operatør-go.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EaQkAtvpNCLxWkjdEJ11vx
Tre C7-review-funn der vakten var groenn fordi den ikke KUNNE se defekten sin.
Alle tre TDD: vakten skrevet om foerst, mutasjons-verifisert roed mot ekte
filer, deretter kilden rettet. Suite 179 -> 182.
D1 (607313e3) tests/canon-consistency.test.mjs case (b) -- F-d-kadensvakten
kunne ikke feile paa den KANONISKE kadens-tabellen. teamMonthly bandt kadens-
adjektivet direkte til check-in med \s+, men etter "Maanedlig" kommer "**" og
en cellevegg, aldri whitespace; ledWeekly krevde /review/, mens den kanoniske
raden sier "statusgjennomgang". Vakten var altsaa blind paa nettopp det
artefaktet F-d produserer. Erstattet av to former med ulik struktur: prosa
(kadens + binding i SAMME klausul -- setning/komma/celle/" og ") og kadens-rad
(kadens-adjektivet alene i foerste celle, binding paa tvers av celleveggene).
Klausul-splittingen er det som skiller korrekt dobbeltrytme ("Ukentlig 15-min
check-in + maanedlig 30-min review", okr-implementation.md:181) fra motsigelse.
To nye fixture-caser holder hverandre i sjakk: (b2) de fire muterte kanoniske
linjene MAA flagges, (b3) ti legitime former MAA ikke.
D2 (7579d59c) case (g) -- agent.includes(d) er substring-containment, saa
rubrikk-dimensjonen "Outcome" var subsumert av "Outcome-fokus" og kunne
slettes uten at vakten falt. Ni av ti dims var ekte dekket; den tiende var
utestbar. Matcher naa token-grenser (uthevede listeledd + overskrifter).
Ny fixture (g2) pinner skillet.
D3 (029ef814) case (i) + commands/freshen-references.md:24 -- vakten
ekskluderte to filer permanent under en kommentar som kalte dem
"allerede-fiksede". freshen-references.md var aldri fikset; den falt utenfor
review-lista paa ni, og bar fortsatt "OKR-kontekst injiseres automatisk via
hook" -- en eksakt match for vaktens egen frase. Begge ekskluderinger fjernet
(analyse.md-ekskluderingen var dead code: fila matcher ingenting), kontekst-
blokken skrevet om til analyse.md-moensteret (oppdag fra disk via Glob).
Mutasjons-verifisering (alle fem forble groenne FOER, roede ETTER):
okr-framework.md:54 -> team maanedlig check-in -> (b) RED
okr-framework.md:55 -> ledelse ukentlig -> (b) RED
okr-framework.md:58 -> prosa "holdes maanedlig" -> (b) RED
okr-framework.md:59 -> prosa "holdes ukentlig" -> (b) RED
kvalitetssjekker-agent.md:48 slettet (Outcome) -> (g) RED
Artefakt: .claude/projects/2026-07-23-en-kanon-metodekonsolidering/review.md
Rot-index.md bar en markoer som dekket to urelaterte konsepter: den upstream
OKF-versjonen bundelen sikter mot OG pluginens egen layout-revisjon. Specen
(catalog/docs/okf-second-brain/spec.md 12, log.md 2026-07-23) skiller dem i to
markoerer. Denne releasen migrerer emitteren og sjekkeren over.
- okf-index.mjs: emitterer okf_version: 0.1 (upstream, paakrevd per 3) +
okf_layout: kb-layout-2026-06 (vaar revisjon, valgfri per 12). Ny konstant
OKF_LAYOUT; OKF_VERSION baerer naa upstream-verdien. Begge rot-eksklusive.
- Migrasjonssti: en ikke-upstream verdi i okf_version FLYTTES verbatim til
okf_layout ved neste kjoering. Spec-konform okf_version roeres aldri;
eksisterende okf_layout bevares. Byte-idempotent.
- okf-check.mjs: ekkoer begge markoerene (fravaerende -> MANGLER). Rent ekko,
ingen ny haandheving -- spec 3 er ikke haandhevende paa form ennaa.
- CLI: --okf-layout er kanon. --okf-version beholdt som deprecated alias
(verdien var alltid en layout-revisjon) m/ varsel til stderr, ALDRI stdout.
Samme aliasing for generateIndexes({ okfLayout }) mot { okfVersion }.
- Doc-flater (CLAUDE.md, second-brain SKILL.md, commands/oppsett.md) beskriver
naa to markoerer der de beskrev en.
Suite 167 -> 179, alle groenne. Versjonssync 1.8.1 over alle shippede flater.
Laaser opp catalog + llm-ingestion-okf, som begge ventet paa denne migrasjonen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pUfkQ1YyH75z9y6RBaBHG
Lukker de fire release-relevante MAJOR-funnene fra /trekreview (S33). Alle TDD
roed -> groenn, ingen fiks landet uten en test som feilet foerst. Suite 163 -> 167.
R1 (af16d5e4) hooks/scripts/coaching-hook.mjs:83 -- LEVENDE REGRESJON innfoert av
1.8.0. Denne releasen skrev status-malen (commands/sporing.md:86-88) om til den
kanoniske skalaen On Track/At Risk/Off Track, mens hooken fortsatt talte kun
/i fare|blokkert/i over tabellrader. En status generert under 1.8.0 ga derfor
atRiskCount = 0 og SessionStart-nudgen sluttet stille aa utloese seg. Hooken
teller naa de kanoniske etikettene; de to norske er BEHOLDT som bakover-
kompatibilitet for status-filer skrevet foer 1.8.0. Nudge-teksten bruker samme
kanoniske vokabular. Ny testcase mates av malen slik den faktisk genereres i dag;
den eksisterende casen beholder gammelt vokabular og daekker legacy-stien.
R2 (7ec575be) F-i-omskrivingen ga hver kommando en Kontekstbevissthet-blokk som
INSTRUERER Glob, men allowed-tools ble kun utvidet i kaskade.md. Glob lagt til i
export, gap, governance, innfoering, kvalitet, moeter, skriv, sporing. Ny vakt-
case (k): nevner BODY verktoeyet, maa frontmatter deklarere det (13 kommandoer
instruerer Glob; alle 13 dekket). Case (i) grepper kun etter fjernede fraser og
kunne ikke fange dette.
R3 (5e61ae0d) tests/package-shape.test.mjs asserterte KUN package.json -- som er
private:true og dermed den ene flaten som aldri shipper. En delvis bump ville
shippet groenn. Ny versjonssync-case dekker .claude-plugin/plugin.json, README-
badgen og begge SKILL.md, med forventet verdi UTLEDET fra package.json (ett sted
aa endre ved neste bump). Mutasjonsbevist: hver av de fire flatene tilbakestilt
til 1.7.1 en om gangen -> casen roed i alle fire tilfeller.
R4 (ccff16e1 + 231c53fc) Tre parallelle confidence-etikettsett overlevde F-c:
fremdriftssporer-agent.md:68 ("Paa sporet / I fare / Blokkert"), :98
("Confidence: [Hoey/Medium/Lav]" -- en annen akse: stoerrelse, ikke sannsynlighet)
og SKILL.md:48 ("blocked"; kanonisk er "off track"). Alle tre erstattet med
referanse til kanon (okr-framework.md:389-392). sporing.md og agenten den
delegerer til svarer naa i samme vokabular. Vakt-case (a)/(b) skanner naa samme
sett som (d) allerede brukte (+ agents/ + SKILL.md), samlet i canonScan(). Ny
case (a2) fanger etikettsett skrevet som bullet eller mal-linje -- tabell-
signaturen alene fanget dem ikke, og det var nettopp formen driften overlevde i.
Divergens gjenkjennes STRUKTURELT (skraastrek-enumerasjon av >= 2 etiketter, med
>= 1 ikke-kanonisk), saa loepende prosa som "For KR i fare" og "Blokkert av
eksterne faktorer" ikke gir falske positive. Verifisert: roed-listen var noeyaktig
de 3 kjente linjene, ingen andre.
CHANGELOG/README: vakt-antall 13 -> 15 cases, suite 149 -> 167, og de fire
fiksene lagt inn under [1.8.0] (Added + Fixed). Ingen versjonsbump.
GJENSTAAR fra reviewet (3 MAJOR, IKKE i denne bolgen): 607313e3 F-d-kadens-
moensteret kan ikke feile paa den kanoniske kadens-tabellen; 029ef814
freshen-references.md:24 baerer fortsatt en foreldet kontekstblokk og vaktens
exclude-kommentar kaller fila feilaktig "allerede-fikset" (den er utenfor
1.8.0-scope by design, jf. ba91fc2 -- kommentaren er usann, ikke ekskluderingen);
7579d59c "Outcome" er utestbar i 10-dims-casen pga. substring-containment.
Verify: node --test --test-reporter=tap tests/*.test.mjs -> 167 pass / 0 fail.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pUfkQ1YyH75z9y6RBaBHG
Step 14 (Wave 6), siste steg i fase C3. Alle versjonsflater 1.7.1 -> 1.8.0:
plugin.json:3, package.json:3, package-lock.json:3+9, CLAUDE.md:1, README.md
badge, SKILL.md x2. Ny Keep-a-Changelog-seksjon [1.8.0] + README-historikkrad
som oppsummerer F-a..F-i, score-grenser, konsistensvakten og C6-markeds-
oppdateringen fra Steps 1-13.
TDD: package.json bumpet foerst -> package-shape.test.mjs case 1 gikk ROED
(expected 1.7.1, actual 1.8.0) -> assertion + header-kommentar oppdatert til
1.8.0 (minor-lane C: En kanon) -> GROENN. Historiske "B1/B2 (1.7.1)"-
provenanskommentarer i tester og historikkrader for 1.7.1 er urort.
To presisjonsfikser tatt inn fra S31-funn (begge i filer Step 14 allerede rorer):
- CLAUDE.md:21 sa "score the 16 domain reference files". Fasit: 16 AV 17 scores;
okr-quality-rubrics.md er ekskludert (sirkulaer - den er selv scorings-
instrumentet). Skrevet i samme presise form som README:150.
- CLAUDE.md:73 pekte paa lib/innboks-convert.mjs. Modulen har ALDRI eksistert
(git log --all paa stien: tom; adapterne har ligget i lib/convert/ siden
a807ee2). Rettet til lib/convert/index.mjs. Samme feilsti stod i CHANGELOG
1.7.0-noten (linje 34) og er rettet der ogsaa: en dokumentert modul som aldri
fantes er en usann paastand, ikke historisk provenans.
CHANGELOG-datoen er satt til 2026-07-25 (i dag). Faller C7-releasen paa en
senere dato, maa datoen justeres da.
Verify: node --test --test-reporter=tap tests/*.test.mjs -> 163 pass / 0 fail.
grep -rc "1.7.1" plugin.json package.json CLAUDE.md -> 0/0/0.
9 filer endret = Manifest expected_paths 1:1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016pUfkQ1YyH75z9y6RBaBHG
- Ny tests/reference-integrity.test.mjs: alle ${CLAUDE_PLUGIN_ROOT}-stier i
commands/agents må finnes på disk OG være shippbare (aldri under gitignored
.claude/). Fanger død-referanse-klassen permanent (TDD: rød på
freshen-references før fiks). Suite 135 -> 138.
- Døde referanser lukket: freshen-references peker nå på metrics-library
«Review-kadens»; metrics-library-provenanslinje uten død relativ sti.
- Kryssref-isolasjon: «Ressurser/Interne referanser»-seksjon i de 5 isolerte
KB-filene (examples, oboard-guide, meeting-guides, calculator, cfr).
- «Sist oppdatert»-markør på alle 17 referansefiler (var 4).
- 19 -> 20 antipatterns (SKILL, kvalitet x2, help — help-forekomst funnet i
sweep utover review-lista); «15. oktober» -> tidlig oktober (arshjul x2,
framework); garblet prognoseformel rettet mot calculator-kanon (framework).
- Typonits: schuld/Næste (meeting-guides), resultatmål (dfo-mapping),
sandbagging (trendanalytiker), Q1-2026 -> T1-2026 (fremdriftssporer).
- README: hooks-badge 4 -> 3, død Stop-rad fjernet.
- BACKLOG.md foldet inn i docs/roadmap.md (tema-nivå, ingen interne
plandetaljer) og slettet; .gitignore ROADMAP.md ankret til rot (/ROADMAP.md)
så docs/roadmap.md kan trackes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>