0.9 Canonical Pipeline — PRODUCT
0.9 Canonical Pipeline — PRODUCT
Section titled “0.9 Canonical Pipeline — PRODUCT”Status: RATIFIED-S238 reconciliation — most invariants ratified S234-S237; remaining items carry explicit
STILL-OPEN — gates on Xnotes. 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].
How to use this doc
Section titled “How to use this doc”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 from0.9-intended-architecture.md(e.g.[arch §4.2]). Note as of S238:0.9-intended-architecture.mdis 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 intoarchitecture/01-*.md…09-*.mdlives indocs/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.
Source-of-truth pointers
Section titled “Source-of-truth pointers”- 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
§1 — Content model (Q1)
Section titled “§1 — Content model (Q1)”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+.)
§2 — Storage model (Q2)
Section titled “§2 — Storage model (Q2)”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 consumecontent_text: str, notFileLike). Memo scoping is per-component-path, NOT global content-hash dedup.
§3 — Q&A model (Q3)
Section titled “§3 — Q&A model (Q3)”Maps onto
0.9-intended-architecture.md§6. Decisions Q3.1–Q3.N. Q&A pairs become first-class entities, no longercontent_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.)
§4 — KG / memory model (Q4)
Section titled “§4 — KG / memory model (Q4)”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.)
§5 — IMS naming cleanup (Q5)
Section titled “§5 — IMS naming cleanup (Q5)”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 (cite00-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:
application_typesinstance table (Option (c) hybrid) + 6 baselinecore-provenance seed rows (procurement, intelligence, sales_proposal, product_guide, competitor_research, training_onboarding) per Q-OQR1-01- Q-OQR1-03.
workspacesmigration: droptypetext column + CHECK; addapplication_type_idFK; backfill from existing type values.kb_sectionretirement: drop value from old CHECK pre-FK swap (zero prod rows) per Q-OQR1-S235.- Procurement rename:
bid_workspaces→procurement_workspaces;lib/bid/bid-state-machine.ts→lib/procurement/procurement-workflow.ts;BID_STATES→PROCUREMENT_WORKFLOW_STATESper Q-OQR1-02. project_id→workspace_idrename: 2 DB columns (bid_questions,templates) + 44 code-file sweep via ts-morph + ast-grep.- Form templates rename:
templates→form_templates;template_fields→form_template_fields;template_requirements→form_template_requirementsper Q-OQR1-11. digests→change_reportsrename (Q5.x); cron + UI text updates.- Provenance enum applied to new hybrid vocab tables (form_types,
application_types) + retrofit to
entity_aliases.category→provenanceper Q-OQR1-11. source_documents.workspace_idnullable migration per Q-OQR1-09.q_a_pairsschema sketch update (no workspace FK; nullablesource_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.)
§6 — Document lifecycle UI (DW)
Section titled “§6 — Document lifecycle UI (DW)”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 WP406-mcp-tooling.md.
All other prior-PROVISIONAL invariants ratified S234-S237 per the ratification-source citations in §1-§8 above.
§10 — Validation & acceptance
Section titled “§10 — Validation & acceptance”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)
§11 — Out of scope (v1)
Section titled “§11 — Out of scope (v1)”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. Noprivate_to_workspace_idcolumn in v1. (Cite00-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. (Cite00-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.)
- 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
- Yjs
y-supabasepersistence (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 evaluatesy-supabaseonce collab usage patterns clear. (Cite0.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 commit099eb5f6. (Cite00-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.
§12 — Changelog
Section titled “§12 — Changelog”- 2026-05-10 (kh-prod-readiness-S42 W4-warp-adoption): scaffold authored.
All P-N invariants
[PROVISIONAL]; awaiting Liam ratification of §16 OPEN questions in0.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 per0.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 cite00-synthesis-v2.mdandINV-architecture-split-readiness.md. Note on0.9-intended-architecture.mdoutdated-ness added per S237 Liam ruling.
§13 — v1 scope
Section titled “§13 — v1 scope”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.
§13.1 Ontology + storage
Section titled “§13.1 Ontology + storage”application_typesinstance table (Option (c) hybrid) + 6core-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_idFK replaces texttypecolumn;kb_sectionretired entirely (zero prod rows). (Q-OQR1-S235;00-synthesis-v2.md§3.8.)- Procurement rename across all surfaces:
bid_workspaces→procurement_workspaces;lib/bid/→lib/procurement/;BID_STATES→PROCUREMENT_WORKFLOW_STATES. (Q-OQR1-02;00-synthesis-v2.md§3.5.) - Three-table form templates rename:
templates→form_templates;template_fields→form_template_fields;template_requirements→form_template_requirements. Provenance enum applied (96 prod SSQ + Charnwood rows seededcore-provenance). (Q-OQR1-11;00-synthesis-v2.md§2.2 I2 row + §3.7.) q_a_pairscorpus-level shape: no direct workspace FK; nullablesource_workspace_idfor provenance audit. Workspace relevance viascope_tagoverlap. (Q-OQR1-06 + Q-OQR1-07;00-synthesis-v2.md§3.6.)source_documentsOption α slim-and-keep + nullablesource_documents.workspace_id(admin-shared binaries). (B2 + Q-OQR1-09;00-synthesis-v2.md§2.1 B2 row + §3.15.)citationspolymorphicciting_entityenum (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.categoryrenamedprovenance. (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_metadataJSONB → typed columns / Zod-validated shape; SKOS columns (BT/NT/SYN) on futurethesaurus_entries. (00-synthesis-v2.md§3.9.)
§13.2 Pipeline + extraction
Section titled “§13.2 Pipeline + extraction”- 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.)
- share-id identity contract not replaceable by Docling). (COCO.5;
pipeline_failurestable 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: strconsumption, notFileLike). (COCO.9 + COCO.10;00-synthesis-v2.md§2.2 I3.)
§13.3 Q&A + edit flow
Section titled “§13.3 Q&A + edit flow”- 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_totemporal 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_matchesseparateembedding_score+fulltext_scorecolumns (op-verify deferred to feature spec). (N9 RESOLVED-S236;00-synthesis-v2.md§5.1.)
§13.4 KG / memory
Section titled “§13.4 KG / memory”- 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_idfor pipeline-side correlation (principled hybrid). (N7 RESOLVED-S236;00-synthesis-v2.md§5.1.)
§13.5 Combined pre-launch PR (Q-OQR1-16)
Section titled “§13.5 Combined pre-launch PR (Q-OQR1-16)”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:
provenancecolumn 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 —
policyvscomplianceboundary: author-vs-evidence rule (ISO management-system framing). Implementable viadocs/reference/classification-prompt.mdv4.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_valuesretainscapabilityuntil DB CHECK drops it. (00-synthesis-v2.md§5.4 row 6.) - CV 06 lifecycle-type —
regulationvsdate_boundboundary: regulation-as-specialisation rule. Both lifecycles get freshness decay;regulationadditionally tracks regulator-published effective/sunset dates. DCAT-AP-aligned. Implementable inlib/freshness.ts+ classification-prompt update; no schema change. (00-synthesis-v2.md§5.4 row 7.) - CV 13 ingest-source —
bid_libraryparameter 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 —
firecrawlprune-on-migration: pruned frombaseline_valueswhen 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.)
§13.7 Docs-site framework (S237)
Section titled “§13.7 Docs-site framework (S237)”- 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 commit099eb5f6.)
§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 explicitGRANTper 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.
§14.1 Client-extensibility surfaces
Section titled “§14.1 Client-extensibility surfaces”- Admin UI for client-managed vocabularies — sections for
application_types,form_types,scope_tagsextend 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 forapplication_typesis delivered via Option C hybrid perdocs/specs/id-29-tanstack-workspace-types/TECH.md— admin-editable copy (label,label_plural,description,default_icon,default_colour) lives in DB columns onapplication_types; dev-editable routing/features (route,available,hasCustomCreation,features.*) lives in a static client map inhooks/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 allapplication_typesmetadata. 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_pairs—private_to_workspace_idcolumn 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.)
§14.2 Q&A pair extensions
Section titled “§14.2 Q&A pair extensions”- 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_reviewqueue transition for approved Q&A pair promotion.
§14.3 Editor + collab persistence
Section titled “§14.3 Editor + collab persistence”- Yjs
y-supabasepersistence (UC1 4.1.Q4) — v1 ships Yjs collab without DB persistence; awareness state in-memory + browser; recovery via Tiptap local-storage. v1.1 evaluatesy-supabaseadapter once collab usage patterns clear.
§14.4 Dedup-merge upgrades
Section titled “§14.4 Dedup-merge upgrades”- 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.
§14.5 CV 03 nesting
Section titled “§14.5 CV 03 nesting”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.