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.
key | name | area | severity | authored_lifecycle | enforcement |
|---|---|---|---|---|---|
actor-narrative-arc | Actor narrative-arc framework | go-to-market | — | intended_live | — |
agents-earn-their-keep | Agents are rows that earn their keep | operating-model | — | intended_live | — |
analyst-voice | Analyst voice — quantitative, global, calibrated, sourced | go-to-market | — | intended_live | — |
bet-on-product-not-platform | Bet on the product, not the platform | platform-architecture | — | intended_live | — |
canonical-write-invariant | Canonical write invariant | doctrine-rules | high | intended_live | code-path, db-tier (2) |
closure-integrity | Closure integrity | doctrine-rules | high | intended_live | script, job (2) |
corpus-coverage-doctrine | Corpus coverage doctrine — the universal dataset areas | go-to-market | — | intended_live | — |
corpus-is-one-fusion-graph | The corpus is one fusion graph | data-discipline | high | intended_live | — |
data-is-truth-docs-are-render | Data is the truth; documents are renders | operating-model | high | intended_live | — |
detection-only-not-mitigation | Detection/informational only, never mitigation | go-to-market-compliance | high | intended_live | — |
deterministic-first | Deterministic-first; LLM only the gap | data-discipline | high | intended_live | — |
engine-self-heals | The engine self-heals | operating-model | — | intended_live | — |
entity-resolution-one-pattern | Entity resolution is one pattern | data-discipline | — | intended_live | — |
export-sequencing | Export sequencing: EAR99 first, CARVER gated, AECA §38 company-ending | go-to-market-compliance | high | intended_live | review (1) |
graph-is-the-job | The graph is the job — render intelligence, not content | doctrine-rules | high | intended_live | — |
ground-answers-in-source-of-truth | Ground answers in the source of truth | doctrine-rules | high | intended_live | SessionStart injection + turn-local self-check (1) |
hq-single-run-surface | HQ is the single run surface | operating-model | — | intended_live | — |
inbound-trust-boundary | Trust boundary on inbound | doctrine-rules | high | intended_live | sub-agent (1) |
judgment-operator-plus-hq-claude | Judgment = operator + HQ Claude | operating-model | — | intended_live | — |
justify-not-prove | Justify, not prove | data-discipline | — | intended_live | — |
lineage-chain-must-hold | The lineage chain must hold | data-discipline | — | intended_live | — |
no-untracked-ai-work | No untracked AI work | doctrine-rules | high | intended_live | ci-lint (1) |
output-is-a-projection | An output is a projection | data-discipline | — | intended_live | — |
provenance-born-at-collection | Provenance is born at collection | data-discipline | — | intended_live | — |
provenance-not-verification | Provenance, not verification | data-discipline | high | intended_live | — |
scope-time-discipline | Scope-time discipline; entities are stable nouns | data-discipline | — | intended_live | — |
vertical-agnostic-platform | Vertical-agnostic platform, a product lineup | platform-architecture | — | intended_live | — |
vertical-logic-in-product-layer | Vertical logic in the product layer, never the foundation | platform-architecture | high | intended_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.
key | name | one_liner |
|---|---|---|
agent-dispatch-rubric | Agent dispatch rubric — who does what work | Route 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-model | Backlog & task model | How work is classified, queued, seeded, and closed. |
buyer-sequence | Buyer sequence | PLG + reseller pilot -> SBIR/allied-MoD -> government program-of-record. |
directory-editorial-policy | Directory editorial policy — the public surface | Vendor-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-policy | Directory research & enrichment policy — four launch cuts | RATIFIED 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-coverage | Drone-defense coverage specification (active product line) | How the first product line — drone defense + critical-infrastructure exposure — specializes the universal datasets and tiers. |
gtm-operational-setup | GTM operational layer — setup design + operator checklist | Socials (X/LinkedIn ← daily article+map story) + email ops (drones@, sequences, quarantined replies) + CRM-lite; account creation operator-gated |
infrastructure-disclosure-gate | Infrastructure-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-sync | Operator email sync — decisions over email | Batch decisions into [RP-AI] emails with full document content INLINE; check inbound every wake; act via quarantine triage |
Governance metadata on the same nine:
key | area | trigger | authored_lifecycle | ratified in session |
|---|---|---|---|---|
agent-dispatch-rubric | — | — | intended_live | 291 |
backlog-and-task-model | backlog-task-model | creating or grooming any backlog row | intended_live | 285 |
buyer-sequence | go-to-market-compliance | go-to-market planning | intended_live | 285 |
directory-editorial-policy | editorial | — | intended_live | 362 |
directory-research-policy | editorial | — | intended_live | 362 |
drone-defense-coverage | go-to-market | Deciding what to build/groom/enrich for the Drone Intelligence product, or which actors/datasets to prioritize in the drone-defense area. | intended_live | 287 |
gtm-operational-setup | operating-model | — | intended_live | 318 |
infrastructure-disclosure-gate | go-to-market-compliance | Any deployment / infrastructure-assessment artifact about a specific site, before it ships to any surface (free, paid, or gated). | intended_live | 287 |
operator-email-sync | — | — | intended_live | 291 |
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
key | name | one_liner | parent |
|---|---|---|---|
north-star | System of record for fielded drone capability + the industrial base | Who can field what, in what numbers, with what capability, sourced from where. | business:robotics.press |
build-the-graph | Build & groom the cross-linked capability graph | The moat an LLM with web search cannot reconstruct on demand. | north-star |
ship-data-product | Ship Drone Intelligence as a data product | API + data subscription sold into the procurement market. | north-star |
projection-layer | Stand up the projection layer | Analytics that turn the graph into estimates a buyer pays for. | north-star |
operate-the-factory | Operationalize the factory — the operator console | See the whole factory at a glance; dial, start, and stop every machine from one simple, high-quality console. | north-star |
layer-0-carver | Layer 0 — CARVER Exposure (gated upside) | Site-vulnerability map, US-person-only, behind a DDTC commodity-jurisdiction determination. | ship-data-product |
layer-1-incident-feed | Layer 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-deployments | Layer 2 — Deployments & Commercial Activity | Who fielded what, where, under which contract. | ship-data-product |
layer-3-supply-chain | Layer 3 — Supply Chain | Counter-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.
| agent | tools | model | mcpServers | maxTurns | memory |
|---|---|---|---|---|---|
agent-builder | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | — | 40 | project |
bureau-chief | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
chief-engineer | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
chief-of-staff | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
communications-director | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | — | 50 | project |
contact-graph-analyst | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | sonnet | — | 40 | project |
editor-in-chief | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
geospatial-engineer | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch | opus | — | 50 | project |
inbound-triage | Read, Grep, Glob | sonnet | — | 4 | — |
infrastructure-analyst | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
media-scout | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch | sonnet | — | 30 | project |
platform-architect | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | opus | postgres | 50 | project |
researcher | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch | sonnet | — | 30 | project |
web-analyst | Read, Write, Edit, Bash, Grep, Glob, WebFetch, WebSearch, Agent | sonnet | — | 40 | project |
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.
| file | bytes | registered | invoked by |
|---|---|---|---|
guardrail.sh | 4,503 | yes | PreToolUse |
agent-feed.sh | 1,916 | yes | PostToolUse |
git-event.sh | 1,818 | yes | PostToolUse |
git-event.py | 1,244 | no | git-event.sh line 47 |
session-start.sh | 2,725 | yes | SessionStart |
session-start.py | 7,613 | no | session-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_slug | calls | spend | mean/call | mean latency |
|---|---|---|---|---|
business_events | 8,177 | $262.15 | $0.03206 | 1,947 ms |
triage | 8,584 | $106.71 | $0.01243 | 5,057 ms |
attack_event_enrich | 29,805 | $95.99 | $0.00322 | 4,763 ms |
conflict_extractor | 1,264 | $74.56 | $0.05899 | 35,519 ms |
signal_enricher | 5,487 | $60.94 | $0.01111 | 7,678 ms |
editorial_qa | 175 | $43.04 | $0.24594 | 79,691 ms |
editorial_review | 1,804 | $37.67 | $0.02088 | 19,782 ms |
x_search_listener | 1,166 | $31.41 | $0.02694 | 19,236 ms |
unknown | 1,216 | $28.31 | $0.02328 | 12,834 ms |
cluster_conflict | 221 | $27.23 | $0.12321 | 104,522 ms |
analyze | 443 | $26.81 | $0.06052 | 27,468 ms |
content_remediation | 708 | $16.98 | $0.02398 | 43,138 ms |
enhancer | 1,414 | $16.56 | $0.01171 | 7,329 ms |
pipeline_qa_sonnet | 242 | $16.40 | $0.06777 | 52,042 ms |
discovery | 1,073 | $16.39 | $0.01527 | 5,583 ms |
email_comms | 399 | $14.56 | $0.03649 | 23,152 ms |
classify | 1,819 | $12.69 | $0.00698 | 3,107 ms |
product_enrich | 417 | $12.41 | $0.02976 | 14,380 ms |
qa_remediation | 789 | $11.60 | $0.01470 | 19,614 ms |
resolution_fallback | 913 | $9.74 | $0.01067 | 3,207 ms |
card_composer | 464 | $9.60 | $0.02069 | 5,320 ms |
structured_data_backfill | 1,655 | $9.24 | $0.00558 | 4,853 ms |
attack_event_sector | 7,139 | $8.84 | $0.00124 | 1,668 ms |
signal_scan | 447 | $8.21 | $0.01837 | 16,967 ms |
people_extract | 417 | $8.16 | $0.01957 | 4,465 ms |
campaign_sender | 1,883 | $7.12 | $0.00378 | 3,501 ms |
product_extract | 447 | $3.89 | $0.00870 | 5,425 ms |
listen_extract | 2,333 | $3.63 | $0.00156 | 2,547 ms |
chief-engineer | 1,720 | $3.56 | $0.00207 | 1,999 ms |
backfill_cut_discriminators | 234 | $2.57 | $0.01098 | 12,111 ms |
article_grader | 123 | $1.15 | $0.00935 | 12,887 ms |
strategic | 7 | $1.06 | $0.15143 | 69,944 ms |
as-built-generator | 10 | $1.02 | $0.10200 | 54,947 ms |
kpi_extractor | 177 | $0.97 | $0.00548 | 4,963 ms |
rp_models_smoke | 6 | $0.97 | $0.16167 | 12,318 ms |
intel:cross_entity_synthesis | 1 | $0.89 | $0.89000 | 170,664 ms |
freshness_checker | 145 | $0.74 | $0.00510 | 5,415 ms |
weekly_contact_growth | 105 | $0.69 | $0.00657 | 2,202 ms |
carver_scorer | 12 | $0.45 | $0.03750 | 40,182 ms |
daily-content-agent | 61 | $0.44 | $0.00721 | 2,998 ms |
consistency_checker | 13 | $0.32 | $0.02462 | 17,990 ms |
card_composer_sample | 19 | $0.31 | $0.01632 | 5,297 ms |
seo_rewrite | 469 | $0.24 | $0.00051 | 1,518 ms |
weekly_outreach_picker | 11 | $0.24 | $0.02182 | 12,292 ms |
pre_publication_gate | 58 | $0.20 | $0.00345 | 3,146 ms |
intel:bizops_pricing_extract | 2 | $0.18 | $0.09000 | 65,634 ms |
business_events_569_verification | 1 | $0.17 | $0.17000 | 51,750 ms |
outreach_drafter | 15 | $0.11 | $0.00733 | 3,545 ms |
intel:claim_verification | 8 | $0.07 | $0.00875 | 2,333 ms |
outreach | 20 | $0.07 | $0.00350 | 3,585 ms |
intel:entity_research | 15 | $0.04 | $0.00267 | 28,934 ms |
contact_finder | 27 | $0.04 | $0.00148 | 2,265 ms |
intel:research_planner | 1 | $0.03 | $0.03000 | 30,592 ms |
signal_embedder | 1,260 | $0.03 | $0.00002 | 1,210 ms |
job_health | 81 | $0.02 | $0.00025 | 602 ms |
build_runner | 2 | $0.02 | $0.01000 | 5,845 ms |
test_no_sr | 1 | $0.02 | $0.02000 | 30,578 ms |
test_v2 | 1 | $0.01 | $0.01000 | 23,825 ms |
content_remediation_test | 2 | $0.01 | $0.00500 | 4,175 ms |
hq_valuation_research | 1 | $0.00 | $0.00000 | 23,395 ms |
test_with_sr | 1 | $0.00 | $0.00000 | 4,073 ms |
intel:reflection | 1 | $0.00 | $0.00000 | 4,798 ms |
intel:smoke_test | 1 | $0.00 | $0.00000 | 1,307 ms |
biz:factcheck | 81 | $0.00 | $0.00000 | 5,476 ms |
codex_dispatch | 20 | $0.00 | $0.00000 | 975,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.
| dimension | label | widget | sort_order | is_hierarchical | indexable | values | distinct companies |
|---|---|---|---|---|---|---|---|
use_case | Use case / mission | checkbox | 0 | false | true | 11 | 1,021 |
platform_category | Platform category | checkbox | 1 | true | true | 22 | 1,182 |
sector | Sector / application | checkbox | 2 | true | true | 12 | 1,704 |
supply_chain_role | Supply-chain role | checkbox | 3 | false | false | 6 | 8 |
capability | Capability | checkbox | 4 | true | false | 107 | 868 |
geography | Geography | checkbox | 5 | true | true | 7 | 623 |
business_model | Business model | checkbox | 10 | false | true | 5 | 912 |
deployment_form | Deployment form | checkbox | 11 | false | true | 4 | 243 |
cuas_function | C-UAS function | checkbox | 12 | false | true | 4 | 251 |
cuas_legal_class | C-UAS legal class | checkbox | 13 | false | true | 2 | 245 |
asset_class | Asset class | checkbox | 14 | false | true | 12 | 258 |
inspection_modality | Inspection modality | checkbox | 15 | false | true | 9 | 286 |
psr_discipline | Public-safety discipline | checkbox | 16 | false | true | 8 | 58 |
grant_program | Grant program | checkbox | 17 | false | true | 10 | 37 |
end_market | End market | checkbox | 18 | false | true | 10 | 0 |
owner_type | Owner / operator type | checkbox | 19 | false | true | 3 | 0 |
funding_source | Funding source | checkbox | 20 | false | true | 15 | 67 |
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.
| dimension | value | label | parent | companies |
|---|---|---|---|---|
use_case | security-robots | Security & perimeter robots | — | 531 |
use_case | warehouse-robots | Warehouse & intralogistics robots | — | 361 |
use_case | drone-detection | Drone detection & airspace protection | — | 307 |
use_case | asset-inspection | Asset inspection & integrity | — | 260 |
use_case | public-safety-robots | Public-safety & emergency-response robots | — | 82 |
use_case | cleaning-robots | Cleaning robots | — | 0 |
use_case | field-robots | Field & agricultural robots | — | 0 |
use_case | grounds-robots | Grounds & landscape robots | — | 0 |
use_case | jobsite-robots | Jobsite & construction robots | — | 0 |
use_case | mine-haulage | Autonomous mine haulage | — | 0 |
use_case | yard-logistics | Yard logistics | — | 0 |
platform_category | software | Software | — | 860 |
platform_category | fixed-wing | Fixed-wing UAV | drone | 352 |
platform_category | drone | Drone / UAV | — | 340 |
platform_category | sensor | Sensor | — | 286 |
platform_category | ugv-amr | UGV / AMR | — | 271 |
platform_category | handheld | Handheld device | — | 151 |
platform_category | uuv | UUV / subsea | — | 77 |
platform_category | usv-marine | USV / marine surface | — | 69 |
platform_category | interceptor | Interceptor UAV | drone | 5 |
platform_category | loitering-munition | Loitering munition | drone | 5 |
platform_category | ucav | UCAV | drone | 5 |
platform_category | cruise-missile | Cruise missile | — | 4 |
platform_category | recon-uav | Reconnaissance UAV | drone | 4 |
platform_category | ballistic-missile | Ballistic missile | — | 2 |
platform_category | c2-ew | C2 / electronic warfare | — | 1 |
platform_category | decoy | Decoy | — | 1 |
platform_category | fpv | FPV drone | drone | 1 |
platform_category | actuator | Actuator | — | 0 |
platform_category | humanoid | Humanoid | — | 0 |
platform_category | manipulator-arm | Manipulator / arm | — | 0 |
platform_category | multirotor | Multirotor UAV | drone | 0 |
platform_category | subsystem-component | Subsystem / component | — | 0 |
sector | defense | Defense | — | 1,079 |
sector | security | Security | — | 715 |
sector | infrastructure | Infrastructure | — | 575 |
sector | inspection | Inspection | — | 69 |
sector | agriculture | Agriculture | — | 0 |
sector | construction | Construction | — | 0 |
sector | delivery | Delivery | — | 0 |
sector | energy | Energy | — | 0 |
sector | healthcare | Healthcare | — | 0 |
sector | logistics | Logistics / warehouse | — | 0 |
sector | mapping-survey | Mapping / survey | — | 0 |
sector | maritime | Maritime | — | 0 |
supply_chain_role | component-supplier | Component supplier | — | 8 |
supply_chain_role | distributor | Distributor | — | 0 |
supply_chain_role | integrator | Integrator | — | 0 |
supply_chain_role | oem | OEM | — | 0 |
supply_chain_role | service-provider | Service provider | — | 0 |
supply_chain_role | software-vendor | Software vendor | — | 0 |
capability | autonomy-software | Autonomy & Software | — | 742 |
capability | c2-fleet-management | C2 / Fleet Management | autonomy-software | 615 |
capability | patrol-surveillance | Patrol & Surveillance | — | 581 |
capability | navigation | Navigation | autonomy-software | 540 |
capability | detection | Detection | — | 532 |
capability | visual-detection | Visual Detection | detection | 505 |
capability | obstacle-avoidance | Obstacle avoidance | navigation | 492 |
capability | mission-planning | Mission planning | c2-fleet-management | 483 |
capability | perimeter-patrol | Perimeter Patrol | patrol-surveillance | 477 |
capability | autonomous-route-following | Autonomous route following | perimeter-patrol | 471 |
capability | ai-analytics | AI / Analytics | autonomy-software | 408 |
capability | combat-support | Combat Support | — | 360 |
capability | command-and-control | Command and control | c2-fleet-management | 355 |
capability | multi-sensor-fusion | Multi-sensor fusion | visual-detection | 328 |
capability | computer-vision | Computer vision | ai-analytics | 306 |
capability | area-monitoring | Area Monitoring | patrol-surveillance | 300 |
capability | thermal-imaging | Thermal imaging | visual-detection | 290 |
capability | persistent-isr | Persistent ISR | area-monitoring | 252 |
capability | gps-denied-navigation | GPS-denied navigation | navigation | 238 |
capability | slam | SLAM | navigation | 236 |
capability | logistics | Logistics | combat-support | 219 |
capability | load-carrying | Load carrying | logistics | 214 |
capability | inspection | Inspection | — | 194 |
capability | multi-robot-orchestration | Multi-robot orchestration | c2-fleet-management | 189 |
capability | wide-area-surveillance | Wide-area surveillance | area-monitoring | 179 |
capability | lidar-mapping | LIDAR mapping | visual-detection | 178 |
capability | armed-strike | Armed / Strike | combat-support | 163 |
capability | swarm-coordination | Swarm coordination | c2-fleet-management | 156 |
capability | neutralization | Neutralization | — | 141 |
capability | rf-detection | RF Detection | detection | 137 |
capability | data-fusion | Data fusion | ai-analytics | 128 |
capability | drone-signal-detection | Drone signal detection | rf-detection | 127 |
capability | threat-classification | Threat classification | ai-analytics | 120 |
capability | kinetic-defeat | Kinetic Defeat | neutralization | 113 |
capability | subsea-inspection | Subsea Inspection | inspection | 106 |
capability | loitering-munitions | Loitering munitions | armed-strike | 105 |
capability | weapons-integration | Weapons integration | armed-strike | 100 |
capability | drone-on-drone | Drone-on-drone | kinetic-defeat | 76 |
capability | terrain-following | Terrain following | navigation | 76 |
capability | seabed-survey | Seabed survey | subsea-inspection | 73 |
capability | geofenced-patrol | Geofenced patrol | perimeter-patrol | 71 |
capability | pipeline-utility | Pipeline & Utility | inspection | 64 |
capability | projectile-intercept | Projectile intercept | kinetic-defeat | 64 |
capability | radar | Radar | detection | 64 |
capability | structural-inspection | Structural Inspection | inspection | 61 |
capability | camera-based-identification | Camera-based identification | visual-detection | 60 |
capability | 3d-tracking | 3D tracking | radar | 59 |
capability | cyber-defeat | Cyber Defeat | neutralization | 57 |
capability | forced-landing | Forced landing | cyber-defeat | 57 |
capability | rf-jamming | RF Jamming | neutralization | 55 |
capability | underwater-hull | Underwater hull | subsea-inspection | 54 |
capability | direction-finding | Direction finding | rf-detection | 51 |
capability | crack-detection | Crack detection | structural-inspection | 50 |
capability | eod-demining | EOD / Demining | combat-support | 46 |
capability | remote-weapon-stations | Remote weapon stations | armed-strike | 46 |
capability | corrosion-mapping | Corrosion mapping | structural-inspection | 44 |
capability | oilgas-pipeline | Oil/gas pipeline | pipeline-utility | 41 |
capability | predictive-maintenance | Predictive maintenance | ai-analytics | 36 |
capability | cable-pipeline | Cable / pipeline | subsea-inspection | 34 |
capability | signal-classification | Signal classification | rf-detection | 34 |
capability | directed-energy | Directed energy | kinetic-defeat | 33 |
capability | explosive-ordnance-disposal | Explosive ordnance disposal | eod-demining | 33 |
capability | spectrum-analysis | Spectrum analysis | rf-detection | 30 |
capability | power-line | Power line | pipeline-utility | 29 |
capability | mine-clearance | Mine clearance | eod-demining | 28 |
capability | autonomous-resupply | Autonomous resupply | logistics | 26 |
capability | micro-doppler | Micro-Doppler | radar | 22 |
capability | offshore-platform | Offshore platform | subsea-inspection | 21 |
capability | smart-jamming | Smart jamming | rf-jamming | 21 |
capability | casualty-evacuation | Casualty evacuation | logistics | 19 |
capability | protocol-disruption | Protocol disruption | rf-jamming | 19 |
capability | gps-denial | GPS denial | rf-jamming | 17 |
capability | phased-array | Phased array | radar | 17 |
capability | wind-turbine | Wind turbine | pipeline-utility | 17 |
capability | bridge-building-dam-tunnel | Bridge / building / dam / tunnel | structural-inspection | 14 |
capability | acoustic-detection | Acoustic Detection | detection | 13 |
capability | protocol-takeover | Protocol takeover | cyber-defeat | 12 |
capability | anomaly-detection | Anomaly detection | perimeter-patrol | 11 |
capability | solar-panel | Solar panel | pipeline-utility | 10 |
capability | microphone-arrays | Microphone arrays | acoustic-detection | 9 |
capability | hazmat-response | Hazmat response | — | 8 |
capability | firefighting | Firefighting | — | 7 |
capability | net-capture | Net capture | kinetic-defeat | 7 |
capability | sound-signature-matching | Sound signature matching | acoustic-detection | 7 |
capability | tactical-recon-throwbot | Tactical reconnaissance / throwbot | — | 7 |
capability | spoofing | Spoofing | cyber-defeat | 6 |
capability | urban-search-rescue | Urban search & rescue | — | 6 |
capability | behavioral-analytics | Behavioral analytics | area-monitoring | 5 |
capability | ied-neutralization | IED neutralization | eod-demining | 4 |
capability | fmcw | FMCW | radar | 3 |
capability | eo-ir-detection | EO/IR detection | — | 2 |
capability | autonomous-haulage | Autonomous haulage | — | 0 |
capability | bricklaying | Bricklaying | — | 0 |
capability | construction-layout | Construction layout | — | 0 |
capability | crop-scouting | Crop scouting | — | 0 |
capability | crop-spraying | Crop spraying | — | 0 |
capability | demolition-robotics | Demolition robotics | — | 0 |
capability | disinfection | Disinfection | — | 0 |
capability | earthmoving-autonomy | Earthmoving autonomy | — | 0 |
capability | floor-cleaning | Floor cleaning | — | 0 |
capability | harvesting | Harvesting | — | 0 |
capability | mechanical-weeding | Mechanical weeding | — | 0 |
capability | mowing | Mowing | — | 0 |
capability | rebar-work | Rebar work | — | 0 |
capability | underground-lhd | Underground LHD | — | 0 |
capability | window-cleaning | Window cleaning | — | 0 |
capability | yard-truck-autonomy | Yard-truck autonomy | — | 0 |
geography | north-america | North America | — | 441 |
geography | europe | Europe | — | 267 |
geography | asia-pacific | Asia-Pacific | — | 181 |
geography | middle-east | Middle East | — | 53 |
geography | oceania | Oceania | — | 26 |
geography | africa | Africa | — | 22 |
geography | latin-america | Latin America | — | 11 |
business_model | product-sale | Product / hardware sale | — | 490 |
business_model | integrated-service | Integrated service / managed operations | — | 259 |
business_model | software-saas | Software / SaaS | — | 152 |
business_model | hardware-plus-subscription | Hardware + software subscription | — | 136 |
business_model | raas | Robotics-as-a-Service (RaaS) | — | 123 |
deployment_form | mobile | Mobile / vehicle-mounted | — | 166 |
deployment_form | fixed-site | Fixed / permanent installation | — | 107 |
deployment_form | portable | Portable / man-portable | — | 89 |
deployment_form | rapid-deploy | Rapid-deployable / temporary | — | 26 |
cuas_function | detect | Detect | — | 218 |
cuas_function | defeat | Defeat / mitigate | — | 114 |
cuas_function | identify | Identify / classify | — | 96 |
cuas_function | track | Track / locate | — | 83 |
cuas_legal_class | mitigation-capable | Mitigation-capable (kinetic/RF defeat) | — | 127 |
cuas_legal_class | detection-only | Detection-only (no mitigation) | — | 119 |
asset_class | power-transmission | Power transmission & distribution | — | 73 |
asset_class | oil-gas-pipeline | Oil & gas pipelines | — | 66 |
asset_class | offshore-marine | Offshore & marine | — | 64 |
asset_class | subsea | Subsea / underwater | — | 64 |
asset_class | solar-pv | Solar / PV | — | 38 |
asset_class | wind-turbine | Wind turbines | — | 35 |
asset_class | pressure-vessel-tank | Tanks & pressure vessels | — | 33 |
asset_class | bridge-civil | Bridges & civil structures | — | 27 |
asset_class | rail-infrastructure | Rail infrastructure | — | 16 |
asset_class | road-pavement | Roads & pavement | — | 15 |
asset_class | telecom-tower | Telecom towers | — | 11 |
asset_class | building-envelope | Building envelope / facade | — | 8 |
inspection_modality | visual-rgb | Visual / RGB | — | 236 |
inspection_modality | lidar | LiDAR / 3D | — | 104 |
inspection_modality | thermal-ir | Thermal / infrared | — | 62 |
inspection_modality | photogrammetry | Photogrammetry | — | 40 |
inspection_modality | ultrasonic-ut | Ultrasonic (UT) | — | 37 |
inspection_modality | acoustic-emission | Acoustic emission | — | 17 |
inspection_modality | eddy-current | Eddy current / magnetic | — | 13 |
inspection_modality | gas-leak | Gas / leak sensing | — | 10 |
inspection_modality | radiographic | Radiographic / X-ray | — | 10 |
psr_discipline | eod | EOD / bomb squad | — | 26 |
psr_discipline | usar | Urban search & rescue | — | 16 |
psr_discipline | tactical-recon | Tactical reconnaissance / throwbot | — | 15 |
psr_discipline | casualty-evac | Casualty evacuation | — | 12 |
psr_discipline | hazmat | HAZMAT response | — | 8 |
psr_discipline | firefighting | Firefighting | — | 7 |
psr_discipline | dfr | Drone as first responder (DFR) | — | 0 |
psr_discipline | le-patrol | Law enforcement / patrol support | — | 0 |
grant_program | hsgp | HSGP (Homeland Security Grant Program) | — | 27 |
grant_program | shsp | SHSP (State Homeland Security Program) | — | 26 |
grant_program | uasi | UASI (Urban Area Security Initiative) | — | 26 |
grant_program | dod-1033 | DoD 1033 program | — | 23 |
grant_program | afg | AFG (Assistance to Firefighters Grants) | — | 16 |
grant_program | byrne-jag | Byrne-JAG | — | 7 |
grant_program | safer | SAFER (firefighter staffing grants) | — | 7 |
grant_program | fema-cuas | FEMA C-UAS appropriations | — | 0 |
grant_program | sourcewell | Sourcewell cooperative purchasing | — | 0 |
grant_program | spire | SPIRE / rural EMS | — | 0 |
end_market | airport | Airports & airfields | — | 0 |
end_market | commercial | Commercial real estate | — | 0 |
end_market | corrections | Correctional facilities | — | 0 |
end_market | data-center | Data centers | — | 0 |
end_market | events | Events & mass gatherings | — | 0 |
end_market | infrastructure | Critical infrastructure | — | 0 |
end_market | logistics | Logistics & distribution | — | 0 |
end_market | utility | Utilities & substations | — | 0 |
end_market | venue | Stadiums & venues | — | 0 |
end_market | warehouse | Warehouses | — | 0 |
owner_type | emergency-management | Emergency management | — | 0 |
owner_type | fire | Fire department / fire service | — | 0 |
owner_type | law-enforcement | Law enforcement | — | 0 |
funding_source | grant | Grant-funded | — | 66 |
funding_source | dod-1033 | DoD 1033 / LESO transfer program | — | 1 |
funding_source | safer | SAFER | — | 1 |
funding_source | shsp | SHSP (State Homeland Security Program) | — | 1 |
funding_source | uasi | UASI (Urban Area Security Initiative) | — | 1 |
funding_source | afg | Assistance to Firefighters Grants | — | 0 |
funding_source | byrne-jag | Byrne-JAG | — | 0 |
funding_source | cooperative-purchasing | Cooperative purchasing vehicle | — | 0 |
funding_source | fema | FEMA funding | — | 0 |
funding_source | fema-cuas | FEMA C-UAS appropriations | — | 0 |
funding_source | government-appropriation | Government appropriation | — | 0 |
funding_source | hsgp | HSGP (Homeland Security Grant Program) | — | 0 |
funding_source | port-security | Port Security Grant Program | — | 0 |
funding_source | sourcewell | Sourcewell cooperative purchasing | — | 0 |
funding_source | spire | Oregon 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.
| tier | name | what belongs here |
|---|---|---|
T1 | Durability | Data 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. |
T2 | Leverage | Scale, 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. |
T3 | Capability | Net-new — new beats, new properties, new content types, new agents, new outreach paths, new map layers, new visualizations. |
| severity | meaning | examples given at ratification |
|---|---|---|
S1 | Burning — actively losing data, money, or credibility | 80% reject rate in deployment-report pipeline (#430); silent writeback failure on PUBLISHED articles (#431) |
S2 | Known-bad — degrading slowly, working around it daily | Email body 2K-char truncation (#468); email_comms.py at 1493 lines (#386) |
S3 | Should-fix — real but not urgent | Move report_content cap to job_type config (#438); deduplicate orphaned signal rows |
S4 | Nice-to-have — future leverage | Bloomberg-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.
| path | contents |
|---|---|
db/full.dump | Every accessible schema, pg_dump -Fc, 706 MB |
db/schema-public.dump | Canonical graph only, 688 MB |
db/schema-directory.dump | The directory keep-set, 18 MB |
db/schema-supabase_migrations.dump | Migration history |
db/ddl-all.sql | Human-readable DDL for the whole database |
db/rowcounts.csv | Row-count census taken at dump time |
llm-traces/ | Gzipped monthly JSONL, plus manifest and README |
repos/*.bundle | Nine git repositories, full history, git bundle --all |
machine-state-before-freeze.txt | systemd units, timers and cron as they ran |
crontab-before-freeze.bak | Verbatim crontab before the freeze |
doppler-secret-names.json | Secret names only, no values |
SHA256SUMS | Checksums 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.
| extension | version at source | tables that fail without it |
|---|---|---|
postgis | 3.3.7 | deployment_sites, attack_events, conflict_events, infrastructure_seeds |
vector (pgvector) | 0.8.0 | signals, 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.
| layer | structure |
|---|---|
| Data model | one shared entity graph, typed facet edges attached; a new vertical is a config row |
| Harness | three general agent classes with capability grants, isolation per unit of work |
| Knowledge system | one node table across goals, rules, code, decisions, sessions, work |
| Corpus surface | one 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