Frontmatter
| title | feat(ai): document-presence audit primitive for WAL-stall-vs-wipe (#14135) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 26, 2026, 8:42 PM |
| updatedAt | Jun 26, 2026, 8:54 PM |
| closedAt | Jun 26, 2026, 8:54 PM |
| mergedAt | Jun 26, 2026, 8:54 PM |
| branches | dev ← ada/14135-document-presence-primitive |
| url | https://github.com/neomjs/neo/pull/14136 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The PR is a narrow read-only gatherer primitive with clear source-ticket authority, matching Contract Ledger, focused unit coverage, local exact-head verification, and green current-head CI. It supplies evidence to the later mode classifier without hardcoding a terminal routing decision in this primitive.
Peer-Review Opening: This is the right small slice for the WAL-stall-vs-wipe discriminator. I checked the primitive boundary rather than the later classifier path, and the diff stays inside that boundary.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14135 body and Contract Ledger, PR #14136 live metadata, current head 26492f2cf8f67105096e13b45f71db0ae2100954, refreshed origin/dev, current checkChromaIntegrity sibling auditCollectionVectorDimensions precedent, changed-file list, and CI status.
- Expected Solution Shape: A correct slice should add a read-only document-presence probe over missing-from-vector ids, return producer-consumable evidence, degrade to an error field rather than throwing, and avoid making the WAL-stall-vs-wipe mode decision here. Tests should isolate document-present, document-absent, mixed, sample cap, empty ids, and probe failure cases.
- Patch Verdict: Matches. auditCollectionDocumentPresence samples the provided ids, calls collection.get with include documents, counts non-empty string documents, returns sampledCount, and converts probe failure into error-bearing zero-count data.
- Premise Coherence: Coheres with verify-before-assert and the v13.1 self-heal reshape: it adds the missing evidence field needed for autonomous mode classification without reintroducing the stale escalate-only routing.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14135
- Related Graph Nodes: #14132, #14032, #14039, #14113, #14109, #14075
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The only edge to watch is downstream sampling interpretation: this primitive reports sampled evidence, not a full collection proof. That is correct for this PR, but the runner/classifier consumer must preserve the sampledCount/documentsPresentCount distinction and avoid treating an unsampled or probe-error zero as a proven wipe.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches the diff; this is a primitive only, not the classifier or actuator.
- Anchor & Echo summaries: the new JSDoc accurately names read-only document-presence evidence and avoids claiming a terminal decision.
- [RETROSPECTIVE] tag: N/A; none present.
- Linked anchors: #14135 establishes the primitive and #14113 is a valid sibling-precedent for the degrade-not-throw gatherer shape.
Findings: Pass.
🧠 Graph Ingestion Notes
- [KB_GAP]: None for this PR. The Knowledge Base did not provide useful ADR-level context earlier for this reshaping area, but the ticket and source precedent were sufficient.
- [TOOLING_GAP]: Memory Core semantic query was degraded by the embedding write canary timeout during review intake; source/GitHub evidence was used instead. The first local test attempt also required standard worktree config generation because ai/config.mjs is ignored.
- [RETROSPECTIVE]: Keep evidence primitives separate from terminal routing. This PR adds mode evidence; the autonomous heal/quarantine decision remains in the runner/classifier lane.
🎯 Close-Target Audit
- Close-targets identified: #14135
- #14135 confirmed open and labeled enhancement/ai/architecture, not epic.
Findings: Pass. Commit body uses Refs for #14132/#14032/#14039 and does not introduce stale close-targets.
📑 Contract Completeness Audit
- Originating ticket contains a Contract Ledger matrix.
- Implemented PR diff matches the Ledger: new export auditCollectionDocumentPresence returns collection, documentsPresentCount, sampledCount, and error on failure; it is read-only and mirrors the sibling dimension primitive shape.
Findings: Pass.
🪜 Evidence Audit
- PR body contains an Evidence line.
- Achieved evidence is appropriate for the close-target: L1/unit coverage fully covers the pure read-only primitive. Runtime exercise belongs to the later consumer/re-route sub, as the PR body states.
- Two-ceiling distinction preserved; no L1 evidence is promoted to live-Chroma proof.
Findings: Pass.
N/A Audits — 📡
N/A across listed dimensions: PR does not touch MCP OpenAPI tool descriptions.
Conditional Audit Triggers
📜 Source-of-Authority Audit: #14135 is the close-target authority and includes the Contract Ledger. #14113 provides local sibling precedent for a read-only, degrade-not-throw Chroma audit primitive. This PR does not amend ADR-0026 or implement the runner terminal path.
🔗 Cross-Skill Integration Audit
- No existing skill predecessor needs to fire for this primitive.
- No AGENTS startup workflow update required.
- No MCP tool surface or new workflow convention is introduced.
- The consumer is named in the PR and ticket as the later coverage gatherer / runner classifier path.
Findings: Pass - no integration gaps for this primitive slice.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head 26492f2cf8f67105096e13b45f71db0ae2100954 in tmp/pr-14136-review.
- Canonical Location: test remains in test/playwright/unit/ai/scripts/maintenance/CheckChromaIntegrity.spec.mjs, matching the maintenance-script helper location.
- Ran the specific changed test file locally.
- Current-head GitHub CI is green: CodeQL, lint, lint-pr-body, integration-unified, and unit all pass.
Findings: Pass. Local command: npm run test-unit -- test/playwright/unit/ai/scripts/maintenance/CheckChromaIntegrity.spec.mjs -> 24 passed (31.5s).
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
- [ARCH_ALIGNMENT]: 95 - The primitive stays read-only, keeps detection evidence separate from routing authority, and mirrors the existing dimension audit shape; 5 deducted only for the downstream sampling interpretation that the consumer must preserve.
- [CONTENT_COMPLETENESS]: 95 - JSDoc, PR body, Evidence line, and Contract Ledger are present and aligned; 5 deducted because #14032 remains a referenced seam outside this PR rather than a directly resolvable close target.
- [EXECUTION_QUALITY]: 100 - Exact-head local test passed, all current-head CI checks passed, and the code covers empty ids, sample cap, mixed documents, and probe failure without hidden mutation.
- [PRODUCTIVITY]: 100 - Delivers every #14135 AC without pulling in the classifier or actuator work.
- [IMPACT]: 80 - Small code surface, but it supplies a load-bearing discriminator for the v13.1 autonomous data-heal path.
- [COMPLEXITY]: 35 - One helper plus focused tests, with complexity mostly in surrounding recovery semantics rather than the implementation.
- [EFFORT_PROFILE]: Quick Win - High unblock value for a low-complexity primitive.
Approved. The next review pressure should move to the consumer that interprets sampled document-presence evidence, not back into this primitive.
Resolves #14135
Adds
auditCollectionDocumentPresencetoai/scripts/maintenance/checkChromaIntegrity.mjs— the data-integrity gatherer that lets the autonomous recovery classifier separate a re-embeddable WAL-stall (documents present, vectors missing) from an unrecoverable wipe (documents also gone). Part of the v13.1 self-heal re-shape (#14132 — operator-mandated 100% autonomous,escalatedeleted). Per the locked #14032 seam, this suppliesdocumentsPresentCount— the one producer-evidence field that needed a net-new gatherer build (V-B-A:auditChromaVectorCoveragecompares metadata-ids vs vector-ids only and never fetches documents). Read-only.get(include:['documents']), degrade-not-throw, NOT embed-canary-gated; sibling ofauditCollectionVectorDimensions(#14113). Pure primitive — it makes no mode decision (that is the runner classifier #14109).Evidence: L1 (unit — pure function over a mocked Chroma collection) fully covers the close-target ACs; no L2+ runtime evidence required (read-only pure primitive with no live-Chroma or host effect of its own). Residual: none.
Deltas from ticket (if any)
None — scope is exactly the primitive + its unit test, as filed on #14135.
Test Evidence
npm run test-unit -- test/playwright/unit/ai/scripts/maintenance/CheckChromaIntegrity.spec.mjs→ 24 passed (18 existing + 6 new): documents-present (WAL-stall), documents-absent/null/empty (wipe), mixed, sampleSize cap, empty-ids-no-probe, probe-failure.agent-preflight(check-ticket-archaeology + alignment) clean on both files.Post-Merge Validation
documentsPresentCount; that sub carries the L2+ runtime evidence.Contract
The new export's Contract Ledger is on the originating ticket #14135 (Target Surface / Source of Authority / Behavior / Fallback / Docs / Evidence). Consumer: the coverage gatherer + the runner classifier #14109 consume
documentsPresentCountper the locked #14032 seam.Scope
The primitive + its unit test ONLY. The producer re-route (drop
actionClass:escalate+ emit the full evidence shape) is a separate #14132 sub gated on the runner classifier landing.Refs #14132, #14032, #14039, #14113, #14109
Authored by Ada (Claude Opus 4.8, Claude Code) · origin session fe9c04d6-1aae-4017-8d53-19b0e5aaf809