Build log · Part 7 of 6

Appendix: schemas, catalogues and reference tables

Complete DDL for the 25 published tables, the 28 tenets, 9 procedures, 9 goals, 14 agent definitions, 4 hook registrations, all 65 cost-bearing agent slugs, all 247 facet values, the backlog rubric, and the archive restore recipe

Reference material for the six parts that precede it. Each item is complete rather than representative — the parts quote what an argument needed; this holds the rest. Everything below was read from the live database or from a file in the harness repository on 2026-07-25, one day after the machine was frozen and while the database was still standing.

1. The directory schema

Twenty-five base tables and two views, as introspected from information_schema.columns. Part 1 shows companies and entity_facets; these are all of them, in the order pg_dump emits.

CREATE TABLE directory.associations (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    name text NOT NULL,
    description text,
    website text,
    country_iso text,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.business_events (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    event_type text,
    event_date date,
    event_status text,
    primary_company_id uuid,
    counterparty_company_ids uuid[],
    protagonist_person_ids uuid[],
    signal_ids uuid[],
    quantitative_anchor jsonb,
    watch_items jsonb,
    source_confidence text,
    provenance jsonb,
    published boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.companies (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text NOT NULL,
    name text NOT NULL,
    tagline text,
    description text,
    website text,
    linkedin text,
    x_handle text,
    hq_location text,
    country text,
    country_iso text,
    region text,
    hq_latitude double precision,
    hq_longitude double precision,
    founded smallint,
    employee_range text,
    ownership_type text,
    ticker text,
    exchange text,
    funding_total bigint,
    latest_round text,
    logo_url text,
    hero_image_url text,
    aliases text[],
    data_completeness integer,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    search_vector tsvector,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.company_activity (
    company_id uuid NOT NULL,
    signal_count integer DEFAULT 0 NOT NULL,
    first_signal_date date,
    last_signal_date date,
    monthly_trend jsonb,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.company_cut_completeness (
    company_id uuid NOT NULL,
    use_case_key text NOT NULL,
    gold_pct smallint DEFAULT 0 NOT NULL,
    launch_ready boolean DEFAULT false NOT NULL,
    missing jsonb DEFAULT '[]'::jsonb NOT NULL,
    schema_version text,
    computed_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.company_depth (
    company_id uuid NOT NULL,
    identity_depth smallint,
    classification_depth smallint,
    connections_depth smallint,
    magnitude_depth smallint,
    evidence_depth smallint,
    analysis_depth smallint,
    depth_overall smallint,
    n_products integer DEFAULT 0 NOT NULL,
    n_people integer DEFAULT 0 NOT NULL,
    n_deals integer DEFAULT 0 NOT NULL,
    n_competitors integer DEFAULT 0 NOT NULL,
    n_signals integer DEFAULT 0 NOT NULL,
    deal_value_total numeric DEFAULT 0 NOT NULL,
    facet_dim_count integer DEFAULT 0 NOT NULL,
    has_report boolean DEFAULT false NOT NULL,
    has_summary boolean DEFAULT false NOT NULL,
    computed_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.competitors (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid NOT NULL,
    competitor_id uuid,
    label text,
    relationship text,
    notes text,
    source text,
    added_date date,
    provenance jsonb
);

CREATE TABLE directory.component_suppliers (
    component_id uuid NOT NULL,
    company_id uuid NOT NULL,
    role text,
    country_iso text,
    confidence real,
    provenance jsonb
);

CREATE TABLE directory.components (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    canonical_name text NOT NULL,
    component_class text,
    is_class boolean DEFAULT false NOT NULL,
    manufacturer_company_id uuid,
    origin_country_iso text,
    description text,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.deals (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid,
    deal_type text,
    title text,
    date date,
    value text,
    value_num numeric,
    value_confidence text,
    funding_stage text,
    region text,
    buyer_investor text,
    source_url text,
    signal_id uuid,
    provenance jsonb,
    published boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.deployment_sites (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    name text NOT NULL,
    site_type text,
    operator text,
    operator_type text,
    country text,
    country_iso text,
    region text,
    geom public.geometry(Point,4326),
    environment text,
    status text,
    deployment_count integer,
    sources text[],
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.entity_facets (
    entity_type text NOT NULL,
    entity_id uuid NOT NULL,
    facet_value_id uuid NOT NULL,
    provenance jsonb,
    CONSTRAINT entity_facets_entity_type_check CHECK ((entity_type = ANY (ARRAY['company'::text, 'product'::text, 'system'::text, 'person'::text, 'component'::text, 'deployment_site'::text, 'regulation'::text, 'association'::text])))
);

CREATE TABLE directory.entity_redirects (
    from_slug text NOT NULL,
    to_slug text,
    entity_kind text NOT NULL,
    reason text,
    since timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.facet_dimensions (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    key text NOT NULL,
    label text NOT NULL,
    description text,
    is_hierarchical boolean DEFAULT false NOT NULL,
    sort_order integer DEFAULT 0 NOT NULL,
    widget text DEFAULT 'checkbox'::text NOT NULL,
    indexable boolean DEFAULT false NOT NULL
);

CREATE TABLE directory.facet_values (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    dimension_id uuid NOT NULL,
    key text NOT NULL,
    label text NOT NULL,
    parent_id uuid,
    description text
);

CREATE TABLE directory.landing_pages (
    site_id uuid NOT NULL,
    facet_combo jsonb NOT NULL,
    slug text NOT NULL,
    intro_copy text,
    owner text,
    refresh_policy text,
    indexable boolean DEFAULT false NOT NULL,
    provenance jsonb DEFAULT '{}'::jsonb NOT NULL,
    CONSTRAINT landing_pages_facet_combo_check CHECK ((jsonb_typeof(facet_combo) = 'object'::text)),
    CONSTRAINT landing_pages_provenance_check CHECK ((jsonb_typeof(provenance) = 'object'::text))
);

CREATE TABLE directory.people (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    name text NOT NULL,
    title text,
    bio text,
    linkedin text,
    x_handle text,
    company_id uuid,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.people_companies (
    person_id uuid NOT NULL,
    company_id uuid NOT NULL,
    role text
);

CREATE TABLE directory.products (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    company_id uuid,
    slug text,
    name text NOT NULL,
    description text,
    url text,
    launch_year text,
    key_specs text,
    deployment_status text,
    operating_environment text,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    search_vector tsvector,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE TABLE directory.regulations (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    title text NOT NULL,
    jurisdiction text,
    country_iso text,
    summary text,
    body text,
    effective_date date,
    url text,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

CREATE VIEW directory.regulations_public AS
 SELECT id,
    slug,
    title,
    jurisdiction,
    country_iso,
    summary,
    effective_date,
    url
   FROM directory.regulations
  WHERE published;

CREATE TABLE directory.research_reports (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    subject_type text NOT NULL,
    subject_id uuid,
    title text NOT NULL,
    report_type text,
    report_date date,
    summary text,
    body text,
    source_count integer,
    word_count integer,
    is_current boolean DEFAULT true NOT NULL,
    provenance jsonb,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE VIEW directory.reports_public AS
 SELECT id,
    subject_type,
    subject_id,
    title,
    report_type,
    report_date,
    summary,
    source_count,
    word_count,
    is_current
   FROM directory.research_reports
  WHERE is_current;

CREATE TABLE directory.site_deployments (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    site_id uuid,
    company_id uuid,
    product_id uuid,
    product_name text,
    company_name text,
    use_case text,
    autonomy_level text,
    deployment_date date,
    status text,
    units_deployed integer,
    coverage_area text,
    source_confidence text,
    source_url text,
    provenance jsonb,
    published boolean DEFAULT true NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL
);

CREATE TABLE directory.site_filters (
    site_id uuid NOT NULL,
    facet_value_id uuid NOT NULL
);

CREATE TABLE directory.sites (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    subdomain text NOT NULL,
    name text NOT NULL,
    tagline text,
    entity_type text DEFAULT 'company'::text NOT NULL,
    presentation jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    context_stat text,
    intro text,
    seo_policy jsonb DEFAULT '{}'::jsonb NOT NULL,
    CONSTRAINT sites_seo_policy_check CHECK ((jsonb_typeof(seo_policy) = 'object'::text))
);

CREATE TABLE directory.systems (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    slug text,
    canonical_name text NOT NULL,
    system_class text,
    system_role text,
    is_class boolean DEFAULT false NOT NULL,
    manufacturer_company_id uuid,
    product_id uuid,
    origin_country_iso text,
    description text,
    provenance jsonb,
    published boolean DEFAULT false NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    completeness_pct smallint,
    last_verified_at timestamp with time zone,
    freshness_pct smallint
);

Constraints, from pg_constraint: 25 primary keys, 9 unique constraints, 25 foreign keys, and the four CHECK constraints already inline above.

-- Primary keys
ALTER TABLE directory.associations              ADD CONSTRAINT associations_pkey PRIMARY KEY (id);
ALTER TABLE directory.business_events           ADD CONSTRAINT business_events_pkey PRIMARY KEY (id);
ALTER TABLE directory.companies                 ADD CONSTRAINT companies_pkey PRIMARY KEY (id);
ALTER TABLE directory.company_activity          ADD CONSTRAINT company_activity_pkey PRIMARY KEY (company_id);
ALTER TABLE directory.company_cut_completeness  ADD CONSTRAINT company_cut_completeness_pkey PRIMARY KEY (company_id, use_case_key);
ALTER TABLE directory.company_depth             ADD CONSTRAINT company_depth_pkey PRIMARY KEY (company_id);
ALTER TABLE directory.competitors               ADD CONSTRAINT competitors_pkey PRIMARY KEY (id);
ALTER TABLE directory.component_suppliers       ADD CONSTRAINT component_suppliers_pkey PRIMARY KEY (component_id, company_id);
ALTER TABLE directory.components                ADD CONSTRAINT components_pkey PRIMARY KEY (id);
ALTER TABLE directory.deals                     ADD CONSTRAINT deals_pkey PRIMARY KEY (id);
ALTER TABLE directory.deployment_sites          ADD CONSTRAINT deployment_sites_pkey PRIMARY KEY (id);
ALTER TABLE directory.entity_facets             ADD CONSTRAINT entity_facets_pkey PRIMARY KEY (entity_type, entity_id, facet_value_id);
ALTER TABLE directory.entity_redirects          ADD CONSTRAINT entity_redirects_pkey PRIMARY KEY (from_slug);
ALTER TABLE directory.facet_dimensions          ADD CONSTRAINT facet_dimensions_pkey PRIMARY KEY (id);
ALTER TABLE directory.facet_values              ADD CONSTRAINT facet_values_pkey PRIMARY KEY (id);
ALTER TABLE directory.landing_pages             ADD CONSTRAINT landing_pages_pkey PRIMARY KEY (site_id, slug);
ALTER TABLE directory.people                    ADD CONSTRAINT people_pkey PRIMARY KEY (id);
ALTER TABLE directory.people_companies          ADD CONSTRAINT people_companies_pkey PRIMARY KEY (person_id, company_id);
ALTER TABLE directory.products                  ADD CONSTRAINT products_pkey PRIMARY KEY (id);
ALTER TABLE directory.regulations               ADD CONSTRAINT regulations_pkey PRIMARY KEY (id);
ALTER TABLE directory.research_reports          ADD CONSTRAINT research_reports_pkey PRIMARY KEY (id);
ALTER TABLE directory.site_deployments          ADD CONSTRAINT site_deployments_pkey PRIMARY KEY (id);
ALTER TABLE directory.site_filters              ADD CONSTRAINT site_filters_pkey PRIMARY KEY (site_id, facet_value_id);
ALTER TABLE directory.sites                     ADD CONSTRAINT sites_pkey PRIMARY KEY (id);
ALTER TABLE directory.systems                   ADD CONSTRAINT systems_pkey PRIMARY KEY (id);

-- Unique constraints
ALTER TABLE directory.associations      ADD CONSTRAINT associations_slug_key UNIQUE (slug);
ALTER TABLE directory.companies         ADD CONSTRAINT companies_slug_key UNIQUE (slug);
ALTER TABLE directory.components        ADD CONSTRAINT components_slug_key UNIQUE (slug);
ALTER TABLE directory.facet_dimensions  ADD CONSTRAINT facet_dimensions_key_key UNIQUE (key);
ALTER TABLE directory.facet_values      ADD CONSTRAINT facet_values_dimension_id_key_key UNIQUE (dimension_id, key);
ALTER TABLE directory.people            ADD CONSTRAINT people_slug_key UNIQUE (slug);
ALTER TABLE directory.regulations       ADD CONSTRAINT regulations_slug_key UNIQUE (slug);
ALTER TABLE directory.sites             ADD CONSTRAINT sites_subdomain_key UNIQUE (subdomain);
ALTER TABLE directory.systems           ADD CONSTRAINT systems_slug_key UNIQUE (slug);

-- Foreign keys
ALTER TABLE directory.business_events          ADD CONSTRAINT business_events_primary_company_id_fkey        FOREIGN KEY (primary_company_id)        REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.company_activity         ADD CONSTRAINT company_activity_company_id_fkey               FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.company_cut_completeness ADD CONSTRAINT company_cut_completeness_company_id_fkey       FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.company_depth            ADD CONSTRAINT company_depth_company_id_fkey                  FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.competitors              ADD CONSTRAINT competitors_company_id_fkey                    FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.competitors              ADD CONSTRAINT competitors_competitor_id_fkey                 FOREIGN KEY (competitor_id)            REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.component_suppliers      ADD CONSTRAINT component_suppliers_company_id_fkey            FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.component_suppliers      ADD CONSTRAINT component_suppliers_component_id_fkey          FOREIGN KEY (component_id)             REFERENCES directory.components(id)       ON DELETE CASCADE;
ALTER TABLE directory.components               ADD CONSTRAINT components_manufacturer_company_id_fkey        FOREIGN KEY (manufacturer_company_id)  REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.deals                    ADD CONSTRAINT deals_company_id_fkey                          FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.entity_facets            ADD CONSTRAINT entity_facets_facet_value_id_fkey              FOREIGN KEY (facet_value_id)           REFERENCES directory.facet_values(id)     ON DELETE CASCADE;
ALTER TABLE directory.facet_values             ADD CONSTRAINT facet_values_dimension_id_fkey                 FOREIGN KEY (dimension_id)             REFERENCES directory.facet_dimensions(id) ON DELETE CASCADE;
ALTER TABLE directory.facet_values             ADD CONSTRAINT facet_values_parent_id_fkey                    FOREIGN KEY (parent_id)                REFERENCES directory.facet_values(id)     ON DELETE SET NULL;
ALTER TABLE directory.landing_pages            ADD CONSTRAINT landing_pages_site_id_fkey                     FOREIGN KEY (site_id)                  REFERENCES directory.sites(id)            ON DELETE CASCADE;
ALTER TABLE directory.people                   ADD CONSTRAINT people_company_id_fkey                         FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.people_companies         ADD CONSTRAINT people_companies_company_id_fkey               FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE CASCADE;
ALTER TABLE directory.people_companies         ADD CONSTRAINT people_companies_person_id_fkey                FOREIGN KEY (person_id)                REFERENCES directory.people(id)           ON DELETE CASCADE;
ALTER TABLE directory.products                 ADD CONSTRAINT products_company_id_fkey                       FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.site_deployments         ADD CONSTRAINT site_deployments_company_id_fkey               FOREIGN KEY (company_id)               REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.site_deployments         ADD CONSTRAINT site_deployments_product_id_fkey               FOREIGN KEY (product_id)               REFERENCES directory.products(id)         ON DELETE SET NULL;
ALTER TABLE directory.site_deployments         ADD CONSTRAINT site_deployments_site_id_fkey                  FOREIGN KEY (site_id)                  REFERENCES directory.deployment_sites(id) ON DELETE SET NULL;
ALTER TABLE directory.site_filters             ADD CONSTRAINT site_filters_facet_value_id_fkey               FOREIGN KEY (facet_value_id)           REFERENCES directory.facet_values(id)     ON DELETE CASCADE;
ALTER TABLE directory.site_filters             ADD CONSTRAINT site_filters_site_id_fkey                      FOREIGN KEY (site_id)                  REFERENCES directory.sites(id)            ON DELETE CASCADE;
ALTER TABLE directory.systems                  ADD CONSTRAINT systems_manufacturer_company_id_fkey           FOREIGN KEY (manufacturer_company_id)  REFERENCES directory.companies(id)        ON DELETE SET NULL;
ALTER TABLE directory.systems                  ADD CONSTRAINT systems_product_id_fkey                        FOREIGN KEY (product_id)               REFERENCES directory.products(id)         ON DELETE SET NULL;

2. Tenet catalogue

All 28 rows of rp_ontology_nodes WHERE kind='tenet', keyed. The name and one_liner text is in Part 4; the columns below are the machine-readable fields that sit behind it — the key an agent cites, the governance-facet area and severity, and the enforcement array where one is attached. Six of the 28 carry an enforcement array; the parenthesised number is its length.

keynameareaseverityauthored_lifecycleenforcement
actor-narrative-arcActor narrative-arc frameworkgo-to-marketintended_live
agents-earn-their-keepAgents are rows that earn their keepoperating-modelintended_live
analyst-voiceAnalyst voice — quantitative, global, calibrated, sourcedgo-to-marketintended_live
bet-on-product-not-platformBet on the product, not the platformplatform-architectureintended_live
canonical-write-invariantCanonical write invariantdoctrine-ruleshighintended_livecode-path, db-tier (2)
closure-integrityClosure integritydoctrine-ruleshighintended_livescript, job (2)
corpus-coverage-doctrineCorpus coverage doctrine — the universal dataset areasgo-to-marketintended_live
corpus-is-one-fusion-graphThe corpus is one fusion graphdata-disciplinehighintended_live
data-is-truth-docs-are-renderData is the truth; documents are rendersoperating-modelhighintended_live
detection-only-not-mitigationDetection/informational only, never mitigationgo-to-market-compliancehighintended_live
deterministic-firstDeterministic-first; LLM only the gapdata-disciplinehighintended_live
engine-self-healsThe engine self-healsoperating-modelintended_live
entity-resolution-one-patternEntity resolution is one patterndata-disciplineintended_live
export-sequencingExport sequencing: EAR99 first, CARVER gated, AECA §38 company-endinggo-to-market-compliancehighintended_livereview (1)
graph-is-the-jobThe graph is the job — render intelligence, not contentdoctrine-ruleshighintended_live
ground-answers-in-source-of-truthGround answers in the source of truthdoctrine-ruleshighintended_liveSessionStart injection + turn-local self-check (1)
hq-single-run-surfaceHQ is the single run surfaceoperating-modelintended_live
inbound-trust-boundaryTrust boundary on inbounddoctrine-ruleshighintended_livesub-agent (1)
judgment-operator-plus-hq-claudeJudgment = operator + HQ Claudeoperating-modelintended_live
justify-not-proveJustify, not provedata-disciplineintended_live
lineage-chain-must-holdThe lineage chain must holddata-disciplineintended_live
no-untracked-ai-workNo untracked AI workdoctrine-ruleshighintended_liveci-lint (1)
output-is-a-projectionAn output is a projectiondata-disciplineintended_live
provenance-born-at-collectionProvenance is born at collectiondata-disciplineintended_live
provenance-not-verificationProvenance, not verificationdata-disciplinehighintended_live
scope-time-disciplineScope-time discipline; entities are stable nounsdata-disciplineintended_live
vertical-agnostic-platformVertical-agnostic platform, a product lineupplatform-architectureintended_live
vertical-logic-in-product-layerVertical logic in the product layer, never the foundationplatform-architecturehighintended_live

The six enforcement arrays, verbatim from rp_ontology_facets.content->'enforcement':

{
  "canonical-write-invariant": [
    {"mechanism": "code-path", "ref": "canonical writes go through engine's data layer (provenance/resolution); no ad-hoc SQL or scripts that bypass it"},
    {"mechanism": "db-tier",   "ref": "Tier-3 gated tables (agent_types/job_types/recurring_tasks/...) + namespace convention"}
  ],
  "closure-integrity": [
    {"mechanism": "script", "ref": "scripts/force_close.py"},
    {"mechanism": "job",    "ref": "closure_integrity_audit recurring task"}
  ],
  "export-sequencing": [
    {"mechanism": "review", "ref": "retained export counsel; EAR99 self-classification + DDTC CJ filing"}
  ],
  "ground-answers-in-source-of-truth": [
    {"mechanism": "Self-check before any claim about the operation's state, design, or doctrine: the supporting query or file-read must appear earlier in the same turn, before the assertion.",
     "ref": "SessionStart hook injects all enforced tenets into boot context (hooks/session-start.py); HQ main-loop discipline."}
  ],
  "inbound-trust-boundary": [
    {"mechanism": "sub-agent", "ref": "inbound-triage (tool-restricted)"}
  ],
  "no-untracked-ai-work": [
    {"mechanism": "ci-lint", "ref": "engine/tests/test_llm_trace_lint.py"}
  ]
}

3. Procedure catalogue

All 9 rows of rp_ontology_nodes WHERE kind='procedure', with one_liner verbatim. All nine carry authority='source-of-truth' and status='active' on their governance facet.

keynameone_liner
agent-dispatch-rubricAgent dispatch rubric — who does what workRoute work by class: internal strategic agents for judgment, sonnet/haiku tiers for execution/bulk, Codex via dispatch.py for self-contained builds, OpenRouter workers for production pipelines
backlog-and-task-modelBacklog & task modelHow work is classified, queued, seeded, and closed.
buyer-sequenceBuyer sequencePLG + reseller pilot -> SBIR/allied-MoD -> government program-of-record.
directory-editorial-policyDirectory editorial policy — the public surfaceVendor-neutral, provenance-first, facts-cited; gating ladder (facts free, synthesis paid, aggregates never hidden); no modeled numbers ever published; cut-specific lines for public-safety (no militarization editorializing, no tactics) and drone-detection (detection-vs-mitigation legal line, no defeat how-tos)
directory-research-policyDirectory research & enrichment policy — four launch cutsRATIFIED s362: auto-enrichment maintains breadth (mostly $0 deterministic); commissioned research buys depth; steady-state cap ~$80/mo; collection follows the taxonomy (public-safety top priority)
drone-defense-coverageDrone-defense coverage specification (active product line)How the first product line — drone defense + critical-infrastructure exposure — specializes the universal datasets and tiers.
gtm-operational-setupGTM operational layer — setup design + operator checklistSocials (X/LinkedIn ← daily article+map story) + email ops (drones@, sequences, quarantined replies) + CRM-lite; account creation operator-gated
infrastructure-disclosure-gateInfrastructure-assessment disclosure gate (composition test)What infrastructure-exposure content may ship: block on composition (precise geolocation + per-site scoring + vendor-procurement coupling), not on any single factor.
operator-email-syncOperator email sync — decisions over emailBatch decisions into [RP-AI] emails with full document content INLINE; check inbound every wake; act via quarantine triage

Governance metadata on the same nine:

keyareatriggerauthored_lifecycleratified in session
agent-dispatch-rubricintended_live291
backlog-and-task-modelbacklog-task-modelcreating or grooming any backlog rowintended_live285
buyer-sequencego-to-market-compliancego-to-market planningintended_live285
directory-editorial-policyeditorialintended_live362
directory-research-policyeditorialintended_live362
drone-defense-coveragego-to-marketDeciding what to build/groom/enrich for the Drone Intelligence product, or which actors/datasets to prioritize in the drone-defense area.intended_live287
gtm-operational-setupoperating-modelintended_live318
infrastructure-disclosure-gatego-to-market-complianceAny deployment / infrastructure-assessment artifact about a specific site, before it ships to any surface (free, paid, or gated).intended_live287
operator-email-syncintended_live291

4. The goal tree

Nine kind='goal' nodes. The tree is expressed twice in the substrate — once as rp_ontology_nodes.parent_id, and once as part_of edges in rp_ontology_edges. Both agree.

business:robotics.press
└── goal:north-star  — System of record for fielded drone capability + the industrial base
    ├── goal:build-the-graph      — Build & groom the cross-linked capability graph
    ├── goal:ship-data-product    — Ship Drone Intelligence as a data product
    │   ├── goal:layer-1-incident-feed  — Layer 1 — Incident/Threat Feed (ships first)
    │   ├── goal:layer-2-deployments    — Layer 2 — Deployments & Commercial Activity
    │   ├── goal:layer-3-supply-chain   — Layer 3 — Supply Chain
    │   └── goal:layer-0-carver         — Layer 0 — CARVER Exposure (gated upside)
    ├── goal:projection-layer     — Stand up the projection layer
    └── goal:operate-the-factory  — Operationalize the factory — the operator console
keynameone_linerparent
north-starSystem of record for fielded drone capability + the industrial baseWho can field what, in what numbers, with what capability, sourced from where.business:robotics.press
build-the-graphBuild & groom the cross-linked capability graphThe moat an LLM with web search cannot reconstruct on demand.north-star
ship-data-productShip Drone Intelligence as a data productAPI + data subscription sold into the procurement market.north-star
projection-layerStand up the projection layerAnalytics that turn the graph into estimates a buyer pays for.north-star
operate-the-factoryOperationalize the factory — the operator consoleSee the whole factory at a glance; dial, start, and stop every machine from one simple, high-quality console.north-star
layer-0-carverLayer 0 — CARVER Exposure (gated upside)Site-vulnerability map, US-person-only, behind a DDTC commodity-jurisdiction determination.ship-data-product
layer-1-incident-feedLayer 1 — Incident/Threat Feed (ships first)attack_events + CONFLICT_USE signals, daily-refresh API, per-record provenance, cross-linked graph.ship-data-product
layer-2-deploymentsLayer 2 — Deployments & Commercial ActivityWho fielded what, where, under which contract.ship-data-product
layer-3-supply-chainLayer 3 — Supply ChainCounter-drone industrial base + the adversary Shahed/Geran supply chain.ship-data-product

All nine carry authored_lifecycle='intended_live'. One part_of edge into the tree comes from a node that is not a goal: decision:console-control-safety-posture is declared part_of goal:operate-the-factory.

5. Agent roster

The frontmatter of all fourteen files in ~/robotics-press-harness/agents/. Part 3 gives the class split and the Agent-tool grant; the tools string below is the full declaration each definition carries.

agenttoolsmodelmcpServersmaxTurnsmemory
agent-builderRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopus40project
bureau-chiefRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
chief-engineerRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
chief-of-staffRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
communications-directorRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopus50project
contact-graph-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentsonnet40project
editor-in-chiefRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
geospatial-engineerRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchopus50project
inbound-triageRead, Grep, Globsonnet4
infrastructure-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
media-scoutRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchsonnet30project
platform-architectRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
researcherRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchsonnet30project
web-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentsonnet40project

Three distinct tools strings across fourteen definitions. Ten hold the nine-tool grant including Agent; three hold the same grant minus Agent; inbound-triage holds three read-only tools and is the only definition without a memory key.

6. Hook registration

Six scripts exist in ~/robotics-press-harness/hooks/. Four are named in the hooks block of config/settings.json; the other two are invoked by their shell wrappers rather than by the harness.

filebytesregisteredinvoked by
guardrail.sh4,503yesPreToolUse
agent-feed.sh1,916yesPostToolUse
git-event.sh1,818yesPostToolUse
git-event.py1,244nogit-event.sh line 47
session-start.sh2,725yesSessionStart
session-start.py7,613nosession-start.sh line 57

The registration block, verbatim from ~/robotics-press-harness/config/settings.json:

"hooks": {
  "PreToolUse": [
    { "matcher": "Bash|Write",
      "hooks": [ { "type": "command", "command": "bash /home/worker/.claude/hooks/guardrail.sh", "timeout": 5 } ] }
  ],
  "PostToolUse": [
    { "matcher": "*",
      "hooks": [ { "type": "command", "command": "bash /home/worker/.claude/hooks/agent-feed.sh", "timeout": 3 } ] },
    { "matcher": "Bash",
      "hooks": [ { "type": "command", "command": "bash /home/worker/.claude/hooks/git-event.sh", "timeout": 5 } ] }
  ],
  "SessionStart": [
    { "matcher": "*",
      "hooks": [ { "type": "command", "command": "bash /home/worker/.claude/hooks/session-start.sh", "timeout": 10 } ] }
  ]
}

The commands point at ~/.claude/hooks/, which symlinks into the harness repository. The same file holds "defaultMode": "acceptEdits", the permission arrays, and the statusLine command.

7. Per-agent cost

Every agent_slug in eng_llm_traces, ordered by spend. Part 5 ranks the top eleven metered stages; this is all 65, including the slugs that spent nothing. spend is round(sum(cost_usd), 2); mean/call is that figure divided by calls; mean latency is avg(latency_ms) over all statuses, not ok only.

agent_slugcallsspendmean/callmean latency
business_events8,177$262.15$0.032061,947 ms
triage8,584$106.71$0.012435,057 ms
attack_event_enrich29,805$95.99$0.003224,763 ms
conflict_extractor1,264$74.56$0.0589935,519 ms
signal_enricher5,487$60.94$0.011117,678 ms
editorial_qa175$43.04$0.2459479,691 ms
editorial_review1,804$37.67$0.0208819,782 ms
x_search_listener1,166$31.41$0.0269419,236 ms
unknown1,216$28.31$0.0232812,834 ms
cluster_conflict221$27.23$0.12321104,522 ms
analyze443$26.81$0.0605227,468 ms
content_remediation708$16.98$0.0239843,138 ms
enhancer1,414$16.56$0.011717,329 ms
pipeline_qa_sonnet242$16.40$0.0677752,042 ms
discovery1,073$16.39$0.015275,583 ms
email_comms399$14.56$0.0364923,152 ms
classify1,819$12.69$0.006983,107 ms
product_enrich417$12.41$0.0297614,380 ms
qa_remediation789$11.60$0.0147019,614 ms
resolution_fallback913$9.74$0.010673,207 ms
card_composer464$9.60$0.020695,320 ms
structured_data_backfill1,655$9.24$0.005584,853 ms
attack_event_sector7,139$8.84$0.001241,668 ms
signal_scan447$8.21$0.0183716,967 ms
people_extract417$8.16$0.019574,465 ms
campaign_sender1,883$7.12$0.003783,501 ms
product_extract447$3.89$0.008705,425 ms
listen_extract2,333$3.63$0.001562,547 ms
chief-engineer1,720$3.56$0.002071,999 ms
backfill_cut_discriminators234$2.57$0.0109812,111 ms
article_grader123$1.15$0.0093512,887 ms
strategic7$1.06$0.1514369,944 ms
as-built-generator10$1.02$0.1020054,947 ms
kpi_extractor177$0.97$0.005484,963 ms
rp_models_smoke6$0.97$0.1616712,318 ms
intel:cross_entity_synthesis1$0.89$0.89000170,664 ms
freshness_checker145$0.74$0.005105,415 ms
weekly_contact_growth105$0.69$0.006572,202 ms
carver_scorer12$0.45$0.0375040,182 ms
daily-content-agent61$0.44$0.007212,998 ms
consistency_checker13$0.32$0.0246217,990 ms
card_composer_sample19$0.31$0.016325,297 ms
seo_rewrite469$0.24$0.000511,518 ms
weekly_outreach_picker11$0.24$0.0218212,292 ms
pre_publication_gate58$0.20$0.003453,146 ms
intel:bizops_pricing_extract2$0.18$0.0900065,634 ms
business_events_569_verification1$0.17$0.1700051,750 ms
outreach_drafter15$0.11$0.007333,545 ms
intel:claim_verification8$0.07$0.008752,333 ms
outreach20$0.07$0.003503,585 ms
intel:entity_research15$0.04$0.0026728,934 ms
contact_finder27$0.04$0.001482,265 ms
intel:research_planner1$0.03$0.0300030,592 ms
signal_embedder1,260$0.03$0.000021,210 ms
job_health81$0.02$0.00025602 ms
build_runner2$0.02$0.010005,845 ms
test_no_sr1$0.02$0.0200030,578 ms
test_v21$0.01$0.0100023,825 ms
content_remediation_test2$0.01$0.005004,175 ms
hq_valuation_research1$0.00$0.0000023,395 ms
test_with_sr1$0.00$0.000004,073 ms
intel:reflection1$0.00$0.000004,798 ms
intel:smoke_test1$0.00$0.000001,307 ms
biz:factcheck81$0.00$0.000005,476 ms
codex_dispatch20$0.00$0.00000975,608 ms

Six slugs spent less than half a cent in total and round to $0.00 above: hq_valuation_research $0.004313, test_with_sr $0.003549, intel:reflection $0.002134, intel:smoke_test $0.000068, and two at exactly zero — biz:factcheck (81 calls) and codex_dispatch (20 calls, a flat-rate subscription runtime that wrote trace rows carrying tokens and latency but no cost).

8. Facet catalogue

Seventeen dimensions and 247 values. Part 1 gives the dimension shape; this adds the display label, the widget, the sort order used for rendering, and the count of distinct published companies carrying at least one value from each dimension.

dimensionlabelwidgetsort_orderis_hierarchicalindexablevaluesdistinct companies
use_caseUse case / missioncheckbox0falsetrue111,021
platform_categoryPlatform categorycheckbox1truetrue221,182
sectorSector / applicationcheckbox2truetrue121,704
supply_chain_roleSupply-chain rolecheckbox3falsefalse68
capabilityCapabilitycheckbox4truefalse107868
geographyGeographycheckbox5truetrue7623
business_modelBusiness modelcheckbox10falsetrue5912
deployment_formDeployment formcheckbox11falsetrue4243
cuas_functionC-UAS functioncheckbox12falsetrue4251
cuas_legal_classC-UAS legal classcheckbox13falsetrue2245
asset_classAsset classcheckbox14falsetrue12258
inspection_modalityInspection modalitycheckbox15falsetrue9286
psr_disciplinePublic-safety disciplinecheckbox16falsetrue858
grant_programGrant programcheckbox17falsetrue1037
end_marketEnd marketcheckbox18falsetrue100
owner_typeOwner / operator typecheckbox19falsetrue30
funding_sourceFunding sourcecheckbox20falsetrue1567

All 247 values, grouped by dimension in render order and ranked within a dimension by company count. companies counts rows in entity_facets with entity_type='company'; parent is facet_values.parent_id resolved to its key.

dimensionvaluelabelparentcompanies
use_casesecurity-robotsSecurity & perimeter robots531
use_casewarehouse-robotsWarehouse & intralogistics robots361
use_casedrone-detectionDrone detection & airspace protection307
use_caseasset-inspectionAsset inspection & integrity260
use_casepublic-safety-robotsPublic-safety & emergency-response robots82
use_casecleaning-robotsCleaning robots0
use_casefield-robotsField & agricultural robots0
use_casegrounds-robotsGrounds & landscape robots0
use_casejobsite-robotsJobsite & construction robots0
use_casemine-haulageAutonomous mine haulage0
use_caseyard-logisticsYard logistics0
platform_categorysoftwareSoftware860
platform_categoryfixed-wingFixed-wing UAVdrone352
platform_categorydroneDrone / UAV340
platform_categorysensorSensor286
platform_categoryugv-amrUGV / AMR271
platform_categoryhandheldHandheld device151
platform_categoryuuvUUV / subsea77
platform_categoryusv-marineUSV / marine surface69
platform_categoryinterceptorInterceptor UAVdrone5
platform_categoryloitering-munitionLoitering munitiondrone5
platform_categoryucavUCAVdrone5
platform_categorycruise-missileCruise missile4
platform_categoryrecon-uavReconnaissance UAVdrone4
platform_categoryballistic-missileBallistic missile2
platform_categoryc2-ewC2 / electronic warfare1
platform_categorydecoyDecoy1
platform_categoryfpvFPV dronedrone1
platform_categoryactuatorActuator0
platform_categoryhumanoidHumanoid0
platform_categorymanipulator-armManipulator / arm0
platform_categorymultirotorMultirotor UAVdrone0
platform_categorysubsystem-componentSubsystem / component0
sectordefenseDefense1,079
sectorsecuritySecurity715
sectorinfrastructureInfrastructure575
sectorinspectionInspection69
sectoragricultureAgriculture0
sectorconstructionConstruction0
sectordeliveryDelivery0
sectorenergyEnergy0
sectorhealthcareHealthcare0
sectorlogisticsLogistics / warehouse0
sectormapping-surveyMapping / survey0
sectormaritimeMaritime0
supply_chain_rolecomponent-supplierComponent supplier8
supply_chain_roledistributorDistributor0
supply_chain_roleintegratorIntegrator0
supply_chain_roleoemOEM0
supply_chain_roleservice-providerService provider0
supply_chain_rolesoftware-vendorSoftware vendor0
capabilityautonomy-softwareAutonomy & Software742
capabilityc2-fleet-managementC2 / Fleet Managementautonomy-software615
capabilitypatrol-surveillancePatrol & Surveillance581
capabilitynavigationNavigationautonomy-software540
capabilitydetectionDetection532
capabilityvisual-detectionVisual Detectiondetection505
capabilityobstacle-avoidanceObstacle avoidancenavigation492
capabilitymission-planningMission planningc2-fleet-management483
capabilityperimeter-patrolPerimeter Patrolpatrol-surveillance477
capabilityautonomous-route-followingAutonomous route followingperimeter-patrol471
capabilityai-analyticsAI / Analyticsautonomy-software408
capabilitycombat-supportCombat Support360
capabilitycommand-and-controlCommand and controlc2-fleet-management355
capabilitymulti-sensor-fusionMulti-sensor fusionvisual-detection328
capabilitycomputer-visionComputer visionai-analytics306
capabilityarea-monitoringArea Monitoringpatrol-surveillance300
capabilitythermal-imagingThermal imagingvisual-detection290
capabilitypersistent-isrPersistent ISRarea-monitoring252
capabilitygps-denied-navigationGPS-denied navigationnavigation238
capabilityslamSLAMnavigation236
capabilitylogisticsLogisticscombat-support219
capabilityload-carryingLoad carryinglogistics214
capabilityinspectionInspection194
capabilitymulti-robot-orchestrationMulti-robot orchestrationc2-fleet-management189
capabilitywide-area-surveillanceWide-area surveillancearea-monitoring179
capabilitylidar-mappingLIDAR mappingvisual-detection178
capabilityarmed-strikeArmed / Strikecombat-support163
capabilityswarm-coordinationSwarm coordinationc2-fleet-management156
capabilityneutralizationNeutralization141
capabilityrf-detectionRF Detectiondetection137
capabilitydata-fusionData fusionai-analytics128
capabilitydrone-signal-detectionDrone signal detectionrf-detection127
capabilitythreat-classificationThreat classificationai-analytics120
capabilitykinetic-defeatKinetic Defeatneutralization113
capabilitysubsea-inspectionSubsea Inspectioninspection106
capabilityloitering-munitionsLoitering munitionsarmed-strike105
capabilityweapons-integrationWeapons integrationarmed-strike100
capabilitydrone-on-droneDrone-on-dronekinetic-defeat76
capabilityterrain-followingTerrain followingnavigation76
capabilityseabed-surveySeabed surveysubsea-inspection73
capabilitygeofenced-patrolGeofenced patrolperimeter-patrol71
capabilitypipeline-utilityPipeline & Utilityinspection64
capabilityprojectile-interceptProjectile interceptkinetic-defeat64
capabilityradarRadardetection64
capabilitystructural-inspectionStructural Inspectioninspection61
capabilitycamera-based-identificationCamera-based identificationvisual-detection60
capability3d-tracking3D trackingradar59
capabilitycyber-defeatCyber Defeatneutralization57
capabilityforced-landingForced landingcyber-defeat57
capabilityrf-jammingRF Jammingneutralization55
capabilityunderwater-hullUnderwater hullsubsea-inspection54
capabilitydirection-findingDirection findingrf-detection51
capabilitycrack-detectionCrack detectionstructural-inspection50
capabilityeod-deminingEOD / Deminingcombat-support46
capabilityremote-weapon-stationsRemote weapon stationsarmed-strike46
capabilitycorrosion-mappingCorrosion mappingstructural-inspection44
capabilityoilgas-pipelineOil/gas pipelinepipeline-utility41
capabilitypredictive-maintenancePredictive maintenanceai-analytics36
capabilitycable-pipelineCable / pipelinesubsea-inspection34
capabilitysignal-classificationSignal classificationrf-detection34
capabilitydirected-energyDirected energykinetic-defeat33
capabilityexplosive-ordnance-disposalExplosive ordnance disposaleod-demining33
capabilityspectrum-analysisSpectrum analysisrf-detection30
capabilitypower-linePower linepipeline-utility29
capabilitymine-clearanceMine clearanceeod-demining28
capabilityautonomous-resupplyAutonomous resupplylogistics26
capabilitymicro-dopplerMicro-Dopplerradar22
capabilityoffshore-platformOffshore platformsubsea-inspection21
capabilitysmart-jammingSmart jammingrf-jamming21
capabilitycasualty-evacuationCasualty evacuationlogistics19
capabilityprotocol-disruptionProtocol disruptionrf-jamming19
capabilitygps-denialGPS denialrf-jamming17
capabilityphased-arrayPhased arrayradar17
capabilitywind-turbineWind turbinepipeline-utility17
capabilitybridge-building-dam-tunnelBridge / building / dam / tunnelstructural-inspection14
capabilityacoustic-detectionAcoustic Detectiondetection13
capabilityprotocol-takeoverProtocol takeovercyber-defeat12
capabilityanomaly-detectionAnomaly detectionperimeter-patrol11
capabilitysolar-panelSolar panelpipeline-utility10
capabilitymicrophone-arraysMicrophone arraysacoustic-detection9
capabilityhazmat-responseHazmat response8
capabilityfirefightingFirefighting7
capabilitynet-captureNet capturekinetic-defeat7
capabilitysound-signature-matchingSound signature matchingacoustic-detection7
capabilitytactical-recon-throwbotTactical reconnaissance / throwbot7
capabilityspoofingSpoofingcyber-defeat6
capabilityurban-search-rescueUrban search & rescue6
capabilitybehavioral-analyticsBehavioral analyticsarea-monitoring5
capabilityied-neutralizationIED neutralizationeod-demining4
capabilityfmcwFMCWradar3
capabilityeo-ir-detectionEO/IR detection2
capabilityautonomous-haulageAutonomous haulage0
capabilitybricklayingBricklaying0
capabilityconstruction-layoutConstruction layout0
capabilitycrop-scoutingCrop scouting0
capabilitycrop-sprayingCrop spraying0
capabilitydemolition-roboticsDemolition robotics0
capabilitydisinfectionDisinfection0
capabilityearthmoving-autonomyEarthmoving autonomy0
capabilityfloor-cleaningFloor cleaning0
capabilityharvestingHarvesting0
capabilitymechanical-weedingMechanical weeding0
capabilitymowingMowing0
capabilityrebar-workRebar work0
capabilityunderground-lhdUnderground LHD0
capabilitywindow-cleaningWindow cleaning0
capabilityyard-truck-autonomyYard-truck autonomy0
geographynorth-americaNorth America441
geographyeuropeEurope267
geographyasia-pacificAsia-Pacific181
geographymiddle-eastMiddle East53
geographyoceaniaOceania26
geographyafricaAfrica22
geographylatin-americaLatin America11
business_modelproduct-saleProduct / hardware sale490
business_modelintegrated-serviceIntegrated service / managed operations259
business_modelsoftware-saasSoftware / SaaS152
business_modelhardware-plus-subscriptionHardware + software subscription136
business_modelraasRobotics-as-a-Service (RaaS)123
deployment_formmobileMobile / vehicle-mounted166
deployment_formfixed-siteFixed / permanent installation107
deployment_formportablePortable / man-portable89
deployment_formrapid-deployRapid-deployable / temporary26
cuas_functiondetectDetect218
cuas_functiondefeatDefeat / mitigate114
cuas_functionidentifyIdentify / classify96
cuas_functiontrackTrack / locate83
cuas_legal_classmitigation-capableMitigation-capable (kinetic/RF defeat)127
cuas_legal_classdetection-onlyDetection-only (no mitigation)119
asset_classpower-transmissionPower transmission & distribution73
asset_classoil-gas-pipelineOil & gas pipelines66
asset_classoffshore-marineOffshore & marine64
asset_classsubseaSubsea / underwater64
asset_classsolar-pvSolar / PV38
asset_classwind-turbineWind turbines35
asset_classpressure-vessel-tankTanks & pressure vessels33
asset_classbridge-civilBridges & civil structures27
asset_classrail-infrastructureRail infrastructure16
asset_classroad-pavementRoads & pavement15
asset_classtelecom-towerTelecom towers11
asset_classbuilding-envelopeBuilding envelope / facade8
inspection_modalityvisual-rgbVisual / RGB236
inspection_modalitylidarLiDAR / 3D104
inspection_modalitythermal-irThermal / infrared62
inspection_modalityphotogrammetryPhotogrammetry40
inspection_modalityultrasonic-utUltrasonic (UT)37
inspection_modalityacoustic-emissionAcoustic emission17
inspection_modalityeddy-currentEddy current / magnetic13
inspection_modalitygas-leakGas / leak sensing10
inspection_modalityradiographicRadiographic / X-ray10
psr_disciplineeodEOD / bomb squad26
psr_disciplineusarUrban search & rescue16
psr_disciplinetactical-reconTactical reconnaissance / throwbot15
psr_disciplinecasualty-evacCasualty evacuation12
psr_disciplinehazmatHAZMAT response8
psr_disciplinefirefightingFirefighting7
psr_disciplinedfrDrone as first responder (DFR)0
psr_disciplinele-patrolLaw enforcement / patrol support0
grant_programhsgpHSGP (Homeland Security Grant Program)27
grant_programshspSHSP (State Homeland Security Program)26
grant_programuasiUASI (Urban Area Security Initiative)26
grant_programdod-1033DoD 1033 program23
grant_programafgAFG (Assistance to Firefighters Grants)16
grant_programbyrne-jagByrne-JAG7
grant_programsaferSAFER (firefighter staffing grants)7
grant_programfema-cuasFEMA C-UAS appropriations0
grant_programsourcewellSourcewell cooperative purchasing0
grant_programspireSPIRE / rural EMS0
end_marketairportAirports & airfields0
end_marketcommercialCommercial real estate0
end_marketcorrectionsCorrectional facilities0
end_marketdata-centerData centers0
end_marketeventsEvents & mass gatherings0
end_marketinfrastructureCritical infrastructure0
end_marketlogisticsLogistics & distribution0
end_marketutilityUtilities & substations0
end_marketvenueStadiums & venues0
end_marketwarehouseWarehouses0
owner_typeemergency-managementEmergency management0
owner_typefireFire department / fire service0
owner_typelaw-enforcementLaw enforcement0
funding_sourcegrantGrant-funded66
funding_sourcedod-1033DoD 1033 / LESO transfer program1
funding_sourcesaferSAFER1
funding_sourceshspSHSP (State Homeland Security Program)1
funding_sourceuasiUASI (Urban Area Security Initiative)1
funding_sourceafgAssistance to Firefighters Grants0
funding_sourcebyrne-jagByrne-JAG0
funding_sourcecooperative-purchasingCooperative purchasing vehicle0
funding_sourcefemaFEMA funding0
funding_sourcefema-cuasFEMA C-UAS appropriations0
funding_sourcegovernment-appropriationGovernment appropriation0
funding_sourcehsgpHSGP (Homeland Security Grant Program)0
funding_sourceport-securityPort Security Grant Program0
funding_sourcesourcewellSourcewell cooperative purchasing0
funding_sourcespireOregon SPIRE0

9. Backlog classification rubric

The definitions behind the three mandatory axes, from decisions/2026-04-26-backlog-triage-rubric.md. Part 4 gives the axis values; these are the membership rules that decided which value a row got.

tiernamewhat belongs here
T1DurabilityData integrity, idempotency, dedup invariants, schema correctness, write safety, recovery from failure, rollback safety, canonical-write-invariant violations, silent-failure bugs, content-pipeline reject loops, anything that risks losing or corrupting state.
T2LeverageScale, simplicity, observability. Platform refactors, schema unification, config-as-data extraction, queue/state-machine work, structured metrics, modularization, agent framework. The work that makes T1 cheap to maintain and T3 cheap to add.
T3CapabilityNet-new — new beats, new properties, new content types, new agents, new outreach paths, new map layers, new visualizations.
severitymeaningexamples given at ratification
S1Burning — actively losing data, money, or credibility80% reject rate in deployment-report pipeline (#430); silent writeback failure on PUBLISHED articles (#431)
S2Known-bad — degrading slowly, working around it dailyEmail body 2K-char truncation (#468); email_comms.py at 1493 lines (#386)
S3Should-fix — real but not urgentMove report_content cap to job_type config (#438); deduplicate orphaned signal rows
S4Nice-to-have — future leverageBloomberg-density company cards (#251); SEO meta on zero-click pages (#398)
bug         broken thing that should work; production failure; silent error
data        schema, migration, dedup, integrity, canonical write paths
platform    cross-cutting infra: queue, state machine, observability,
            agent framework, refactor for simplicity, modularization
pipeline    content/listener/outreach pipelines, harvest jobs, workflow
feature     net-new capability for users or properties (site, map, dashboard)
content     editorial work, articles, beats, research feeding articles
ops         process, runbooks, deployments, costs, capacity, security ops
docs        documentation, decisions, playbooks, design specs, strategy

The queue order, as specified:

ORDER BY
  CASE tier WHEN 'T1' THEN 1 WHEN 'T2' THEN 2 WHEN 'T3' THEN 3 ELSE 4 END,
  CASE severity WHEN 'S1' THEN 1 WHEN 'S2' THEN 2 WHEN 'S3' THEN 3 WHEN 'S4' THEN 4 ELSE 5 END,
  priority,        -- within-bucket fine-tune; lower wins
  ref              -- stable tiebreaker

Four CHECK constraints on backlog, verbatim from pg_get_constraintdef. Part 4 quotes backlog_open_classified in reduced form; the enforced text carries the enum casts, the changes_requested status, and the clause that closes the grandfathered code category:

CONSTRAINT backlog_tier_check CHECK (
  ((tier IS NULL) OR (tier = ANY (ARRAY['T1'::text, 'T2'::text, 'T3'::text]))))

CONSTRAINT backlog_severity_check CHECK (
  ((severity IS NULL) OR (severity = ANY (ARRAY['S1'::text, 'S2'::text, 'S3'::text, 'S4'::text]))))

CONSTRAINT backlog_category_check CHECK (
  ((category IS NULL) OR (category = ANY (ARRAY['bug'::text, 'data'::text, 'platform'::text,
    'pipeline'::text, 'feature'::text, 'content'::text, 'ops'::text, 'docs'::text, 'code'::text]))))

CONSTRAINT backlog_open_classified CHECK (
  ((status <> ALL (ARRAY['proposed'::sprint_task_status, 'backlog'::sprint_task_status,
    'planned'::sprint_task_status, 'ready'::sprint_task_status, 'in_progress'::sprint_task_status,
    'in_review'::sprint_task_status, 'changes_requested'::sprint_task_status]))
   OR ((tier IS NOT NULL) AND (severity IS NOT NULL) AND (category IS NOT NULL)
       AND (category <> 'code'::text))))

A fifth CHECK constrains the owning repository:

CONSTRAINT backlog_repo_check CHECK (
  ((repo IS NULL) OR (repo = ANY (ARRAY['hq'::text, 'eng'::text, 'pub'::text, 'biz'::text,
    'intel'::text, 'website'::text, 'globe'::text, 'ops'::text, 'toolkit'::text, 'cross'::text,
    'sbx'::text]))))

The sprint_task_status enum holds ten values in declaration order: proposed, backlog, planned, ready, in_progress, done, deferred, failed, changes_requested, in_review. Seven of the ten are open states named by backlog_open_classified; done, deferred and failed are terminal and exempt from the classification requirement.

10. Restoring the cold archive

From ~/archive/mothball-2026-07-24/README.md and ~/robotics-press/docs/MOTHBALL.md. The archive mirrors to r2://rp-backups/mothball-2026-07-24/, a private bucket — r2.dev disabled, no custom domains, verified at archive time. The traces hold full prompts and responses, including anything the inbound-email path handled, which is why they are not in the world-readable asset bucket.

pathcontents
db/full.dumpEvery accessible schema, pg_dump -Fc, 706 MB
db/schema-public.dumpCanonical graph only, 688 MB
db/schema-directory.dumpThe directory keep-set, 18 MB
db/schema-supabase_migrations.dumpMigration history
db/ddl-all.sqlHuman-readable DDL for the whole database
db/rowcounts.csvRow-count census taken at dump time
llm-traces/Gzipped monthly JSONL, plus manifest and README
repos/*.bundleNine git repositories, full history, git bundle --all
machine-state-before-freeze.txtsystemd units, timers and cron as they ran
crontab-before-freeze.bakVerbatim crontab before the freeze
doppler-secret-names.jsonSecret names only, no values
SHA256SUMSChecksums for every artifact

Two extensions are preconditions, and missing either one fails silently in the middle: pg_restore keeps going and produces a database that looks complete.

extensionversion at sourcetables that fail without it
postgis3.3.7deployment_sites, attack_events, conflict_events, infrastructure_seeds
vector (pgvector)0.8.0signals, eng_build_runs, mv_signal_trends

Also present at source, less load-bearing: pg_trgm, pgcrypto, uuid-ossp, pg_stat_statements, supabase_vault. No stock container image ships both PostGIS and pgvector; the archive was restored in two passes and the results unioned.

The second trap is the container init phase. pg_isready returns true against the initialisation server, which is then shut down and restarted — killing any restore in flight. The first verification run appeared to prove the dump was truncated mid-COPY; the harness was wrong, not the artifact. The recipe below waits for the log line instead:

docker run -d --name pg --shm-size=2g -e POSTGRES_PASSWORD=v -e POSTGRES_USER=v \
  postgis/postgis:17-3.5-alpine
# WAIT for the REAL server, not the init-phase one — pg_isready returns true
# during init, and the init server is then shut down, killing any restore in
# flight (this silently truncated a verification run mid-COPY):
until docker logs pg 2>&1 | grep -q "PostgreSQL init process complete"; do sleep 1; done
until docker exec pg pg_isready -U v; do sleep 1; done

docker exec pg psql -U v -d postgres -c "CREATE DATABASE restored;"
docker exec pg psql -U v -d restored -c \
  "CREATE EXTENSION postgis; CREATE EXTENSION pg_trgm; CREATE EXTENSION pgcrypto;"
docker cp db/schema-directory.dump pg:/tmp/d.dump
docker exec pg pg_restore -U v -d restored --no-owner --no-acl /tmp/d.dump

Roughly 28 role "authenticated"/"graph_writer"/"anon" does not exist errors are expected. They are RLS GRANT and POLICY statements against roles that do not exist in a fresh container, they lose no data, and pg_restore exits 1 regardless. The restore is judged by row counts, not by exit code.

Reversing the freeze, if the machine were still standing — unit files were left on disk and the freeze only stopped and disabled them:

crontab ~/archive/mothball-2026-07-24/crontab-before-freeze.bak
systemctl --user enable --now rp-listen rp-corpus rp-heartbeat rp-engine-api rp-observer
systemctl --user enable --now rp-telemetry.timer rp-doc-generation.timer rp-control-drain.timer

The structure at four layers

A summary of the form each layer settled on, retained here because it is the only place in the series that states all four together. It is a characterisation of design decisions, not a measurement.

layerstructure
Data modelone shared entity graph, typed facet edges attached; a new vertical is a config row
Harnessthree general agent classes with capability grants, isolation per unit of work
Knowledge systemone node table across goals, rules, code, decisions, sessions, work
Corpus surfaceone fact layer legible to both readers; synthesis built on top

Each was reached by building a specific version first and extracting the general one afterward.


Back to: Part 1 — the data model