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-market—intended_live—
agents-earn-their-keepAgents are rows that earn their keepoperating-model—intended_live—
analyst-voiceAnalyst voice — quantitative, global, calibrated, sourcedgo-to-market—intended_live—
bet-on-product-not-platformBet on the product, not the platformplatform-architecture—intended_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-market—intended_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-model—intended_live—
entity-resolution-one-patternEntity resolution is one patterndata-discipline—intended_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-model—intended_live—
inbound-trust-boundaryTrust boundary on inbounddoctrine-ruleshighintended_livesub-agent (1)
judgment-operator-plus-hq-claudeJudgment = operator + HQ Claudeoperating-model—intended_live—
justify-not-proveJustify, not provedata-discipline—intended_live—
lineage-chain-must-holdThe lineage chain must holddata-discipline—intended_live—
no-untracked-ai-workNo untracked AI workdoctrine-ruleshighintended_liveci-lint (1)
output-is-a-projectionAn output is a projectiondata-discipline—intended_live—
provenance-born-at-collectionProvenance is born at collectiondata-discipline—intended_live—
provenance-not-verificationProvenance, not verificationdata-disciplinehighintended_live—
scope-time-disciplineScope-time discipline; entities are stable nounsdata-discipline—intended_live—
vertical-agnostic-platformVertical-agnostic platform, a product lineupplatform-architecture—intended_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-rubric——intended_live291
backlog-and-task-modelbacklog-task-modelcreating or grooming any backlog rowintended_live285
buyer-sequencego-to-market-compliancego-to-market planningintended_live285
directory-editorial-policyeditorial—intended_live362
directory-research-policyeditorial—intended_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-model—intended_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-sync——intended_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, Agentopus—40project
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, Agentopus—50project
contact-graph-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentsonnet—40project
editor-in-chiefRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
geospatial-engineerRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchopus—50project
inbound-triageRead, Grep, Globsonnet—4—
infrastructure-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
media-scoutRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchsonnet—30project
platform-architectRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentopuspostgres50project
researcherRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearchsonnet—30project
web-analystRead, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agentsonnet—40project

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 robots—531
use_casewarehouse-robotsWarehouse & intralogistics robots—361
use_casedrone-detectionDrone detection & airspace protection—307
use_caseasset-inspectionAsset inspection & integrity—260
use_casepublic-safety-robotsPublic-safety & emergency-response robots—82
use_casecleaning-robotsCleaning robots—0
use_casefield-robotsField & agricultural robots—0
use_casegrounds-robotsGrounds & landscape robots—0
use_casejobsite-robotsJobsite & construction robots—0
use_casemine-haulageAutonomous mine haulage—0
use_caseyard-logisticsYard logistics—0
platform_categorysoftwareSoftware—860
platform_categoryfixed-wingFixed-wing UAVdrone352
platform_categorydroneDrone / UAV—340
platform_categorysensorSensor—286
platform_categoryugv-amrUGV / AMR—271
platform_categoryhandheldHandheld device—151
platform_categoryuuvUUV / subsea—77
platform_categoryusv-marineUSV / marine surface—69
platform_categoryinterceptorInterceptor UAVdrone5
platform_categoryloitering-munitionLoitering munitiondrone5
platform_categoryucavUCAVdrone5
platform_categorycruise-missileCruise missile—4
platform_categoryrecon-uavReconnaissance UAVdrone4
platform_categoryballistic-missileBallistic missile—2
platform_categoryc2-ewC2 / electronic warfare—1
platform_categorydecoyDecoy—1
platform_categoryfpvFPV dronedrone1
platform_categoryactuatorActuator—0
platform_categoryhumanoidHumanoid—0
platform_categorymanipulator-armManipulator / arm—0
platform_categorymultirotorMultirotor UAVdrone0
platform_categorysubsystem-componentSubsystem / component—0
sectordefenseDefense—1,079
sectorsecuritySecurity—715
sectorinfrastructureInfrastructure—575
sectorinspectionInspection—69
sectoragricultureAgriculture—0
sectorconstructionConstruction—0
sectordeliveryDelivery—0
sectorenergyEnergy—0
sectorhealthcareHealthcare—0
sectorlogisticsLogistics / warehouse—0
sectormapping-surveyMapping / survey—0
sectormaritimeMaritime—0
supply_chain_rolecomponent-supplierComponent supplier—8
supply_chain_roledistributorDistributor—0
supply_chain_roleintegratorIntegrator—0
supply_chain_roleoemOEM—0
supply_chain_roleservice-providerService provider—0
supply_chain_rolesoftware-vendorSoftware vendor—0
capabilityautonomy-softwareAutonomy & Software—742
capabilityc2-fleet-managementC2 / Fleet Managementautonomy-software615
capabilitypatrol-surveillancePatrol & Surveillance—581
capabilitynavigationNavigationautonomy-software540
capabilitydetectionDetection—532
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 Support—360
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
capabilityinspectionInspection—194
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
capabilityneutralizationNeutralization—141
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 response—8
capabilityfirefightingFirefighting—7
capabilitynet-captureNet capturekinetic-defeat7
capabilitysound-signature-matchingSound signature matchingacoustic-detection7
capabilitytactical-recon-throwbotTactical reconnaissance / throwbot—7
capabilityspoofingSpoofingcyber-defeat6
capabilityurban-search-rescueUrban search & rescue—6
capabilitybehavioral-analyticsBehavioral analyticsarea-monitoring5
capabilityied-neutralizationIED neutralizationeod-demining4
capabilityfmcwFMCWradar3
capabilityeo-ir-detectionEO/IR detection—2
capabilityautonomous-haulageAutonomous haulage—0
capabilitybricklayingBricklaying—0
capabilityconstruction-layoutConstruction layout—0
capabilitycrop-scoutingCrop scouting—0
capabilitycrop-sprayingCrop spraying—0
capabilitydemolition-roboticsDemolition robotics—0
capabilitydisinfectionDisinfection—0
capabilityearthmoving-autonomyEarthmoving autonomy—0
capabilityfloor-cleaningFloor cleaning—0
capabilityharvestingHarvesting—0
capabilitymechanical-weedingMechanical weeding—0
capabilitymowingMowing—0
capabilityrebar-workRebar work—0
capabilityunderground-lhdUnderground LHD—0
capabilitywindow-cleaningWindow cleaning—0
capabilityyard-truck-autonomyYard-truck autonomy—0
geographynorth-americaNorth America—441
geographyeuropeEurope—267
geographyasia-pacificAsia-Pacific—181
geographymiddle-eastMiddle East—53
geographyoceaniaOceania—26
geographyafricaAfrica—22
geographylatin-americaLatin America—11
business_modelproduct-saleProduct / hardware sale—490
business_modelintegrated-serviceIntegrated service / managed operations—259
business_modelsoftware-saasSoftware / SaaS—152
business_modelhardware-plus-subscriptionHardware + software subscription—136
business_modelraasRobotics-as-a-Service (RaaS)—123
deployment_formmobileMobile / vehicle-mounted—166
deployment_formfixed-siteFixed / permanent installation—107
deployment_formportablePortable / man-portable—89
deployment_formrapid-deployRapid-deployable / temporary—26
cuas_functiondetectDetect—218
cuas_functiondefeatDefeat / mitigate—114
cuas_functionidentifyIdentify / classify—96
cuas_functiontrackTrack / locate—83
cuas_legal_classmitigation-capableMitigation-capable (kinetic/RF defeat)—127
cuas_legal_classdetection-onlyDetection-only (no mitigation)—119
asset_classpower-transmissionPower transmission & distribution—73
asset_classoil-gas-pipelineOil & gas pipelines—66
asset_classoffshore-marineOffshore & marine—64
asset_classsubseaSubsea / underwater—64
asset_classsolar-pvSolar / PV—38
asset_classwind-turbineWind turbines—35
asset_classpressure-vessel-tankTanks & pressure vessels—33
asset_classbridge-civilBridges & civil structures—27
asset_classrail-infrastructureRail infrastructure—16
asset_classroad-pavementRoads & pavement—15
asset_classtelecom-towerTelecom towers—11
asset_classbuilding-envelopeBuilding envelope / facade—8
inspection_modalityvisual-rgbVisual / RGB—236
inspection_modalitylidarLiDAR / 3D—104
inspection_modalitythermal-irThermal / infrared—62
inspection_modalityphotogrammetryPhotogrammetry—40
inspection_modalityultrasonic-utUltrasonic (UT)—37
inspection_modalityacoustic-emissionAcoustic emission—17
inspection_modalityeddy-currentEddy current / magnetic—13
inspection_modalitygas-leakGas / leak sensing—10
inspection_modalityradiographicRadiographic / X-ray—10
psr_disciplineeodEOD / bomb squad—26
psr_disciplineusarUrban search & rescue—16
psr_disciplinetactical-reconTactical reconnaissance / throwbot—15
psr_disciplinecasualty-evacCasualty evacuation—12
psr_disciplinehazmatHAZMAT response—8
psr_disciplinefirefightingFirefighting—7
psr_disciplinedfrDrone as first responder (DFR)—0
psr_disciplinele-patrolLaw enforcement / patrol support—0
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 program—23
grant_programafgAFG (Assistance to Firefighters Grants)—16
grant_programbyrne-jagByrne-JAG—7
grant_programsaferSAFER (firefighter staffing grants)—7
grant_programfema-cuasFEMA C-UAS appropriations—0
grant_programsourcewellSourcewell cooperative purchasing—0
grant_programspireSPIRE / rural EMS—0
end_marketairportAirports & airfields—0
end_marketcommercialCommercial real estate—0
end_marketcorrectionsCorrectional facilities—0
end_marketdata-centerData centers—0
end_marketeventsEvents & mass gatherings—0
end_marketinfrastructureCritical infrastructure—0
end_marketlogisticsLogistics & distribution—0
end_marketutilityUtilities & substations—0
end_marketvenueStadiums & venues—0
end_marketwarehouseWarehouses—0
owner_typeemergency-managementEmergency management—0
owner_typefireFire department / fire service—0
owner_typelaw-enforcementLaw enforcement—0
funding_sourcegrantGrant-funded—66
funding_sourcedod-1033DoD 1033 / LESO transfer program—1
funding_sourcesaferSAFER—1
funding_sourceshspSHSP (State Homeland Security Program)—1
funding_sourceuasiUASI (Urban Area Security Initiative)—1
funding_sourceafgAssistance to Firefighters Grants—0
funding_sourcebyrne-jagByrne-JAG—0
funding_sourcecooperative-purchasingCooperative purchasing vehicle—0
funding_sourcefemaFEMA funding—0
funding_sourcefema-cuasFEMA C-UAS appropriations—0
funding_sourcegovernment-appropriationGovernment appropriation—0
funding_sourcehsgpHSGP (Homeland Security Grant Program)—0
funding_sourceport-securityPort Security Grant Program—0
funding_sourcesourcewellSourcewell cooperative purchasing—0
funding_sourcespireOregon SPIRE—0

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