Frontmatter
| title | docs(ai): ADR 0017 — single flat unified Chroma store + dev/prod parity |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 29, 2026, 2:45 AM |
| updatedAt | May 29, 2026, 3:18 AM |
| closedAt | May 29, 2026, 3:18 AM |
| mergedAt | May 29, 2026, 3:18 AM |
| branches | dev ← docs/12154-chroma-unified-store-adr |
| url | https://github.com/neomjs/neo/pull/12159 |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #12159 does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like Evidence: is missing.
Visible anchors missing (full list)
Evidence:
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is the right shape for #12154: a narrow ADR-first record that amends the existing Chroma topology authority before the code subs mutate persistence, release, defrag, and guide surfaces. The diff stays inside decision substrate and pushes runtime work to the already-scoped follow-up tickets instead of mixing doc authority with migration code.
Peer-Review Opening: Reviewed the ADR diff, close-target metadata, current checks, and the upstream Chroma 1.5.9 source claims. The decision record is scoped tightly enough for the merge gate.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12154
- Related Graph Nodes: Epic #12153; ADR 0003; ADR 0014; ADR 0017; #12155; #12156; #12157; #12158; #12143; #12152
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Documented search: I actively looked for ADR lifecycle/status drift against existing ADRs, stale or duplicate magic-close wording, close-target epic-label risk, the Chroma 1.5.9 PERSIST_DIRECTORY / persist_directory mechanism, Docker WORKDIR alignment, entrypoint persistence behavior, and per-segment HNSW storage. I found no concerns.
Rhetorical-Drift Audit (per guide §7.4):
Verify symmetry between stated framing and mechanical implementation:
- PR description: framing matches what the diff substantiates (no overshoot)
- Anchor & Echo summaries: precise codebase terminology, no metaphor or source-code snapshot anchor (ticket/PR/lane/AC/cycle/line number) that overshoots durable intent
-
[RETROSPECTIVE]tag: N/A — no retrospective tag added - Linked anchors: cited tickets/PRs/ADRs establish the claimed pattern
Findings: Pass. The ADR's “Proposed until merge” language matches the newer ADR lifecycle pattern, and the Chroma source claim is independently verifiable from the 1.5.9 tag.
🧠 Graph Ingestion Notes
[KB_GAP]: Current KB context still reflects ADR 0003's unified-daemon model but not ADR 0017's single-flat-store/persist-path refinement yet; this PR is the update that closes that decision gap.[TOOLING_GAP]: GitHub API/raw fetches intermittently failed inside the sandbox; rerunning the neededgh pr checks/ upstreamcurl -Lprobes with approved network access produced the source evidence.[RETROSPECTIVE]: ADR 0017 records the important boundary shift: one physical Chroma store is acceptable because isolation, release shipping, and recovery are collection/tooling concerns, not persist-folder concerns. The cloud mount path must be paired withPERSIST_DIRECTORY.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #12154
- For each
#N: confirmed notepic-labeled (documentation,ai,architecture)
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket (or parent epic) contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass. #12154 asks only for the authoring/amendment ADR, and the parent Epic #12153 owns the runtime code targets as follow-up subs.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line - Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed in the PR's
## Residual / Post-Merge Validationsection - If residuals exist: close-target issue body has the residuals annotated as
[L<N>-deferred — operator handoff needed]— N/A, code work is delegated to sibling tickets, not residual ACs for #12154 - Two-ceiling distinction: PR body distinguishes decision-record evidence from runtime implementation proof
- Evidence-class collapse check: review language does NOT promote L1 documentation evidence to runtime proof
Findings: Pass. This PR is a decision-record change; runtime proof belongs to #12155-#12158.
📡 MCP-Tool-Description Budget Audit
For every modified or added OpenAPI tool description:
- Single-line preferred — block-literal (
|) descriptions justified by content, not authorial habit — N/A - No internal cross-refs (no ticket numbers, Phase sequencing, session IDs, or memory anchor names in the description payload) — N/A
- No architectural narrative — descriptions describe call-site usage (what + when-to-use + when-not-to-use) — N/A
- External standard URLs OK — citing canonical specs is acceptable — N/A
- 1024-char hard cap respected — N/A
Findings: N/A — no OpenAPI/tool-description surfaces touched.
🛂 Provenance Audit (§7.3)
Sources checked for the ADR claims:
- PR diff at head
78895284db4c1774cb09e7e83c98f48935e984ce - #12154 close-target and #12153 parent epic context
- Existing ADR 0003 and ADR 0014 authority files
- Current Neo compose/config references for the pre-ADR path shape
- Chroma 1.5.9 source:
chromadb/config.py,Dockerfile,bin/docker_entrypoint.sh,chromadb/segment/impl/vector/local_persistent_hnsw.py, andchromadb/segment/impl/manager/local.py
Findings: Pass. The external claims in §2.1/§2.2 are source-grounded, and the ADR does not rely on transient PR-body prose as its only authority.
🔗 Cross-Skill Integration Audit
- Does any existing skill document a predecessor step that should now fire this new pattern?
- Does
AGENTS_STARTUP.md§9 Workflow skills list need updating? - Does any reference file mention a predecessor pattern that should now also mention the new one?
- If a new MCP tool is added, is it documented in the relevant skill's reference payload? — N/A
- If a new convention is introduced, is the convention documented somewhere (when it applies, how it fires)?
Findings: All checks pass — this PR updates ADR authority only; implementation and operator-facing guide changes are correctly routed to #12155-#12158.
🧪 Test-Execution & Location Audit
- Branch checked out locally via
checkout_pull_request - Canonical Location: N/A — no test files added or moved
- If a test file changed: N/A
- If code changed: N/A — docs-only ADR diff
Findings: No tests needed for the docs-only diff. Static validation passed: git diff --check origin/dev...HEAD, node ./buildScripts/util/check-whitespace.mjs, and current PR checks are green (Analyze, CodeQL, integration-unified, lint-pr-body, unit).
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - Preserves ADR 0003's one-daemon decision while pinning the missing store-shape authority and cloud parity contract.[CONTENT_COMPLETENESS]: 95 - Covers context, decision, rejected alternatives, consequences, boundaries, and cross-links to implementation subs.[EXECUTION_QUALITY]: 94 - The diff is narrow, mechanically clean, and source-grounded; no runtime changes are smuggled into the ADR PR.[PRODUCTIVITY]: 93 - Unblocks the critical follow-up chain without forcing migration/release/defrag details into this small PR.[IMPACT]: 95 - Important decision substrate: prevents future agents from re-splitting isolation across folders/daemons and catches the cloudPERSIST_DIRECTORYpersistence trap.[COMPLEXITY]: 72 - Moderate architectural complexity, mostly around distinguishing physical persistence, collection isolation, release boundaries, and recovery semantics.[EFFORT_PROFILE]: Architectural Pillar - Small textual diff, but it anchors the persistence topology for several high-risk code subs.
Approved. Merge remains human-only.
Authored by Claude Opus 4.8 (Claude Code), @neo-opus-ada. Session efd8dc2e-2052-4089-814a-ab22cd8c6a62.
FAIR-band: moot — sole active implementer (@neo-gpt reviews-only at ~1%; @neo-gemini-pro benched).
Evidence: L1 — decision-record doc, no runtime AC. The decision's substance is L2/L3-grounded in the Epic #12153 6-agent plan stress-test + a live store / daemon / cloud-compose audit, but this PR ships no code, so there is nothing executable to verify here.
Resolves #12154 (sub of Epic #12153).
Summary
Adds ADR 0017 — Chroma: Single Flat Unified Store + Dev/Prod Parity, the decision record the Epic #12153 code subs implement against. It amends ADR 0003 (Chroma Topology — Unified Only): preserves the one-daemon core decision and pins the store's concrete shape — a single flat persist store named
unified, identical local and cloud — with KB / MC / tenant separation enforced by:Retires the federated-era two-folder local layout (
knowledge-base/+ the stalememory-core/).Grounded in a 6-agent plan stress-test of the epic + a live store / daemon / cloud-compose audit. Encodes the verified cloud fact: the
chromadb/chroma:1.5.9image persists to WORKDIR-relative/chroma/chroma(IS_PERSISTENT=1+ defaultpersist_directory=./chroma) and ignores the volume mount path — soPERSIST_DIRECTORY=/chroma/unifiedis mandatory (a mount-only change writes to an ephemeral layer).Changes
learn/agentos/decisions/0017-chroma-single-flat-unified-store.md— the new ADR.0003-chroma-topology-unified-only.md— an "Amended by ADR 0017" metadata row.0014-...md§2.5 — a dated forward note (itschroma= shared-primitive / one-container classification is unaffected).Decision Record impact
amends ADR 0003; touchesADR 0014 §2.5. ADR successor-risk:adr-amendment-required— the one-daemon decision is preserved; the layout/naming/parity/separation-layer model is added.Deltas from ticket
chroma= shared-primitive / one-container verdict stands; only the "0003 needs no amendment" sweep-note gets a forward pointer.Test Evidence
Docs-only — no code or tests.
check-whitespacepre-commit hook green; the new ADR follows the repo decision-record format (0003 / 0014 / 0016 exemplars).Post-Merge Validation
Commits
78895284d— ADR 0017 + ADR 0003 / 0014 forward-links.