WP6-B1 Verifier Report — MD vs Live DB Drift
WP6-B1 Verifier Report — MD vs Live DB Drift
Section titled “WP6-B1 Verifier Report — MD vs Live DB Drift”Date: 14/05/2026 · Wave: S236 WP6 B1 (Verifier) · Author: Verifier sub-agent
Branch: content-items-investigation · Sources verified:
docs/ontology/*.md(29 CV files, drafter A1 commite0ba727b)lib/validation/schemas.ts(Zod canonical constants)supabase/types/database.types.ts(generated TS types)- Live DB CHECK constraints via
mcp__supabase__execute_sql(projectrovrymhhffssilaftdwd) - Prod row enumerations on
content_items,taxonomy_*,layer_vocabulary,entity_aliases,template_requirements,feed_articles,content_history,workspaces types/bid.ts,lib/workspace-types.ts,lib/layer-inference.ts
This is an adversarial diff. MD is assumed wrong until proven right. Drift report only — no MD edits (C1’s job).
1. Summary — Drift Severity Rollup
Section titled “1. Summary — Drift Severity Rollup”| Severity | Count | Files |
|---|---|---|
| CRITICAL | 1 | 03-layer-vocabulary.md |
| HIGH | 4 | 15-workspaces-type.md, 13-ingest-source.md, 19-engineering-types.md, 25-application-type.md (verification of staged content only — table doesn’t yet exist) |
| MEDIUM | 5 | 01-taxonomy-domains.md, 02-taxonomy-subtopics.md, 06-lifecycle-type.md, 12-requirement-type.md, 18-entity-aliases.md |
| LOW | 7 | 04-content-type.md, 11-change-type.md, 16-extraction-method.md, 28-change-report-category.md, 26-form-type.md, 27-form-format.md, 29-cocoindex-source-kind.md |
| CLEAN (PASS) | 12 | 05-platform.md, 07-dedup-status.md, 08-freshness.md, 09-governance-review-status.md, 10-publication-status.md, 14-bid-states.md, 17-diff-mode.md, 20-chunk-kind.md, 21-scope-tag.md, 22-origin-kind.md, 23-extractor-kind.md, 24-citation-kind.md |
Bottom line: 12/29 PASS, 17/29 require changes. One CRITICAL (CV 03 layer-vocabulary baseline values are entirely wrong). One HIGH escalation about CV 15 (proposal-placeholder is a transcription error — code uses proposal).
2. Per-File Drift Table
Section titled “2. Per-File Drift Table”| # | File | Status | Issue summary |
|---|---|---|---|
| 01 | 01-taxonomy-domains.md | TBD-RESOLVED | Baseline values are TBD; live DB has 15 active rows enumerable. |
| 02 | 02-taxonomy-subtopics.md | TBD-RESOLVED | Baseline values are TBD; live DB has 57 active rows enumerable. |
| 03 | 03-layer-vocabulary.md | DRIFT (CRITICAL) | MD declares regulatory/customer/internal. Live DB has sales_brief/bid_detail/company_reference/research. ZERO overlap. The drafter invented values. |
| 04 | 04-content-type.md | CLEAN | 15 values match content_items_valid_content_type CHECK + VALID_CONTENT_TYPES Zod tuple verbatim. Ambiguity (policy/compliance, methodology/capability) noted in §4 below. |
| 05 | 05-platform.md | CLEAN | 6 values match content_items_platform_check CHECK + VALID_PLATFORMS Zod tuple verbatim. |
| 06 | 06-lifecycle-type.md | DRIFT (MEDIUM) | 4 MD values; NO live CHECK constraint exists on content_items.lifecycle_type — column is unconstrained. MD claims editable_via: database_migration but there is no migration to constrain. |
| 07 | 07-dedup-status.md | CLEAN | 5 values match content_items_dedup_status_check CHECK verbatim. |
| 08 | 08-freshness.md | CLEAN | 4 values match content_items_previous_freshness_check CHECK verbatim (note: live constraint is on previous_freshness; current freshness column appears unconstrained but uses same vocabulary). |
| 09 | 09-governance-review-status.md | CLEAN | 5 values match content_items_governance_review_status_check CHECK verbatim. |
| 10 | 10-publication-status.md | CLEAN | 4 values match content_items_publication_status_check CHECK + ItemCreateBodySchema.publication_status Zod literal verbatim. |
| 11 | 11-change-type.md | CLEAN | 11 values match content_history_change_type_check CHECK verbatim. Drift between declared (11) and observed (5) noted in MD already. |
| 12 | 12-requirement-type.md | TBD-RESOLVED | Baseline TBD; live DB CHECK lists 7 (policy, statement, evidence, data, narrative, declaration, reference); all 7 observed in prod with row counts. |
| 13 | 13-ingest-source.md | DRIFT (HIGH) | MD lists 11 documented values. Zod gate (ItemCreateBodySchema.ingestion_source) only allows 4: manual, upload, url_import, upload_autosplit. 5 distinct values in prod. Soft-CV — no DB CHECK. Two hidden values in code: mcp_create (lib/mcp/tools/content.ts:502) and bid_library (lib/layer-inference.ts:21) not in MD. |
| 14 | 14-bid-states.md | CLEAN | 10 values match BID_STATES (types/bid.ts:3-14) + VALID_BID_STATUSES (schemas.ts:1897-1908) + projects_status_check (live DB constraint name projects_status_check on workspaces) verbatim. Note: bid_questions.status is a separate state machine (7 values: pending, in_progress, drafted, reviewed, final, skipped, complete) — that’s question-level workflow, not workspace-level. MD correctly scopes to workspace-level. |
| 15 | 15-workspaces-type.md | DRIFT (HIGH) | proposal-placeholder does NOT exist in code. lib/workspace-types.ts:106 registers type: 'proposal' (no hyphen, no -placeholder suffix). The -placeholder suffix appears only in the source plan doc phase-b-prerequisite-1-onthology-pipeline.md:58 as descriptive prose (“plus proposal-placeholder in code registry”). A1 transcribed the prose verbatim instead of reading the actual code identifier. Other code references confirmed: lib/workspace-types.ts:106 and :167 use proposal. |
| 16 | 16-extraction-method.md | CLEAN | 5 values match feed_articles_extraction_method_check CHECK verbatim. All 5 observed in prod. |
| 17 | 17-diff-mode.md | CLEAN | 2 values match source_document_diffs_diff_mode_check CHECK verbatim. |
| 18 | 18-entity-aliases.md | TBD-RESOLVED | Live DB has category column (NOT provenance — rename pending per Q-OQR1-11) with 2 values (generic, client); 24 prod alias rows enumerable. |
| 19 | 19-engineering-types.md | DRIFT (HIGH) | Live types/ directory has 17 files, MD lists 10. Missing from MD: intelligence-refinement, ingest, taxonomy (domain types). Plus 4 declaration files (css.d, jsdom.d, readability.d, turndown-plugin-gfm.d) which MD correctly excludes as non-domain — but A1 only excluded css.d explicitly, missing the other 3. Recommend: drop this CV from the register entirely (engineering-side, not user-facing CV; out of scope per A1’s own §Notes). |
| 20 | 20-chunk-kind.md | CLEAN | Status planned; column not in prod schema. 3 baseline values reasonable. |
| 21 | 21-scope-tag.md | CLEAN | Status planned; column not in prod schema. CLIENT-DEFINED, no baseline values expected. |
| 22 | 22-origin-kind.md | CLEAN | Status planned; column not in prod schema. 4 baseline values reasonable. |
| 23 | 23-extractor-kind.md | CLEAN | Status planned; column not in prod schema. 5 baseline values reasonable. |
| 24 | 24-citation-kind.md | CLEAN | Status planned; live citations table has content_citations.citation_type with 4 values (reference, copied, adapted, inspired). Different vocabulary — MD declares the planned future shape; live shape is older. Worth noting: future citations.citation_kind ≠ current content_citations.citation_type. |
| 25 | 25-application-type.md | DRIFT (HIGH-CONTENT) | Status needed; table does not exist. 6 baseline values look reasonable. Verification gate: these are aspirational values — cannot be drift-checked against DB. C1 should ensure core_seed_path: scripts/seed/baseline-application-types.sql is created in WP6 ratifier wave or later. |
| 26 | 26-form-type.md | CLEAN | Status needed; table does not exist. 11 values reasonable. Note: template_requirements.template_type CHECK has 10 values today (sq, rfp, eqq, pqq, gcloud, method_statement, dos, dps, framework, other); MD’s planned form_type vocabulary differs structurally (different scope). Live observed values: only sq (66 rows) and rfp (30 rows). |
| 27 | 27-form-format.md | CLEAN | Status needed; table does not exist. 5 values reasonable. |
| 28 | 28-change-report-category.md | CLEAN | Status needed; table does not exist. 4 values listed; source §2.1 says “etc.” — Liam input needed (escalation §5). |
| 29 | 29-cocoindex-source-kind.md | CLEAN | Status planned; column not in prod schema. 7 baseline values reasonable. |
3. Bidirectional Drift Detail (Closed-Enum CVs Only)
Section titled “3. Bidirectional Drift Detail (Closed-Enum CVs Only)”CV 03 layer-vocabulary — CRITICAL
Section titled “CV 03 layer-vocabulary — CRITICAL”| Direction | Values |
|---|---|
| In MD, missing from DB | regulatory, customer, internal (none of the three exist in layer_vocabulary table) |
| In DB, missing from MD | sales_brief, bid_detail, company_reference, research (all 4 live rows are absent from MD) |
| Recommended action | C1 MUST overwrite the entire baseline_values block with the live 4 rows: sales_brief/Sales Brief, bid_detail/Bid Detail, company_reference/Company Reference, research/Research. Update the Definition prose: it currently describes a “regulatory/customer/internal” three-layer model that doesn’t match the live vocabulary at all. The live model is a knowledge-context layering (“which audience reads this?”) — Sales Brief is internal-sales facing, Bid Detail is tender-response facing, Company Reference is corporate-controlled docs, Research is background material. (See description column values in DB output.) |
The drafter was working from source §2.1 which lists regulatory/customer/internal as examples — but those examples were stale or speculative; the live layer_vocabulary table has had the four real keys for some time. A1 should have queried the live table. This is the most serious finding.
CV 13 ingest-source — HIGH
Section titled “CV 13 ingest-source — HIGH”| Direction | Values |
|---|---|
| In MD, missing from DB-prod observation | upload, upload_autosplit, mcp_create, bid_outcome_integration, python_url, qa_import, batch_reclassify (only 5 of 11 documented values observed in prod) |
| In MD, missing from Zod gate | 7 of 11 values are not in ItemCreateBodySchema.ingestion_source Zod enum — mcp_create, rss_feed, bid_outcome_integration, python_url, python_markdown, qa_import, batch_reclassify. Pipeline writes bypass this Zod gate — only /api/items POSTs are validated. |
| In code, missing from MD | bid_library — appears in lib/layer-inference.ts:21 and :96 as a documented ingestionSource literal, NOT in MD. Note the column is ingest_source in some places, ingestion_source in others (column-name inconsistency). |
| Recommended action | C1 should: (a) add bid_library to the documented value list with a note “appears in lib/layer-inference.ts only — verify whether it is in active use or legacy”; (b) reconcile the prose claim “11 documented canonical values” with reality (11 + bid_library = 12, or 10 if bid_library is dead); (c) note the column-name drift (ingest_source vs ingestion_source) as Liam-needs-decision. |
CV 15 workspaces-type — HIGH
Section titled “CV 15 workspaces-type — HIGH”| Direction | Values |
|---|---|
| In MD, missing from code/DB | proposal-placeholder (does not exist in code — lib/workspace-types.ts:106 uses proposal, no suffix) |
| In MD, missing from prod data | bid (0 prod rows), kb_section (0 prod rows), proposal (0 prod rows). Only intelligence is in prod (4 rows). |
| In code, missing from MD | proposal (the actual code identifier — A1 wrote proposal-placeholder instead) |
| Recommended action | C1: replace proposal-placeholder with proposal in the baseline values table AND in the relationships/notes prose. Update note “Code registry’s proposal is not in the DB CHECK — verifier sub-agent should flag this divergence” to reflect the correct identifier. |
CV 06 lifecycle-type — MEDIUM
Section titled “CV 06 lifecycle-type — MEDIUM”| Direction | Values |
|---|---|
| In MD, missing from DB | bid_discovered (no prod rows; no CHECK constraint exists on content_items.lifecycle_type so it could land in future inserts) |
| In DB, missing from MD | None — live values (evergreen, date_bound, regulation) are subset of MD’s 4 |
| Schema gap | content_items.lifecycle_type has no CHECK constraint. MD claims editable_via: database_migration but no migration enforces the enum. Soft-CV in DB; only Zod or pipeline code constrains. |
| Recommended action | C1: add a §Notes bullet “No DB CHECK on content_items.lifecycle_type — soft-CV today; CHECK migration recommended for v1.0 to harden the 4 documented values.” Also escalate the missing CHECK as a Liam decision (§5). |
CV 04 content-type — CLEAN with caveats
Section titled “CV 04 content-type — CLEAN with caveats”15 values match perfectly across MD ↔ Zod ↔ live CHECK. Two prod-data observations:
policy(19 rows) andcompliance(17 rows) co-exist in prod with similar counts — confirms ambiguity is live, not theoretical.methodology(7 rows) sees use;capabilityis 0 rows in prod — suggestscapabilitymay be aspirational. Worth a Liam follow-up but not blocking.q_a_pairis the dominant content type (395 rows, ~63% of prod). Confirms the CV 22origin_kindwork is high-value.document(0 rows),pdf(0 rows),blog(0 rows),product_description(0 rows),q_a_pairheavy — reasonable but worth noting many enum values have no prod usage.
CV 18 entity-aliases — TBD-RESOLVED + provenance rename
Section titled “CV 18 entity-aliases — TBD-RESOLVED + provenance rename”Live entity_aliases.category column has 2 values: generic (14 rows, e.g. agile/Agile, wordpress/WordPress) and client (10 rows, e.g. Phew/Phew Design Limited). The Q-OQR1-11 ratification calls for renaming category → provenance (active per S235); C1 should ensure the MD reflects “rename pending in combined PR Q-OQR1-16” not “renamed”.
4. Resolution of A1’s 9 Source Ambiguities
Section titled “4. Resolution of A1’s 9 Source Ambiguities”| # | A1 ambiguity | Resolution |
|---|---|---|
| 1 | CV 03 — layer_vocabulary inserts client-allowed? | Table-driven, no CHECK constraint. Live DB has 4 rows (no provenance column to distinguish core/client). The DB allows arbitrary inserts on layer_vocabulary (no CHECK, no row-source enum). Functionally HYBRID by mechanism; A1’s classification stands. HOWEVER: the much bigger issue (entirely wrong baseline values) overshadows this. C1 must fix the values first; classification is correct. |
| 2 | CV 04 — policy vs compliance, methodology vs capability overlap | Prod-data evidence: policy 19 rows vs compliance 17 rows (live ambiguity confirmed); methodology 7 rows vs capability 0 rows. No semantic disambiguation rule found in code or specs. Recommend C1 escalate to Liam (§5) — needs a definitional ruling. |
| 3 | CV 06 — regulation vs date_bound boundary | Prod-data: 8 regulation rows vs 4 date_bound rows. No definitional rule found in code or specs. Recommend C1 propose: regulation = governed by external regulatory effective date (e.g. ICO regulation X effective from Y); date_bound = explicit validity window not tied to regulation (e.g. “valid for FY26”). Escalate to Liam for ratification. |
| 4 | CV 12 — requirement_type current values | RESOLVED. Live template_requirements_requirement_type_check lists 7 values: policy, statement, evidence, data, narrative, declaration, reference. All 7 observed in prod with counts (data 32, declaration 21, narrative 16, evidence 12, policy 7, statement 5, reference 3). C1 should populate the baseline_values block with these 7. |
| 5 | CV 13 — soft-CV drift between docs and prod | RESOLVED + extra finding. 11 documented values in MD; 5 observed in prod (qa_import 440, manual 71, url_import 55, rss_feed 40, python_markdown 23). Hidden code value bid_library (lib/layer-inference.ts:21) is NOT in MD — A1 missed it. Zod gate ItemCreateBodySchema.ingestion_source only allows 4 values, blocking 7 of the 11 documented values from entering via /api/items POSTs (pipeline writes bypass). |
| 6 | CV 15 — proposal-placeholder divergence | RESOLVED — but A1 had the wrong identifier. Code uses proposal (no -placeholder). DB CHECK does NOT include proposal — only bid, kb_section, intelligence. So an INSERT with type='proposal' would fail the CHECK. The code-registry-vs-DB divergence is real, but the identifier in MD is wrong. See drift §3 above. |
| 7 | CV 19 — engineering-types keep/drop from register | Recommend DROP. This CV is engineering-side only (TS files in types/), not a user-facing controlled vocabulary. It has no DB surface, no admin UI, no client extension. A1’s own §Notes flags this. C1 should either drop the file (preferred — keeps the 29 register clean) or move it to a docs/ontology/_engineering-only/ subfolder marked out-of-scope. Ratifier wave should NOT generate a Zod schema for it. |
| 8 | CV 28 — change-report-category list incomplete | NEEDS LIAM INPUT. No prod data exists (change_reports table doesn’t exist yet); source §2.1 says “etc.” after 4 values. Cannot be resolved by code inspection. Escalate to Liam (§5). |
| 9 | CVs 01/02 — taxonomy domains/subtopics baseline | RESOLVED. Live DB has 15 active domains and 57 active subtopics with provenance enum (baseline / client / recommended). Distribution: 7 baseline domains (security, compliance, implementation, support, corporate, product-feature, methodology) + 8 client domains (safeguarding-*, multi-academy-trusts, education, products-services, legislation-policy, market-intelligence, sector-news). C1 should choose: (a) populate MD baseline_values with all 7 baseline-provenance domains as core rows; (b) leave client-provenance rows out (they’re tenant-specific Phew rows that shouldn’t ship as platform baseline). Same approach for subtopics. |
5. Escalations (Liam Attention Required)
Section titled “5. Escalations (Liam Attention Required)”These items either suggest a schema/code bug or a missing decision Liam alone can resolve. Per CLAUDE.md “Agent escalation rule”:
-
CV 03 layer-vocabulary — drafter invented wrong values. Source §2.1 lists
regulatory/customer/internalas examples. Live DB has the four-key business model (sales_brief,bid_detail,company_reference,research). Either (a) source §2.1 needs updating to reflect the real vocabulary, or (b)layer_vocabularyis supposed to migrate to the regulatory/customer/internal model. Likely (a). Liam should confirm. -
CV 06 lifecycle-type has no DB CHECK constraint.
content_items.lifecycle_typeis unconstrained — soft-CV today. MD claimseditable_via: database_migration(implying CHECK-gated) but no such migration exists. Recommend creating a migration to add a CHECK constraint with the 4 documented values. Liam decision: accept this as a schema-cleanup item, or leave soft-CV intentionally? -
CV 13 ingest_source — hidden code value
bid_library.lib/layer-inference.ts:21declares the type'manual' | 'url_import' | 'upload' | 'bid_library'.bid_libraryis not in MD’s 11 values. Either (a)bid_libraryis dead code that should be removed, or (b) it’s a real ingest source that should be added to the documented set. Liam decision: which? -
CV 13 column-name drift.
content_items.ingest_source(column name) vs Zod fieldingestion_sourcevs Pythoningestion_sourceparameter — same concept, three names. Liam decision: standardise asingest_source(matches DB) oringestion_source(matches Zod)? Cosmetic but enforced by ratifier. -
CV 15 workspaces-type —
kb_sectionretire path. Per A1 MD,kb_sectionis “LEGACY — slated for removal” with 0 prod rows. Live DB CHECK still permits it. Confirmed: it’s still in 5 code locations (per source §7.1). Combined PR Q-OQR1-16 lands the cleanup. Liam confirm: any blocker to droppingkb_sectionfrom the CHECK in that PR? -
CV 04 content-type —
policy/complianceandmethodology/capabilitysemantic boundaries undocumented. Both pairs have prod-data evidence of co-existence. Liam needs to either (a) define the boundary, (b) accept ambiguity and note “either is valid”, or (c) consolidate (e.g. dropcompliance, fold intopolicy). Tribal knowledge is not survivable past v1. -
CV 28 change-report-category vocabulary incomplete. Source §2.1 says “etc.” after 4 values. Liam input needed before ratifier wave.
-
extraction_method.firecrawlretirement decision. Per CV 16 §Notes,firecrawlwill retire if §7.5 “drop Firecrawl” decision lands. 27 prod rows currently usefirecrawl. Liam needs to confirm timing and migration plan (re-extract those 27 articles, or leave the historical value?). Not a B1 blocker, but flagged because the CV will need updating when the decision lands.
6. Recommendations for C1 Editor (Concrete Actions)
Section titled “6. Recommendations for C1 Editor (Concrete Actions)”Numbered actions C1 can apply directly:
CRITICAL
Section titled “CRITICAL”docs/ontology/03-layer-vocabulary.md— Replace thebaseline_values:frontmatter block (lines 109-118) with:Also rewrite the §Definition (lines 121-125) — the live values are knowledge-context layering (Sales Brief = internal-sales-facing, Bid Detail = tender-response, Company Reference = corporate controlled docs, Research = background material), NOT the regulatory/customer/internal model the MD currently describes. Also rewrite §Baseline values table (lines 132-137).baseline_values:- key: sales_brieflabel: Sales Briefprovenance: core- key: bid_detaillabel: Bid Detailprovenance: core- key: company_referencelabel: Company Referenceprovenance: core- key: researchlabel: Researchprovenance: core
-
docs/ontology/15-workspaces-type.md— Replaceproposal-placeholderwithproposaleverywhere it appears (frontmatter line ~982, baseline values table line 1005, prose lines 990, 1010, 1018, 1025). Update the §Notes line 1025: change “Code registry’sproposal-placeholderis not in the DB CHECK” to “Code registry’sproposalis not in the DB CHECK (available: falseinlib/workspace-types.ts:113)”. -
docs/ontology/13-ingest-source.md— Add a 12th documented value:bid_library(with provenance note “appears inlib/layer-inference.ts:21only — verify in-use vs legacy”). Add a §Notes paragraph: “Zod gateItemCreateBodySchema.ingestion_source(lib/validation/schemas.ts:300-302) only allows 4 values (manual,upload,url_import,upload_autosplit); pipeline writes bypass the gate, which is how prod values likeqa_import/rss_feed/python_markdownland.” Also add: “Column name drift: DB columningest_source, Zod fieldingestion_source, Python pipeline parameteringestion_source— three names for one concept; needs Liam decision.” -
docs/ontology/19-engineering-types.md— Recommend C1 escalate to Liam for “drop or keep”. If keep: update baseline_values to enumerate all 13 actual domain types (10 listed +intelligence-refinement,ingest,taxonomy). Excludecss.d,jsdom.d,readability.d,turndown-plugin-gfm.d(all type-declaration files, not domain types). If drop: delete the file and updatedocs/ontology/README.mdindex table.
MEDIUM
Section titled “MEDIUM”-
docs/ontology/01-taxonomy-domains.md— Replacebaseline_values: TBDblock with the 7 baseline-provenance domains observed live (security,compliance,implementation,support,corporate,product-feature,methodology— alldisplay_namelowercase) markedprovenance: core. Note in prose that 8 client-provenance domains (Phew tenant-specific) are intentionally out-of-scope for platform baseline. -
docs/ontology/02-taxonomy-subtopics.md— Replacebaseline_values: TBDwith the 31 baseline-provenance subtopics observed live (group by parent domain in the prose; do not enumerate all 31 inline in baseline_values — too long; instead note “seescripts/seed/baseline-taxonomy-subtopics.sqlfor full list” and link). -
docs/ontology/06-lifecycle-type.md— Add §Notes bullet: “No DB CHECK oncontent_items.lifecycle_typetoday — soft-CV. CHECK migration recommended for v1.0 to harden the 4 documented values. Updateeditable_viafromdatabase_migrationtodatabase_migration(post-CHECK) orapplication_code(pre-CHECK).” Also add Liam-needs-decision flag. -
docs/ontology/12-requirement-type.md— Replacebaseline_values: TBDwith the 7 live values:baseline_values:- key: policylabel: Policyprovenance: core- key: statementlabel: Statementprovenance: core- key: evidencelabel: Evidenceprovenance: core- key: datalabel: Dataprovenance: core- key: narrativelabel: Narrativeprovenance: core- key: declarationlabel: Declarationprovenance: core- key: referencelabel: Referenceprovenance: coreUpdate §Baseline values prose accordingly. (Source:
template_requirements_requirement_type_checkCHECK; all 7 observed in prod.) -
docs/ontology/18-entity-aliases.md— Confirm the prose says “category rename to provenance is pending in Q-OQR1-16 combined PR” rather than implying it’s done. Liveentity_aliases.categorycolumn still exists with 2 values (generic14 rows,client10 rows). Add a §Notes bullet listing 5 example acronym mappings observed in prod (e.g.Phew → Phew Design Limited,Asp Net → ASP.NET,WCAG 2 1 Aa → WCAG 2.1 AA).
LOW (informational)
Section titled “LOW (informational)”-
docs/ontology/04-content-type.md— Add prod-data observation to §Notes: “q_a_pairis the dominant prod content_type (395 of 629 rows, ~63%);capabilityhas 0 prod rows;policy(19) andcompliance(17) co-exist with similar counts confirming the ambiguity is live, not theoretical.” -
docs/ontology/11-change-type.md— Confirm prod observation matches MD prose: 5 observed (create1175,owner_change23,archive10,edit10,metadata_change5); 6 declared but unobserved (ai_update,import,merge,rollback,delete,publication_state). Add row counts to §Notes for traceability. -
docs/ontology/24-citation-kind.md— Add a §Notes bullet noting that the livecontent_citations.citation_typeCHECK has different values (reference,copied,adapted,inspired) — the plannedcitations.citation_kindis a different shape and supersedes/coexists. Avoids future confusion when the planned column lands.
Appendix A — Verification SQL
Section titled “Appendix A — Verification SQL”Reproducible SQL run against project rovrymhhffssilaftdwd:
-- All public-schema CHECK constraintsSELECT conname, conrelid::regclass::text, pg_get_constraintdef(oid)FROM pg_constraint WHERE contype = 'c' AND connamespace = 'public'::regnamespaceORDER BY conrelid::regclass::text, conname;
-- Per-CV prod enumerationsSELECT content_type, COUNT(*) FROM content_items GROUP BY content_type ORDER BY 2 DESC;SELECT platform, COUNT(*) FROM content_items GROUP BY platform ORDER BY 2 DESC;SELECT ingest_source, COUNT(*) FROM content_items GROUP BY ingest_source ORDER BY 2 DESC;SELECT change_type, COUNT(*) FROM content_history GROUP BY change_type ORDER BY 2 DESC;SELECT requirement_type, COUNT(*) FROM template_requirements GROUP BY requirement_type ORDER BY 2 DESC;SELECT extraction_method, COUNT(*) FROM feed_articles GROUP BY extraction_method ORDER BY 2 DESC;SELECT type, COUNT(*) FROM workspaces GROUP BY type ORDER BY 2 DESC;SELECT category, COUNT(*) FROM entity_aliases GROUP BY category ORDER BY 2 DESC;
-- Layer vocabulary live rows (CRITICAL drift)SELECT key, label, description, display_order, is_active FROM layer_vocabulary ORDER BY display_order, key;
-- Taxonomy domain + subtopic enumerationSELECT name, display_name, provenance, is_active FROM taxonomy_domains ORDER BY display_order, name;SELECT t.name, d.name AS parent, t.provenance, t.is_active FROM taxonomy_subtopics t LEFT JOIN taxonomy_domains d ON t.domain_id=d.id ORDER BY d.display_order, t.display_order;Appendix B — Files Verified, Not Modified
Section titled “Appendix B — Files Verified, Not Modified”This report verifies but does not edit:
docs/ontology/01-*.mdthroughdocs/ontology/29-*.md(29 files)docs/ontology/README.md
Per agent prompt §Constraints: “Do NOT edit any MD file (that is C1’s job)”. All recommended changes in §6 are for C1 to apply.