Skip to content

0.9 Canonical Pipeline — PRODUCT

Status: RATIFIED-S238 reconciliation — most invariants ratified S234-S237; remaining items carry explicit STILL-OPEN — gates on X notes. Original scaffold (S42 W4-warp-adoption, 10/05/2026) numbered invariants from the Phase 0.9 architecture proposal; the S238 pass flips every [PROVISIONAL] to one of [RATIFIED-S2XX] (with source citation) or [STILL-OPEN — gates on X].

This file holds user-perspective invariants — what the canonical pipeline does, expressed so each line is independently testable. The companion TECH.md carries the implementation references (current code file:line refs

  • spike artifacts + decision graph cross-refs).

Authoring conventions adopted from warp write-product-spec skill (/Users/liamj/Documents/development/warp/.agents/skills/write-product-spec/):

  • Invariants are numbered globally (P-1, P-2, …) so TECH.md can reference them by ID.
  • Each invariant is a single statement of the form When [trigger], the system [outcome] (because [constraint]).
  • Cross-ref every invariant to a Q-id from 0.9-decision-graph.md (e.g. [Q2.4]) and an architecture §-id from 0.9-intended-architecture.md (e.g. [arch §4.2]). Note as of S238: 0.9-intended-architecture.md is OUTDATED per Liam — central frame of §1.2/§4/§5/§10/§13 at variance with S233-S237 ratifications. Architecture §-refs preserved for audit trail; ratification citations supersede. Wave plan to split into architecture/01-*.md09-*.md lives in docs/specs/core-docs-pathway-assessment/INV-architecture-split-readiness.md.
  • Invariants carry either [RATIFIED-S2XX] with explicit source citation or [STILL-OPEN — gates on X] with explicit gating item.
  • Phase 0.9 synthesis V2 (rolling ratification register): docs/plans/phase-0-investigation/10-feedback-investigation-findings/00-synthesis-v2.md
  • Decision graph (187 decisions + §11 S234-S237 ratifications): docs/plans/phase-0-investigation/0.9-decision-graph.md
  • WP-ONTO-R1 feedback investigation (Q-OQR1-01..17 ratifications 14/05/2026): docs/plans/phase-0-investigation/phase-b-prerequisite-1-onthology-pipeline-feedback-investigation.md
  • Edit-flow investigation §6 (per-UC Candidate A/B/C ratifications): docs/plans/phase-0-investigation/0.9-edit-flow-investigation.md
  • Architecture split readiness (10-item supersession backbone): docs/specs/core-docs-pathway-assessment/INV-architecture-split-readiness.md
  • Intended architecture (~2015 lines, S229 framing — OUTDATED per S237; preserved as audit-trail snapshot): docs/plans/phase-0-investigation/0.9-intended-architecture.md
  • Spike plan (8 spikes): docs/plans/phase-0-investigation/0.9-spike-plan.md
  • Phase 0.9 synthesis impact (test/code blast radius): docs/audits/kh-production-readiness-phase-1/0-9-synthesis-impact.md

Maps onto 0.9-intended-architecture.md §4. Decisions Q1.1–Q1.N.

P-1 [RATIFIED-S234] [Q1.1] [arch §4.1] When a user edits content in their external folder (LocalFS / SharePoint / Notion), KH detects the change and re-ingests within the configured polling cadence. The external folder is canonical; KH stores a materialised index, not the original source. Cocoindex source-binding is the substrate per 0.9-decision-graph.md §11.2 COCO.1 + 00-synthesis-v2.md §3.1 (Cloud Run sidecar for Docling 1.8 GB footprint — KH already runs Cloud Run for the Python pipeline).

P-2 [RATIFIED-S234] [Q1.2] [arch §4.2] When KH ingests a markdown file, the chunked, embedded, classified result is queryable via MCP within the same ingest run — no separate publish step required. Cocoindex ExtractByLlm is the recurring runtime adapter (Pattern A/B retires post-Phew-migration per 00-synthesis-v2.md §2.1 B1 + Prereq 2 Rec 1).

(Additional Q1.3–Q1.N invariants land during WP4 sub-doc work — see INV-architecture-split-readiness.md §6 wave plan for S238+.)

Maps onto 0.9-intended-architecture.md §5. Decisions Q2.1–Q2.N. As of S238, all v1-storage ratifications consolidated below.

P-10 [RATIFIED-S234] [Q2.1] [arch §5.1] When KH presents content to a user (via UI or MCP), the response includes a stable pointer back to the external-folder source path so the user can navigate to the canonical location. source_documents adopts Option α (slim-and-keep) with nullable source_documents.workspace_id for admin-shared binaries (cite 00-synthesis-v2.md §2.1 B2 row + §3.15 + 0.9-decision-graph.md §11.1 ONT.7 + Q-OQR1-09).

P-11 [RATIFIED-S235] [Q2.9] [arch §5.4] When a user edits content in KH, the write-back behaviour is determined per use-case by the seven ratified Candidate A/B/C choices from 0.9-edit-flow-investigation.md §6 (Liam S229 + S235 confirmation):

  • UC1 (typo fix) — Candidate A: in-platform editor + filesystem write to source_documents.original_path (markdown) or sidecar .md (binary).
  • UC2 (date / version bump) — collapses to UC1 (Candidate A) per S228 §3.2 de-scope.
  • UC3 (sweeping rename) — two-variant split: Candidate A (find-replace, no LLM) + Candidate B (smart-agent via Anthropic API with text-editor-tool).
  • UC4 (paragraph rewrite, cited content) — Candidate A: in-platform Tiptap + Yjs; edit-intent gate at save time; citations re-anchor per hybrid policy (§6.0.2 of edit-flow-investigation).
  • UC5 (bid response → Q&A promotion) — KH-DB-only operation (no candidate; no folder write-back).
  • UC6 (Q&A pair revision) — split: user-direct (KH-DB-only) + AI-suggest (Candidate B for proposal step, refinement via the user-direct flow).
  • UC7 + UC10 (external folder change detected) — cocoindex source binding native (no candidate; system-driven).
  • UC8 (AI-suggested dedup merge) — v1 Candidate A + LLM-reasoning; v1.1 upgrade to Candidate C (Managed Agent).
  • UC9 (scope-tag taxonomy update) — KH-native typed-column work-package (no candidate; no folder write-back).

Markdown sidecar v1 (Q&A sidecar pattern, UC5 4.6.Q7 + UC6 4.3.Q7) is UNBLOCKED-CONDITIONAL per S9 spike (cite 00-synthesis-v2.md §2.2 I3 row

  • 0.9-spike-S9-cocoindex-idempotency.md) — substrate works subject to layered fn-shape (inner-tier extraction fns must consume content_text: str, not FileLike). Memo scoping is per-component-path, NOT global content-hash dedup.

Maps onto 0.9-intended-architecture.md §6. Decisions Q3.1–Q3.N. Q&A pairs become first-class entities, no longer content_items.content_type='q_a_pair'.

P-20 [RATIFIED-S235] [Q3.1] [arch §6.1] When KH extracts a Q&A pair (via miner pattern from corpus content), the pair is written to a dedicated q_a_pairs table with provenance pointer (source content_item_id + offset), validity window (effective_from / effective_to), and scope tags that drive workspace relevance. The table is corpus-level: NO direct workspace FK; nullable source_workspace_id for provenance audit only. Workspace relevance is computed via scope_tag overlap query, not FK join. This supersedes both 0.9-intended-architecture.md §4.3 N:1 framing (workspace_id UUID NOT NULL) AND the prior phase-b-prerequisite-1-onthology-pipeline.md §4.4 M:N junction recommendation. (Cite 00-synthesis-v2.md §3.6 + 0.9-decision-graph.md §11.1 ONT.5 + 0.9-collapse-candidates.md §12.2 row 1 + Q-OQR1-06 14/05/2026.)

P-21 [RATIFIED-S234] [Q3.2] [arch §6.3] When a user composes a bid answer (procurement form response) or sales-proposal response, KH offers candidate Q&A pairs filtered by scope tag overlap + validity window — pairs whose validity has expired or whose scope tags do not overlap the caller’s context are excluded by default. bid_question_matches carries separate embedding_score + fulltext_score columns (RATIFIED-S236 per 00-synthesis-v2.md §5.1; operational verification deferred to feature spec time).

P-22 [RATIFIED-S234] [Q3.x] [N8 cite] When a Q&A pair is cited by a workspace artefact, the citation row uses the polymorphic citing_entity enum (bid_response, sales_proposal_response, competitor_research_finding, training_unit, mcp_search_response) — NOT a NOT-NULL bid_response_id column. (Cite 00-synthesis-v2.md §2.3 N8 row.)

Maps onto 0.9-intended-architecture.md §7. Decisions Q4.1–Q4.N. Adopts mempalace Shape A (temporal KG) + Shape B (provenance-tagged) pre-launch.

P-30 [RATIFIED-S234] [Q4.1] [arch §7.2] When KH records an entity mention, the KG row carries a temporal validity window (when the fact was asserted, when it was last verified, when it became stale) + a provenance chain (source content_item_id, extraction agent, extraction timestamp). Mempalace Shape A (temporal) + Shape B (provenance-tagged) substrate.

P-31 [RATIFIED-S234] [Q4.4] [arch §7.5] When a user queries the KG via MCP, results are scoped to the user’s workspace by default; cross- workspace queries require an explicit --scope=global argument and an admin role. (RLS via get_user_role() per CLAUDE.md; supplemented by the Supabase auto-RLS event trigger per 00-synthesis-v2.md §3.16 — RESOLVED-S236.)

Maps onto 0.9-intended-architecture.md §8. Decisions Q5.1–Q5.N. Schema renames + column carve-outs land as a single pre-launch combined PR per Q-OQR1-16 (cite 00-synthesis-v2.md §2.3 N3 row + 0.9-decision-graph.md §11.3).

P-40 [RATIFIED-S235] [Q5.1] [arch §8.1] When code references the client workspace concept, it uses workspace_id (not project_id). This rename lands as part of the combined pre-launch PR with the other nine items in 0.9-decision-graph.md §11.3:

  1. application_types instance table (Option (c) hybrid) + 6 baseline core-provenance seed rows (procurement, intelligence, sales_proposal, product_guide, competitor_research, training_onboarding) per Q-OQR1-01
    • Q-OQR1-03.
  2. workspaces migration: drop type text column + CHECK; add application_type_id FK; backfill from existing type values.
  3. kb_section retirement: drop value from old CHECK pre-FK swap (zero prod rows) per Q-OQR1-S235.
  4. Procurement rename: bid_workspacesprocurement_workspaces; lib/bid/bid-state-machine.tslib/procurement/procurement-workflow.ts; BID_STATESPROCUREMENT_WORKFLOW_STATES per Q-OQR1-02.
  5. project_idworkspace_id rename: 2 DB columns (bid_questions, templates) + 44 code-file sweep via ts-morph + ast-grep.
  6. Form templates rename: templatesform_templates; template_fieldsform_template_fields; template_requirementsform_template_requirements per Q-OQR1-11.
  7. digestschange_reports rename (Q5.x); cron + UI text updates.
  8. Provenance enum applied to new hybrid vocab tables (form_types, application_types) + retrofit to entity_aliases.categoryprovenance per Q-OQR1-11.
  9. source_documents.workspace_id nullable migration per Q-OQR1-09.
  10. q_a_pairs schema sketch update (no workspace FK; nullable source_workspace_id) — applies when S16 q_a_pairs migration runs (separate sequenced migration; combined-PR direction sets the shape).

Note (S238): prior framing of P-40 (“estimated ~5d HIGH cost”) is retired — budget / day-count terminology banned platform-wide since S231.

P-41 [RATIFIED-S235] [Q5.2] [arch §8.2] When code references the content-change-report concept, it uses change_reports (not digests). UI labels already use “Change Reports”; this rename converges code to UI. Lands in the same combined PR as P-40 (item 7) per Q-OQR1-16.

P-42 [RATIFIED-S235] [Q-OQR1-02] When code references procurement workflow (bid + RFP + PQQ + ITT + framework + DPS + G-Cloud), it uses procurement as the umbrella application_type and form_type as the discriminator within it. BID_STATES is renamed PROCUREMENT_WORKFLOW_STATES; lib/bid/ becomes lib/procurement/. (Cite 00-synthesis-v2.md §3.5 + 0.9-decision-graph.md §11.1 ONT.4.)

P-43 [RATIFIED-S235] [Q-OQR1-01] [Q-OQR1-03] When the platform references an application category (procurement / intelligence / sales_proposal / product_guide / competitor_research / training_onboarding), it references a row in the application_types instance table — NOT a code constant. The table carries a provenance enum (core vs client); v1 seeds 6 core-provenance baseline rows. Client-extensible types deferred to v1.1 admin UI per Q-OQR1-13. (Cite 00-synthesis-v2.md §3.4 + 0.9-decision-graph.md §11.1 ONT.2 + ONT.3.)

Maps onto 0.9-intended-architecture.md §9. From the DW decision branch. KH UI becomes admin / governance / visualisation tier; primary user-content interaction flows through Claude via MCP.

P-50 [RATIFIED-S234] [DW.1] [arch §9.1] When a user wants to edit a document, they open it in their preferred Claude surface (Word / Excel / PowerPoint / Desktop / claude.ai / headless agent). KH’s web UI is a secondary admin surface — it does NOT render a document editor for primary content edits. (UC1 Candidate A still uses KH’s Tiptap editor for atomic edits inside KH per 0.9-edit-flow-investigation.md §6.1 — the “primary edit surface = Claude” framing covers production-content authoring; KH retains an editor for the in-platform edit flow.)

P-51 [RATIFIED-S234] [DW.2] [arch §9.3] When KH’s UI is used, it serves admin functions: governance review, gap analysis, visualisation, onboarding, admin. 13 CARRIES + 4 LOAD-BEARING features are retained per 0.9 audit; 8 COLLAPSES-CLEANLY features move to MCP tool surface.

§7 — Onboarding & client experience (CX)

Section titled “§7 — Onboarding & client experience (CX)”

Maps onto 0.9-intended-architecture.md §10. From the CX decision branch.

P-60 [STILL-OPEN — gates on CX.28 ratification] [CX.28] [arch §10.4] When a new client onboards, the system EITHER requires an external folder connection before any other onboarding step OR allows folder connection to be deferred post-onboarding. Provisional default: folder-required — no client can proceed past onboarding step N without a connected folder. (Not addressed in Q-OQR1-01..17 ratifications; remains operational per 00-synthesis-v2.md §5.2 — Liam ruling required before spike kickoff.)

P-61 [STILL-OPEN — gates on CX.29 ratification] [CX.29] [arch §10.6] When the SMB data-fix tool is invoked, it operates over EITHER the entire client corpus OR a user-scoped subset. Provisional default: user-scoped subset — data-fix v1 ships scoped to a single workspace; cross-workspace data-fix deferred to v2. (Not addressed in Q-OQR1-01..17 ratifications; single-Phew-tenant v1 framing per 00-synthesis-v2.md §3.14 supports user-scoped subset.)

§8 — Migration (current → canonical pipeline)

Section titled “§8 — Migration (current → canonical pipeline)”

Maps onto 0.9-intended-architecture.md §13. Migration sequencing.

P-70 [RATIFIED-S234] [arch §13.1] When the migration runs, existing content_items rows with content_type='q_a_pair' are migrated to the new q_a_pairs table; the original content_items row is retired (not deleted — soft-archive for rollback). Migration script + dry-run + rollback path per Spike #8 (0.9-spike-plan.md §8). 395 prod q_a_pair rows (empirically 0/395 assigned to workspaces today — supports corpus-level shape per P-20).

P-71 [RATIFIED-S234] [arch §13.4] When the migration completes, the existing 6-item Stream 1 backlog is RE-DERIVED against the new schema: items 1, 5, 11 carry as-is; items 3, 6, 7 evolve to fit the canonical model.

§9 — Open questions (gates ratification)

Section titled “§9 — Open questions (gates ratification)”

As of S238, the OPEN-question register reduces to two items + the cross-cutting MCP-action review pass.

Gates per-invariant:

  • CX.28 onboarding folder-required (provisional: required) — see P-60.
  • CX.29 SMB data-fix v1 scope (provisional: user-scoped) — see P-61.

Cross-cutting STILL-OPEN gate (post-S237):

  • Theme F — MCP-action review pass — Liam pre-decision still pending after S237 (cite 00-synthesis-v2.md §5.2 row 1). Mempalace direct vs wrapped in KH MCP — operational. Required to unblock WP4 06-mcp-tooling.md.

All other prior-PROVISIONAL invariants ratified S234-S237 per the ratification-source citations in §1-§8 above.

Each P-N invariant becomes a contract: TECH.md will carry the verification mechanism (unit test / integration test / MCP eval / manual walkthrough) plus the assertion shape. Validation skeleton (per warp convention):

  • Unit: invariants P-1, P-2, P-10, P-20, P-22, P-30, P-40, P-41, P-42, P-43
  • Integration: P-11, P-21, P-31, P-50, P-51, P-70, P-71
  • MCP eval: P-21, P-31 (Claude as primary surface)
  • Manual walkthrough: P-60, P-61 (onboarding flows — pending CX.28/CX.29 ratification)

Per S235 DEFERRED-v1.1 register + 0.9-decision-graph.md §11.4.4:

  • mempalace Shape D PG backend (v4-alpha unstable per 0.9 §1.3) — reassess on upstream stabilisation.
  • Skill-seekers multi-source dedupe (v1+1 per 0.9 dedupe synthesis).
  • Cross-workspace KG queries without explicit admin role + scope flag (v2).
  • Workspace-private q_a_pairs (Q-OQR1-08) — DEFERRED-v1.1; single Phew tenant means private/shared distinction not load-bearing for v1. No private_to_workspace_id column in v1. (Cite 00-synthesis-v2.md §3.14.)
  • Admin UI for client-managed vocabularies (application_types, form_types, scope_tags) (Q-OQR1-13) — DEFERRED-v1.1; v1 ships SQL-seeded baseline only. Settings page admin UI extends in v1.1. (Cite 00-synthesis-v2.md §3.13.)
  • Markdown sidecar materialisation for approved Q&A pairs (UC5 4.6.Q7
    • UC6 4.3.Q7) — DEFERRED-v1.1; v1 keeps approved Q&A pairs KH-DB-only. v1.1 evaluates sidecar materialisation once external-folder write-back patterns are mature (UC1 + UC4 + UC6 ship first). (Cite 0.9-edit-flow-investigation.md §6.5 + §6.6.)
  • Yjs y-supabase persistence (UC1 4.1.Q4) — DEFERRED-v1.1; v1 ships Yjs collab without DB persistence; awareness state lives in-memory + browser; recovery handled by Tiptap’s local-storage fallback. v1.1 evaluates y-supabase once collab usage patterns clear. (Cite 0.9-edit-flow-investigation.md §6.1.1 4.1.Q4.)
  • Auto-merge threshold for UC8 dedup (4.7.Q7) — None in v1; all merges require user review. Auto-merge revisited post-v1.1 once curator UX validated.
  • Candidate C (Managed Agent) for UC8 dedup — DEFERRED-v1.1; v1 ships Candidate A + LLM-reasoning; v1.1 upgrade evaluated post-v1 usage. (Cite 0.9-edit-flow-investigation.md §6.8.)
  • p0-layer-nesting-spec.md (CV 03 UI nesting — INV-1 hybrid 3-axis architecture: layer + tabs + q_a_pairs+scope_tag) — DEFERRED-S238+; v1 keeps existing 4 live keys (sales_brief / bid_detail / company_reference / research) per S237 commit 099eb5f6. (Cite 00-synthesis-v2.md §5.3 + §5.4.)
  • Form_type-specific behaviour data-driven model (Q-OQR1-14) — DEFERRED-v2; v1 is code-driven.
  • Multi-wing content semantics (Q-OQR1-10) — DEFERRED to operational impl.
  • 2026-05-10 (kh-prod-readiness-S42 W4-warp-adoption): scaffold authored. All P-N invariants [PROVISIONAL]; awaiting Liam ratification of §16 OPEN questions in 0.9-intended-architecture.md.
  • 2026-05-14 (S238 in-place reconciliation): every [PROVISIONAL] flipped to [RATIFIED-S2XX] with source citation or [STILL-OPEN — gates on X] with explicit gating item. P-11 reframed from “hybrid write-back” to the seven-UC Candidate A/B/C set per 0.9-edit-flow-investigation.md §6. P-20 reframed from N:1 FK to corpus-level + scope_tag-driven per Q-OQR1-06. P-22 added (citations polymorphic enum, N8). P-40 reframed from “~5d HIGH cost” budget framing to combined-PR scope per Q-OQR1-16 (10 items). P-42 + P-43 added (procurement rename + application_types instance table). §11 Out-of-scope refreshed with DEFERRED-v1.1 items. §13 v1 scope section added. §14 v1.1 scope section added. Source-of-truth pointers updated to cite 00-synthesis-v2.md and INV-architecture-split-readiness.md. Note on 0.9-intended-architecture.md outdated-ness added per S237 Liam ruling.

Explicit in-scope items per Q-OQR1-01..17 ratifications + 00-synthesis-v2.md §2 (B/I/N closures) + §3.4..§3.18 entries NOT marked DEFERRED-v1.1. Source citations point to the canonical ratification entry.

  • application_types instance table (Option (c) hybrid) + 6 core-provenance baseline rows: procurement, intelligence, sales_proposal, product_guide, competitor_research, training_onboarding. (Q-OQR1-01 + Q-OQR1-03; 00-synthesis-v2.md §3.4.)
  • workspaces.application_type_id FK replaces text type column; kb_section retired entirely (zero prod rows). (Q-OQR1-S235; 00-synthesis-v2.md §3.8.)
  • Procurement rename across all surfaces: bid_workspacesprocurement_workspaces; lib/bid/lib/procurement/; BID_STATESPROCUREMENT_WORKFLOW_STATES. (Q-OQR1-02; 00-synthesis-v2.md §3.5.)
  • Three-table form templates rename: templatesform_templates; template_fieldsform_template_fields; template_requirementsform_template_requirements. Provenance enum applied (96 prod SSQ + Charnwood rows seeded core-provenance). (Q-OQR1-11; 00-synthesis-v2.md §2.2 I2 row + §3.7.)
  • q_a_pairs corpus-level shape: no direct workspace FK; nullable source_workspace_id for provenance audit. Workspace relevance via scope_tag overlap. (Q-OQR1-06 + Q-OQR1-07; 00-synthesis-v2.md §3.6.)
  • source_documents Option α slim-and-keep + nullable source_documents.workspace_id (admin-shared binaries). (B2 + Q-OQR1-09; 00-synthesis-v2.md §2.1 B2 row + §3.15.)
  • citations polymorphic citing_entity enum (bid_response, sales_proposal_response, competitor_research_finding, training_unit, mcp_search_response). (N8; 00-synthesis-v2.md §2.3 N8 row.)
  • Provenance enum across all hybrid Layer-1 CVs: application_types, form_types, form_template_requirements, guides, coverage_targets; entity_aliases.category renamed provenance. (Q-OQR1-11; 00-synthesis-v2.md §3.7.)
  • Typed columns over JSONB platform-wide (Liam S235 — “where there is an opportunity to use typed columns in our schema, we should always do so”). Cascades into source_documents.extraction_metadata JSONB → typed columns / Zod-validated shape; SKOS columns (BT/NT/SYN) on future thesaurus_entries. (00-synthesis-v2.md §3.9.)
  • Cocoindex ExtractByLlm + entity_resolution + files_transform + memoisation as recurring runtime adapter. Pattern A/B retires post-Phew-migration. (00-synthesis-v2.md §2.1 B1 row + 0.9-decision-graph.md §11.2 COCO.1.)
  • Docling adoption for PDF (decisive win) / DOCX (narrow win) / XLSX (clean post-S235 verification). Cloud Run sidecar architecture (Docling 1.8 GB > Vercel 250 MB). (0.9-decision-graph.md §11.2 COCO.2–COCO.4 + COCO.6.)
  • pullmd retention for HTML (Playwright sidecar + Cloudflare short-circuit
    • share-id identity contract not replaceable by Docling). (COCO.5; 00-synthesis-v2.md §3.3.)
  • pipeline_failures table DO-NOT-BUILD; cocoindex retry/back-off/DLQ subsumes; recordPipelineRun() handles rollup. (COCO.7; 00-synthesis-v2.md §3.10.)
  • Q4.12 cost-tracking pattern RETIRE; cocoindex memoisation + per-stage metrics supersede. (COCO.8; 00-synthesis-v2.md §3.11.)
  • Markdown sidecar v1 promotion gate UNBLOCKED-CONDITIONAL per S9 spike (95% confidence; layered fn-shape required — content_text: str consumption, not FileLike). (COCO.9 + COCO.10; 00-synthesis-v2.md §2.2 I3.)
  • All seven UC ratifications per 0.9-edit-flow-investigation.md §6 (Candidate A / B / C assignments) — see P-11 for full enumeration.
  • Edit-intent capture (UC4) at save time via closed per-UC vocabulary + free-text “other-with-note” escape (§6.0.1).
  • Anthropic citations re-anchor: hybrid — re-anchor if verbatim match, else mark-as-paraphrased with archived-snapshot pointer (§6.0.2).
  • Citation immutability: version-on-cite at ship time; shipped Q&A versions preserved with valid_from/valid_to temporal bounds (§6.0.3).
  • Permission gating per UC: editor + admin for UC1/UC4/UC5/UC6; admin-only for UC3/UC8/UC9; system-driven for UC7/UC10 (§6.0.4).
  • Downstream-impact UI: count + paginated affected-record list (§6.0.5).
  • Rollback-by-operation-ID: full per-op rollback with prior-version restore; admin-only invocation (§6.0.6).
  • AI-suggest fatigue mitigation: per-workspace tunable confidence threshold + rejection memory + daily-per-user suggestion cap (§6.0.7).
  • bid_question_matches separate embedding_score + fulltext_score columns (op-verify deferred to feature spec). (N9 RESOLVED-S236; 00-synthesis-v2.md §5.1.)
  • Mempalace Shape A (temporal KG) + Shape B (provenance-tagged) adopted pre-launch.
  • Workspace-scoped KG queries default; cross-workspace via --scope=global
    • admin role.
  • audit_log RLS pattern: Supabase rls_auto_enable() event trigger platform-wide (closes OQ-Q24-B + OQ-Q113-B together). (RESOLVED-S236; 00-synthesis-v2.md §3.16.)
  • op_id propagation: trigger-driven for platform-wide audit cohesion + cocoindex per-flow op_id for pipeline-side correlation (principled hybrid). (N7 RESOLVED-S236; 00-synthesis-v2.md §5.1.)

Single PR scope per 0.9-decision-graph.md §11.3 — see P-40 for the 10-item enumeration. Pre-launch is the cheapest time to land naming cleanup + ontology rework together.

§13.6 CV refinements (S237 ratifications)

Section titled “§13.6 CV refinements (S237 ratifications)”
  • CV 02 taxonomy-subtopics: reconcile prose to 33 baseline values (matches frontmatter). Seed-file derivability deferred to Q-OQR1-16 combined PR. (00-synthesis-v2.md §5.4 row 2.)
  • CV 03 layer-vocabulary: provenance column ALTER lands in Q-OQR1-16 combined PR. v1 keeps existing 4 live keys (sales_brief / bid_detail / company_reference / research); INV-1 hybrid 3-axis architecture DEFERRED-S238+. (00-synthesis-v2.md §5.4 rows 3-4.)
  • CV 04 content-type — policy vs compliance boundary: author-vs-evidence rule (ISO management-system framing). Implementable via docs/reference/classification-prompt.md v4.8+ update; no schema change. (00-synthesis-v2.md §5.4 row 5.)
  • CV 04 content-type — retire capability (0 prod rows). Enum drops 15 → 14 values on Q-OQR1-16 migration. Lockstep-with-migration retire pattern: baseline_values retains capability until DB CHECK drops it. (00-synthesis-v2.md §5.4 row 6.)
  • CV 06 lifecycle-type — regulation vs date_bound boundary: regulation-as-specialisation rule. Both lifecycles get freshness decay; regulation additionally tracks regulator-published effective/sunset dates. DCAT-AP-aligned. Implementable in lib/freshness.ts + classification-prompt update; no schema change. (00-synthesis-v2.md §5.4 row 7.)
  • CV 13 ingest-source — bid_library parameter literal renamed → bid_library_extraction (lib/layer-inference.ts:21 + scripts/kb_pipeline/layer_inference.py). Inference-function-internal, NOT a DB value. Cleanup PR lands separately. (00-synthesis-v2.md §5.4 row 8.)
  • CV 16 extraction-method — firecrawl prune-on-migration: pruned from baseline_values when CHECK migration drops it from DB enum (not before). Python extractor divergence (trafilatura + pdfplumber) retires on Docling adoption. (00-synthesis-v2.md §5.4 rows 10-11.)
  • CV 19 engineering-types — KEEP (13 values label internal type domains). (00-synthesis-v2.md §5.4 row 12.)
  • Astro + Starlight ratified as docs-site framework (NOT GitBook). Same-repo docs-site/ sub-directory most likely; standalone repo retained as contingency only. Build deferred to production-readiness track. (00-synthesis-v2.md §5.4 row 1; S237 commit 099eb5f6.)

§13.8 Supabase platform compliance (S236)

Section titled “§13.8 Supabase platform compliance (S236)”
  • Supabase public-schema grants compliance (May 30 platform deadline): every new CREATE TABLE public.* migration must include explicit GRANT per role (anon / authenticated / service_role) before Data API access. Combined migration with auto-RLS event trigger. (00-synthesis-v2.md §3.17.)
  • Supabase OAuth token endpoint (May 26 platform deadline): verify app/api/oauth/* + MCP plugin OAuth client tolerate HTTP 200 (not 201) per OAuth 2.1 §3.2.3. Add Vitest assertion. (00-synthesis-v2.md §3.18.)

§14 — v1.1 scope (DEFERRED-v1.1 register)

Section titled “§14 — v1.1 scope (DEFERRED-v1.1 register)”

Items explicitly deferred to v1.1 per Liam ratification 14/05/2026 + S237 close-out. Single-Phew-tenant v1 is the operative framing; v1.1 unlocks generic SMB onboarding + multi-tenant configurability.

  • Admin UI for client-managed vocabularies — sections for application_types, form_types, scope_tags extend the existing settings page (taxonomy / tags / guides / layers / entities / governance / content-owner-management precedent). Schema is v1; surface is v1.1. (Q-OQR1-13; 00-synthesis-v2.md §3.13.) v1.0 status (S251 WP3 ID-21 ratification): UI metadata for application_types is delivered via Option C hybrid per docs/specs/id-29-tanstack-workspace-types/TECH.md — admin-editable copy (label, label_plural, description, default_icon, default_colour) lives in DB columns on application_types; dev-editable routing/features (route, available, hasCustomCreation, features.*) lives in a static client map in hooks/use-application-types.ts. v1.1 target: collapse the static client map into DB columns once the admin UI is ready to mutate them safely, restoring a single source of truth for all application_types metadata. The Q-OQR1-13 admin UI delivery and this collapse should land together (single PR or close-coupled PRs).
  • Client-defined application_types — schema-level provenance='client' rows; admin UI in v1.1 to add/manage client-extended types.
  • Client-defined form_types — same pattern. v1 ships core-provenance form_types per Q-OQR1-03 derivation.
  • Workspace-private q_a_pairsprivate_to_workspace_id column deferred to v1.1; single Phew tenant means private/shared distinction not load-bearing for v1. (Q-OQR1-08; 00-synthesis-v2.md §3.14.)
  • Markdown sidecar materialisation for approved Q&A pairs (UC5 4.6.Q7 + UC6 4.3.Q7). v1 keeps Q&A pairs KH-DB-only; v1.1 evaluates sidecar materialisation once UC1 + UC4 + UC6 external-folder write-back patterns mature.
  • Auto-publish if actor is curator-or-admin opt-in policy (UC5 4.6.Q2) — workspace-level setting; v1 default is mandatory in_review queue transition for approved Q&A pair promotion.
  • Yjs y-supabase persistence (UC1 4.1.Q4) — v1 ships Yjs collab without DB persistence; awareness state in-memory + browser; recovery via Tiptap local-storage. v1.1 evaluates y-supabase adapter once collab usage patterns clear.
  • Candidate C (Managed Agent) for UC8 dedup — v1.1 evaluates upgrade from v1 Candidate A + LLM-reasoning. Migration path: documentation-agent replaces KH server orchestration; Claude API LLM-reasoning step folds into the agent’s tooling. (0.9-edit-flow-investigation.md §6.8.)
  • Auto-merge threshold for UC8 (4.7.Q7) — None in v1. v1.1 evaluates once curator UX validated.
  • p0-layer-nesting-spec.md (CV 03 UI nesting — INV-1 hybrid 3-axis architecture: layer + tabs + q_a_pairs+scope_tag) — DEFERRED-S238+. v1 retains 4 live keys (sales_brief / bid_detail / company_reference / research). Spec author + scope deferred. (00-synthesis-v2.md §5.3
    • §5.4 row 4.)

§14.6 v2 candidates (mentioned for completeness; not v1.1)

Section titled “§14.6 v2 candidates (mentioned for completeness; not v1.1)”
  • Form_type-specific behaviour data-driven model (Q-OQR1-14) — v2; v1 + v1.1 are code-driven.
  • Cross-workspace KG queries without admin + scope flag — v2.
  • Cross-workspace sweep / merge / taxonomy operations (UC3 / UC8 / UC9) — never v1; v2 may unlock.
  • Multi-wing content semantics (Q-OQR1-10) — operational impl, no scheduled version.