docs(phase-4): record linkedin-studio's two named requirements before the freeze

They named both on a live channel today, having withdrawn the half of their
original question that turned out not to bind them. Recorded here rather than in
a reply so the scope freeze has to answer them explicitly.

`write_index` ownership was genuinely ambiguous in this plan — they read
deliverable 4's "write" and asked which line owns it. It is deliverable 3, and
the plan now says so.

Their vocabulary requirement is already the Python half's shape:
`TypePolicy(allowed=None)` is the default and rewrites nothing, so there is no
DEFAULT_TYPE to snap to. The reference checker's collapse is a known deviation to
resolve with the convention owner under step 1, not a behaviour to lift.
This commit is contained in:
Kjell Tore Guttormsen 2026-07-25 20:34:54 +02:00
commit c5e6f083e6

View file

@ -46,7 +46,40 @@ code.
parity.
3. **linkedin-studio stays plugin-local.** Its `ingest/published/`
provenance-record grammar has a different lifecycle by design and is NOT
normalized into this library. Explicit non-goal, agreed up front.
normalized into this library. Explicit non-goal, agreed up front, and
confirmed by them on 2026-07-25 as their own fixed decision rather than
something conceded to us.
Two requirements they named on 2026-07-25, before the scope freeze, which
it must therefore answer explicitly rather than pass over. Both are about
not breaking what they have, not about building toward them:
- **`write_index` must have a do-nothing mode.** They run a fourth index
mode the spec does not describe: create-if-absent, no managed lines,
the whole file hand-editable. Their scaffold never opens an existing
index, so it cannot normalize one. The requirement is that this
library's writer match that — against an existing index carrying no
managed lines, write nothing, and do not normalize the frame "while it
is open anyway". This is the writer-side sibling of the Phase 3
decision that nothing enumerates a directory unless the profile says
the index is derived. `write_index` is deliverable 3, not deliverable
4's `write`; that was ambiguous in this plan and is now stated.
- **An absent vocabulary means "do not snap", never "snap to default".**
The reference checker collapses any non-matching type to a
`DEFAULT_TYPE`, which would erase their Profile / Operations /
PendingDiff distinction with zero byte change. Vocabulary is
per-bundle, never spec-global. This is already the Python half's shape
`TypePolicy(allowed=None)` is the default and rewrites nothing — so
the Node half inherits a design rather than adopting a constraint, and
the collapse is a known deviation to resolve with the convention owner
under step 1 rather than lift.
They have offered a minimal tolerance fixture pair (a `brain/` hub whose
`index.md` carries `okf_version` as markdown text, and an
`ingest/published/` record: YAML-free five-line header terminated by
`\n---\n`, no trailing newline). Take the bytes rather than the
description — it is held as a tolerance case, never as a format this
library emits.
4. **Persist gate = guard-as-contract.** There is no Node guard today. The Node
half documents and enforces the guard's *contract* at its persist seam
(fail-closed hook point, no content-safety logic of its own) so a future Node