Appearance
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
| What | does what | to what | the columns that carry it | rows today | how it gets written today | status |
|---|---|---|---|---|---|---|
| Entities | owns | Entities | entity.parent_entity_id → entityentity_ownership.owner_entity_id → entityentity_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 → entityhand run script → entityadmin ui → entity | stored |
| Entities | sells | Products | products.entity_id → entityproducts.brand_entity_id → entityentity_product_inclusions.entity_id → entityentity_product_inclusions.product_id → products | 139 products 37 company-to-product inclusions | analyzer → productsmigration backfill → productsnothing writes entity_product_inclusions | partial |
| Products | contains | Products | products.parent_product_id → products | 0 products with a parent product | not yet located | empty |
| Products | offers | Features | product_feature_tags.product_id → productsproduct_feature_tags.feature_id → product_featuresproduct_features.parent_id → product_features | 1,517 features 1,621 product-to-feature links | analyzer → product_featuresanalyzer → product_feature_tags | stored |
| Entities | runs · joins | Groupings | campaigns.entity_id → entitycampaign_companies.campaign_id → campaignscampaign_companies.company_id → entityevent_participations.entity_id → entityevent_participations.event_instance_id → event_instancesevent_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 → campaignshand run script → campaign_companiesadmin ui → campaigns | stored |
| Groupings | contains | Groupings | campaign_events.campaign_id → campaignscampaign_events.event_id → event_instances | 1 campaign-in-event rows | nothing writes campaign_events | unwritten |
| Groupings | gathers | Content | campaign_content.campaign_id → campaignscampaign_content.content_id → content_itemcontent_events.content_id → content_itemcontent_events.event_id → events_observancesevent_participations.content_id → content_item | 312 piece-in-campaign rows 9 piece-at-event rows | analyzer → content_eventshand run script → campaign_contentadmin ui → campaign_content | stored |
| Groupings | promotes | Products | campaign_products.campaign_id → campaignscampaign_products.product_id → products | 41 campaign-to-product links | hand run script → campaign_productsadmin ui → campaign_products | stored |
| Entities | makes / appears in | Content | content_entity.content_id → content_itemcontent_entity.entity_id → entitycontent_entity_mention.content_id → content_itemcontent_entity_mention.entity_id → entitycontent_music.content_id → content_itemcontent_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_entityanalyzer → content_entity_mentiontrigger → content_entity | stored |
| Entities | owns | Content | content_item.link_id → linkslinks.entity_id → entitylinks.company_id → entityentity_links.link_id → linksentity_links.entity_id → entity | 50 company-to-collected-link rows 8,369 pieces that resolve to an owner through that chain | analyzer → linkstrigger → linkshand run script → links | stored |
| Entities | credited on | Content | content_credit.content_id → content_itemcontent_credit.entity_id → entitycontent_credit.person_id → entity_peoplecontent_credit.discipline_id → creative_disciplinesv6_content_credits.content_id → content_itemv6_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_creditsadmin ui → v6_content_creditsnothing writes content_credit | stored |
| Content | shows | Products | content_products.content_id → content_itemcontent_products.product_id → products | 8,534 piece-to-product links | analyzer → content_productsmigration backfill → content_products | stored |
| Content | demonstrates | Features | content_features.content_id → content_itemcontent_features.feature_id → product_features | 1,750 piece-to-feature links | analyzer → content_features | stored |
| Content | is cut into | Moments | content_segment.parent_content_id → content_itemcontent_segment.source_scene_id → content_scenescontent_scenes.content_id → content_itemcontent_markers.content_id → content_itemcontent_markers.segment_id → content_segment | 3,437 moments 5,064 detected scenes 24 markers a person set inside a piece | analyzer → content_segmentanalyzer → content_sceneshand run script → content_segment | stored |
| Moments | sits on | Shelf | content_segment_categories.segment_id → content_segmentcontent_segment_classifications.segment_id → content_segment | 4,848 moment-on-shelf rows 3,355 moment classifications | analyzer → content_segment_categoriesanalyzer → content_segment_classificationshand run script → content_segment_categories | stored |
| Moments | is described by | Side axes | content_element.segment_id → content_segmentcontent_behavior.segment_id → content_segmentcontent_concept.segment_id → content_segmentcontent_expression.segment_id → content_segmentcontent_product_surface.segment_id → content_segmentcontent_technique.segment_id → content_segmententity_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_elementanalyzer → entity_motion_identityhand run script → content_element | stored |
| Content | classified by | Concepts | content_disciplines.content_id → content_itemcontent_disciplines.discipline_id → creative_disciplinescontent_themes.content_id → content_itemcontent_roles.content_id → content_itemcontent_audience_segments.content_id → content_itemcontent_taxonomy_tag.content_id → content_itemcontent_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_disciplinesanalyzer → content_themeshand run script → content_disciplines | stored |
| Entities | classified by | Concepts | company_categories.entity_id → entitycompany_categories.category_id → categoriescategories.industry_id → industriesindustries.sector_id → sectorssectors.macro_sector_id → macro_sectors | 50 company-to-category links | analyzer → company_categories | stored |
| One creative | has versions | Content | not yet located | partial | ||
| Products | has models and variants | Products | entity.parent_entity_id → entityproducts.entity_id → entity | admin ui → entity | partial | |
| Products | includes in a bundle | Products | entity_product_inclusions.entity_id → entityentity_product_inclusions.product_id → products | not yet located | partial |
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.
| Arrow | status | the finding |
|---|---|---|
| Entities owns Entities | stored | Almost 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 Products | partial | Reviewed 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 Products | empty | Reviewed 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 Features | stored | A 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 Groupings | unwritten | A 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 Content | stored | Nothing 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 Content | stored | Two 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 Content | stored | Two 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 Concepts | stored | What 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 Content | partial | The 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 Products | partial | Reviewed 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 Products | partial | Reviewed 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.