Skip to content

The relationship matrix — every arrow the model draws, and what carries it today ​

STATUS: 🟢 GENERATED · foreign keys probed live 2026-09-02 (199 of them, checksum-matched to the database) · row counts probed 2026-09-03 · writers located 2026-09-03.

Later bounded reviews: 2026-10-03 · 2026-10-04. Their findings below supersede the corresponding older claims; they do not refresh the rest of this snapshot.

The five model pages each carry a map with arrows on it — a company sells products, a campaign gathers content, a video is cut into moments. This page is every one of those arrows in one table, with three honest columns beside each: the database columns that actually carry it, how many rows sit in them today, and the code that writes those rows — an analyzer step, a trigger, a script somebody runs by hand, or nothing at all. An arrow the model draws that nothing stores is listed as a finding, not smoothed over.

When to read this. Open it when a decision in the review asks whether something is real today — whether a sponsor tier exists, whether a campaign can sit inside a campaign, whether a credit is recorded. The last table is the honest list of what the model draws and the data does not yet carry.

How to read the status. stored — a column exists and something writes it. unwritten — a column exists and rows may sit in it, but no code writes it today. empty — the column exists, nothing has written it yet. derived — the product works it out, nothing stores it. missing — the model draws it and no column carries it. partial — related storage exists, but the approved relationship or its complete write/read path has not been established; read its finding.

The model's arrows ​

Whatdoes whatto whatthe columns that carry itrows todayhow it gets written todaystatus
EntitiesownsEntitiesentity.parent_entity_id → entity
entity_ownership.owner_entity_id → entity
entity_ownership.owned_entity_id → entity
394 product lines sitting inside their own company
1 sub-brand under a parent company
0 ownership rows between companies
analyzer → entity
hand run script → entity
admin ui → entity
stored
EntitiessellsProductsproducts.entity_id → entity
products.brand_entity_id → entity
entity_product_inclusions.entity_id → entity
entity_product_inclusions.product_id → products
139 products
37 company-to-product inclusions
analyzer → products
migration backfill → products
nothing writes entity_product_inclusions
partial
ProductscontainsProductsproducts.parent_product_id → products0 products with a parent productnot yet locatedempty
ProductsoffersFeaturesproduct_feature_tags.product_id → products
product_feature_tags.feature_id → product_features
product_features.parent_id → product_features
1,517 features
1,621 product-to-feature links
analyzer → product_features
analyzer → product_feature_tags
stored
Entitiesruns · joinsGroupingscampaigns.entity_id → entity
campaign_companies.campaign_id → campaigns
campaign_companies.company_id → entity
event_participations.entity_id → entity
event_participations.event_instance_id → event_instances
event_instances.host_entity_id → entity
48 campaigns
69 company-in-campaign roles
10 who took part in an event
16 event instances (a year of an event)
hand run script → campaigns
hand run script → campaign_companies
admin ui → campaigns
stored
GroupingscontainsGroupingscampaign_events.campaign_id → campaigns
campaign_events.event_id → event_instances
1 campaign-in-event rowsnothing writes campaign_eventsunwritten
GroupingsgathersContentcampaign_content.campaign_id → campaigns
campaign_content.content_id → content_item
content_events.content_id → content_item
content_events.event_id → events_observances
event_participations.content_id → content_item
312 piece-in-campaign rows
9 piece-at-event rows
analyzer → content_events
hand run script → campaign_content
admin ui → campaign_content
stored
GroupingspromotesProductscampaign_products.campaign_id → campaigns
campaign_products.product_id → products
41 campaign-to-product linkshand run script → campaign_products
admin ui → campaign_products
stored
Entitiesmakes / appears inContentcontent_entity.content_id → content_item
content_entity.entity_id → entity
content_entity_mention.content_id → content_item
content_entity_mention.entity_id → entity
content_music.content_id → content_item
content_music.artist_entity_id → entity
23,962 piece-to-company links
13,740 of those, marked as the owner
810 mentions of a company inside a piece
146 music links on a piece
analyzer → content_entity
analyzer → content_entity_mention
trigger → content_entity
stored
EntitiesownsContentcontent_item.link_id → links
links.entity_id → entity
links.company_id → entity
entity_links.link_id → links
entity_links.entity_id → entity
50 company-to-collected-link rows
8,369 pieces that resolve to an owner through that chain
analyzer → links
trigger → links
hand run script → links
stored
Entitiescredited onContentcontent_credit.content_id → content_item
content_credit.entity_id → entity
content_credit.person_id → entity_people
content_credit.discipline_id → creative_disciplines
v6_content_credits.content_id → content_item
v6_content_credits.entity_id → entity
32 credits on a piece
13 credits on a piece (older table)
21 people placed at a company
analyzer → v6_content_credits
admin ui → v6_content_credits
nothing writes content_credit
stored
ContentshowsProductscontent_products.content_id → content_item
content_products.product_id → products
8,534 piece-to-product linksanalyzer → content_products
migration backfill → content_products
stored
ContentdemonstratesFeaturescontent_features.content_id → content_item
content_features.feature_id → product_features
1,750 piece-to-feature linksanalyzer → content_featuresstored
Contentis cut intoMomentscontent_segment.parent_content_id → content_item
content_segment.source_scene_id → content_scenes
content_scenes.content_id → content_item
content_markers.content_id → content_item
content_markers.segment_id → content_segment
3,437 moments
5,064 detected scenes
24 markers a person set inside a piece
analyzer → content_segment
analyzer → content_scenes
hand run script → content_segment
stored
Momentssits onShelfcontent_segment_categories.segment_id → content_segment
content_segment_classifications.segment_id → content_segment
4,848 moment-on-shelf rows
3,355 moment classifications
analyzer → content_segment_categories
analyzer → content_segment_classifications
hand run script → content_segment_categories
stored
Momentsis described bySide axescontent_element.segment_id → content_segment
content_behavior.segment_id → content_segment
content_concept.segment_id → content_segment
content_expression.segment_id → content_segment
content_product_surface.segment_id → content_segment
content_technique.segment_id → content_segment
entity_motion_identity.segment_id → content_segment
3,541 what-is-on-screen rows
125 what the product is doing rows
2,629 concept rows
0 expression rows
0 product-surface rows
258 technique rows
513 moment-to-brand motion identity links
analyzer → content_element
analyzer → entity_motion_identity
hand run script → content_element
stored
Contentclassified byConceptscontent_disciplines.content_id → content_item
content_disciplines.discipline_id → creative_disciplines
content_themes.content_id → content_item
content_roles.content_id → content_item
content_audience_segments.content_id → content_item
content_taxonomy_tag.content_id → content_item
content_taxonomy_tag.term_id → taxonomy_term
15,511 piece-to-craft links
78,932 theme rows
28,389 job-it-does rows
21,249 audience rows
0 generic taxonomy tags
analyzer → content_disciplines
analyzer → content_themes
hand run script → content_disciplines
stored
Entitiesclassified byConceptscompany_categories.entity_id → entity
company_categories.category_id → categories
categories.industry_id → industries
industries.sector_id → sectors
sectors.macro_sector_id → macro_sectors
50 company-to-category linksanalyzer → company_categoriesstored
One creativehas versionsContentnot yet locatedpartial
Productshas models and variantsProductsentity.parent_entity_id → entity
products.entity_id → entity
admin ui → entitypartial
Productsincludes in a bundleProductsentity_product_inclusions.entity_id → entity
entity_product_inclusions.product_id → products
not yet locatedpartial

In plain words, one arrow at a time ​

  • Entities owns Entities. A company can own another company or a sub-brand.
  • Entities sells Products. A company sells products; a product belongs to the company that makes it.
  • Products contains Products. This older product-detail parent tree is retained as an implementation reference. The approved family relationship lives on product entities; see “has models and variants”.
  • Products offers Features. A product offers features — the things it can do.
  • Entities runs · joins Groupings. A brand runs a campaign; companies and people take part in a campaign or an event in a named role.
  • Groupings contains Groupings. A pile can hold another pile: an event contains the campaigns that ran at it, and a campaign can contain a smaller campaign inside it.
  • Groupings gathers Content. A campaign gathers the pieces made for it; an event gathers the pieces that showed up at it.
  • Groupings promotes Products. A campaign promotes one or more products.
  • Entities makes / appears in Content. A brand makes a piece, or is mentioned in it; one entity is marked as the piece's owner.
  • Entities owns Content. The brand whose video it is — ownership runs through the link the piece was collected from, back to the company that owns that link.
  • Entities credited on Content. The studio, agency or person who made a piece is credited on it, with the craft they did.
  • Content shows Products. A piece shows a product — the one it is about, or one that appears in it.
  • Content demonstrates Features. A piece demonstrates a feature.
  • Content is cut into Moments. A video is cut into moments — the short stretches inside it.
  • Moments sits on Shelf. A moment sits on one or more shelves — the groups you browse them by — with one marked as its main shelf.
  • Moments is described by Side axes. A moment is described on the side — what is on screen, what the product is doing, how it was framed.
  • Content classified by Concepts. A piece is classified against the shared vocabulary — the crafts in it, the themes, the job it does, the audience it is aimed at.
  • Entities classified by Concepts. A company is classified by its industry — sector, industry, category — and by what kind of company it is.
  • One creative has versions Content. A work can have separately browsable cuts, languages or layouts. An unchanged version can have several publications, each with its own captures. A moment identifies an interval inside a video, not another version.
  • Products has models and variants Products. A product family contains models and variants through their entity identities. Bundle membership is a separate relationship.
  • Products includes in a bundle Products. A bundle includes products without turning those products into its models or variants.

What the model draws that the data does not yet carry, or carries thinly ​

These are findings — each is a place where a walkthrough of a real case would stop. None is a workaround; each is either a column to add, a writer to build, or a call to make.

Arrowstatusthe finding
Entities owns EntitiesstoredAlmost none of this is one company owning another: of the 395 links to a parent, 394 are product lines inside their own company and one is a sub-brand, and the table built for ownership between companies is empty.
Entities sells ProductspartialReviewed 3 October 2026: products.entity_id identifies the product itself under the approved model, not automatically its seller. The current creation path can parent a new product entity to an evidenced source owner; this is not certification of all seller relationships. Separate legacy brand links and inclusion storage remain. Trace company-to-product reads against entity parentage and relation meaning before retirement or migration.
Products contains ProductsemptyReviewed 3 October 2026: zero legacy product-parent links. The older cited product insert and reconciliation migration do not write parent_product_id; their existence was not proof of a writer for this arrow. Preserve the legacy column until all consumers and migration requirements are reviewed.
Products offers FeaturesstoredA feature row does not point at its product directly — the link lives in a separate tag table, and the feature tree itself is flat today.
Groupings contains GroupingsunwrittenA campaign inside a bigger campaign has no column at all — the campaigns table carries no parent. Only campaign-in-event is stored, and one row holds it today.
Groupings gathers ContentstoredNothing in the pipeline decides which campaign a piece belongs to. The two things that write it are a script an operator runs by hand and an admin screen, and the real-time trigger (a press release, a newsroom link) is a stub that does nothing. That is why only a few hundred pieces belong to any campaign.
Entities owns ContentstoredTwo chains claim ownership — the link a piece was collected from, and the mentioned-in junction. Only 8,369 of the 13,944 pieces resolve to an owner through the canonical one, so the brand a piece belongs to can disagree with itself.
Entities credited on ContentstoredTwo credit tables exist and both are nearly empty. Everything written today goes to the older one; the table the model points at, content_credit, has no writer anywhere.
Entities classified by ConceptsstoredWhat kind of company it is — brand, agency, studio — is a plain column with no list behind it, and most companies have it empty.
One creative has versions ContentpartialThe 4 October decision separates versions, publications and captures. The earlier source-reuse pointer and generic content writers do not establish this identity model. Physical storage, identity constraints, evidence and all write/read consumers still require a fresh audit before implementation; this amendment records meaning only.
Products has models and variants ProductspartialReviewed 3 October 2026: the entity-parent graph has 86 child/parent pairs where both identities have product details. This proves links exist, not that every pair is a correct family relation. The approved one-detail-per-entity model has 139 distinct entity links across 139 current product records, but no entity-link uniqueness in the probed product constraints/indexes. Family meaning, writer behavior, descendant queries and UX remain to be verified together. The older products.parent_product_id tree is not the approved family authority.
Products includes in a bundle ProductspartialReviewed 3 October 2026: existing inclusion storage has 17 bundled and 20 core rows. None of their source entities has a product-detail record in this probe, so these rows do not establish the approved product-bundle use case. No application writer was located by the bounded backend/frontend/migration search. Reconcile these inclusion semantics and all consumers before deciding whether to extend existing storage; no claim that a new table is required.

Every foreign key in the database, by what it points at (199, probed 2026-09-02) ​

The physical substrate the arrows above are built from. Grouped by the table being pointed at; the biggest hubs first.

  • → content_item (44): analysis_run.content_id · campaign_content.content_id · campaign_intelligence_evidence_refs.content_id · campaign_source_evidence.content_id · content_audience_segments.content_id · content_behavior.content_id · content_concept.content_id · content_credit.content_id · content_disciplines.content_id · content_element.content_id · content_entity.content_id · content_entity_mention.content_id · content_events.content_id · content_expression.content_id · content_features.content_id · content_item.analysis_source_id · content_markers.content_id · content_material.content_id · content_music.content_id · content_observations.content_item_id · content_placement.content_id · content_principle.content_id · content_product_surface.content_id · content_products.content_id · content_proof_points.content_id · content_risk_signals.content_id · content_roles.content_id · content_scenes.content_id · content_segment.parent_content_id · content_segment_classifications.parent_content_id · content_substrate.content_id · content_taxonomy_tag.content_id · content_technique.content_id · content_themes.content_id · content_tones.content_id · content_verbal_claims.content_id · content_visual_cues.content_id · content_writing_style.content_id · event_participations.content_id · llm_responses.content_id · pipeline_events.content_id · pipeline_executions.content_item_id · v6_content_credits.content_id · workspace_content.content_id
  • → entity (36): brand_guideline_sections.entity_id · brand_principle.entity_id · campaign_companies.company_id · campaigns.entity_id · company_categories.entity_id · content_credit.entity_id · content_entity.entity_id · content_entity_mention.entity_id · content_music.artist_entity_id · content_music.song_entity_id · content_signals.entity_id · entity.parent_entity_id · entity_alias.entity_id · entity_departments.entity_id · entity_external_id.entity_id · entity_links.entity_id · entity_motion_identity.entity_id · entity_ownership.owned_entity_id · entity_ownership.owner_entity_id · entity_people.entity_id · entity_people.person_entity_id · entity_product_inclusions.entity_id · event_instances.host_entity_id · event_participations.entity_id · event_participations.project_entity_id · links.company_id · links.entity_id · news_items.entity_id · pending_entity_people.entity_id · pending_entity_people.person_entity_id · products.brand_entity_id · products.entity_id · relationship_events.primary_entity_id · relationship_events.secondary_entity_id · v6_content_credits.entity_id · website_content.entity_id
  • → content_segment (18): analysis_run.segment_id · campaign_intelligence_evidence_refs.segment_id · content_behavior.segment_id · content_concept.segment_id · content_element.segment_id · content_expression.segment_id · content_markers.segment_id · content_material.segment_id · content_principle.segment_id · content_product_surface.segment_id · content_segment.parent_segment_id · content_segment_categories.segment_id · content_segment_classifications.segment_id · content_segment_disciplines.segment_id · content_substrate.segment_id · content_technique.segment_id · content_writing_style.segment_id · entity_motion_identity.segment_id
  • → analysis_run (8): analysis_output.run_id · content_credit.run_id · content_entity.first_seen_run_id · content_entity_mention.run_id · content_item.chosen_run_id · content_taxonomy_tag.run_id · llm_responses.run_id · v6_content_credits.run_id
  • → campaigns (8): campaign_companies.campaign_id · campaign_content.campaign_id · campaign_events.campaign_id · campaign_intelligence_claims.campaign_id · campaign_intelligence_evidence_refs.campaign_id · campaign_intelligence_runs.campaign_id · campaign_products.campaign_id · campaign_source_evidence.campaign_id
  • → products (7): campaign_products.product_id · content_products.product_id · entity_product_inclusions.product_id · links.product_id · product_feature_tags.product_id · products.parent_product_id · website_content.product_id
  • → prompt_versions (6): analysis_run.prompt_version_id · campaign_intelligence_runs.prompt_version_id · content_item.prompt_version_id · pipeline_executions.prompt_version_id · prompt_bindings.prompt_version_id · prompt_sets.default_version_id
  • → entity_departments (5): campaigns.department_id · content_entity_mention.department_id · entity_departments.parent_department_id · entity_people.department_id · pending_entity_people.proposed_department_id
  • → links (5): collection_runs.link_id · content_item.link_id · content_item.source_config_id · entity_links.link_id · page_snapshots.link_id
  • → content_sections (4): content_content_sections.section_id · content_section_closure.ancestor_id · content_section_closure.descendant_id · content_sections.parent_id
  • → creative_disciplines (4): content_credit.discipline_id · content_disciplines.discipline_id · content_segment_disciplines.discipline_id · creative_disciplines.parent_id
  • → project (4): membership.project_id · project_block.project_id · project_doc.project_id · project_item.project_id
  • → prompt_sets (4): content_routing.prompt_set_id · pipeline_routing.prompt_set_id · prompt_versions.prompt_set_id · workflows.prompt_set_id
  • → taxonomy_term (4): content_taxonomy_tag.term_id · taxonomy_closure.ancestor_id · taxonomy_closure.descendant_id · taxonomy_term.parent_id
  • → comments (3): comment_mentions.comment_id · comment_read_state.thread_id · comments.parent_id
  • → content_markers (3): marker_mentions.marker_id · reel_items.marker_id · tracker_items.marker_id
  • → product_features (3): content_features.feature_id · product_feature_tags.feature_id · product_features.parent_id
  • → analysis_batches (2): analysis_run.batch_id · pipeline_events.batch_id
  • → campaign_intelligence_runs (2): campaign_intelligence_claims.run_id · campaign_intelligence_evidence_refs.run_id
  • → collection_runs (2): analysis_batches.collection_run_id · content_item.collection_run_id
  • → content_scenes (2): campaign_intelligence_evidence_refs.scene_id · content_segment.source_scene_id
  • → event_categories (2): event_subcategories.category_id · events_observances.category_id
  • → event_instances (2): campaign_events.event_id · event_participations.event_instance_id
  • → events_observances (2): content_events.event_id · event_instances.observance_id
  • → notes (2): note_mentions.note_id · notes.parent_id
  • → ai_conversations (1): ai_messages.conversation_id
  • → campaign_intelligence_claims (1): campaign_intelligence_evidence_refs.claim_id
  • → campaign_source_evidence (1): campaign_intelligence_evidence_refs.source_evidence_id
  • → categories (1): company_categories.category_id
  • → entity_people (1): content_credit.person_id
  • → event_subcategories (1): events_observances.subcategory_id
  • → industries (1): categories.industry_id
  • → llm_responses (1): analysis_run.llm_response_id
  • → macro_sectors (1): sectors.macro_sector_id
  • → project_doc (1): project_block.doc_id
  • → reels (1): reel_items.reel_id
  • → schema_enums (1): taxonomy_alias.canonical_enum_id
  • → sectors (1): industries.sector_id
  • → trackers (1): tracker_items.tracker_id
  • → v6_content_credits (1): pending_entity_people.source_credit_id
  • → workflows (1): links.workflow_id
  • → workspaces (1): workspace_content.workspace_id

Generated by scripts/atlas-relationships.py from _data/relationships/ — the foreign keys and row counts with the query that read each one, and the exact code citation behind every writer above. --check re-opens every citation at its line before this page is allowed to change.

The BrandTrackers domain model. Source: git markdown, drift-checked against the live DB.