docs(okf): run the §12 re-check against Google OKF v0.2 — three corrections, floor unchanged

§12 says "When Google bumps OKF, each plugin re-checks conformance." Google
bumped 2026-07-25; commons ruled the trigger catalog's to pull and the plugin
owners' to perform. This is the pull.

Held: upstream has NOT moved (git ls-remote answers 3fcbb9f, identical to the
mirror the 0.3 round read; SPEC last touched 2026-07-24 in 780fe9d). All seven
upstream anchors resolve exactly, quotes verbatim. The §3 floor is conformant
with upstream §11. No floor change -> the convention stays at 0.3.

Corrected:
1. §14 said "OKF SPEC v0.1" while linking blob/main/okf/SPEC.md, which has
   served v0.2 since 2026-07-24 — a reader following our own reference got
   v0.2 under a v0.1 label.
2. §3 attributed to upstream a rule upstream does not state: "upstream binds
   the index.md requirement to the bundle root alone", cited to commons'
   method-spec.md. Google requires index.md NOWHERE (SPEC :117 "Optional",
   :504 "MAY appear in any directory", :759 consumers MUST NOT reject for
   missing index files). Three rungs, not two; ours is highest either way, so
   only the attribution was wrong.
3. §4 now names v0.2's second breaking change (# Citations -> sources).
   Measured 2026-08-03: no marketplace emitter writes # Citations; the one
   live exposure is a plan, not code — ms-ai-architect's brief still names an
   upstream v0.1 example as the template to copy.

Suites 120/120, 0 fail. check-versions 12/12 OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01THEvHPWM11RupX24wBGKLu
This commit is contained in:
Kjell Tore Guttormsen 2026-08-03 20:46:05 +02:00
commit 552784e262
2 changed files with 76 additions and 8 deletions

View file

@ -494,6 +494,47 @@ protocol; 🟢 is reserved for the independent gate-verified step (operator veri
clean: **no fixture was migrated**, deliberately — the 9 body-text fixtures are now the coverage
for the transitional path. _(catalog session, økt 9.)_
- **2026-08-03** — **The §12 re-check against Google OKF v0.2 was run. Three corrections, no floor
change, so the convention stays at 0.3.**
§12 says «When Google bumps OKF, each plugin re-checks conformance.» Google bumped on 2026-07-25.
commons ruled the trigger **catalog's to pull and the plugin owners' to perform**
(`portfolio-optimiser-commons/STATE.md:120`, plan doc `docs/plan/2026-07-31-okf-versjonsakse-sjekk.md:66-67`);
this entry is the pull.
**What held.** Upstream has **not moved**: `git ls-remote` on `GoogleCloudPlatform/knowledge-catalog`
answers `3fcbb9f` — identical to the local mirror the 0.3 round read. `okf/SPEC.md` was last touched
2026-07-24 (`780fe9d` = the v0.2 migration, #227). All **seven** upstream anchors this document
cites resolve exactly where it says, quotes verbatim (§4.1:168, :193-196, :302, :467-469, §8:509-510,
§12:773-775, §13.1:802-804). The §3 floor is conformant with upstream §11: upstream requires a
parseable frontmatter block and a non-empty `type`; this convention requires the same `type` and
adds `index.md` per level, which §11 permits because it forbids only *rejecting* a bundle for a
missing index. **Nothing about the floor changed, so the convention version does not move.**
**Three corrections, each measured, none of them upstream's fault:**
| # | Where | Was | Is |
|---|---|---|---|
| 1 | §14 references | «OKF SPEC **v0.1**» pointing at `blob/main/okf/SPEC.md` | `main` has served **v0.2** since 2026-07-24 — label and link had disagreed for 10 days |
| 2 | §3 superset paragraph | «**upstream** binds the `index.md` requirement to the bundle root alone», cited to `method-spec.md:81-85` | three rungs: upstream requires it **nowhere** (`:117`, `:504`, `:759`); **commons'** method-spec binds the root alone; ours binds every level |
| 3 | §4 recommended fields | only v0.2's *first* breaking change named | the second (`# Citations``sources`, §13.1:806-808) now named, with its measured exposure |
Correction 2 is the defect class this re-check exists to catch: **a claim about upstream sourced
from a sibling's derived document.** The direction matters — it made upstream look *stricter* than
it is, so the superset claim was never at risk; only the attribution was wrong. Nothing downstream
changes, but the sentence misstated a third party in a public document.
**Measured for correction 3 (2026-08-03):** no marketplace emitter writes `# Citations` — grepped
across linkedin-studio, okr and ms-ai-architect. The one live exposure is a **plan, not code**:
ms-ai-architect's design brief still names an upstream **v0.1** example as the template to copy,
carrying both `timestamp` and `# Citations` (`docs/okf-second-brain-brief-2026-06.md:56`). That is
their call to make, and it is in the trigger message they received.
**Trigger sent** to the three consumers of §2 (linkedin-studio, okr, ms-ai-architect) and the
outcome reported to commons, who had closed the track from their side. What the plugin owners own
is conformance of their **own** bundles; what the catalog owns is the axis, the trigger and this
document. _(catalog session, økt 18.)_
## Distilled architecture notes (OKF round, 2026-07)
Durable conclusions from the cross-repo round (full working context retained by the catalog session):

View file

@ -74,12 +74,23 @@ file path minus `.md`.
- **MUST (consumers)** — preserve unknown frontmatter keys, tolerate unknown `type` values, tolerate
broken cross-links.
This is a **superset** of upstream OKF, not a restatement of it. The difference is deliberate and
sits in one place: upstream binds the `index.md` requirement to the **bundle root alone** — a nested
directory without its own `index.md` is not an error there (`method-spec.md:81-85`) — whereas the
MUST above binds **every** level. §8 permits a plugin to go further than the floor; this is the
catalog exercising that, and a reader must not take it as upstream's requirement restated. okr's
`okf-check.mjs` (§7) is the reference implementation of *these* semantics.
This is a **superset** of upstream OKF, not a restatement of it — and it is a superset of **two**
contracts, which this document through 0.3 collapsed into one. There are three rungs, not two:
1. **Upstream requires `index.md` nowhere.** Its structure diagram marks the file `# Optional`
(`okf/SPEC.md:117`), §8 opens «An `index.md` file MAY appear in any directory, including the
bundle root» (`:504`), and §11 forbids a consumer to reject a bundle for «Missing `index.md`
files» (`:759`). Read at `3fcbb9f`.
2. **A sibling contract binds the requirement to the bundle root alone** — commons'
`method-spec.md:81-85`: a missing root `index.md` is an error, «this binds the **root alone**»,
and a nested directory without its own `index.md` is not an error.
3. **The MUST above binds every level.** Highest rung; ours.
§8 permits a plugin to go further than the floor, and this is the catalog exercising that. A reader
must not take the MUST as upstream's requirement restated — **nor attribute rung 2 to Google, which
does not state it** (through 0.3 this paragraph did, citing `method-spec.md` for a sentence that
said "upstream"; corrected 2026-08-03 against `3fcbb9f`). okr's `okf-check.mjs` (§7) is the
reference implementation of *these* semantics.
## 4. Recommended fields (warnings, not errors)
@ -94,6 +105,16 @@ marker whose name depends on the bundle's `okf_version` (below). Supply where ch
(`:804`). The gate therefore asks each bundle for the marker its own version names, and never
nags a correct bundle of either version. An absent or non-version-shaped `okf_version` gets
the legacy floor: absence is echoed, not failed (§3), so it still needs a defined list.
- **v0.2's *other* breaking change does not reach this floor — but it reaches a template.** Upstream
also superseded the body `# Citations` list with frontmatter `sources`: consumers «SHOULD read
`sources` and MAY still parse a legacy `# Citations` body list for v0.1 documents»
(`okf/SPEC.md` §13.1:806-808, read at `3fcbb9f`). `sources` is recommended here, never required,
so the §3 floor is untouched whichever form a bundle carries. **Measured 2026-08-03: no
marketplace emitter writes `# Citations`.** The live exposure is a *plan*, not code —
ms-ai-architect's design brief still names an upstream v0.1 example as the template to copy,
carrying both `timestamp` and a `# Citations` section (`ms-ai-architect`
`docs/okf-second-brain-brief-2026-06.md:56`). A bundle built from that template would be
v0.1-shaped on **both** retired fields, which is conformant but ages the day it is written.
- **Canonical name is `resource`** (the OKF spec's name) — **not** `source`.
- A field that would break a plugin's invariant may be omitted. Example: linkedin-studio omits
`timestamp` (its serializer is pure/deterministic — a timestamp would break round-trip) and
@ -282,8 +303,14 @@ commands?) + **maintenance reliability** — **not** against formal OKF conforma
## 14. References
- **OKF SPEC v0.1:** `github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md`
(12 June 2026, "a starting point, not a finished standard").
- **OKF SPEC:** `github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md`. **`main`
has served v0.2 since 2026-07-24** (`780fe9d`, "okf: migrate format and tooling to Open Knowledge
Format v0.2"; the SPEC was last touched at `3fcbb9f` the same day, and upstream had not moved
when this was re-checked on 2026-08-03). Every upstream anchor in this document was read at
`3fcbb9f`. Upstream publishes **no tags**, so the v0.1 text — the version this convention targets
on the `okf_version` axis (§12) — is reachable only through history.
_(Through 0.3 this entry read "OKF SPEC v0.1" while pointing at `main`; label and link had
disagreed since the upstream bump. A reader following it got v0.2 under a v0.1 label.)_
- **Per-plugin design notes:** linkedin-studio `docs/okf-convergence-brief.md`; okr
`docs/okf-second-brain-note-2026-06.md`; ms-ai-architect `docs/okf-second-brain-brief-2026-06.md`.
- **Shared checker (the cross-plugin gate):** `catalog/scripts/okf-check.mjs` (+ `okf-frontmatter.mjs`,