promptVersionIdground(retrieval) hands it.corpusVersionIdsv-graph-* scripts: content · tags · edges · embeddings · variations. Each build declares a retrievalInterface: the fields it exposes. That interface is the compatibility contract.corpora/* registrycorpora/{versionId} · lineageretrievalInterface it exposes through ground(retrieval) — with fields added vs the prior plate picked out in green.registerCorpus() call (the form in §F mirrors that call for the rare manual register):sv-graph-etl.js →
sv-graph-embed.js →
sv-graph-repair-edges.js →
sv-graph-aura-enrich.js →
registerCorpus({label, builtFrom, retrievalInterface, exposesFields, metrics}) →
corpora/{versionId}
corpora/*| Version ↕ | Label ↕ | builtFrom ↕ | builtAt ↕ | Interface ↕ | Status ↕ | Action |
|---|
nominated:true on corpora/{versionId} and the plate appears on the Proof Spike board beside the prompt candidates.7corpora/{id} through govCorpus — an operator+ action. A pioneer-but-not-operator credential is refused server-side; the refusal surfaces below.registerCorpus()registerCorpus() call does this on build. For a manual register, declare the version, what it was built from, and the retrievalInterface fields it exposes through ground(retrieval) — that field set is the compatibility contract.4sv-retrieval-1
retrievalInterface. A pair can lock only if a prompt's required fields ⊆ this version's exposesFields — declare them honestly.config/live (a runtime-config flip, app-cached, no deploy). One live pair at a time; supersede-prior; full audit trail.promptVersionId and corpusVersionId, and a lock is compatibility-guarded: lock only if the prompt's required fields ⊆ the corpus's retrievalInterface.corpora/{versionId}), its own lineage, its own A/B, its own go-live. Prompt-only governance is half the system: a brilliant prompt against stale stock still ships a stale edition. The corpus is tuned in the graph pipeline (sv-graph-* scripts), not a UI — so the Desk needs a deliberate "nominate" path the pipeline doesn't provide.(:Concept/:Question)-[:HAS_VARIATION {surface, reason}]->(:Variation {text, status}) — content-safety in the corpus, not the voice layer (voice = phrasing only). The while-listening surface pulls a listen-safe affirming variation; the app surface re-admits a lead-register reframe in app-safe form. neo.js only reads status:'live'.