Skip to content

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 commit e0ba727b)
  • lib/validation/schemas.ts (Zod canonical constants)
  • supabase/types/database.types.ts (generated TS types)
  • Live DB CHECK constraints via mcp__supabase__execute_sql (project rovrymhhffssilaftdwd)
  • 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).


SeverityCountFiles
CRITICAL103-layer-vocabulary.md
HIGH415-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)
MEDIUM501-taxonomy-domains.md, 02-taxonomy-subtopics.md, 06-lifecycle-type.md, 12-requirement-type.md, 18-entity-aliases.md
LOW704-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)1205-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).


#FileStatusIssue summary
0101-taxonomy-domains.mdTBD-RESOLVEDBaseline values are TBD; live DB has 15 active rows enumerable.
0202-taxonomy-subtopics.mdTBD-RESOLVEDBaseline values are TBD; live DB has 57 active rows enumerable.
0303-layer-vocabulary.mdDRIFT (CRITICAL)MD declares regulatory/customer/internal. Live DB has sales_brief/bid_detail/company_reference/research. ZERO overlap. The drafter invented values.
0404-content-type.mdCLEAN15 values match content_items_valid_content_type CHECK + VALID_CONTENT_TYPES Zod tuple verbatim. Ambiguity (policy/compliance, methodology/capability) noted in §4 below.
0505-platform.mdCLEAN6 values match content_items_platform_check CHECK + VALID_PLATFORMS Zod tuple verbatim.
0606-lifecycle-type.mdDRIFT (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.
0707-dedup-status.mdCLEAN5 values match content_items_dedup_status_check CHECK verbatim.
0808-freshness.mdCLEAN4 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).
0909-governance-review-status.mdCLEAN5 values match content_items_governance_review_status_check CHECK verbatim.
1010-publication-status.mdCLEAN4 values match content_items_publication_status_check CHECK + ItemCreateBodySchema.publication_status Zod literal verbatim.
1111-change-type.mdCLEAN11 values match content_history_change_type_check CHECK verbatim. Drift between declared (11) and observed (5) noted in MD already.
1212-requirement-type.mdTBD-RESOLVEDBaseline TBD; live DB CHECK lists 7 (policy, statement, evidence, data, narrative, declaration, reference); all 7 observed in prod with row counts.
1313-ingest-source.mdDRIFT (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.
1414-bid-states.mdCLEAN10 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.
1515-workspaces-type.mdDRIFT (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.
1616-extraction-method.mdCLEAN5 values match feed_articles_extraction_method_check CHECK verbatim. All 5 observed in prod.
1717-diff-mode.mdCLEAN2 values match source_document_diffs_diff_mode_check CHECK verbatim.
1818-entity-aliases.mdTBD-RESOLVEDLive DB has category column (NOT provenance — rename pending per Q-OQR1-11) with 2 values (generic, client); 24 prod alias rows enumerable.
1919-engineering-types.mdDRIFT (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).
2020-chunk-kind.mdCLEANStatus planned; column not in prod schema. 3 baseline values reasonable.
2121-scope-tag.mdCLEANStatus planned; column not in prod schema. CLIENT-DEFINED, no baseline values expected.
2222-origin-kind.mdCLEANStatus planned; column not in prod schema. 4 baseline values reasonable.
2323-extractor-kind.mdCLEANStatus planned; column not in prod schema. 5 baseline values reasonable.
2424-citation-kind.mdCLEANStatus 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.
2525-application-type.mdDRIFT (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.
2626-form-type.mdCLEANStatus 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).
2727-form-format.mdCLEANStatus needed; table does not exist. 5 values reasonable.
2828-change-report-category.mdCLEANStatus needed; table does not exist. 4 values listed; source §2.1 says “etc.” — Liam input needed (escalation §5).
2929-cocoindex-source-kind.mdCLEANStatus 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)”
DirectionValues
In MD, missing from DBregulatory, customer, internal (none of the three exist in layer_vocabulary table)
In DB, missing from MDsales_brief, bid_detail, company_reference, research (all 4 live rows are absent from MD)
Recommended actionC1 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.

DirectionValues
In MD, missing from DB-prod observationupload, 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 gate7 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 MDbid_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 actionC1 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.
DirectionValues
In MD, missing from code/DBproposal-placeholder (does not exist in code — lib/workspace-types.ts:106 uses proposal, no suffix)
In MD, missing from prod databid (0 prod rows), kb_section (0 prod rows), proposal (0 prod rows). Only intelligence is in prod (4 rows).
In code, missing from MDproposal (the actual code identifier — A1 wrote proposal-placeholder instead)
Recommended actionC1: 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.
DirectionValues
In MD, missing from DBbid_discovered (no prod rows; no CHECK constraint exists on content_items.lifecycle_type so it could land in future inserts)
In DB, missing from MDNone — live values (evergreen, date_bound, regulation) are subset of MD’s 4
Schema gapcontent_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 actionC1: 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).

15 values match perfectly across MD ↔ Zod ↔ live CHECK. Two prod-data observations:

  • policy (19 rows) and compliance (17 rows) co-exist in prod with similar counts — confirms ambiguity is live, not theoretical.
  • methodology (7 rows) sees use; capability is 0 rows in prod — suggests capability may be aspirational. Worth a Liam follow-up but not blocking.
  • q_a_pair is the dominant content type (395 rows, ~63% of prod). Confirms the CV 22 origin_kind work is high-value.
  • document (0 rows), pdf (0 rows), blog (0 rows), product_description (0 rows), q_a_pair heavy — 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 categoryprovenance (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 ambiguityResolution
1CV 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.
2CV 04policy vs compliance, methodology vs capability overlapProd-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.
3CV 06regulation vs date_bound boundaryProd-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.
4CV 12 — requirement_type current valuesRESOLVED. 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.
5CV 13 — soft-CV drift between docs and prodRESOLVED + 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).
6CV 15proposal-placeholder divergenceRESOLVED — 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.
7CV 19 — engineering-types keep/drop from registerRecommend 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.
8CV 28 — change-report-category list incompleteNEEDS 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).
9CVs 01/02 — taxonomy domains/subtopics baselineRESOLVED. 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.

These items either suggest a schema/code bug or a missing decision Liam alone can resolve. Per CLAUDE.md “Agent escalation rule”:

  1. CV 03 layer-vocabulary — drafter invented wrong values. Source §2.1 lists regulatory/customer/internal as 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_vocabulary is supposed to migrate to the regulatory/customer/internal model. Likely (a). Liam should confirm.

  2. CV 06 lifecycle-type has no DB CHECK constraint. content_items.lifecycle_type is unconstrained — soft-CV today. MD claims editable_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?

  3. CV 13 ingest_source — hidden code value bid_library. lib/layer-inference.ts:21 declares the type 'manual' | 'url_import' | 'upload' | 'bid_library'. bid_library is not in MD’s 11 values. Either (a) bid_library is 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?

  4. CV 13 column-name drift. content_items.ingest_source (column name) vs Zod field ingestion_source vs Python ingestion_source parameter — same concept, three names. Liam decision: standardise as ingest_source (matches DB) or ingestion_source (matches Zod)? Cosmetic but enforced by ratifier.

  5. CV 15 workspaces-type — kb_section retire path. Per A1 MD, kb_section is “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 dropping kb_section from the CHECK in that PR?

  6. CV 04 content-type — policy/compliance and methodology/capability semantic 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. drop compliance, fold into policy). Tribal knowledge is not survivable past v1.

  7. CV 28 change-report-category vocabulary incomplete. Source §2.1 says “etc.” after 4 values. Liam input needed before ratifier wave.

  8. extraction_method.firecrawl retirement decision. Per CV 16 §Notes, firecrawl will retire if §7.5 “drop Firecrawl” decision lands. 27 prod rows currently use firecrawl. 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:

  1. docs/ontology/03-layer-vocabulary.md — Replace the baseline_values: frontmatter block (lines 109-118) with:
    baseline_values:
    - key: sales_brief
    label: Sales Brief
    provenance: core
    - key: bid_detail
    label: Bid Detail
    provenance: core
    - key: company_reference
    label: Company Reference
    provenance: core
    - key: research
    label: Research
    provenance: core
    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).
  1. docs/ontology/15-workspaces-type.md — Replace proposal-placeholder with proposal everywhere it appears (frontmatter line ~982, baseline values table line 1005, prose lines 990, 1010, 1018, 1025). Update the §Notes line 1025: change “Code registry’s proposal-placeholder is not in the DB CHECK” to “Code registry’s proposal is not in the DB CHECK (available: false in lib/workspace-types.ts:113)”.

  2. docs/ontology/13-ingest-source.md — Add a 12th documented value: bid_library (with provenance note “appears in lib/layer-inference.ts:21 only — verify in-use vs legacy”). Add a §Notes paragraph: “Zod gate ItemCreateBodySchema.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 like qa_import/rss_feed/python_markdown land.” Also add: “Column name drift: DB column ingest_source, Zod field ingestion_source, Python pipeline parameter ingestion_source — three names for one concept; needs Liam decision.”

  3. 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). Exclude css.d, jsdom.d, readability.d, turndown-plugin-gfm.d (all type-declaration files, not domain types). If drop: delete the file and update docs/ontology/README.md index table.

  1. docs/ontology/01-taxonomy-domains.md — Replace baseline_values: TBD block with the 7 baseline-provenance domains observed live (security, compliance, implementation, support, corporate, product-feature, methodology — all display_name lowercase) marked provenance: core. Note in prose that 8 client-provenance domains (Phew tenant-specific) are intentionally out-of-scope for platform baseline.

  2. docs/ontology/02-taxonomy-subtopics.md — Replace baseline_values: TBD with 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 “see scripts/seed/baseline-taxonomy-subtopics.sql for full list” and link).

  3. docs/ontology/06-lifecycle-type.md — Add §Notes bullet: “No DB CHECK on content_items.lifecycle_type today — soft-CV. CHECK migration recommended for v1.0 to harden the 4 documented values. Update editable_via from database_migration to database_migration (post-CHECK) or application_code (pre-CHECK).” Also add Liam-needs-decision flag.

  4. docs/ontology/12-requirement-type.md — Replace baseline_values: TBD with the 7 live values:

    baseline_values:
    - key: policy
    label: Policy
    provenance: core
    - key: statement
    label: Statement
    provenance: core
    - key: evidence
    label: Evidence
    provenance: core
    - key: data
    label: Data
    provenance: core
    - key: narrative
    label: Narrative
    provenance: core
    - key: declaration
    label: Declaration
    provenance: core
    - key: reference
    label: Reference
    provenance: core

    Update §Baseline values prose accordingly. (Source: template_requirements_requirement_type_check CHECK; all 7 observed in prod.)

  5. 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. Live entity_aliases.category column still exists with 2 values (generic 14 rows, client 10 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).

  1. docs/ontology/04-content-type.md — Add prod-data observation to §Notes: “q_a_pair is the dominant prod content_type (395 of 629 rows, ~63%); capability has 0 prod rows; policy (19) and compliance (17) co-exist with similar counts confirming the ambiguity is live, not theoretical.”

  2. docs/ontology/11-change-type.md — Confirm prod observation matches MD prose: 5 observed (create 1175, owner_change 23, archive 10, edit 10, metadata_change 5); 6 declared but unobserved (ai_update, import, merge, rollback, delete, publication_state). Add row counts to §Notes for traceability.

  3. docs/ontology/24-citation-kind.md — Add a §Notes bullet noting that the live content_citations.citation_type CHECK has different values (reference, copied, adapted, inspired) — the planned citations.citation_kind is a different shape and supersedes/coexists. Avoids future confusion when the planned column lands.


Reproducible SQL run against project rovrymhhffssilaftdwd:

-- All public-schema CHECK constraints
SELECT conname, conrelid::regclass::text, pg_get_constraintdef(oid)
FROM pg_constraint WHERE contype = 'c' AND connamespace = 'public'::regnamespace
ORDER BY conrelid::regclass::text, conname;
-- Per-CV prod enumerations
SELECT 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 enumeration
SELECT 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-*.md through docs/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.