---
title: Vault Curator Split + Bi-temporal Reference
type: reference
tags: [vault, curator, ingest, lint, bi-temporal, v1.6, CURATOR-01, CURATOR-02, CURATOR-03, CURATOR-04]
status: locked
locked_at: 2026-05-29
edges:
  refines:
    - "[[vault-edges]]"
    - "[[vault-atoms]]"
    - "[[vault-trails]]"
    - "[[vault-mochs]]"
  derived-from:
    - "[[v1.6-graph-primitives]]"
---

# Vault Curator Split + Bi-temporal Reference

The Phase 75 v1.6-F CURATOR family ships the **curator-split architecture**
(CURATOR-01 + CURATOR-02 + CURATOR-03) plus the **bi-temporal data plane**
(CURATOR-04) per SPEC §3.6 / DEEP-03 §Curator Split + §Bi-temporal shipped
shapes. This doc is the authoritative cross-primitive reference: it captures
the agent boundaries, the 3-stage pipeline, the Q5 LOCKED reversibility
contract (R3 framing-tightened), the 4-field bi-temporal schema, the lint
cadence (R5 cadence-discipline), and the DEEP-06 cross-milestone forward-
reference to v1.7-A CDEEP.

This doc is the authoritative reference for the curator-split semantics —
plan SUMMARY.md files do NOT duplicate this content (CONTEXT.md §Carry-
forward MC4 doc-ownership discipline; mirrors the Phase 72 vault-atoms.md +
Phase 73 vault-trails.md + Phase 74 vault-mochs.md authoritative-reference
precedent). Downstream callers (agents/gmd-vault-ingest.md +
agents/gmd-vault-lint.md + agents/gmd-vault-curator.md + bin/lib/vault-
ingest.js + bin/lib/vault-lint.js + bin/lib/vault-curator.js + the audit
substrate at tests/audit-curator-split.sh + tests/audit-bitemporal-schema.sh
+ tests/audit-include-invalidated-flag.sh) CITE this doc as the upstream
contract.

<!-- critic-decision: 47ba91b4-cfb0-40c9-8b59-694281fb3b6b -->

## Agent Boundaries

The Phase 75 CURATOR family decomposes the pre-v1.6 monolithic curator
agent + library into a **2-agent + thin-router architecture** per DEEP-03
§Curator Split shipped-shape codeblock (lifted VERBATIM from
`.planning/research/v1.6-deep-dive/SUMMARY.md` lines 659-748 as the
authoritative contract per CONTEXT.md MC2):

### `gmd-vault-ingest` (creative writer; CURATOR-01)

DEEP-03 `agents.gmd_vault_ingest` shipped shape:

- **Role**: creative writer.
- **Responsibilities**:
  - Inbox → Knowledge promotion (per v1.3 curator pattern preserved).
  - Atom extraction (raw → atoms per Phase 72 ATOM-01 schema).
  - Typed-edge proposal (frontmatter `supersedes:` / `contradicts:` /
    etc.; Phase 71 closed 10-verb vocab consumer).
  - First-write frontmatter stamping — `type:` (Phase 71 EDGE-02) +
    `valid_from:` + `recorded_at:` (Phase 75 CURATOR-04 bi-temporal
    via `stampBiTemporalFirstWrite(fm)`; same first-write motion as
    existing `type:` stamp pass) + `prefLabel:` (Phase 71 EDGE-03).
  - Segment-classification per llm-atomic-wiki Phase 2 (extract /
    skip / deferred).
- **Forbidden**:
  - Inventing new atom branches (surface as user question).
  - Editing existing atoms (immutability; supersession-only per Phase
    72 ATOM lifecycle).
  - Creating wiki/MOC notes (delegate to vault-moc + future ingest
    passes; Phase 74 MOC-cluster regeneration is auto-generated, NOT
    ingest-authored).
  - Pre-resolving cross-note wikilinks (per graphiti seam-discipline).
- **Calibration**: After ~10-20 atoms in a batch, request user review
  before continuing (llm-atomic-wiki parallel-compile checkpoint
  pattern).

Lib backing: `bin/lib/vault-ingest.js` (Plan 75-02 Task 1 lift). CLI
surface: `node bin/gmd-tools.cjs vault-curator --promote [--dry-run]`
(thin-router dispatches to `vault-ingest.js::runPromote` via delegating
wrapper).

### `gmd-vault-lint` (pedant; CURATOR-02)

DEEP-03 `agents.gmd_vault_lint` shipped shape:

- **Role**: pedant. Tool constraint: NO Write/Edit tools — audit-only.
- **Responsibilities**:
  - Programmatic Lint FIRST (deterministic; runs in seconds): ghost
    wikilinks + orphan pages + filename/header format + temporal-
    marker regex violations + broken backlinks + cross-phase lint-
    event consumers (unknown_edges Phase 71 + unknown_note_type
    Phase 71 + claim_exceeds_240_chars Phase 72 + trail_sequence_too_short
    / glue_length_mismatch / glue_missing / trail_step_superseded
    Phase 73 + cluster_rename_candidate Phase 74 + bi_temporal_*
    Phase 75 — 4 events declared in Plan 75-01; POINTER_MISSING
    emitted by Plan 75-02 lint layer after wikilink-target resolution
    walk).
  - Semantic Lint SECOND (LLM-call; user-invoked ONLY): contradictions
    + concept gaps + expired claims + weak orphans + edge-vocab drift
    (track relation_type frequency).
  - Bi-temporal transition checks (`invalidated_at` / `invalidated_by`
    integrity; `appendToKnowledgeLog` writes on every detected
    transition — R1 INTEGRATION).
  - Merge proposals (duplicate-atom candidates surfaced for user
    decision; NEVER auto-merge).
  - Vault health diagnostics (engraph row 7 pattern adopted): orphans
    + broken links + stale + tag hygiene.
- **Forbidden**:
  - Creating or editing atoms (audit-only role).
  - Resolving contradictions (flag-only per SPEC §2; human decides).
- **Output**: `Knowledge/_lint-report.md`. Sort order: contradictions
  > ghost links > orphans > concept gaps > expired claims > edge
  vocabulary drift > bi-temporal transitions (7 MARKER_PAIR_G auto-
  block sections; byte-deterministic).
- **Severity**: programmatic violations are blocking (auto-fix
  candidates for `gmd-vault-ingest` next pass); semantic findings
  are advisory.

Lib backing: `bin/lib/vault-lint.js` (Plan 75-02 Task 1 NEW pedant
library). CLI surface: `node bin/gmd-tools.cjs vault-lint --programmatic
[--semantic] [--raw]` (Plan 75-04 wiring; this plan ships the
substrate).

### `gmd-vault-curator` (thin router; CURATOR-03)

The legacy agent file PERSISTS as the public Task() spawn surface for
back-compat (zero external-contract impact per Q5 LOCKED — see
§Reversibility Contract below). Its `<dispatch>` block routes work to
the 2 sibling agents:

| Work type | Routes to | CLI lib |
|-----------|-----------|---------|
| Creative-writer work | `gmd-vault-ingest` | `vault-ingest.js` |
| Pedant work | `gmd-vault-lint` | `vault-lint.js` |
| Ambiguous judgement-call resolution | curator inline (legacy) | `vault-curator.js` thin-router |

Lib backing: `bin/lib/vault-curator.js` (Plan 75-02 reshape; 874 LOC →
181 LOC thin router with delegating wrappers preserving 14 module-
exports). All 17 prior export surfaces re-resolved identically through
delegating wrappers (`module.exports.<X> = ingest.<X>` /
`module.exports.<X> = lint.<X>`); identity-equality preserved (verified
by `tests/audit-curator-split.sh` T4 + T5 baseline assertions).

### Parallelism — fan-out safety

DEEP-03 `parallelism.fan_out_safety` lifted VERBATIM:

> When gmd-orchestrator fans out N parallel ingest agents, it MUST
> pre-assign atom slugs in a wave manifest. Agents fill content into
> named slots; they NEVER name files. Without this, parallel agents
> will produce colliding atom IDs.

Precedent: llm-atomic-wiki parallel-compile naming-lock (README +
CLAUDE.md coordinator pattern).

### Refusals inherited

DEEP-03 `refusals_inherited` lifted VERBATIM:

- **`no_runtime_curation_engine`**: Per llm-atomic-wiki Lens C (Lens
  A.7): GMD's curator is methodology-as-code (skills + agents, no
  daemon). Repo ships zero long-running processes.
- **`no_destructive_resolution`**: Per graphiti Lens C: contradictions
  are flagged + bi-temporal-encoded, not resolved. Human decides which
  fact is true. v1.6 inherits.
- **`no_inline_atom_editing`**: Per llm-atomic-wiki + claude-obsidian:
  atoms are immutable. Supersession only.
- **`human_curates_sources`**: Per claude-obsidian WIKI.md §Summary:
  human picks raw sources; agent does everything downstream. The
  `.raw/` immutable boundary codifies this contract.

## 3-Stage Pipeline

DEEP-03 `pipeline_stages` shipped shape lifted VERBATIM
(llm-atomic-wiki 3-stage pipeline mapped to GMD curator split):

### `stage_1_raw_to_atoms`

- **Agent**: `gmd-vault-ingest`.
- **Input**: `Knowledge/_inbox/` clipped notes (literature) + author-
  drafted fleeting notes.
- **Output**: `Knowledge/Atoms/<branch>/` files per atom frontmatter
  schema (see `references/vault-atoms.md` §Schema).
- **Checkpoint**: user review after ~10-20 atoms per batch.

### `stage_2_atoms_to_wiki`

- **Agent**: `gmd-vault-ingest` (synthesis pass).
- **Input**: existing atoms + user-prompted topic.
- **Output**: `Knowledge/<topic>.md` wiki pages composing 3-8 atoms
  via wikilinks.
- **Forbidden**: inline-expand atom bodies (composition is via
  wikilink only).

### `stage_3_lint`

- **Agent**: `gmd-vault-lint`.
- **Input**: `Knowledge/` (wiki + atoms + inbox).
- **Output**: `Knowledge/_lint-report.md` (7 MARKER_PAIR_G auto-block
  sections) + `Knowledge/_log.md` (R1 INTEGRATION — append-only
  supersession-transition log per Phase 75 scope expansion).
- **Cadence**: programmatic Lint runs INSIDE `vault-maintain --core`
  tier (NEW step `lint` slotted AFTER `moc-cluster` and BEFORE
  `test-coverage`; Plan 75-04 wiring). Semantic Lint runs ONLY on
  user-invoked `vault-lint --semantic` (R5 cadence-discipline).

## Reversibility Contract (Q5 LOCKED)

The Phase 75 CURATOR-03 thin-router decision LOCKS the **external-
CLI-API round-trip survival contract** at the audit layer (R3 framing-
tightened per critic decision 47ba91b4 R3):

### Contract

The external CLI API + 17 const/function export surface of
`bin/lib/vault-curator.js` produces IDENTICAL stdout JSON shape +
exit codes pre- and post-split AND across a hypothetical future
re-merge of `vault-ingest.js` + `vault-lint.js` back into
`vault-curator.js`. Specifically:

- `node bin/gmd-tools.cjs vault-curator --dry-run --raw` produces
  identical JSON output shape.
- `node bin/gmd-tools.cjs vault-curator --promote --dry-run` produces
  identical promotion-plan output.
- `node bin/gmd-tools.cjs vault-curator --stale-downgrade --dry-run`
  produces identical stale-downgrade-plan output (routes to
  `vault-lint.js::runStaleDowngrade` via delegating wrapper).
- All 17 `require('./vault-curator.js').<X>` call sites in Phase 71-74
  audit harnesses + agent doc blocks + downstream tooling continue
  resolving identically (identity-equality verified at audit level via
  `tests/audit-curator-split.sh` T4 const re-export + T5 function
  delegation assertions).

### What the contract DOES NOT claim (R3 framing-tightened)

The audit does NOT claim to prove **byte-equivalent code-level
re-merge**. That is NOT the Q5 LOCKED contract and is NOT audited. The
Q5 LOCKED contract is specifically about EXTERNAL-CLI-API round-trip
survival — the public CLI commands behave identically AFTER the split
(and would continue behaving identically AFTER a hypothetical re-
merge), without making any byte-level claim about the code structure
itself.

This framing-tightening matters because the contract is durable across
implementation evolution: future refactors can change internal
function signatures, re-route delegation paths, or even partially
re-merge the libs back into vault-curator.js — as long as the external
CLI API + 17 export surface produces IDENTICAL output, the Q5 LOCKED
contract is satisfied.

### Structural mechanism — thin-router pattern

`bin/lib/vault-curator.js` SHRINKS from 874 LOC (pre-split) to 181
LOC (post-split) by lifting all function bodies into
`bin/lib/vault-ingest.js` (creative writer; ~817 LOC) +
`bin/lib/vault-lint.js` (pedant; ~629 LOC). vault-curator.js retains
the public surface via:

- **Const re-exports**: `module.exports.NOTE_TYPE_ENUM =
  ingest.NOTE_TYPE_ENUM;` (identity-equality preserved — the same
  frozen object reference is re-exported).
- **Function delegating wrappers**: `module.exports.promoteOne =
  ingest.promoteOne;` (identity-equality preserved — the function
  reference is assigned, NOT wrapped in a fresh closure). This is the
  load-bearing mechanism: assigning a fresh closure
  (`module.exports.promoteOne = (...args) => ingest.promoteOne(...args)`)
  would break identity-equality and the audit T5 assertion would fire
  RED.
- **`cmdVaultCurator`**: the top-level CLI dispatch router; preserves
  Phase 21 DEG-04 lock semantics + isEnabled gate + no-flag usage hint
  shape from pre-split behavior. Routes by flag: `--stale-downgrade` →
  `vault-lint.js::runStaleDowngrade`; everything else → `vault-
  ingest.js::runPromote`.

### Audit lock

`tests/audit-curator-split.sh` (Plan 75-02 Task 4) M-Q5 mutation arm
REMOVES the thin-router delegation lines + asserts public CLI commands
behave IDENTICALLY against a fixture vault — RED on mutation. This
locks the external-CLI-API round-trip survival contract at audit
level: any future regression that breaks the thin-router delegation
fires RED-on-mutation in the audit harness.

### Re-merge READINESS (GOV-02b, Phase 88 Plan 88-03)

**Verdict: Q5 seam INTACT — curator re-merge readiness CONFIRMED.**
This is a READINESS record only; the actual re-merge of
`vault-ingest.js` + `vault-lint.js` back into `vault-curator.js` is
DOWNSTREAM and OUT OF SCOPE (gated on a positive bi-temporal /
extraction-quality signal — see GOV-01 pause + the §GOV-02 two-part
un-stub gate below).

Evidence the seam is intact at execute time (2026-06-02):

- The Q5 LOCKED reversibility contract above (the external-CLI-API
  round-trip survival contract — the public CLI commands +
  `require('./vault-curator.js').<X>` 17-export surface produce
  IDENTICAL output AFTER the split AND would continue to AFTER a
  hypothetical re-merge) is documented in this section and remains
  the operative contract.
- The seam is AUDIT-LOCKED: `tests/audit-curator-split.sh` M-Q5
  mutation arm removes the thin-router delegation lines and asserts
  public CLI commands behave IDENTICALLY against a fixture vault
  (RED-on-mutation). That guard is unchanged by Plan 88-03 — this
  plan edited only header comments + agent/reference prose, no
  function body / export / thin-router delegation line was touched
  (the byte-identical-twin + curator audit are the guards).
- The thin-router mechanism (const re-exports + function delegating
  wrappers preserving identity-equality, `cmdVaultCurator` dispatch)
  is documented under §Structural mechanism above and is reversible
  BY CONSTRUCTION: a re-merge simply re-inlines the lifted function
  bodies back into `vault-curator.js` while the 17-export public
  surface stays byte-stable.

No gap found in the reversibility seam. (Plan 88-03 GOV-02b records
readiness; it does NOT perform the re-merge.)

## Bi-temporal Schema

The Phase 75 CURATOR-04 bi-temporal data plane ships a **4-field
hybrid schema** LOCKED VERBATIM from DEEP-03 §Bi-temporal
`bitemporal_fields:` shipped-shape codeblock (MC2 codeblock-binding;
literal `SQL:2011` + `graphiti` + `Obsidian frontmatter collision`
substrings present in `bin/lib/vault-frontmatter.js` header per
Plan 75-01 implementation):

```yaml
bitemporal_fields:
  # SQL:2011 bitemporal pattern — every fact carries TWO time axes:
  #   1. valid_time (when the fact was true in the world)
  #   2. transaction_time (when the system believed the fact)
  # Hybrid with graphiti's bi-temporal-encoded contradictions pattern.
  # Frontmatter axis: do NOT collide with Obsidian-native `created` /
  # `updated` (they live in the same namespace; Phase 75 fields are
  # parallel additive axes).
  valid_from: <YYYY-MM-DDTHH:MM:SSZ>      # knowledge-graph fact axis
  invalidated_at: <YYYY-MM-DDTHH:MM:SSZ>  # supersession timestamp
  invalidated_by: <wikilink>              # supersession forward-pointer
  recorded_at: <YYYY-MM-DDTHH:MM:SSZ>     # transaction-time / file-system fact axis
```

### Field semantics

| Field | Lifecycle phase | Authoring agent | Semantic axis |
|-------|-----------------|-----------------|---------------|
| `valid_from` | First-write | `gmd-vault-ingest` | Knowledge-graph fact (when true in the world) |
| `recorded_at` | First-write | `gmd-vault-ingest` | File-system fact (when authored into vault) |
| `invalidated_at` | Mutation-time (supersession) | `gmd-vault-lint` detection | Knowledge-graph fact (when stopped being true) |
| `invalidated_by` | Mutation-time (supersession) | `gmd-vault-lint` detection | Graph-traversable forward-pointer (wikilink) |

### First-write motion (Plan 75-02 CURATOR-01)

`bin/lib/vault-ingest.js::stampBiTemporalFirstWrite(fm)` mutates `fm`
IN PLACE to add `valid_from: <now-iso>` + `recorded_at: <now-iso>` on
every Knowledge promotion in the SAME first-write motion as the
existing `type:` stamp pass (single source of truth per DEEP-03
§Curator Split `agents.gmd_vault_ingest.responsibilities` bullet 4).
NO double-stamping: caller-supplied values preserved verbatim (matches
Phase 71 EDGE-02 first-write stamp precedence — caller wins over
inference). `invalidated_at` + `invalidated_by` are NOT stamped on
first write — those are mutation-time fields populated on supersession.

### READ-TIME mtime fallback (Plan 75-01 implementation)

`bin/lib/vault-frontmatter.js::parseFrontmatter(content, opts?)`
accepts an optional `opts.mtime` 2nd-arg. When the parsed frontmatter
LACKS `valid_from` or `recorded_at` (pre-Phase-75 notes), the parser
falls back to the file mtime as a synthetic value. This preserves
graceful-degradation: pre-Phase-75 notes participate in time-travel
queries without retrofitting. R4 consumer note distinction (see below)
gates the SEMANTIC interpretation of mtime-bucketed results.

### R4 consumer note (inscribed VERBATIM)

The knowledge-graph fact axis (`valid_from` / `invalidated_at`) is
DISTINCT from the file-system fact axis (`recorded_at` / mtime).
mtime-bucketed `--recorded-as-of` results MUST NOT be interpreted as
semantic time-travel evidence — they reflect file-system authoring
time, not knowledge claim validity. This distinction is load-bearing
for future readers; do NOT conflate the two axes.

### Coexistence with Phase 72 `superseded_by:` (ADDITIVE)

The Phase 72 atom-specific `superseded_by:` lifecycle (immutability +
supersession via forward-pointer) is the CANONICAL atom-layer answer —
see `references/vault-atoms.md` §Lifecycle subsection §Phase-75-bi-
temporal-forward-reference for the atom-specific contract. Phase 75
bi-temporal is the ADDITIONAL audit-trail layer; atoms MAY carry BOTH
`superseded_by: <new-atom-id>` (graph-traversable forward-link) AND
`invalidated_at` + `invalidated_by` (temporal record of when the
supersession was authored). Authors who want only one axis are free
to omit the other.

## Lint Cadence

The Phase 75 CURATOR-02 lint cadence ships **R5 cadence-discipline**
(CONTEXT.md §CURATOR-02 R5 LOCKED; carry-forward from Phase 74 "no
LLM on hot path" load-bearing constraint):

### Programmatic Lint cadence

Runs INSIDE `vault-maintain --core` tier as NEW step `lint` slotted
AFTER `moc-cluster` and BEFORE `test-coverage` (Plan 75-04 wiring;
Plan 75-02 ships the lib substrate). NOT in CRITICAL_STEPS
(recoverable per MAINT classification — failure degrades observability
but leaves vault coherency invariant intact). Runs every
`vault-maintain --core` invocation. Deterministic; runs in seconds.

CLI surface (Plan 75-04 wiring):
`node bin/gmd-tools.cjs vault-lint --programmatic [--raw]`.

### Semantic Lint cadence

Runs ONLY on user-invoked `vault-lint --semantic` CLI; NEVER
triggered automatically in v1.6 (R5 cadence-discipline load-bearing).
Out-of-band invocation surface only. Programmatic violations are
blocking auto-fix candidates; semantic findings are advisory.

CLI surface: `node bin/gmd-tools.cjs vault-lint --semantic [--raw]`
(Plan 75-04 wiring + LLM-call binding; Plan 75-02 ships scaffolding
stub returning empty findings + informational `semantic_lint_stub_invoked`
lint event).

### `Knowledge/_log.md` convention extension (R1 INTEGRATION)

`bin/lib/vault-lint.js::appendToKnowledgeLog(vaultRoot, entry)`
appends a one-line entry to `Knowledge/_log.md` on EVERY detected
supersession transition (atom OR non-atom). R1 integration per critic
decision 47ba91b4 — Phase 72 atom-specific `Knowledge/_log.md` scope
(see `references/vault-atoms.md` §Lifecycle "Log the conscious-
deletion decision in Knowledge/_log.md") expanded by Phase 75 to all
Knowledge notes. SAME append-only log; atom-specific supersession
lifecycle stays the canonical atom-layer answer
(`references/vault-atoms.md` §Lifecycle §Supersession-manual-checklist
remains the load-bearing atom-layer contract).

Format:
```
YYYY-MM-DD HH:MM:SS UTC | <vault-rel-path> | invalidated -> [[<wikilink>]] | <reason-or-blank>
```

Idempotency: 24-hour dedup window. Read existing log; skip if same
`<vault-rel-path>` + `<invalidated_by>` pair appears within past 24
hours. Lazy-scaffold first-time-create with 5-line header citing this
doc (§Bi-temporal Schema + §Lint Cadence) + `references/vault-atoms.md`
§Lifecycle.

### `Knowledge/_lint-report.md` §Bi-temporal Transitions section

Per-run snapshot of detected transitions in the lint report (7th
section in DEEP-03 sort order; complement to the append-only
`Knowledge/_log.md` history). Byte-deterministic across re-runs.

### Audit lock

`tests/audit-curator-split.sh` (Plan 75-02 Task 4) M-LOG mutation arm
mutates `appendToKnowledgeLog` to early-return without writing — RED
on absence of `Knowledge/_log.md` in fixture vault. Locks the R1
INTEGRATION at audit level: any future regression that bypasses the
log append fires RED-on-mutation.

## DEEP-06 cross-milestone forward-reference

`Knowledge/Patterns/v1.6-graph-primitives.md` is the curator-promoted
v1.6 graph-primitives synthesis note (Phase 70 Plan 70-04). It is the
authoritative cross-milestone anchor for v1.6 graph primitives —
EDGE-01 vocab, EDGE-02 note-type enum, EDGE-03 SKOS-lite aliases,
ATOM-01 schema, TRAIL-01 trail-shape, MOCH-01/02 cluster-MOC, CURATOR-01..04
this-doc-family. v1.7-A CDEEP phase (code-edge vocabulary binding per
SPEC §6 Open Q7 LOCKED) will cite that synthesis note as the v1.6
anchor; this doc (`references/vault-curator-split.md`) is the v1.6
curator-split + bi-temporal-specific contract that the v1.7-A plan-
phase MUST cite when defining code-curator-lint semantics.

The DEEP-06 contract marker at
`.planning/phases/70-v1-6-a-deep-research-substrate/deep-06-contract-marker.md`
is grep-discoverable. v1.7-A's plan-phase agent MUST find that marker
and route to `Knowledge/Patterns/v1.6-graph-primitives.md` as the
synthesis anchor.

When v1.7-A binds code-curator-lint semantics (per SPEC §6 Open Q7
LOCKED vocabulary-divergence contract — vocabulary-level divergence
is intentional; mechanism-level consistency is preserved), it MUST
cite this doc as the v1.6 vault-curator-split upstream. The
mechanism (2-agent decomposition + thin-router reversibility contract
+ programmatic-FIRST / semantic-SECOND lint cadence + bi-temporal
data plane with `superseded_by:` ADDITIVE coexistence) is reusable as
the mechanism baseline; the vocabulary (`inbox` / `Knowledge/Atoms/`
/ `Knowledge/_log.md` / `Knowledge/_lint-report.md`) is v1.6-A vault-
specific and v1.7-A CDEEP may diverge — but the divergence must be
made explicit and routed through the same SPEC-amendment path that
originated this doc.

Tail-mirror precedent: `references/vault-trails.md` + `references/vault-mochs.md`
DEEP-06 cross-milestone forward-reference tails carry the same
structure. This doc is the 5th in the v1.6 reference-doc family
(vault-edges + vault-atoms + vault-trails + vault-mochs + vault-curator-split).

## GOV-02 — INGEST-EXT un-stub gate (TWO-PART) + governance record

Phase 88 (v1.7.1-B GOV) records the un-stub gate for the STUBBED
creative-writer extraction helpers —
`bin/lib/vault-ingest.js::extractAtomFromDoc`,
`::classifySegment`, and the semantic-lint stub
`bin/lib/vault-lint.js::runSemanticLint` — as a **TWO-PART** gate
(GOV-02c; critic-locked category-error fix, CONTEXT.md §GOV-02). The
un-stub (INGEST-EXT family) is OUT OF SCOPE for v1.7.1; this is the
governance record of WHAT must be true before it lands.

The two-part framing exists because **atom-INCLUSION lift ≠
atom-EXTRACTION quality** — these are different questions and the
VREAD-01 number answers only the first.

### Precondition 1 (retrieval-value): SATISFIED

Atoms demonstrably help retrieval WHEN PRESENT. VREAD-01
(`tests/audit-retrieval-lift.sh`, frozen 11-note dogfood corpus)
measured OFF recall@5 = 0.545 → ON recall@5 = 1.000 with
`--include-atoms`. So the *retrieval-value* precondition — "do atoms,
once in the index, improve retrieval?" — is **SATISFIED**: the answer
is yes.

### Precondition 2 (extraction-quality): UNMEASURED — separate downstream gate

VREAD-01's fixture atoms were **human-curated + byte-pinned**. The
0.545 → 1.000 number therefore says NOTHING about whether the STUBBED
`extractAtomFromDoc` / `classifySegment` / `runSemanticLint` would
*produce surfaceable atoms of comparable quality*. Atom-INCLUSION lift
(precondition 1) is a categorically different measurement from
atom-EXTRACTION quality (precondition 2). Precondition 2 is
**UNMEASURED** and remains a **separate downstream gate** — it
requires a machine-extraction-quality instrument that does not yet
exist (the VREAD-01 instrument does not measure it).

### Verdict — gate stays GATED

The INGEST-EXT un-stub stays **GATED on precondition 2**, which
VREAD-01 does NOT satisfy. Precondition 1 being satisfied is NOT
sufficient — do NOT collapse the two preconditions into "met-in-
principle". This gate is recorded as OPEN / not-yet-satisfied; it is
explicitly NOT being closed by the VREAD-01 number. When a future
milestone builds a machine-extraction-quality instrument and shows the
stubs produce surfaceable atoms, precondition 2 can be re-evaluated;
until then the helpers stay stubbed.

### Precondition 2 — NOW MEASURED (v1.8.1 QUAL; GOV-04 ruling)

**Appended v1.8.1-C (Phase 99, GOV-04). This subsection does NOT rewrite
the precondition-1 record or the "gate stays GATED" verdict above — both
stay verbatim; this is the precondition-2 measurement + verdict recorded
ALONGSIDE them.**

Precondition 2 (extraction-quality) was **UNMEASURED at v1.7.1** (the
VREAD-01 instrument does not measure it). It is **NOW MEASURED** by the
**v1.8.1-B QUAL instrument** — the producer-agnostic extraction-quality
instrument that scores the producer's emitted atoms/edges (the OUTPUT)
against a frozen AI-AUTHORED gold set. The recorded number
(`references/extraction-quality-recorded-number.md`, frozen fixtures commit
`ccb5d73`):

- **gold claim-F1** mean **0.403 @TAU0.5** across **N=3** producer runs
  (TAU sweep 0.359 @0.6 / 0.273 @0.7);
- **atomicity** multi-claim-violation-rate **0.000 (0/15)** — HARD sub-floor;
- **agent-loop variance** stdev **0.018–0.034** per-mille (AI self-consistency,
  NOT the human ceiling);
- **ρ = 1.000** on the FULL qrel set AND **1.000** on the HELD-OUT slice.

**GOV-04 verdict (`references/extraction-quality-autostage-ruling.md`):** the
auto-stage confidence threshold derived from this number is **PROVISIONAL**
— the gold is **AI-AUTHORED** and the **human ceiling is PENDING** (2026-06-04
user ruling). GOV-04 ships auto-stage **DISABLED-BY-DEFAULT** (99-04
`AUTO_STAGE_ENABLED = false`); it does **NOT** authorize unsupervised
auto-staging this milestone. Enabling is gated on **(a)** a ratified human
ceiling **AND (b)** a real calibrated confidence source — a future decision.

**Unchanged / untouched (explicit):** the **precondition-1** record
("Precondition 1 (retrieval-value): SATISFIED" — VREAD-01 0.545 → 1.000) is
**UNCHANGED**; the "gate stays GATED" verdict text above is byte-preserved;
and the **GOV-01 bi-temporal pause**
(`references/vault-bitemporal-investment-gate.md`) is **UNTOUCHED**. This
subsection only records that precondition-2 is now measured and links the
GOV-04 PROVISIONAL verdict alongside the precondition-1 record.

---

*Audit: `tests/audit-curator-split.sh` (Plan 75-02). Implementation:
`bin/lib/vault-ingest.js` (creative writer; Plan 75-02 Task 1) +
`bin/lib/vault-lint.js` (pedant; Plan 75-02 Task 1) +
`bin/lib/vault-curator.js` (thin router; Plan 75-02 Task 1) +
`bin/lib/vault-frontmatter.js` 4-field bi-temporal parser surface (Plan 75-01).
Query/orient surface: `vault-query --include-invalidated` + `vault-query --as-of` +
`vault-query --recorded-as-of` (Plan 75-03). Lint engine dogfood:
Knowledge/_lint-report.md auto-generated at HEAD via `vault-lint`
(Plan 75-04 REQUIRED dogfood activation). Upstream contracts:
references/vault-edges.md (Phase 71 EDGE-01 closed vocab; lint-event consumer
surface for unknown_edges) + references/vault-atoms.md §Lifecycle
(Phase 72 ATOM `superseded_by:` ADDITIVE coexistence; Knowledge/_log.md
convention extension) + references/vault-trails.md §Lifecycle subsection 2
(Phase 73 `trail_step_superseded` lint-event consumer) +
references/vault-mochs.md §Cluster Naming Convention (Phase 74
`cluster_rename_candidate` lint-event consumer) +
Knowledge/Patterns/v1.6-graph-primitives.md (DEEP-06 cross-milestone anchor).*
