Version: 2.0 (promoted + rebuilt kh-main-S267). Supersedes docs/plans/phase-0-investigation/0.9-decision-graph.md (now a pointer stub).
Status: [CURRENT-CANONICAL] for the phase-0 → canonical-pipeline → implementation decision arc.
Original audit dates: 2026-05-10 (S227 initial; S228 corrections) → 2026-05-11 (S232 three-tier restructure) → 2026-05-26 (S267 promote + intended-vs-current rebuild).
Original branch: content-items-investigation.
Purpose. This is the single reference that maps what was intended (the phase-0 investigation decisions, S227–S233) to what was actually ratified and built (canonical-pipeline v1 implementation, S234–S251). It exists because the original phase-0 decision graph froze at the S232/S233 proposal stage — its status tags (RESOLVED-DIRECTION-S233, PROVISIONAL, PENDING-ARCH) record proposed direction pending Liam review, not the ratified outcome, and the §11 ratification register that downstream docs cite degraded out of the file through the canonical-pipeline transitions. This rebuild makes the intended → current delta explicit (Part I) while preserving the original decision catalogue for audit (Part II).
Three layers carry decision truth. When they overlap, the higher layer wins:
docs/specs/id-31-canonical-pipeline-implementation-plan/PLAN.md §7 — the LIVE canonical decision log for canonical-pipeline v1 (Diff-UI retained markdown-first; ledger-api deferred-v1.1; Theme-F direct ratified S240; the 25-row STILL-OPEN disposition register). This is the authority for anything in canonical-pipeline scope.
- This graph (Part I crosswalk) — the catalogue of all phase-0 architectural decisions (Q1/Q2/Q3/Q4/Q5/DW/CX) with their intended→current deltas. Broader than PLAN.md §7 (covers dev-workflow + cross-cutting decisions that never entered the pipeline plan), but defers to PLAN.md §7 where they overlap.
- The ledgers (
docs/reference/{task-list,product-roadmap,product-backlog}.json) — the live implementation status. Task IDs cited below (ID-36…ID-51) are task-list records; “SHIPPED” = that task is done.
The deferred items (v1.1 / v2 / post-launch) have their own canonical home: docs/reference/deferral-register.md (the v2/v1.1 forward register, built alongside this rebuild). This graph points to it; it does not re-list deferrals.
The decisions below materially advanced past their S232/S233 status. Each row gives: the intended direction (Part II tag), the current ratified state + session, the implementation status (ledger task), and the authority. Decisions NOT listed here are either (a) unchanged since S233 (still in their Part II tier) or (b) deferred — see the deferral register.
| Decision | Intended (S233) | Current ratified state | Implementation | Authority |
|---|
Q5.1–Q5.4 digests → change_reports (table, types, routes, page) | PROVISIONAL rename | RATIFIED + SHIPPED. Full code+DB+URL+enum rename; CI guard + CLAUDE.md gotcha deliberately deleted (single-dev repo) | SHIPPED — ID-40 (T5) done: S248 initial + S251 W1B residual (lib/change-reports/*, app/api/change-reports/*, digest_type→frequency, digest_ready→change_report_ready) | PLAN.md §4.5; docs/research/s251-w1b-digest-to-change-reports-scope-discovery.md |
Q5.5 project_id → workspace_id | RESOLVED-DIRECTION-S233 (“2 DB cols, 44 code files, lower-risk than reported”) | RATIFIED + SHIPPED. 2 DB columns renamed (bid_questions, templates); code sweep | SHIPPED — ID-37 (T2) done S246 (DB) + ID-39 (T4) done (code sweep) | PLAN.md §4.2 + §4.4 |
| Decision | Intended (S233) | Current ratified state | Implementation | Authority |
|---|
| Q1.3 / Q3.1 / Q3.2 Q&A as own domain (two-tier) | RESOLVED / SIDECAR-REOPENED-S233 | RATIFIED + SHIPPED. q_a_pairs (golden record) + q_a_extractions (derived cache) + q_a_pair_history trigger + q_a_search/q_a_get_verbatim RPCs. Markdown sidecar emit = DEFERRED-v1.1 (not reopened to v1) | SHIPPED — ID-41 (T6) done S249 (staging) + S250 (prod) | PLAN.md §4.6; deferral register (sidecar) |
Q1.6 / Q4.1 / Q4.7 entity_relationships temporal + provenance enum (mempalace Shape A) | RESOLVED (extend-in-place) | RATIFIED + SHIPPED (partial). entity_aliases.category → provenance enum landed in combined PR; full Shape-A temporal columns land with KG integration (T12, not yet built) | PARTIAL — provenance enum in ID-37 (T2) done; T12 not yet a task | PLAN.md §4.2 sub-task 4 |
Q1.9 source_documents post-cocoindex shape (Option α/β) | RESOLVED-DIRECTION-S233 (α working rec) | DIRECTION held (α). source_documents.workspace_id made NULLABLE in combined PR (no-op on prod — already nullable). Full α/β retirement binding deferred to content-model-invariants spec | PARTIAL — ID-37 (T2) done (NULLABLE); retirement not executed | PLAN.md §4.2 sub-task 5 |
Q1.11 citations polymorphic (content_citations → citations, add q_a_pair_id, XOR target) | RESOLVED-DIRECTION-S233 | RATIFIED, NOT YET BUILT. Scoped as T11 (citations polymorphic enum + version-on-cite) | PENDING — folded into ID-49 (remaining pipeline stages) pending | PLAN.md §4.11 |
Q1.12 bid_question_matches matching cache | RESOLVED-DIRECTION-S233 | RATIFIED + RENAMED question_matches (never built under the old name; question_kind discriminator for sales-proposals) | PENDING — T10; folded into ID-49 pending | PLAN.md §5 Wave 3; project-plan §5 |
| Q1.13 workspace partition (Shape B) + reserved seats | RESOLVED-SHAPE-B-S233 | RATIFIED + SHIPPED. Shape B kept; 5 reserved satellite seats created upfront (PK+FK+RLS); intelligence_workspaces JSONB→typed promotion (company_profile_id/guide_id/relevance_threshold) | SHIPPED — ID-37 (T2) done S246/S247; intelligence-workspaces spec LANDED-S244 (amended Wave 0.5) | PLAN.md §4.2 sub-tasks 7+8 |
| Decision | Intended (S233) | Current ratified state | Implementation | Authority |
|---|
Q3.5 Pattern A/B parser (extract-qa-pairs.ts) | RESOLVED-MIGRATION-HELPER-ONLY-S233 | RATIFIED-RETIRE post-Phew migration (one-shot helper, not a v1 ingestion adapter) | PENDING — T14 retire; ID-46 spec_needed | PLAN.md §4.14; project-plan §5 (theme retirements) |
| Q3.11 forms/templates shape | RESOLVED-RENAME-BID-TEMPLATES-S233 (“rename to bid_templates”) | SUPERSEDED by S243 Item 19. NOT renamed to bid_templates — instead templates → form_templates + form_type 3-tier split (form_types CV / procurement_vehicles CV / procurement_vehicle_instances; G-Cloud = instance of framework, not a form_type) | SHIPPED — ID-37 (T2) done S246 (form_templates rename + 3-tier split) | PLAN.md §4.2 sub-tasks 2+9; project-plan §6 |
| Q3.8 bid-response → corpus feedback loop (3 UCs) | RESOLVED-DIRECTION-S233 | RATIFIED (Phase 2 scope). UC5 promotion + outcome→corpus; lands with procurement application | PENDING — Phase 2 (procurement); T9 per-UC | PLAN.md §4.9; project-plan §6 |
Q3.10 coverage 4th gap source (bid_response) | RESOLVED-EXTEND-NOT-REBUILD-S233 | RATIFIED (extend). Gates on question_matches landing | PENDING — Phase 2 | PLAN.md §4.10 |
| Decision | Intended (S233) | Current ratified state | Implementation | Authority |
|---|
Q4.5 mempalace Shape C (wing = workspace_id) | RESOLVED-NO-SCHEMA-CHANGE-S233 | RATIFIED. No schema change; wing wire-up convention in 06-mcp-tooling.md. (mempalace_search wing filter still errors — client-side filter workaround per CLAUDE.md) | n/a (convention) | PLAN.md §5; CLAUDE.md mempalace gotcha |
| DW.6 / OQ5 Theme-F mempalace integration pattern | RATIFIED-WITH-CAVEAT (MCP-action review pending) | RATIFIED-S240 — DIRECT pattern (mempalace as separate Anthropic plugin alongside KH MCP). Migration to wrapped pattern = DEFERRED-POST-LAUNCH | LIVE (direct plugin) | PLAN.md §7 item 1; 06-mcp-tooling.md §4; theme-f-mempalace-investigation.md |
| (S239 sweep) Diff-UI retire scope | heading toward DEFERRED-v1.1 (S240) | RATIFIED-S243 — RETAINED for v1, markdown-first. Re-pointed from source_document_diffs to markdown sidecar revision comparison | PENDING — T9 sidecar re-point (Phase 2) | PLAN.md §7 item 2; project-plan §8 (REVERSED-S243) |
| CX.32 Knowledge Map substrate | RESOLVED-S232 (cocoindex, not Graphify) | Unchanged. Substrate = cocoindex; user-facing surface scope still open (post-launch) | n/a — surface DEFERRED | 08-new-features.md; deferral register |
| CX.33 source-document explorer | RESOLVED-DIRECTION-S233 (per-MIME, compose in-stack) | RATIFIED (compose, zero new deps). Explorer’s edit mode IS the UC1/UC4/UC6 surface | PENDING — Phase 2 | 07-collapse-list.md §10; finding 06 |
| OQ11 forms question-extraction | RESOLVED-DIRECTION-S233 | RATIFIED. Deterministic extractors + AI-assisted-cataloguing skill; fed into procurement-workspaces + form_type 3-tier | PENDING — Phase 2 | PLAN.md §5; template-driven-completeness-spec.md §7.3 |
| OQ12 wider workspace-scoping schema | DEFERRED-TO-WIDER-SCHEMA-DECISION | RESOLVED via 04-workspace-types.md + Shape B (Q1.13) | SHIPPED (Shape B) — ID-37 (T2) done | 04-workspace-types.md; PLAN.md §4.2 |
Downstream docs cite “0.9-decision-graph.md §11.3” for the combined-PR migration scope — a section that degraded out of the file. It is reconstructed here as the as-built scope. The migration (commit 38242fef, staging S246 / prod S247, ID-37 / T2 done) carried the 10 canonical §11.3 items plus 5 reserved satellite seats and 2 S243 schema additions. The 10-item table below maps one-to-one to PLAN.md §4.2 acceptance criteria; the post-§11.3 additions are listed separately so the canonical 10 remain unambiguous for docs that cite “§11.3”.
| # | Item | As-built |
|---|
| 1 | application_types instance table + 6 seed rows | DONE-S246 |
| 2 | workspaces.application_type_id FK + drop type text col | DONE-S246 |
| 3 | kb_section retire | DONE-S246 |
| 4 | Procurement rename (bid_workspaces → procurement_workspaces) | DONE-S246 |
| 5 | project_id → workspace_id (2 DB cols: bid_questions, templates) | DONE-S246 |
| 6 | Form templates rename (3 tables: templates→form_templates, template_fields→form_template_fields, template_requirements→form_template_requirements) | DONE-S246 |
| 7 | digests → change_reports (DB col digest_type→frequency) | DONE-S246 |
| 8 | Provenance enum + entity_aliases.category → provenance | DONE-S246 |
| 9 | source_documents.workspace_id NULLABLE | DONE-S246 (no-op on prod) |
| 10 | q_a_pairs schema sketch (full schema lands in T6) | DONE-S246 |
| Addition | Source | As-built |
|---|
| 5 reserved satellite seats (PK+FK+RLS only) | reserved-workspace-seats/TECH.md T-1 (NEW-S240) | DONE-S246 |
intelligence_workspaces Shape B promotion (company_profile_id/guide_id/relevance_threshold JSONB→typed; strip JSONB keys) | RATIFIED-S243 Item 12 + AMENDED-S244 Wave 0.5; PLAN.md §4.2 sub-task 8 | DONE-S246 |
form_type 3-tier split (form_types CV / procurement_vehicles CV / procurement_vehicle_instances) | RATIFIED-S243 Item 19; PLAN.md §4.2 sub-task 9 | DONE-S246 |
Prod-apply note (S247): sync_bid_status trigger drop pulled forward from T4 after first prod-apply hit record "new" has no field "type" (3 prod intel rows carried JSONB keys; greenfield staging had 0). Re-applied clean; types regen byte-identical to staging.
Every [DEFERRED-v1.1] / [DEFERRED-v2] / [DEFERRED-POST-LAUNCH] decision is collated in docs/reference/deferral-register.md with source + rationale (built alongside this rebuild to seed the new product roadmap). Headline deferrals touching this graph: markdown sidecar materialisation for approved Q&A (v1.1), workspace-private q_a_pairs (v1.1), admin UI for client-managed vocabularies (v1.1), P-5 RLS observability hook (v1.1), cocoindex-ledger-api (v1.1), form_type data-driven behaviour (v2), mempalace wrapped-MCP pattern (post-launch), Knowledge Map user-facing surface, kg_timeline RPC (v2).
Banner. Everything below this line is the original phase-0 decision catalogue as it stood at the S232 three-tier restructure + S233 directional reclassification. Status tags here record intended direction pending Liam review, NOT ratified outcomes — read them through the Part I crosswalk above and PLAN.md §7. The internal section numbers (§1–§10) and tier totals are the original anchors, preserved for audit-trail continuity; they are not refreshed. The §9/§11 references some predecessor docs make point at registers that were consolidated into Part I (crosswalk + combined-PR scope) during this rebuild.
This doc does not propose architecture. It catalogues every decision the prior planning material raised, classifies each by category, maps dependencies between them, and tracks status. The companion documents (0.9-context.md, 0.9-synthesis.md, the spike reports, and the future architecture/ sub-doc set) carry the joint resolutions.
Three certainty tiers (S232 restructure): §3 below presents every catalogued decision in one of three tiers, sorted within each tier by category (Q1 → Q5 → DW → CX) then by ID. The tiers are:
| Tier | When an item belongs here |
|---|
| §3.A CERTAIN | RESOLVED, ratified by S229-S231 spike outcomes (S1-S16) or by Liam wave-08 / S228-S231 feedback, and not contradicted by any subsequent input. Locked unless new evidence emerges. |
| §3.B VERIFY-AGAINST-RECENT-DOCS | PROVISIONAL, or RESOLVED-but-stale where spike outcomes / S231 feedback may have shifted the answer. The recommendation direction may be locked but specifics still gate on the wider schema-design pass, MCP-action review, or another upstream Phase B sub-doc. Each item carries a trace note pointing to the doc that should be cross-checked when the next architecture sub-doc lands. |
| §3.C OUTSTANDING / AMBIGUOUS | PENDING-ARCH, PENDING-SPIKE, OPEN, DEFERRED-POST-LAUNCH, or PENDING-DESIGN-PHASE at S231; plus newly-raised S231 questions that lack a clear resolution path. Architecture-split sub-docs + the wider schema-design pass + the MCP-action review pass will resolve most of these. Items here are NOT input to Phase 2 commencement — they are work for Phase B WP3 + Phase C and beyond. |
Status tags retained in tables:
| Status | Meaning |
|---|
| RESOLVED | User has explicitly ratified a direction in wave-08-feedback.md or in S228-S231 feedback files. Locked unless new evidence emerges. |
| PROVISIONAL | User has expressed a preference but kept it open subject to interdependencies. May flip in architecture-sub-doc phase. |
| PENDING-ARCH | Cannot resolve until intended architecture sub-doc lands; the answer is downstream of the architecture-split or the wider schema-design pass. |
| PENDING-SPIKE | Cannot resolve until a hands-on spike returns evidence (none remain at S231 — all spike-gates passed per 0.9-synthesis.md §2). |
| PENDING-INVESTIGATION | Requires research / read of code or docs not yet performed. |
| PENDING-DESIGN-PHASE | Real decision but explicitly deferred to dedicated design-phase pass. |
| DEFERRED-POST-LAUNCH | Real decision but explicitly out of scope for v1. |
| OPEN | Decision exists, no preference yet expressed, no resolution path scheduled. |
Per-decision trace notes: Where a spike outcome (S1-S16) or S231 feedback shifted a decision’s position relative to its original wave-08 / S228 framing, an inline trace note in italics records the shift and points to the source. This makes it possible to read the new tier classification without losing the audit trail back to the original recommendation.
Confidence figures (dropped S231): Per 0.9-context.md §7.1, per-spike “Spike confidence: X%” claims, “Overall confidence: X%” rollups, and the prior per-decision Conf column have been dropped project-wide. Direction confidence is now expressed structurally via the tier classification rather than numerically. Day-count and week-count cost annotations have likewise been stripped from individual recommendations.
| Cat | Name | Concerns |
|---|
| Q1 | Content model (schema) | What tables/columns hold corpus content. Whether content_items is refined or replaced. Schema for source documents, chunks, embeddings. |
| Q2 | Storage model (canonical source) | Where the canonical content lives — DB? external folder (LocalFS / SharePoint / Notion)? bucket? Hybrid. Affects re-upload semantics, audit trail, “one golden record” enforcement. |
| Q3 | Q&A model | Whether Q&A pairs are first-class storage, derived view, or hybrid. Schema shape (own tables vs content_type='q_a_pair' rows). Relationship to corpus, bids, sales proposals. |
| Q4 | KG / memory model | Entity + relationship schema, temporal columns, provenance, per-user vs per-org partitioning. mempalace adoption shape. |
| Q5 | IMS legacy naming cleanup | Rename axes from inherited IMS terminology (project_id, digests) to KH-native terminology. |
| DW | Dev workflow | Tools that aid Claude/human dev cycle: graphify, mempalace memory, skill-check, snyk-agent-scan, doc-drift handling. |
| CX | Cross-cutting | Stream 1 reassessment, sequencing, client feedback resolution, third-party tool sequencing, AGPL/license. |
102 decisions catalogued: 42 §3.A CERTAIN + 35 §3.B VERIFY-AGAINST-RECENT-DOCS + 25 §3.C OUTSTANDING / AMBIGUOUS. Sorted within each tier by category then by ID.
S233 reclassification (12/05/2026) — DIRECTIONAL ONLY, PENDING LIAM REVIEW. 13 items received RESOLVED-*-S233 status via the Wave 1B-1 / 1B-2 / 1B-5 (S232) and 1B-3 / 1B-4 / 1B-C (S233) finding docs in 10-feedback-investigation-findings/. These finding docs have not yet been Liam-reviewed. The “RESOLVED-*-S233” tag reflects the agent-proposed direction in each finding doc and the bidirectional trace back to that doc — it is NOT a confirmation that Liam has ratified the direction. Items stay physically in their original tier sections for diff-readability. Treat any *-S233 status row as a proposal in working-draft state until Liam reviews the underlying finding doc, at which point status may be confirmed (→ effective §3.A), revised, or reverted. The 13 reclassified items: Q1.9 (Option α/β), Q1.11 (citations rename), Q1.12 (bid_question_matches), Q1.13 (Shape B), Q2.4 (audit_log + content_history), Q2.9 (sidecar reopened), Q3.2 (sidecar reopened), Q3.5 (Pattern A/B migration-helper-only), Q3.8 (3-UC feedback loop), Q3.10 (extend coverage with 4th source), Q3.11 (rename bid_templates), Q4.5 (no schema change), Q5.5 (rename direction-locked), CX.33 (per-MIME viewer composed in-stack), OQ11 (AI-assisted cataloguer). Tier totals (42+35+25) are the pre-S232 anchor figures and are not refreshed each session.
Classification rule: RESOLVED + ratified by spike outcomes (S229-S231) or by Liam wave-08 / S228-S231 feedback + not contradicted by subsequent input. Trace notes annotate where a spike outcome converted a prior PENDING-SPIKE / PENDING-ARCH item to RESOLVED. These are locked unless new evidence emerges.
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q1.3 | Continue using content_items.content_type='q_a_pair' or extract Q&A entirely? | RESOLVED | Extract Q&A entirely — q_a_pair is its own domain per user (wave-08 Q3 response). Trace: S230 S16 §6 ratified two-tier q_a_pairs (curated golden record) + q_a_extractions (derived cache); content_items.content_type='q_a_pair' retires in staged migration 5 post-cutover. | Q3.1, Q3.2 |
| Q1.6 | Keep entity_mentions + entity_relationships shape or replace with mempalace KG schema? | RESOLVED | Extend in place — add temporal columns, provenance enum, confidence (mempalace Shape A). Don’t replace. Trace: S229 S3 confirmed Shape A (4 additive columns: valid_from, valid_to, source_chunk_id, adapter_name + 1 index) maps 1:1; S230 S12 confirmed three-column extension (provenance enum + retained confidence numeric(3,2) + adapter_name) with three distinct semantics, no collision. | Q4.1, Q4.2 |
| Q1.7 | Add scope_tag + anti_scope_tag columns to content_items for client feedback Item 3? | RESOLVED | Yes per wave-08 D6 (review corpus + taxonomy first). Multi-value array. Trace: S231 confirmed coordination with WP-DEDUP-RULES (S10 §5.5) — per-tenant keyword-rule schema infrastructure shared with OPS-X-SCOPE-TAGS. Tier note: column-addition decision is RESOLVED independently of the parent Q1.1 schema-redesign (§3.C); the dependency is implementation-sequencing, not decision-certainty. | Q1.1 |
| Q1.9 | Replace source_documents (currently 0 prod rows) with cocoindex source-key model? | RESOLVED-DIRECTION-S233 | Trace: S230 S1 confirmed Scenario A from source — cocoindex.connectors.postgres.mount_table_target(..., managed_by="user") skips DDL emission. KH’s existing 75-column content_items table + every FK + CHECK + GENERATED column + trigger + RLS policy survives unchanged. source_documents replacement is no longer required; if used, KH owns it. S233 1B-1 update (10-feedback-investigation-findings/01-*.md): two viable post-cocoindex shapes — Option α (slim-and-keep — retire versioning columns, retain binary-source manifest) or Option β (drop entirely, cocoindex source-key + Storage bucket carry the role). Working recommendation: α for S203 typed-column parity (mime_type, file_size, content_hash, storage_path survive; version, parent_id, original_filename, source_document_diffs retire). 0/629 prod fill = platform-not-live + upload-route silent-fail per app/api/upload/route.ts:417-434, NOT over-abstraction. Final α/β binding at WP4 architecture/02-data-flow.md. Verified-retire seed entries for WP3 collapse-candidates: source_documents.version, source_documents.parent_id, source_documents.original_filename, source_document_diffs (whole table), detect_reupload() RPC. | (was: cocoindex spike — RESOLVED) |
| Q1.15 | Source doc → content edit → re-upload provenance (07-synthesis-feedback L87 question) | RESOLVED S229 | Per S229 edit-flow §6: data flow under two-way pure write-back = UC1 (in-platform edit propagates to folder file via Candidate A) + UC7+10 (external re-upload detected by cocoindex source-binding; logical-doc-id model preserves identity across filename change per cocoindex-eval Appendix §9.1). Provenance: per-record content_history + cocoindex ops-DB ledger + mempalace Shape A KG event + per-op rollback affordance (§6.0.6). Third-party tools: cocoindex (source-binding + ops-DB) + mempalace (Shape A temporal) + Tiptap+Yjs (concurrent-user CRDT). | Q2.4, Q2.5, Q2.9 RESOLVED, edit-flow §6 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q2.1 | Where does the canonical content live — DB, external folder (LocalFS/SharePoint/Notion), bucket, or hybrid? | RESOLVED | External folder canonical per wave-08 Q3 response. DB = materialised index + curated derivations. Aligns with cocoindex outside-the-system model + Wikipedia one-golden-record + SMB data-fix product framing. | none |
| Q2.2 | Per-source flow shape — does cocoindex’s source binding watch the external folder, or do we manually trigger ingest? | RESOLVED | Trace: S229 S2 confirmed cocoindex LocalFile.from_folder() + localfs.walk_dir(..., live=True) source binding works for v1; UC10 native fs-watch via watchfiles 1.1.1. SharePoint / Notion / Dropbox / Box defer to v1.1 via out-of-band sync to local mount. | (was: cocoindex spike — RESOLVED) |
| Q2.5 | Re-upload UPDATE semantics — engine-native (cocoindex sees same key + new hash → UPDATE) or custom RPC detect_reupload? | RESOLVED | Engine-native via cocoindex Scenario A (preferred per 0.7-synthesis-feedback A2 ratification). Trace: S230 S1 confirmed Scenario A; S229 S2 confirmed source-binding sees same key + new content-hash and triggers update path. | (was: cocoindex spike — RESOLVED) |
| Q2.7 | URL inputs storage shape — pullmd_share_id typed column + storage_path = pullmd://${share_id} sentinel? | RESOLVED | Yes per wave-08 pullmd response + 0.8-synthesis §4.2. Trace: S229 S4 CONDITIONAL PASS — pullmd adopted as Tier 2/2.5/3 for HTML/Cloudflare/Google News/Reddit. v1 deployment via Docker Compose. | Q1.10, pullmd adoption |
| Q2.8 | Multi-tenant isolation — one Supabase per client (current) or shared with RLS? | RESOLVED | One Supabase per client (current). Per CLAUDE.md “One Supabase project per client — simple isolation, not multi-tenant RLS”. | none |
| Q2.9 | External-folder write-back — when a user edits content in KH, does it write back to the external file? | RESOLVED S229 — Q&A SIDECAR REOPENED S233 | Principle: one golden record, two-way semantics (S228). Implementation ratified S229 via edit-flow §6: per-UC Candidate A/B/C set — UC1/UC2/UC4 Candidate A (in-platform editor + filesystem write); UC3 two-variant (A for find-replace + B for smart-agent); UC5/UC6 user-direct KH-DB-only; UC6 AI-suggest Candidate B (Claude API revision draft); UC7+10 cocoindex native (system-driven); UC8 v1 Candidate A + LLM-reasoning + v1.1 Candidate C upgrade; UC9 KH-native. See 0.9-edit-flow-investigation.md §6.0 + §6.1-§6.9. S233 1B-2 update (10-feedback-investigation-findings/02-*.md): UC5 4.6.Q7 + UC6 4.3.Q7 “Defer to v1.1” markdown sidecar deferral reopened. With OQ10 RATIFIED-PREDETERMINED-MARKDOWN as v1 INPUT shape, the natural OUTPUT shape is the same file (round-trip via UC1 Candidate A). Recommendation: promote sidecar emit to v1 provided OQ10 markdown shape locked + S9 idempotency confirmed + lifecycle-only columns (confidence, governance_review_status, superseded_by) explicitly classified as not-round-tripped. Pipeline reuses UC1 4.1.Q3 content-hash idempotency — no new infrastructure. Final binding at WP4 architecture/05-qa-flow.md. | Q2.1, edit-flow §6 |
| Q2.10 | What’s the v1 scope of external-folder support — LocalFS only, or include SharePoint/Notion at launch? | RESOLVED | LocalFS for v1 (simplest); SharePoint v1.1; Notion later. Trace: S229 S2 confirmed cocoindex localfs-only v1; SharePoint defers via out-of-band sync to local mount. | (was: cocoindex connector spike — RESOLVED) |
| Q2.11 | OPS-X-CLASSIFY-UI — re-ingest UI for content-already-in-platform that user has edited (per 07-synthesis-feedback L83)? | RESOLVED S229 | Per S229 edit-flow §6: covered by UC10 conflict-resolution flow (§6.7.1 Q4 — git-style merge UI when external re-upload meets prior in-platform edit) + UC4 source classification at paragraph level + UC6 AI-suggest revision (Candidate B proposes revisions when source-doc changes). No dedicated “re-ingest UI” needed; the use case is decomposed across UC4/UC6/UC7+10. | Q2.9 RESOLVED, edit-flow §6 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q3.1 | Q&A pair as content_type vs separate domain? | RESOLVED | Separate domain — own tables — per wave-08 Q3 response. Trace: S230 S16 ratified two-tier q_a_pairs + q_a_extractions. | none |
| Q3.2 | Q&A pair as derived view + curated storage hybrid? | RESOLVED — SIDECAR REOPENED S233 | Provisional yes (wave-08 Q3) — store curated pairs (durable, citable, validated); derive on-demand from corpus when no curated pair matches. Trace: S230 S16 §6 confirmed two-tier model — q_a_pairs carries the curated pairs; q_a_extractions is the derived cache; promotion model defined in S16. S233 1B-2 update (with Q2.9): v1.1 deferral of markdown sidecar reopened given OQ10. Promote sidecar emit to v1 provided gates hit. See Q2.9 trace. | Q3.1 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q4.1 | Adopt mempalace Shape A (temporal columns on entity_relationships)? | RESOLVED | Yes per wave-08 D1. Add valid_from, valid_to, confidence, source_content_item_id, adapter_name. Trace: S229 S3 confirmed schema mapping is 1:1; S230 S12 confirmed the three-column extension keeps provenance (graphify-taxonomy enum) and confidence (numeric signal) and adapter_name (extractor identity) as three distinct columns with three distinct semantics — no collision. | none |
| Q4.2 | Adopt mempalace Shape B (strict-extraction MCP mode)? | RESOLVED | Yes per wave-08 D2. New mode='strict_extract' parameter on search_knowledge_base. Trace: S229 S3 confirmed Shape B response-shape contract (two-step list/preview → get/verbatim); MCP wire-up gated on §8.3 MCP-action review pass per 0.9-synthesis.md §11.1. | none |
| Q4.7 | KG provenance enum (EXTRACTED / INFERRED / AMBIGUOUS) on entity_relationships? | RESOLVED | Yes per wave-08 (mempalace Open Q response 6). Trace: S230 S12 confirmed this is the graphify confidence-label taxonomy (Q4.14) realised as the provenance enum column in the three-column extension. | Q4.1 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q5.7 | Audit for other IMS-legacy terms not yet flagged (sub-agent did exhaustive search; finding was minimal)? | RESOLVED | Per IMS audit §1-§9: no other IMS-shaped contamination remains. Clean. | none |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| DW.5 | Adopt skill-check as CI step? | RESOLVED | Yes per wave-08 + 0.8-synthesis §4.6. bun run lint:skills in quality-precheck, KH-owned skills only, --fix. | none |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| CX.3 | Cocoindex Option A — adopt? | RESOLVED | Yes per wave-08 Group A (A1+A2). Trace: S230 S1 confirmed Scenario A — Phase 2 commits on cocoindex Option A per 0.9-synthesis.md §2. | (was: cocoindex spike — RESOLVED) |
| CX.4 | Cocoindex schema-coupling — Scenario A (engine accepts existing schema) or B (engine wants ownership)? | RESOLVED | Trace: S230 S1 confirmed Scenario A from source — mount_table_target(..., managed_by="user") skips all DDL emission. Existing schema preserved unchanged. | (was: cocoindex spike — RESOLVED) |
| CX.5 | Schema rework cost — if cocoindex Scenario B, fall back to Phase 0.7 Stream 2 build? | RESOLVED-DISSOLVED | Trace: S230 S1 dissolved this decision — Scenario A confirmed; no Stream 2 fallback path required. | CX.4 (RESOLVED) |
| CX.6 | pullmd adoption — replace lib/extraction/html.ts + tier 2/2.5/3 cascade? | RESOLVED | Yes per wave-08 pullmd § + 0.8-synthesis §4.2. Trace: S229 S4 CONDITIONAL PASS — adopt for HTML/CF/GN/Reddit; skill-seekers pdf_scraper for PDF (S231 framing — replaces Jina-PDF); drop Firecrawl + @mendable/firecrawl-js after wire-up. | none |
| CX.7 | Playwright swap with agent-browser? | RESOLVED-NO-SWAP S229 | S229 spike S11: Playwright 20/20 vs agent-browser 14/20 (4 Cloudflare bot-detection + 1 SPA-hydration + 1 networkidle hang); body completeness 0.81 of Playwright’s word count where both succeed. Keep Playwright. Critical re-framing: Playwright surface lives in pullmd’s Tier-3 sidecar (NOT KH’s own extraction cascade — RSS/fetch/Jina/Firecrawl); this decision is only material conditional on S4 pullmd adoption (CONDITIONAL PASS). | S11 spike + S4 pullmd CONDITIONAL PASS |
| CX.9 | pullmd 50-URL bake-off — gate before adoption? | RESOLVED | Yes — Trace: S229 S4 PASS confirmed pullmd performance against the 50-URL test corpus. | spike phase |
| CX.13 | URL + RSS ingest — pullmd vs skill-seekers vs cocoindex? | RESOLVED | pullmd for URL (per CX.6). skill-seekers doc_scraper for bulk-docs-site (separate use case). cocoindex orchestrates. RSS stays Turndown for tier 1. | CX.6 |
| CX.14 | Client feedback Item 1 (list_user_workspaces array vs record schema) — fix? | RESOLVED | Yes — small fix. Done. | none |
| CX.17 | Cleanup migration for 159 mis-bucketed qa_import rows (S207 backfill artefact)? | RESOLVED | No. Cleaned up by re-ingest. | none |
| CX.18 | Add recordPipelineRun() to both Python ingest scripts? | RESOLVED | cocoindex replaces the Python ingest scripts | none |
| CX.19 | ingest_stage2_markdown.py — permanent path or one-shot client-data-load? | RESOLVED | One-shot per wave-08 D13. Retire post-EP8 + canonical-markdown UI ship. | EP8 ship |
| CX.20 | Phase F.4 — confirm “delete-not-refactor entire P6 + qa-detection chain” (~4-5K LOC)? | RESOLVED | Yes per wave-08 D17 with caveat (verify each item; zero-callers ≠ not-needed; some may be repurposed for Q3.4 mining). Tier note: the delete-not-refactor decision itself is RESOLVED; the per-item-verify caveat is execution-time hygiene against the §3.B/§3.C dependencies (Q3.4 in §3.B, Q3.5 in §3.C), not a hold on the decision. | Q3.4, Q3.5 |
| CX.22 | No backfill of existing prod data — re-ingest is the path? | RESOLVED | Yes per wave-08 D15. Current DB state is baseline; re-ingest produces new DB; compare to evaluate. | architecture |
| CX.26 | Default search limit 5 → 10 (configurable)? | RESOLVED | Yes per wave-08 D12 — configurable, default 10. | none |
| CX.27 | search_knowledge_base MCP tool — scope_tag filter parameters? | RESOLVED | Yes per wave-08 (ratifying 0.8-synthesis Stream 1 item 17). Trace: S231 MCP-action review pass concerns NEW tool registrations (check_content_duplicates etc.); adding parameters to the existing search_knowledge_base tool is not within that gate’s scope. | Q1.7 |
| CX.28 | onboarding/setup UX — does the platform require external-folder configuration as a first step? | RESOLVED | S228 ratification: folder connection REQUIRED at first-run for v1. Per Q2.1 external-folder canonical. New onboarding flow needed: “connect your content folder”. | Q2.1 |
| CX.29 | SMB data-fix angle — surface dedupe / golden-source / structuring features explicitly? | RESOLVED | S228 ratification: critical framing for v1; dedupe-with-temporal as the sole v1 feature; remaining items review post-architecture. Trace: S230 S10 ratified UC8 substrate as HYBRID (a)+(c) — cocoindex @coco.fn chunk-embedding (primary) + skill-seekers per-tenant keyword co-confirmer (secondary), passing both TP and FP gates at 91.7%/1.5-4.5%. WP-DEDUP-RULES coordinates per-tenant rule curation with OPS-X-SCOPE-TAGS (S231 agreed). | architecture |
| CX.30 | Parallel re-ingest commitment (wave-08 D8) | RESOLVED | Re-ingest URLs via pullmd in parallel with Stream 1, NOT sequential. Per wave-08 D8 verbatim: “We have URLs which we can use already and which will have been extracted - we just need to re-ingest these via pullmd. This should happen in parallel to the stream one work, so we have a confirmed approach.” | CX.6 |
Classification rule: PROVISIONAL, or RESOLVED-but-stale where spike outcomes / S231 feedback may have shifted the answer. The recommendation direction may be locked but specifics still gate on the wider schema-design pass (architecture/04-workspace-types.md), the architecture-split (architecture/01-* … architecture/09-*), the MCP-action review pass (architecture/06-mcp-tooling.md), or the form-extraction strategy (OQ11). Each item’s trace note identifies the upstream doc that, when it lands, will lock or revise the recommendation.
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q1.8 | Add expiry_date strategy column(s) per NEW1 (extractDates output)? | PROVISIONAL | Keep extractDates on P4+P7 for v1; defer cross-path to §1.15 per wave-08 B2. Trace: coupled with form-extraction strategy (OQ11) — form-question-extraction may re-open expiry-date capture for compliance forms (CSP checklist etc.). | none — verify against architecture/05-qa-flow.md + architecture/08-new-features.md |
| Q1.10 | Where does pullmd share_id live in schema? | PROVISIONAL | Typed column pullmd_share_id on content_items (URL inputs). Sentinel pullmd://${share_id} in storage_path. Trace: S229 S4 CONDITIONAL PASS confirms pullmd adoption; column shape stands but verify against architecture/02-data-flow.md + architecture/03-tech-stack.md for any tech-stack-driven shape change. | Q2 (storage), pullmd adoption |
| Q1.14 | Drop deprecated columns flagged by 0.7-synthesis (notes, source_bid, parent_id rework, reader_html backfill)? | RESOLVED-ON-HOLD | Per 0.8-synthesis Stream 1 items 6 + 7 — drop migrations + reader rewrites. On hold pending architecture per wave-08 Stream-1 response. Trace: per CX.2, Stream 1 re-derives from architecture; items 6 + 7 may evolve. Verify against architecture/02-data-flow.md + S232 WP2 collapse-candidates refresh. | Q1.1, architecture |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q2.3 | Does content_items.content (markdown body) stay populated, or is it metadata-only with on-demand fetch from external? | PROVISIONAL | Stay populated for v1 (search needs full-text). Add original_path column tracking external location. v2: evaluate metadata-only with lazy fetch. Trace: not load-bearing for Phase 2 commit; verify against architecture/02-data-flow.md when sub-doc lands. | Q2.1 |
| Q2.6 | Bucket for source binaries (compliance “show original PDF”) — yes/no? | PROVISIONAL | No bucket in v1. v2: dedicated audit-bucket OR external-folder is sufficient (the original IS in the external folder). Trace: verify against architecture/02-data-flow.md + architecture/08-new-features.md. | Q2.1 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q3.3 | Schema shape for curated Q&A — single q_a_pairs table or split (q_a_pairs + q_a_questions + q_a_answers)? | RESOLVED-DIRECTION-LOCKED | Single q_a_pairs table for v1; question_text + answer_standard + answer_advanced + provenance + scope_tag + valid_from/valid_to + confidence + source_content_id. Split if complexity demands later. Trace: S230 S16 §6 ratified two-tier model (q_a_pairs + q_a_extractions). Column specifics — RLS predicates, workspace partitioning, RPC signatures — gate on the wider schema-design pass (OQ12 workspace scoping) per 0.9-synthesis.md §8.2 + S16 OQ1. Verify against architecture/04-workspace-types.md + architecture/05-qa-flow.md. | Q3.1, Q4, OQ12 wider schema pass |
| Q3.4 | Q&A pair derivation engine — runtime LLM extraction OR pre-extracted into derived cache? | DIRECTION-SHIFTED-S231 | Trace S231 (OQ10 RATIFIED-PREDETERMINED-MARKDOWN): v1 ingestion uses a predetermined markdown shape (YAML-frontmatter per pair) that KH defines pre-ingestion. LLM-extraction is NOT a recurring v1 ingestion path; it is an optional one-shot migration helper for Phew historical content (5 catalogued shapes in S16 §4) under scripts/qa-migration/. Pre-extracted derived cache (q_a_extractions) lands per S16 §6 two-tier model. Verify against architecture/05-qa-flow.md for canonical wire format spec + migration tooling location. | Q3.3, S16 §7 |
| Q3.11 | Forms / templates — keep templates + template_fields shape or refactor? | RESOLVED-RENAME-BID-TEMPLATES-S233 | Keep + rename — per bid-management-audit §4 DOCX-driven shape works; rename templates → bid_templates + template_fields → bid_template_fields. Trace: S232 Wave 1B-5 (10-feedback-investigation-findings/03-*.md) — keep current shape, disambiguate from possible future form_templates / proposal_templates. S233 Wave 1B-3 (10-feedback-investigation-findings/04-*.md) update on OQ11: form-question-extraction does NOT require a new form_templates container — forms catalogue into template_requirements (rename: bid_template_requirements) using same shape; SSQ-style + Charnwood-style + form-style rows coexist discriminated by template_type. No new top-level table for forms. Land in WP4 architecture/04-workspace-types.md. | Q3.8, OQ11 |
| Q3.12 | Q&A pair scope_tag inheritance — per-pair vs per-source-doc vs both? | PROVISIONAL | Per-pair. Pair may be tagged differently from its source if pair is more specific. Source-doc tag becomes default; per-pair override possible. Trace: verify against architecture/05-qa-flow.md + WP-DEDUP-RULES per-tenant rule infrastructure. | Q1.7 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q4.3 | mempalace miner.py vs cocoindex/skill-seekers Q&A mining — which? | DIRECTION-SHIFTED-S229-S231 | Trace S229 S3 §5.3: mempalace convo_miner.py only fires for content with ≥3 >-quoted-turn markers (chat-log shape) — wrong fit for KH’s Q&A corpus. Miner library is importable but does NOT emit triples. KH retains Pass 2 classification rather than subprocess-wrapping miner from cocoindex. S231 framing: predetermined markdown shape (OQ10) makes “Q&A mining” largely irrelevant for v1 ingestion — Q&A arrives in canonical shape. Mining-style approaches reserved for one-shot migration helpers. Verify against architecture/05-qa-flow.md. | cocoindex spike, mempalace observe-only |
| Q4.4 | Embedding model — KH current (text-embedding-3-large 1024d) vs cocoindex default vs mempalace default? | PROVISIONAL | Keep KH current (text-embedding-3-large at 1024d); evaluate alternatives in spike if cocoindex bindings prefer different. Trace: S229 S2 + S230 S1 did not surface a cocoindex preference forcing change; verify against architecture/03-tech-stack.md. | cocoindex spike |
| Q4.5 | mempalace Shape C (per-user / per-org partition via wing model) — adopt now or defer? | RESOLVED-NO-SCHEMA-CHANGE-S233 | Adopt now per wave-08; no schema change beyond ensuring every KH→mempalace MCP call passes workspace_id as the wing parameter. Trace: S229 S3 confirmed Shape C maps 1:1 to KH multi-tenancy. S232 Wave 1B-5 (10-feedback-investigation-findings/03-*.md) update: 1:1 mapping confirms no schema change; wire-up checklist lands in WP4 architecture/06-mcp-tooling.md (“every mempalace MCP call from KH server-side code MUST pass wing: <workspace_id> — ban implicit / fallback wing parameters”). Gated on §8.3 MCP-action review pass for actual wire-up. Note: per CLAUDE.md mempalace_search ⚠ PARTIAL — wing filter still errors; client-side filtering workaround until upstream fix. | Q1.13, mempalace v4-alpha PG backend, OQ12 |
| Q4.8 | kg_invalidate(subject, predicate, object, ended) RPC — needed for v1? | PROVISIONAL | Yes if Shape A adopted. Without invalidate, valid_to never gets set; temporal columns become inert. Trace: Shape A confirmed (Q4.1 §A); RPC sig lands in architecture/06-mcp-tooling.md post MCP-action review pass. | Q4.1, MCP-action review |
| Q4.10 | Replace ‘reorient me’ MCP tool with mempalace per-user memory pattern? | PROVISIONAL | Yes per wave-08 (mempalace per-user could replace/enhance reorient). Verify reorient’s current implementation isn’t load-bearing for any other flow. Trace: gated on §8.3 MCP-action review pass; verify against architecture/06-mcp-tooling.md. | Q4.5, MCP-action review |
| Q4.12 | Embedding pipeline cache + cost tracking (skill-seekers embedding_pipeline.py pattern)? | PROVISIONAL | Adopt. Phase D AI-telemetry is partially-built; this completes it. Conditional on whether cocoindex emits equivalent. Trace: verify against architecture/03-tech-stack.md (Phase D telemetry coupling) + S231 schema feedback re: classification/governance columns first-class tables. | cocoindex spike |
| Q4.13 | KG entity types — keep current taxonomy (per docs/reference/entity-type-taxonomy-spec.md) or extend with mempalace’s? | PROVISIONAL | Keep KH taxonomy (refined post entity-quality eval work). mempalace’s adapter pattern can plug into KH taxonomy. Trace: verify against architecture/05-qa-flow.md + architecture/06-mcp-tooling.md once taxonomy-coupling decisions are explicit. | none |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q5.1 | Rename digests table → change_reports? | PROVISIONAL | Yes per wave-08 General § + IMS audit §1. User-facing already says “Change Reports”; MCP tool already get_change_report. Rename closes the gap. Trace: cost annotation stripped per S231 anti-pattern (no day counts). Verify sequencing against architecture/02-data-flow.md + architecture/08-new-features.md. | none |
| Q5.2 | Rename Digest types + digestType field + generateDigest() → ChangeReport* family? | PROVISIONAL | Yes (companion to Q5.1). Trace: low cost — qualitative not quantitative. | Q5.1 |
| Q5.3 | Rename /app/digest/page.tsx route → /app/change-reports/page.tsx? | PROVISIONAL | Yes. URL change breaks bookmarks (acceptable pre-launch). | Q5.1 |
| Q5.4 | Rename /api/digest/** routes → /api/change-reports/**? | PROVISIONAL | Yes (companion to Q5.3). | Q5.3 |
| Q5.6 | Sequence Q5.1-Q5.4 (digest rename) and Q5.5 (project_id rename) — together or separately? | PROVISIONAL | Together as a “naming cleanup” mini-stream during architecture-impl phase. Both touch migrations + types + RLS. Combined PR is high-blast-radius but reduces churn. Trace: gates on Q5.5 OPEN status (§3.C) — sequencing decision deferred until Q5.5 resolves. | architecture phase scheduling, Q5.5 |
| Q5.9 | Other low-effort renames (e.g. bid-library-ingest/ → qa-edit-helpers/ per wave-08 D19)? | PROVISIONAL | Yes per wave-08 D19. Stream 1 candidate post-architecture. Trace: gated on Q3.7 disposition + S232 WP2 collapse-candidates refresh. | Q3.7 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| DW.2 | Run dedicated build-not-wired audit on graphify’s 22,155 isolated nodes? | RESOLVED-AWAITING-NEW-GROUNDING | Yes per wave-08 D11. Ground in INTENDED architecture per wave-08 graphify §. Trace: prior grounding was monolithic 0.9-intended-architecture.md; that doc is being split into 9 lean sub-docs (S232 WP3 architecture/01-* … architecture/09-*). BNW audit needs to ground against the new sub-doc set once they land. | architecture-split (S232 WP3) |
| DW.3 | Use graphify for /docs archive determination (roadmap 1.16) + /scripts audit? | PROVISIONAL | Yes per wave-08 graphify §. graphify can identify structurally-disconnected docs (likely outdated or aspirational) but cannot tell currently-correct vs historically-correct. Combine with Last verified headers + git mtime + content classification. Trace: S231 schema feedback explicitly endorses Graphify dev-workflow use for “isolated or build-not-wired functionality” verification — bidirectional audit framing per S232 WP2 (0.9-synthesis.md §7.4). | DW.2 sequencing |
| DW.6 | Use mcp-scan for KH MCP tools? | RATIFIED-WITH-CAVEAT | Per OQ5: adopt snyk-agent-scan (package renamed from mcp-scan). Trace S229 S6 PASS: v1 CI step in inspect mode (local, no cloud egress); v2 cloud deferred; redaction wrapper required before any v2 cloud upload. S231 caveat: MCP-action list (across S6 + S15 + intended-arch §12.1) needs Liam refine/remove/extend pass before any tool registrations or revoke-execute migrations land. Verify against architecture/06-mcp-tooling.md post-pass. | spike (RESOLVED), MCP-action review pass |
| DW.8 | Adopt skill-seekers for documenting KH’s 190+ API routes (auto-generate test queries)? | PROVISIONAL | Yes per wave-08. Useful especially for production-readiness test audit. _Trace: pattern-borrow framing per 0.8.5 §3 retained. Schedule once new architecture is finalised, unless completing this now helps with finalising architecture (automated process). | DW.7 result |
| DW.13 | Adopt ESLint input-required rule mirroring tRPC’s input-required convention (per trpc-feedback L42)? | ADOPT-ADVISORY-CONFIRMED [RATIFY-AT-REVIEW] | Liam: “most immediate value could come from”. Adopt ESLint rule mirroring tRPC’s input-required convention. Independent of full tRPC migration. Quote: “Unless there’s a strong reason not to, it looks like the most immediate value could come from - adding an ESLint rule mirroring tRPC’s input-required convention.” Trace: S229 S13 ADOPT-ADVISORY (warn) — 100% precision custom v2 regex-naming rule; +63ms overhead; 6 handler-level path-param gaps remain. [RATIFY-AT-REVIEW] tag retained per anti-pattern guidance — verify at next architecture review pass. | none |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| CX.1 | Stream 1 — hold all 6 user-approved items pending architecture? | RESOLVED-ON-HOLD | Yes per wave-08 Stream-1 response. Trace: collapse list is now framed as a living document through Phase B+ per 0.9-synthesis.md §7.4. Stream 1 re-derivation depends on S232 WP3 architecture-split + WP2 collapse-candidates refresh. | architecture phase, S232 WP2/WP3 |
| CX.2 | Stream 1 — re-derive from architecture or re-ratify existing 6? | PROVISIONAL | Re-derive. Some items (6 drop-migrations, 7 reader rewrites) intersect with Q1/Q2 outcomes. Trace: verify against architecture/07-collapse-list.md (S232 WP3 §7) + S232 WP2 refreshed 0.9-collapse-candidates.md. | architecture phase, S232 WP2 |
| CX.8 | pullmd AGPL v3 — direct re-use vs fork? | PROVISIONAL | Direct re-use OK; fork only if needed (modification triggers AGPL). Per wave-08 D7. Trace: carry as upstream tracking item per 0.9-synthesis.md §11.2 (AGPL acceptability + pullmd v2.0 stability). | none |
| CX.10 | skill-seekers integration verdicts (per 0.8.5 § + wave-08 skill-seekers §) — reconcile with cocoindex? | DIRECTION-SHIFTED-S229-S231 | Trace: S229 S4 + S5 + S231: skill-seekers reduces to (a) pdf_scraper integration for PDF URLs (v1 inclusion confirmed S231 — replaces Jina-PDF), (b) openapi_scraper pattern-borrow for KH’s 190+ API routes (DW.8), (c) dep_analyzer.py SKIP for production-readiness use (S229 S5). cocoindex orchestrates; skill-seekers contributes per-component patterns rather than wholesale adoption. Verify against architecture/03-tech-stack.md. | (was: cocoindex spike — RESOLVED via S1) |
| CX.12 | PDF ingest — cocoindex (with docling) or skill-seekers (pdf_scraper.py + pdf_extractor_poc.py)? | DIRECTION-SHIFTED-S231 | Trace S231 framing: skill-seekers pdf_scraper for v1 PDF URL coverage — replaces prior “docling per wave-08 (cocoindex Q3 = docling)” framing. skill-seekers PDF features (chapter detection, OCR, image extraction) reserved for v2 per OPS-SS-1. Verify against architecture/03-tech-stack.md. | (was: cocoindex spike — RESOLVED via S2/S4); pullmd Tier-3 sidecar |
| CX.16 | Client feedback Item 3 (scope tags + enforced citation) — fix path? | PROVISIONAL | mempalace Shape B + skill-seekers categories pattern + scope-tag schema migration + classifier integration. Trace: cost annotation stripped per S231 anti-pattern. Verify against architecture/05-qa-flow.md + architecture/06-mcp-tooling.md. | Q1.7, Q4.2, Q3.6 |
| CX.23 | Pre-re-ingestion evaluation — current KH search vs graphify-ingested content vs cocoindex-ingested content (when ready)? | REFRAMED-S231 | Trace S231 (OQ13 NOT-REQUIRED-AS-GATE): no further pre-re-ingest evaluation required as a gating step. Re-ingest happens against the refreshed architecture and is observed as it lands. S7 spike reframed as observation rather than gate. Original “Yes per wave-08 General §” stands as observational endorsement; gating framing dropped. Tier note: placed in §3.B (not §3.A) precisely because the recommendation SHIFTED — from “Yes — gate” to “no longer required as gate, observation only”. Per the §3.B classification rule (“RESOLVED-but-stale where spike outcomes / S231 feedback may have shifted the answer”), this fits §3.B. If a future refresh confirms the observational endorsement is unchanging, this can graduate to §3.A. | none |
| CX.25 | Knip baseline reduction in Stream 1? | RESOLVED-SUBJECT-TO-REASSESS | Yes per wave-08 C3, but subject to re-assessment per CX.2. Trace: verify against S232 WP2 collapse-candidates refresh + architecture/07-collapse-list.md. | architecture, CX.2 |
Classification rule: PENDING-ARCH, PENDING-SPIKE (none remain — all spike-gates passed per 0.9-synthesis.md §2), OPEN, DEFERRED-POST-LAUNCH, or PENDING-DESIGN-PHASE at S231; plus newly-raised S231 questions that lack a clear resolution path. Architecture-split sub-docs (architecture/01-* … architecture/09-*), the wider schema-design pass (architecture/04-workspace-types.md), and the MCP-action review pass (architecture/06-mcp-tooling.md) will resolve most of these. Items here are NOT input to Phase 2 commencement — they are work for Phase B WP3 + Phase C and beyond.
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q1.1 | Replace content_items (70 cols) wholesale, refine in place, or split into corpus + extraction tables? | PENDING-ARCH | Refine in place + split out Q&A domain. Audit shows only 3 truly IMS-legacy cols (per IMS legacy audit §1); 54 are KEPT, 13 AMBIGUOUS. Schema contamination is shallow. Trace S231 schema feedback: “The proposed schema redesign wasn’t in relation to whether or not our setup would fit with CocoIndex. It was more about ensuring that we have the right schema in place for our product, especially given the functionality which will be collapsing.” Wider schema-design pass (OQ12) covers this. | Q3 (Q&A split), OQ12 wider schema |
| Q1.2 | Drop the 13 AMBIGUOUS columns (metadata-promoted + token-tracking) from content_items? | PENDING-ARCH | Keep token-tracking (telemetry). Audit metadata-promoted (source_file, layer, content_text_hash, ingest_source) for usage post-canonical-pipeline. Trace S231 schema feedback: “From a scale/extensibility perspective, should classification + governance columns have their own first-class tables?” — shifts the audit from “drop or keep” to “keep, drop, or promote to first-class table”. Lands in wider schema-design pass. | Q1.1, OQ12 wider schema |
| Q1.4 | Schema for Q&A domain — single q_a_pairs table or richer model (questions, answers, citations)? | PENDING-ARCH | Richer model. See Q3 group. Trace: S230 S16 §6 ratified two-tier (q_a_pairs + q_a_extractions); column-level richness specifics still gate on OQ12 wider schema-design pass. | Q3.3, OQ12 wider schema |
| Q1.5 | Keep chunks table (current shape: id, content_item_id, content, embedding) or restructure? | PENDING-ARCH | Keep shape; extend with chunk_kind enum (heading-section, qa-block, paragraph) once chunking strategy is settled per Q&A vs corpus. Trace: predetermined markdown shape (OQ10) simplifies Q&A chunking; corpus chunking unchanged. Verify against architecture/02-data-flow.md. | Q3, Q4 |
| Q1.11 | Schema for q_a_pairs ↔ bid_responses citation linkage — array of FKs, separate citation table, both? | RESOLVED-DIRECTION-S233 | Extend existing content_citations in place — rename to citations; add q_a_pair_id UUID NULL, source_chunk_id UUID NULL, chunk_offset_start INT NULL, chunk_offset_end INT NULL; CHECK constraint exactly-one-target (content_item_id XOR q_a_pair_id). Trace: S232 Wave 1B-2 (10-feedback-investigation-findings/02-*.md Rec 3) — avoids parallel-table maintenance. Migration lands in S16 §10 sequence: S16 q_a_pairs first → citations rename + extend second. Lands in WP4 architecture/05-qa-flow.md for citation contract. | Q3, current schema audit, OQ12 |
| Q1.12 | Schema for bid_questions ↔ q_a_pairs matching cache (so re-runs don’t re-embed)? | RESOLVED-DIRECTION-S233 | New bid_question_matches table. Columns: (id, bid_question_id, content_item_id NULL, q_a_pair_id NULL, CHECK exactly-one-target, score NUMERIC(4,3), match_method TEXT, rank_within_run INT, recompute_run_id UUID, created_at). Migrate bid_questions.matched_content_ids inline array → table (rank-within-run from array order; match_method='legacy'); switch read paths; drop the inline array column. Trace: S232 Wave 1B-2 (10-feedback-investigation-findings/02-*.md Rec 4). Lands in S16 §10 migration sequence + WP4 architecture/05-qa-flow.md for matching contract. Future: rename to question_matches with question_kind discriminator when sales_proposals lands (per 1B-5 OQ-Q113-C). | Q3, OQ11 |
| Q1.13 | Keep workspaces ↔ content_items workspace_id partition or layer in user_id partition? | RESOLVED-SHAPE-B-S233 | Keep Shape B (current — single workspaces table + type discriminator + domain_metadata JSONB + per-type satellite tables). Universal content via content_items + content_item_workspaces M:N (81 prod rows; content_items has NO direct workspace_id). When new applications land (sales_proposals, competitor_research, training): (1) extend workspaces.type CHECK, (2) registerType() in lib/workspace-types.ts, (3) add per-type satellites only where behaviour differs. Trace: S232 Wave 1B-5 (10-feedback-investigation-findings/03-*.md Rec 1). 4 prod workspaces are all type='intelligence'; bid workflow not exercised in prod yet — validates “platform not live” framing. Code registry already declares 4 types (bid / kb_section / proposal-placeholder / intelligence); DB CHECK has 3 (proposal not in CHECK, code-registered only). Promote 'proposal' to DB CHECK when sales_proposals work-package begins. Per-type satellite registry pattern (OQ-Q113-A) — defer; capture in WP4 04-workspace-types.md. | Q4.5, RLS impact, OQ12 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q2.4 | What’s the audit trail — cocoindex source_key + content_hash, separate audit_log table, both? | RESOLVED-DIRECTION-S233 | Both. Cocoindex per-row content-hash IS the audit primitive at the row level. KH layer adds: (a) content_history trigger KEEP as per-item audit primitive (1223 prod rows; 5 change_types in use) + extend with op_id column for UC3/UC8/UC9 rollback per edit-flow §6.0.6; (b) NEW audit_log table for human-readable change events — (id, op_id, op_type, actor_id, workspace_id, occurred_at, op_summary, affected_record_count, ledger_ref) — compliance UX surface; (c) pipeline_runs retain as KH-side rollup of cocoindex runs for pipeline-health-tab (insulates UI from cocoindex schema changes; keeps recordPipelineRun() API stable); (d) provenance API + UI tabs absorb post-cocoindex sources unchanged (flowHistory, temporalEvents extensions to lib/provenance/item-provenance.ts response). Trace: S232 Wave 1B-1 (10-feedback-investigation-findings/01-*.md Recs 6-9). RLS predicates on audit_log gate on Q1.13 (RESOLVED-SHAPE-B). Op_id propagation pattern (trigger-driven vs app-stamped) — Recommendation: trigger-driven where clean, app-stamped where rollback-op cohesion required; finalise at WP4 02-data-flow. MCP audit retrieval gated on §8.3 MCP-action review pass. | Q2.1, cocoindex spike (RESOLVED via S1) |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q3.5 | Pattern A/B parser (extract-qa-pairs.ts) — wire it as bid-response Q&A extractor, retire, or repurpose? | RESOLVED-MIGRATION-HELPER-ONLY-S233 | Keep as one-shot Phew-content migration helper; retire (delete files + tests) after Phew Q&A content migrates to canonical predetermined-markdown shape. NOT the bid-response Q&A extractor (that path is extract_tender_questions.py → bid_questions); NOT the form-question-extraction tool (per S233 OQ11 resolution — that’s the new AI-assisted-cataloguer skill). Trace: S233 Wave 1B-3 (10-feedback-investigation-findings/04-*.md §3.5). (a)+(b) Liam reciprocal questions: SSQ + Charnwood ITT were MANUALLY catalogued — hand-written TS arrays in scripts/catalogue-standard-sq.ts (66 reqs from UAT S77) + scripts/catalogue-charnwood-itt.ts (30 reqs from UAT S83). Forward path for forms (Shape F XLSX/PDF) = deterministic question-text extractors (XLSX via exceljs, PDF via pdf-parse/extract_pdf_text.py) + AI-assisted-cataloguing skill per template-driven-completeness-spec.md §7.3. Pattern A/B parser is irrelevant for either. | Q3.4, OQ11 |
| Q3.6 | Bid drafting flow — citation-only (must cite a q_a_pair or content_item chunk) or generative-with-source (LLM may rephrase across sources)? | PENDING-ARCH | Citation-only by default (mempalace Shape B strict-extract). Generative-with-source as opt-in mode. Aligns with client feedback Item 3 “enforce citation”. Trace: verify against architecture/05-qa-flow.md + architecture/06-mcp-tooling.md. | Q4 (mempalace shape B) |
| Q3.7 | extract-answer.ts + resolve-question.ts — wire to bid drafting OR keep as Q&A library import helpers? | PENDING-ARCH | Per bid-management audit §3, currently Q&A library import helpers (NOT bid drafting). Keep. May be relevant to Q3.4 mining pipeline. Trace: gated on S232 WP2 collapse-candidates refresh disposition for these helpers — per S231 framing they may move to one-shot migration tooling under scripts/qa-migration/. | Q3.4, S232 WP2 |
| Q3.8 | Bid response → corpus feedback loop — completed responses become curated Q&A pairs? | RESOLVED-DIRECTION-S233 | Yes, three UCs all designed; two wired today, one new. UC-A (client supplies prior bid responses) — new 'prior_bid_response' value in q_a_extractions.extractor_kind (post-S16) + 4 typed prior-bid context columns; small additive change. UC-B (client creates response in-platform) — RATIFIED happy path per edit-flow §6.5 UC5; schema-impact = 1B-2 deliverables (citations rename, bid_question_matches new table); + new promotion-from-draft UI surface. UC-C (outcome → corpus) — /api/bids/[id]/outcome/integrate route exists today, won-bid-only; extend to accept lost AND won; add evaluator_score + evaluator_feedback to bid_responses + outcome_signal to bid_response_history; promote 6-9 outcome JSONB fields to a new bid_workspaces satellite (per 1B-5 Shape B pattern). Polymorphic integration target post-S16 (q_a_pairs vs content_items based on content_type). Trace: S233 Wave 1B-4 (10-feedback-investigation-findings/05-*.md). No new top-level table beyond what 1B-2 + 1B-4 already propose. Coverage 4th bid_response gap source (1B-3 §4.3) is the cross-cutting downstream consumer. Land in WP4 architecture/05-qa-flow.md + architecture/08-new-features.md + architecture/04-workspace-types.md (bid_workspaces satellite precedent for sales_proposals/competitor_research/training workspaces). | Q3.1, KBIntegrationReview component |
| Q3.9 | Per-source-shape classification — different extraction approach for docx-Q&A vs markdown-Q&A vs free-form corpus? | OPEN [RATIFY-AT-REVIEW] | wave-08 D14 was TBD pending Q&A approach (NOT ratified as split). Trace S231 (OQ10): predetermined markdown shape removes the per-source-shape question for v1 Q&A ingestion (everything arrives in canonical shape). Per-source classification still relevant for free-form corpus extraction; verify against architecture/05-qa-flow.md._ | Q3.4, OQ10 |
| Q3.10 | Coverage feature — extend to surface “bids generated questions; here are corpus gaps” or rebuild? | RESOLVED-EXTEND-NOT-REBUILD-S233 | Extend. Architecture supports a 4th gap source cleanly: (1) add bid_response to gap-source discriminator in lib/coverage/gap-scoring.ts + scoreBidResponseGap() function mirroring scoreTemplateGap; (2) add bid_question_id field to UnifiedGap in types/unified-gap.ts; (3) wire recompute trigger on bid_question_matches inserts (post-1B-2); (4) surface in existing priority-gaps-tab.tsx — no tab restructure. Phase 4 bid-deadline scoring (the reserved 75-100 critical tier per lib/coverage/gap-scoring.ts:9) wires up when first live bid workspace ships; don’t pre-build. Trace: S233 Wave 1B-3 (10-feedback-investigation-findings/04-*.md §4). Coverage today is template-only (lib/templates/template-coverage.ts + lib/coverage/*.ts); 3 gap sources (taxonomy / template / guide); bid_response is the missing 4th source. Gates on 1B-2 bid_question_matches table landing first. Lands in WP4 architecture/08-new-features.md. | Q3.8 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q4.6 | mempalace v4-alpha PostgreSQL backend — wait for stable or fork now? | DEFERRED-POST-LAUNCH-OPEN-AVAILABILITY | Trace S231: new OQ raised — is the v4-alpha PG backend (PRs #665 + #1337) available to inspect on the mempalace GitHub repo? Track at OPS-MP2 cadence per S15 §6; resolution gates any PG-backend wiring decision. | none |
| Q4.9 | kg_timeline(entity, as_of) RPC — needed for v1 or v2? | DEFERRED-POST-LAUNCH | v2. Useful for “answer was right last quarter” UX but not blocking launch. | Q4.8 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| Q5.5 | Rename project_id → workspace_id (97 occurrences across ~35 files, schema in 6 tables)? | RESOLVED-DIRECTION-S233 | Yes, lower-risk than reported. Reality check: 2 DB columns (bid_questions.project_id 0/0 rows, templates.project_id 0 rows), not 6 tables; 44 code files via grep, not 35; 97 = source-line count, not schema reach. DB migration is straightforward; code sweep is the work. Strategy: ALTER TABLE bid_questions RENAME COLUMN; ALTER TABLE templates RENAME COLUMN; rename FK constraints + rebuild dependent views/RPCs (get_bid_question_stats); regen TS types via bun run gen:types (Wave 1A SA3 script); ts-morph + ast-grep code sweep per S231 (UC3 Candidate B smart-agent variant). Combine with Q5.1-Q5.4 digest → change-reports rename + the OQ12 schema-restructure as one big pre-launch rename PR per Q5.6 (combined recommended; pre-launch is the right time). Trace: S232 Wave 1B-5 (10-feedback-investigation-findings/03-*.md Rec 2). Lands in WP3 + S16 migration sequence. | architecture timing, OQ12, Graphify dev-workflow audit |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| DW.10 | Doc-drift handling — graphify+mempalace combination as solution? | OPEN-PENDING-INVESTIGATION | Pivot - Gitbook is now available and creates a sync between code and documentation. Adopt approach used in the Warp repo (/development/warp), integrated with agent skills as part of implementation workflow | Confirmation of Gitbook integration setup |
| DW.11 | AST data-flow tracing — does any third-party tool cover this? | OPEN-PENDING-INVESTIGATION | Per analysis: no. graphify is structural call-graph, not data-flow. skill-seekers dependency_analyzer is Python AST. Closest: ts-morph + LSP, or commercial Sourcegraph. Real gap not addressed by any tool we evaluated. | none — needs separate investigation if it matters for production-readiness test audit |
| DW.14 | Bulletproof React + Supabase typegen pattern (per trpc-feedback L29-40)? | PENDING-INVESTIGATION [RATIFY-AT-REVIEW] | Evaluate vs current setup. Liam uses this pattern in another project. Resources: supabase.com/docs/reference/javascript/typescript-support + supabase.com/docs/guides/deployment/ci/generating-types. | DW.13 |
| ID | Decision | Status | Recommendation | Depends on |
|---|
| CX.11 | DOCX + CSV ingest — cocoindex connectors or skill-seekers word_scraper.py / doc_scraper.py? | PENDING-SPIKE-RESIDUAL | Per wave-08 cocoindex § — needs cocoindex connector list verification + side-by-side comparison. Trace: S229 S2 covered localfs-only v1 connector scope; specific DOCX + CSV adapter choice within localfs path is a Phase 2 first-week design decision rather than a separate spike (no architectural gate). | (was: cocoindex spike — RESOLVED via S2 for connector scope; format-adapter choice deferred) |
| CX.15 | Client feedback Item 2 (search underperforming) — fix path? | PENDING-ARCH | Multi-axis: classifier prompt update (FUNC-XXX recognition); cross-encoder reranker; default-limit raise; scope-tag taxonomy. See 0.8-synthesis §6 Item 2. Trace: verify against architecture/05-qa-flow.md + architecture/06-mcp-tooling.md + architecture/08-new-features.md. | architecture |
| CX.21 | Roadmap items absorbed by cocoindex — sections 3 (classification), 3.7 (AI telemetry), 5 (document control), 11 (context graph phase 5)? | PENDING-ARCH | Likely yes per wave-08 General §. Audit each section post-architecture. Trace S231 schema feedback: “How does the original Phase D (AI telemetry-related) work get impacted by new canonical pipeline? Are we still extracting the columns from content_items table? Does cocoindex (or skill-seekers) alter the approach?” — Phase D coupling specifics lands in architecture/02-data-flow.md + architecture/03-tech-stack.md. | architecture |
| CX.24 | EP8 ship priority? | OPEN-WITH-NOTE | Carrying from 0.8-synthesis Group C2; subject to architecture sequencing. Trace S228: EP8 spec likely needs rework after architecture progresses; not yet re-specced. | architecture |
| CX.31 | Original client requirements review (wave-08 D16) | PENDING-DESIGN-PHASE | Review original client requirements + current platform config in design phase. Per wave-08 D16 verbatim: “Review original client requirements and current platform config, in design phase.” | architecture phase |
| CX.32 | Knowledge Map user-facing primitive — substrate | RESOLVED-S232 | Cocoindex (not Graphify). Per S231 intended-arch feedback verbatim: “Cocoindex for ‘knowledge map’, not Graphify.” Knowledge Map is a new user-facing capability that visualises curated KB relationships; cocoindex’s @coco.fn graph-derivation primitives + entity_relationships extension (per Q4.1 + Q1.6) is the substrate. Graphify’s dev-workflow role (bidirectional verified-collapsing audit per §7.4 synthesis) stays separate. | Q4.1, cocoindex Scenario A |
| CX.33 | Platform UI source-document explorer — substrate | RESOLVED-DIRECTION-S233 | Per-MIME-type viewer composed from in-stack primitives, mounted at new app/documents/[id]/page.tsx. Markdown → existing Tiptap ContentEditor; DOCX → mammoth.convertToHtml → Turndown → Tiptap edit mode; PDF → existing PdfReaderView (read-only); XLSX → CTA to forms UI (defer to Wave 1B-3 form-cataloguing). Zero new deps. Secondary fallback if mammoth+Tiptap loses critical fidelity: add docx-preview (~150-200 KB, Apache 2.0) as read-only DOCX renderer paired with Tiptap edit mode — not pre-emptive. Trace: S233 Wave 1B-C sub-agent finding (10-feedback-investigation-findings/06-*.md). Every read-side primitive already shipped (react-pdf at pdf-reader-view.tsx, mammoth at 5 call sites, docx/exceljs for write-back, Tiptap 3.22 deployed since S198, yjs/y-prosemirror installed awaiting §9.8 enable). The explorer’s edit mode IS the UC1/UC4/UC6 in-platform-edit surface — one surface, two affordances. The 0.9-context.md §7.5 “TBD which third-party tool” framing is partially obsolete. Open: (OQ-CX33-A) cocoindex re-extract on user edit-back gates on WP3 ledger query pattern; (OQ-CX33-B) DOCX write-back canonical (markdown-sidecar v1 vs full DOCX regen v1.1) aligns with Q2.9 sidecar reopen. Lands in WP3 architecture/03-tech-stack.md + architecture/08-new-features.md. | edit-flow §6, Q2.9 RESOLVED |
The prior status-based rollups (§4 Resolved, §5 PENDING-SPIKE, §6 PENDING-ARCH, §7 OPEN) have been superseded by the three-tier structure in §3. The new equivalences:
| Old rollup | New equivalent |
|---|
| §4 Resolved decisions | §3.A CERTAIN — every entry is RESOLVED + ratified + non-contradicted. |
| §5 PENDING-SPIKE decisions | (None remain) — every spike-gate (S1/S10/S14/S15/S16 + S2-S6/S11-S13) has resolved per 0.9-synthesis.md §2 + §3. Items historically tagged PENDING-SPIKE (Q1.9, Q2.2, Q2.5, Q2.10, CX.4 etc.) graduated to §3.A CERTAIN with trace notes pointing to the spike report. CX.11 graduated to §3.C as PENDING-SPIKE-RESIDUAL (format-adapter choice within already-RESOLVED localfs scope). |
| §6 PENDING-ARCH decisions | §3.C OUTSTANDING / AMBIGUOUS — items still gating on architecture-split or wider schema-design pass land here. |
| §7 OPEN decisions post-S228 | §3.B (where partial-resolution exists, e.g. Q4.11 ADOPTION-CONFIRMED Lens 1) or §3.C (where no resolution path scheduled, e.g. DW.10, DW.14, Q4.6 v4-alpha PG availability). |
S228 audit reclassified several entries originally tagged DEFERRED-POST-LAUNCH after re-reading wave-08-feedback verbatim. Carried forward through S231 unchanged unless noted.
| ID | Question | Status | Why |
|---|
| Q4.9 | kg_timeline RPC | DEFERRED-POST-LAUNCH (§3.C) | v2 UX feature. |
| Stream-1 backlog new items 14, 16-21 (per 0.8-synthesis §7.1) | Various adoptions | DEFERRED-POST-LAUNCH | Sequencing post-architecture; subject to S232 WP2 collapse-candidates refresh. |
| OPS-T1 | Typed defineRoute() wrapper | DEFERRED-POST-LAUNCH | tRPC backlog. Defer until canonical-pipeline collapse complete. Note: codemod for migration time-reduction (trpc-feedback L44) — under-investigated. |
| OPS-PM-1.a | pullmd Reddit capability | RESOLVED-ADOPTED | Capability adopted via pullmd path per 0.8.4 §7.4 + PM7. |
| OPS-SS-1 | skill-seekers pdf_scraper | RESOLVED-ADOPTED | v2; pdfplumber + Pillow + Tesseract footprint shift. (v1 baseline pdf_scraper adoption per CX.12 §3.B is separate.) |
| OPS-SS-2 | openapi_scraper for api_specification content type | RESOLVED-NOT-ADOPT-AS-CONTENT-TYPE | wave-08 D9 = “No” to api_specification content type. Dev-workflow use (auto-document KH’s 190+ API routes) covered separately by DW.8. |
| OPS-OMA-1 | open-multi-agent for sector-intelligence dispatcher | RESOLVED-NOT-ADOPT | wave-08 §open-multi-agent + D5 = “Don’t adopt, no further action for open-multi-agent.” |
| OPS-OMA-2 | open-multi-agent for Sales Proposals 4-pass | RESOLVED-NOT-ADOPT | Same treatment as OPS-OMA-1 per wave-08 D5. |
S231 framing: the collapse list is now an explicitly living document through Phase B+ per 0.9-synthesis.md §6.4. Stream 1 re-derivation depends on S232 WP2 (collapse-candidates refresh + bidirectional Graphify audit) + WP3 (architecture-split). The table below preserves the original 6-item disposition + adds the S231 collapse-list anchors that move other functionality OUT of Stream 1 / collapse scope.
| # | Item | Architecture-Impact | Disposition |
|---|
| 1 | D1 markdown_batch ingest_source value | None | Re-assess post-architecture. |
| 3 | 5 P0 missing FKs on content_items | Possibly affected if Q1.1 changes content_items shape | Re-assess post-architecture; likely carries. |
| 5 | P0-2 fix feed_prompts fire-and-forget | None | Carries forward. |
| 6 | Drop migrations notes/source_bid (verify parent_id given 0.7.4) | Affected if Q1.14 sequence changes | Re-assess post-architecture. |
| 7 | Reader rewrites for source_document text + drop migration | Affected if Q1.9 changes source_documents shape (now: Scenario A confirmed, source_documents preserved unchanged) | Re-assess post-architecture; Q1.9 RESOLVED-via-S1 may simplify the disposition. |
| 11 | 4 knip TRUE-POSITIVE-FIX-NOW items | None | Re-assess post-architecture. |
Disposition: re-derive Stream 1 from architecture, then verify each existing item is preserved or updated. Items 1, 5, 11 will almost certainly carry. Items 3, 6, 7 may evolve.
Per S231 Liam feedback (09-synthesis-and-verification-feedback.md), the following functionality is explicitly NOT in collapse / Stream 1 scope.
| Item | S231 disposition | Trace |
|---|
| Bulk operations UI | INVESTIGATE FIRST — is this already working? | ”Does bulk ops need to be collapsed? - Shouldn’t be if already working.” |
| Content creation/editing/deletion (incl. soft delete) | STAYS | ”Content creation/editing/deletion not collapsing (including soft delete).“ |
| Item | S231 disposition | Trace |
|---|
| Dedupe substrate | Per S10 hybrid (a)+(c) — cocoindex @coco.fn chunk-embedding + skill-seekers per-tenant keyword co-confirmer. | ”Dedupe approach will be based on ‘0.9-spike-S10-dedup-substrate.md’.” Lands in §3.A CX.29 + WP-DEDUP-RULES. |
| MCP-related actions | NOT-YET-APPROVED — Liam refine/remove/extend pass needed | ”MCP-related actions aren’t yet approved - We still need to review, and then refine/remove/extend.” Lands in architecture/06-mcp-tooling.md per 0.9-synthesis.md §8.3. |
The full collapse-list refresh + bidirectional Graphify audit lands in S232 WP2 (0.9-collapse-candidates.md) per 0.9-synthesis.md §7.4.
OQ table updated to S231 cumulative state. Replaces the prior S228-snapshot OQ table. This table is a cross-reference to 0.9-context.md §2 (canonical OQ home); changes there propagate here on next refresh.
| OQ | Decision ID | Status | Detail |
|---|
| OQ1 (Q2.9 write-back) | Q2.9, Q1.15, Q5.10 | FULLY-RATIFIED S229 | Principle (S228): one golden record, two-way semantics. Implementation (S229): per-UC Candidate A/B/C set ratified — UC1/UC2/UC4 Candidate A (in-platform + filesystem write); UC3 two-variant (A find-replace + B smart-agent); UC6 AI-suggest Candidate B (Claude API revision draft); UC7+10 cocoindex native; UC8 v1 Candidate A + LLM-reasoning, v1.1 Candidate C upgrade; UC9 KH-native (no candidate). See 0.9-edit-flow-investigation.md §6. |
| OQ2 (CX.28 onboarding) | CX.28 | RATIFIED | Folder connection REQUIRED at first-run for v1. |
| OQ3 (CX.29 SMB data-fix) | CX.29 | RATIFIED | Critical framing for v1; dedupe-with-temporal as the sole v1 feature; remaining items review post-architecture. Substrate ratified S230 as hybrid (a)+(c) per S10. |
| OQ4 (Q4.11/DW.4 mempalace) | Q4.11, DW.4 | ADOPTION-CONFIRMED (Lens 1) | Lens 1 dev workflow confirmed via S3 + S15 (v3.3.5 with mempalace_search FIXED via PR #1396). Lens 2 memory replacement still pending post-launch validation. S231 OQ raised: is the v4-alpha PG backend available to inspect on the mempalace GitHub repo? (Track at S15; PRs #665 + #1337.) |
| OQ5 (DW.6 mcp-scan) | DW.6 | RATIFIED-YES | Adopt snyk-agent-scan (package renamed). v1 CI step in inspect mode; v2 cloud deferred. S231 caveat: MCP-action list (across S6 + S15 + intended-arch §12.1) needs Liam refine/remove/extend pass before any tool registrations land. |
| OQ6 (CX.7 agent-browser) | CX.7 | RESOLVED-NO-SWAP S229 | S11 spike: keep Playwright. agent-browser fails Cloudflare + body-completeness (14/20 vs 20/20). Playwright surface lives in pullmd Tier-3 sidecar. |
| OQ7 (CX.24 EP8) | CX.24 | OPEN-WITH-NOTE | EP8 spec likely needs rework after architecture progresses; not yet re-specced. |
| OQ8 (DW.10 doc-drift) | DW.10 | OPEN-PENDING-INVESTIGATION | Check skill-seekers for ready-made solution before closure. |
| OQ9 (DW.12 token-reduction) | DW.12 | MOVED-TO-PROD-READINESS-TRACK | update-docs/handoff token reduction handled in production-readiness track. |
| OQ10 (S16 Q&A canonical shape — NEW S231) | Q3.4, Q3.9 | RATIFIED-PREDETERMINED-MARKDOWN | v1 Q&A ingestion uses a predetermined markdown shape (YAML-frontmatter per pair) that KH defines pre-ingestion. Existing Phew historical shapes (5 catalogued in S16 §4) migrate once via one-shot tooling under scripts/qa-migration/; not a recurring v1 path. Pattern A/B docx extractor + markdown_heading_v1 + LLM-extraction = migration helpers, not v1 ingestion adapters. |
| OQ11 (S231 — forms question-extraction strategy) | Q3.5, Q3.11, Q1.8, Q1.12 | RESOLVED-DIRECTION-S233 | (a) Historical: SSQ (66 reqs) + Charnwood ITT (30 reqs) were MANUALLY catalogued into hand-written TS arrays (scripts/catalogue-standard-sq.ts from UAT S77; scripts/catalogue-charnwood-itt.ts from UAT S83). No automated PDF/XLSX→template_requirements pipeline ever existed. (b) Forward path: deterministic question-text extractors (XLSX via exceljs; PDF via pdf-parse/extract_pdf_text.py) feeding an AI-assisted-cataloguing plugin skill per template-driven-completeness-spec.md §7.3. Skill drives requirement_type + taxonomy + matching keyword authoring with human confirmation; output is a generated scripts/catalogue-<slug>.ts seed script. Pattern A/B parser is irrelevant for either historical or forward path — it’s a Q&A pair extractor for the Phew library, not a bid-template question extractor. Trace: S233 Wave 1B-3 (10-feedback-investigation-findings/04-*.md §5). |
| OQ12 (S231 — Q1.13 workspace scoping) | Q1.13, Q3.3, Q3.4, Q4.5, Q5.5, Q5.8, Q1.1, Q1.2, Q1.4, Q1.11 | DEFERRED-TO-WIDER-SCHEMA-DECISION | Workspace scoping for q_a_pairs (and broader workspace/multi-tenant decisions) bundled into a single wider schema-design pass, not resolved at the S16 level. Lands in architecture/04-workspace-types.md per 0.9-synthesis.md §8.2. |
| OQ13 (S231 — pre-re-ingest evaluation) | CX.23 | NOT-REQUIRED-AS-GATE | No further pre-re-ingest evaluation required as a gating step. Re-ingest happens against the refreshed architecture and is observed as it lands. S7 spike reframed as observation rather than gate. |
Per S231 framing (0.9-context.md §7.1), per-spike confidence figures and overall confidence rollups have been dropped project-wide. The previous “Overall confidence: 88% (S228 corrections pass)” framing is removed.
Current status (S232): all catalogued decisions classified into one of three certainty tiers (§3.A / §3.B / §3.C). Every Q-ID + DW.x + CX.x lives in exactly one tier. S232 WP2 (collapse-candidates refresh) and WP3 (architecture-split into 9 lean sub-docs) are the next consumers of this graph; verification of §3.B items happens against those sub-docs as they land.
Drag remaining (carries from S228 + acknowledged S231):
- §3.B items by definition still need cross-doc verification once architecture sub-docs land.
- The collapse list is a living document through Phase B+ (
0.9-synthesis.md §7.4); items in §3.B with collapse-list dependencies will move as the bidirectional Graphify audit (S232 WP2) lands.
- This doc (promoted canonical):
docs/reference/decision-graph.md (rebuilt S267). Original phase-0 home docs/plans/phase-0-investigation/0.9-decision-graph.md is now a pointer stub.
- Predecessors:
docs/plans/phase-0-investigation/wave-08-feedback.md
docs/plans/phase-0-investigation/0.8-synthesis.md
docs/plans/phase-0-investigation/0.8.{2..8}-{tool}-evaluation.md (7 evals)
docs/plans/phase-0-investigation/0.7-synthesis.md
- Companions:
docs/plans/phase-0-investigation/0.9-context.md (canonical OQ home; required reading)
docs/plans/phase-0-investigation/0.9-synthesis.md (Phase 2 commit decision + sub-stream ordering)
docs/plans/phase-0-investigation/0.9-edit-flow-investigation.md (UC1-UC10 Candidate ratifications)
docs/plans/phase-0-investigation/0.9-collapse-candidates.md (refresh in S232 WP2)
docs/plans/phase-0-investigation/09-synthesis-and-verification-feedback.md (S231 Liam feedback)
- Spike reports
0.9-spike-S1 … 0.9-spike-S16 (S229-S230 spike outcomes)
- Successors (Phase B WP3):
docs/plans/phase-0-investigation/architecture/01-vision-mission.md … 09-diagrams.md (lean split of 0.9-intended-architecture.md)
- Phase C: Taskmaster install + seed task tree from architecture sub-docs.
This decision graph operates within the strategic frame defined in 0.9-context.md. That document captures:
- The ai-strategy North Star ratified by Liam S228 (“the knowledge base IS the product”; “everyone ends up working within an LLM”; “we adopt and customise, not reinvent”).
- S228-S231 cumulative OQ ratifications (locked).
- Graphify-feedback context to preserve.
- OQ1 edit-flow investigation Claude-API research URLs (historical reference).
- Canonical baseline corpus pointer (
docs/client-documentation-base/).
- Phase B baseline scope (S231 anchors): budget terminology dropped, predetermined Q&A shape, three-column ER extension, MCP actions pending, cross-doc coupling references.
Sub-agents and future readers MUST read 0.9-context.md before interpreting decisions in this graph.
End of decision graph. Restructured S232 into three certainty tiers (§3.A CERTAIN: 42 / §3.B VERIFY-AGAINST-RECENT-DOCS: 35 / §3.C OUTSTANDING: 25 — matching the §3 intro anchor); all wave-08 + S228 + S229-S231 decisions catalogued; OQ table refreshed to S231 cumulative state.