docs(okf-v0.2): admit portfolio-optimiser to the pilot set, re-point Test A

Operator decision 2026-08-09, on their request. po-claude is parked until the
MAF version ships, so Test A's verdict is not coming from the original
producer.

The admission is about the axis, not the headcount. With po-claude parked, no
original pilot member could EMIT a v0.2 bundle at all -- claude-code-llm-wiki
is read-only in the pilot and catalog is gate-side -- so GA exit criterion 5's
emit half had no possible runner. portfolio-optimiser consumes the same Door A
and is the D7 sibling of the parked repo, which makes it a substitute for the
axis rather than a fourth opinion on it.

A-E1 now measures a wider span than it was written for, because they are
pinned at v0.3.2. Measured rather than asserted: the three DEFAULT goldens are
byte-identical v0.3.2 -> v0.5.0a2, so the measurement can be cited instead of
asking them to trust the additivity promise.

CHANGELOG amends the pilot set under [Unreleased] rather than editing the
released v0.5.0a1 entry, which records what was true when that tag shipped.
It also states the guard pin that tag actually carries (>=0.2,<0.3, resolving
against guard v0.2.0), since main has since moved to >=0.3,<0.4.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TgTrQdexGdLYmt1ZMenPyC
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 10:04:53 +02:00
commit 7d9bc0cddd
2 changed files with 66 additions and 4 deletions

View file

@ -445,6 +445,27 @@ Three repos, each exercising a different axis, and deliberately cheap for them:
| `portfolio-optimiser-claude` | **Producer path.** Real Door A ingestion emitting v0.2 from a real manifest | Pin the pre-release tag, run one real manifest, report | one run |
| `catalog` | **Gate acceptance.** Does a bundle *declaring* `okf_version: 0.2` actually pass their gate — measured against their gate, not our reading of its regex | Run their existing gate on our fixture. No code change | one gate run |
| `claude-code-llm-wiki` | **Expressiveness.** Can the profile object express a strict consumer at v0.2, over 524 real documents | Nothing. We read their bundle and send them the report | zero |
| `portfolio-optimiser` | **Producer path** — admitted 2026-08-09, see below | Pin the pre-release tag in a scratch venv, run one real manifest, report | one run |
**Fourth member admitted 2026-08-09, on their request and the operator's
decision.** `portfolio-optimiser` (the MAF side) asked to join; the ask arrived
alongside the notice that `portfolio-optimiser-claude` is **parked** until the MAF
version is finished, so Test A's verdict is not coming from the original producer
on any near horizon.
The admission is not a courtesy. The producer axis was the only one still open —
Test B closed 2026-07-31 and Test C is ours — and GA exit criterion 5 requires one
consumer to have *emitted* end-to-end. With po-claude parked, `claude-code-llm-wiki`
read-only and `catalog` gate-side, **no member of the original three could emit at
all**, so criterion 5 had no possible runner. They consume the same Door A and are
the D7 sibling of the parked repo, which is what makes them a substitute for the
axis rather than a fourth opinion on it. It also satisfies the standing
needs-driven posture directly: a consumer *asking* is the stated need.
Two things stated to them rather than assumed, because both are theirs to decide:
their run path is frozen 2026-08-12 for a 2026-08-13 live demo, and Test A runs in
a **scratch venv** — the procedure's own words — so it never touches that path;
timing after the demo is offered and no date is attached, since GA has none.
The wiki entry is the important design detail: **most of the pilot is read-only
on our side.** We run the v0.2 reader over real consumer bundles and report what
@ -464,9 +485,12 @@ deciding V1 — a participant, not a test site); `llm-ingestion-pipeline-securit
- **P1 — read-only sweep (us).** Run the v0.2 reader over real bundles from the
pilot set. Finds parser gaps, tolerance-rule violations, and expressiveness
gaps at zero risk to anyone. Runs as soon as D1D3 are green.
- **P2 — one producer, opt-in.** `portfolio-optimiser-claude` emits a v0.2 bundle
against the pre-release tag.
- **P3 — gate check.** `catalog` runs their real gate on P2's output.
- **P2 — one producer, opt-in.** A pilot producer emits a v0.2 bundle against the
pre-release tag. Originally `portfolio-optimiser-claude`; **re-pointed to
`portfolio-optimiser` 2026-08-09** when the former was parked.
- **P3 — gate check.** `catalog` runs their real gate. **Done 2026-07-31, and it
did not wait on P2** — the procedure runs on `examples/` at the tag, not on P2's
output. The dependency stated here originally was wrong; see the Test B result.
- **P4 — fix, then GA.** Address findings, then flip `OKF_LATEST` as its own
release.
@ -860,7 +884,26 @@ merely confirming it.
All three read their inputs from this repo at the pre-release tag (`v0.5.0a1`);
nothing is transported through the mailbox except the specification itself.
#### Test A — producer path (`portfolio-optimiser-claude`)
#### Test A — producer path (`portfolio-optimiser`, re-pointed 2026-08-09)
**Runner changed, expectations unchanged.** Originally `portfolio-optimiser-claude`;
they are parked, and `portfolio-optimiser` was admitted to the pilot set to run it.
Two consequences worth stating, since neither is cosmetic:
- **A-E1 measures a wider span than it was written for**, and that is better
signal, not worse. It asserts byte-identity with what *their currently pinned
version* produces, and they are pinned at `v0.3.2` — not at the baseline
po-claude would have used. **Already measured here rather than asserted:**
`git diff v0.3.2 v0.5.0a2 -- examples/ingest-golden-{file,sql,http}` is empty,
so the three `DEFAULT` goldens are byte-identical across that whole span and the
only `examples/` change is the *added* v0.2 golden. That is what V-A6's suite
exists to hold, so we can cite the measurement instead of asking them to take
our word for it — the symmetric move to catalog pre-measuring their own gate
rather than trusting our reading of their regex.
- **Do not assume po-claude's call-path finding transfers.** Their adapter took
three positional arguments and exposed no `profile` parameter, which is what
made A-E1 measure the library API rather than their pipeline. Whether the MAF
side has the same shape is theirs to report, not ours to predict.
**Procedure.** In a scratch venv, install the package at the `v0.5.0a1` tag. Take
**one manifest they have already run under `DEFAULT`**, so the existing v0.1