Odin
Corpus data model
Dataset 2.3.6Company 2.2.0Read-only
48 model definitions
Assembled corpus

Company-centred research, evidence and outputs

The atomic unit is a company or corporate group. Typed research records sit inside that aggregate; evidence and retained source material are global, reusable objects; Snapshots and Deep Dives select canonical records rather than duplicating facts.

Companies
169
Research records
5,285
Source documents
1,452
Citations
3,099
Retained forms
1,032
File blobs
990
Snapshot plans
169
Deep Dives
11
Company aggregateCompanyResearchRecord
Direct facts15 evidence-backed types
Evidence linksembedded field support
Citationsstored file or URL
Documents and filespublication → form → bytes
Derived recordsCalculation / conclusioncalculation → facts; conclusion → facts, calculations or gaps
Research gapsSearchAttemptchecked documents and URLs
Output plansSnapshot / Deep Diverecord selection / exact field selection
Schema authority src/corpus/schemas/ Cross-record rules src/corpus/validation/
01

Dataset root

The assembled boundary joins company aggregates, global evidence, retained files and authored output plans.

Company corpus datasetCompanyCorpusDatasetschema 2.3.6
FieldTypeRequiredMeaningReferences
schemaVersion literal "2.3.6" Yes Assembled dataset contract version. None
companyResearchRecords[] CompanyResearchRecord[] Yes Company or corporate-group aggregates. None
sourceDocuments[] SourceDocument[] Yes Logical publications shared across companies. None
sourceFileRepresentations[] SourceFileRepresentation[] Yes Retained and derived file forms. None
researchFileBlobs[] ResearchFileBlob[] Yes Immutable content-addressed bytes. None
sourceCitations[] SourceCitation[] Yes Precise citable locations. None
snapshotEditorialPlans[] SnapshotEditorialPlan[] Yes Zero or one Snapshot selection plan per company; the current corpus has one for every company. None
deepDiveSpecs[] DeepDiveSpec[] Yes Authored Deep Dive publication recipes. None
02

Company aggregate

One active company record owns its identity, scope, corporate structure, factual observations, analysis and open research questions.

Company research recordCompanyResearchRecordschema 2.2.0
FieldTypeRequiredMeaningReferences
schemaVersion literal "2.2.0" Yes Company aggregate contract version. None
companyRecordId StableIdentifier Yes Stable aggregate identifier. None
publicationVisibility internal_only | public Yes Company-level output eligibility. None
companyIdentity CompanyIdentity Yes Canonical company or group identity. CompanyIdentity
companyLookup CompanyLookup Yes Canonical route slug and controlled aliases for route, search, MCP and email matching. CompanyLookup
researchScope CompanyResearchScope Yes Standalone/group subject type and subject legal-entity perimeter. CompanyResearchScope
corporateStructure CorporateStructure Yes Legal entities and ownership relationships, including contextual counterparties. CorporateStructure
businessActivities[] BusinessActivity[] Yes Business-line records. BusinessActivity
operatingAssets[] OperatingAsset[] Yes Named operating assets. OperatingAsset
operationalMetricObservations[] OperationalMetricObservation[] Yes Period-specific operating measures. OperationalMetricObservation
financialMetricObservations[] FinancialMetricObservation[] Yes Period-specific financial measures. FinancialMetricObservation
debtInstruments[] DebtInstrument[] Yes Funded instruments and facilities. DebtInstrument
debtMarketObservations[] DebtMarketObservation[] Yes Dated price, yield, spread and rate observations. DebtMarketObservation
covenantRecords[] CovenantRecord[] Yes Instrument-linked covenant terms. CovenantRecord
guarantees[] Guarantee[] Yes Entity-to-instrument guarantee relationships. Guarantee
securityInterests[] SecurityInterest[] Yes Entity-to-instrument collateral relationships. SecurityInterest
companyEvents[] CompanyEvent[] Yes Dated company developments. CompanyEvent
legalMatters[] LegalMatter[] Yes Legal and regulatory matters. LegalMatter
researchFindings[] ResearchFinding[] Yes Flexible evidence-backed factual findings. ResearchFinding
calculatedFindings[] CalculatedFinding[] Yes Deterministic derived results. CalculatedFinding
analystConclusions[] AnalystConclusion[] Yes Analyst judgements and watchlist rationale. AnalystConclusion
researchGaps[] ResearchGap[] Yes Documented unresolved questions and search attempts. ResearchGap
latestResearchUpdate LatestResearchUpdate Yes Timestamp, actor and summary for the active revision. LatestResearchUpdate
Research scope standalone_company | corporate_group Scope IDs point to exact LegalEntity records. Corporate structure may also include contextual owners or counterparties outside that subject perimeter. Borrower IDs may be omitted when unknown; any stated borrower, owner, guarantor, grantor or asset owner must be an exact entity.

Aggregate components

Operational lookup, subject scope, structure containers and revision metadata are explicit nested contracts.

Company lookup CompanyLookup companyLookup exactly 1 per company Operational routing and matching names, kept separate from evidence-backed factual name variants.
embedded type exactly 1 per company
FieldTypeRequiredMeaningReferences
canonicalCompanySlug PublicCompanySlug Yes Lowercase canonical route slug. None
lookupAliases[] CompanyLookupAlias[] Yes Operational aliases; each stores lookupText, lookupContexts, matchPolicy and an optional configurationNote. None
lookupAliases[].lookupText string Yes Exact alias text used for matching. None
lookupAliases[].lookupContexts[] route | search | mcp | email Yes Surfaces on which an alias is valid. None
lookupAliases[].matchPolicy automatic | review_required Yes Whether a match can resolve without review. None
lookupAliases[].configurationNote string No Reason or limitation for the configured alias. None

Relationships

  • Owned by CompanyResearchRecord
  • Complements, but does not replace, CompanyIdentity name variants

Key invariants

  • Route aliases are valid slugs and automatic.
  • Routes and automatic MCP/email aliases are globally unambiguous; search aliases may overlap.
Company research scope CompanyResearchScope researchScope exactly 1 per company Defines whether the aggregate is a standalone company or group and names the entities inside its subject perimeter.
embedded type exactly 1 per company
FieldTypeRequiredMeaningReferences
subjectType standalone_company | corporate_group Yes Aggregate subject classification. None
primaryLegalEntityResearchRecordId StableIdentifier No Primary legal entity when established. LegalEntity
consolidatedReportingLegalEntityResearchRecordId StableIdentifier No Entity whose accounts define the consolidated reporting perimeter. LegalEntity
inScopeLegalEntityResearchRecordIds[] StableIdentifier[] Yes Legal entities included in the research perimeter. LegalEntity
scopeDescription string Yes Plain-language perimeter description. None

Relationships

  • All entity IDs resolve inside corporateStructure.legalEntities

Key invariants

  • Every scope reference resolves to a LegalEntity in corporateStructure.
  • A declared primary entity is included among the in-scope entities.
Corporate structure CorporateStructure corporateStructure exactly 1 per company The legal-entity nodes and directed ownership edges used for structure diagrams and entity-level references.
embedded type exactly 1 per company
FieldTypeRequiredMeaningReferences
legalEntities[] LegalEntity[] Yes Named and evidenced legal entities. LegalEntity
ownershipRelationships[] OwnershipRelationship[] Yes Directed ownership edges. OwnershipRelationship

Relationships

  • Provides entity endpoints for scope and all entity-specific research records

Key invariants

  • Ownership endpoints resolve to legal entities inside the same aggregate.
Latest research update LatestResearchUpdate latestResearchUpdate exactly 1 per company revision A compact marker for when, by whom and why the active company revision changed.
embedded type exactly 1 per company revision
FieldTypeRequiredMeaningReferences
updatedAt ISO 8601 timestamp Yes Time of the update. None
updatedBy string Yes Researcher, agent or process responsible. None
updateSummary string Yes Concise description of the revision. None

Relationships

  • Stored on CompanyResearchRecord; revision history remains in immutable company folders

Key invariants

  • Timestamp includes a timezone.
02.1

Identity and scope

Names the company aggregate and identifies its subject perimeter; corporate structure may also include contextual counterparties.

Company identity company_identity companyIdentity 169 records Canonical group identity, name variants and official websites.
direct evidence exactly 1
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
canonicalCompanyName string Yes Primary display and comparison name. None
companyNameVariants[] CompanyNameVariant[] Yes Trading, former, brand, abbreviated and translated names. None
companyWebsiteUrls[] URL[] Yes Official company or group websites. None

Relationships

  • Owned by CompanyResearchRecord
  • EvidenceLink references SourceCitation

Key invariants

  • Exactly one identity per company aggregate.
  • Every identity has at least one supporting citation.
02.2

Corporate structure

Represents named legal entities and evidenced parent-child ownership edges.

Ownership relationship ownership_relationship corporateStructure.ownershipRelationships[] 127 records A directed, time-aware ownership edge between two exact legal entities.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
ownerLegalEntityResearchRecordId StableIdentifier Yes Parent or owner endpoint. LegalEntity
ownedLegalEntityResearchRecordId StableIdentifier Yes Child or owned endpoint. LegalEntity
ownershipPercentage number 0..100 No Reported ownership percentage. None
relationshipDescription string No Qualifying ownership detail. None
effectivePeriod DateRangeWithPrecision No Period for which the edge applies. None

Relationships

  • Owner and owned endpoints both resolve to LegalEntity records in the same company aggregate

Key invariants

  • Both endpoints resolve to LegalEntity records in the same company aggregate.
  • Any ownership percentage is constrained to 0 through 100.
02.3

Business and operations

Describes what the group does, the assets it owns and observed operating measures.

Business activity business_activity businessActivities[] 264 records A current, historical, planned or discontinued business line.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
activityName string Yes Concise business-line name. None
activityDescription string Yes Factual operating description. None
subjectLegalEntityResearchRecordIds[] StableIdentifier[] Yes Exact entities when known; empty for group-level facts. LegalEntity
geographyNames[] string[] Yes Relevant operating geographies. None
activityStatus current | historical | planned | discontinued Yes Lifecycle status. None

Relationships

  • May reference one or more LegalEntity subjects

Key invariants

  • Unnamed subsidiaries are not invented to populate subject entities.
Operating asset operating_asset operatingAssets[] 2 records A named plant, project, property or other operating asset with evidenced title.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
assetName string Yes Evidenced asset name. None
assetType string Yes Asset category. None
assetDescription string No Additional factual description. None
ownerLegalEntityResearchRecordIds[] StableIdentifier[1..n] Yes Exact legal owners. LegalEntity
locationDescription string No Asset location. None
assetStatus operating | under_construction | planned | idle | closed | unknown Yes Asset lifecycle status. None

Relationships

  • Every owner resolves to a LegalEntity in the same aggregate

Key invariants

  • Group-level operate or own wording cannot establish exact asset title.
Operational metric observation operational_metric_observation operationalMetricObservations[] 358 records A dated capacity, volume, employee, site or other operating measure.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
metricName string Yes Name of the observed measure. None
metricValue MeasuredValue Yes Numeric value, unit, optional currency and qualifier. None
subjectLegalEntityResearchRecordIds[] StableIdentifier[] Yes Exact subjects when known. LegalEntity
applicablePeriod DateRangeWithPrecision Yes Period to which the value applies. None
metricDefinition string No Source-specific definition or perimeter. None

Relationships

  • May reference LegalEntity subjects

Key invariants

  • The observation period is explicit; current and historical values remain separate records.
02.4

Financials and debt

Separates reported financial observations, funded instruments, market marks and credit protections.

Financial metric observation financial_metric_observation financialMetricObservations[] 1,115 records A period-specific revenue, earnings, cash flow, balance-sheet or leverage measure.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
metricName string Yes Name of the reported measure. None
metricValue MeasuredValue Yes Numeric value, unit, optional currency and qualifier. None
reportingLegalEntityResearchRecordId StableIdentifier No Exact reporting entity when identified. LegalEntity
applicablePeriod DateRangeWithPrecision Yes Reporting period. None
accountingBasis string No GAAP, IFRS, adjusted or source-reported basis. None
metricDefinition string No Perimeter or source-specific definition. None

Relationships

  • May identify the reporting LegalEntity

Key invariants

  • Values with different periods, bases or definitions remain separate observations.
Debt instrument debt_instrument debtInstruments[] 397 records A bond, term loan, revolving facility, asset-backed facility, lease liability or other funded instrument.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
instrumentName string Yes Canonical instrument name. None
instrumentIdentifiers[] DebtInstrumentIdentifier[] Yes LoanX, ISIN, CUSIP, common-code or other identifiers. DebtInstrumentIdentifier
borrowerLegalEntityResearchRecordIds[] StableIdentifier[1..n] No Exact borrowers when evidenced. LegalEntity
instrumentType bond | term_loan | revolving_credit_facility | asset_backed_facility | lease_liability | other Yes Instrument classification. None
currency ISO 4217 code No Instrument currency. None
principalAmount MeasuredValue No Outstanding or stated principal. None
facilityCommitmentAmount MeasuredValue No Committed facility size. None
drawnAmount MeasuredValue No Drawn amount when disclosed. None
maturityDate DateWithPrecision No Contractual maturity. None
interestRateDescription string No Margin, coupon, floor and benchmark wording. None
seniority string No Reported ranking. None
instrumentStatus current | repaid | cancelled | proposed | unknown Yes Lifecycle status. None

Relationships

  • Borrowers reference LegalEntity
  • Market observations and covenants reference this record

Key invariants

  • Borrowers are exact entities, not inferred parents.
  • Amount currencies must agree with instrument currency.
Debt market observation debt_market_observation debtMarketObservations[] 59 records A dated price, yield, spread or rate observation tied to one debt instrument.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
debtInstrumentResearchRecordId StableIdentifier Yes Observed instrument. DebtInstrument
observationType price | yield | spread | interest_rate | other Yes Observed measure. None
observedValue MeasuredValue Yes Reported market value. None
valueAsOfDate DateWithPrecision Yes Observation date. None
observationBasis public_clo_report_mark | exchange_close | dealer_indication | fund_fair_value | transaction_price | other Yes Source and method of the observation. None
observationBasisDescription string No Required explanation for an other basis. None
sourceReportedIssuerName string No Issuer wording used in the source. None
sourceReportedInstrumentName string No Instrument wording used in the source. None

Relationships

  • References exactly one DebtInstrument

Key invariants

  • Public CLO marks require day precision, price type, percent-of-par units and a source instrument name.
Covenant record covenant_record covenantRecords[] 68 records A maintenance, incurrence, reporting or other covenant linked to covered instruments.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
covenantName string Yes Covenant label. None
relatedDebtInstrumentResearchRecordIds[] StableIdentifier[1..n] Yes Covered instruments. DebtInstrument
covenantType maintenance | incurrence | reporting | other Yes Covenant classification. None
covenantDescription string Yes Factual term description. None
thresholdValue MeasuredValue No Numeric threshold where disclosed. None
testFrequencyDescription string No Testing cadence. None
covenantStatus current | waived | amended | historical | unknown Yes Current status. None

Relationships

  • References one or more DebtInstrument records

Key invariants

  • Every covered instrument belongs to the same company aggregate.
Guarantee guarantee guarantees[] 5 records An evidenced guarantee from exact legal entities to exact debt instruments.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
guarantorLegalEntityResearchRecordIds[] StableIdentifier[1..n] Yes Guarantors. LegalEntity
guaranteedDebtInstrumentResearchRecordIds[] StableIdentifier[1..n] Yes Guaranteed instruments. DebtInstrument
guaranteeDescription string Yes Scope and nature of the guarantee. None
guaranteeStatus current | released | proposed | unknown Yes Current status. None

Relationships

  • Joins LegalEntity guarantors to DebtInstrument obligations

Key invariants

  • Accounting support undertakings are not treated as financing guarantees without evidence.
Security interest security_interest securityInterests[] 10 records Collateral granted by exact legal entities for exact debt instruments.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
grantorLegalEntityResearchRecordIds[] StableIdentifier[1..n] Yes Security grantors. LegalEntity
securedDebtInstrumentResearchRecordIds[] StableIdentifier[1..n] Yes Secured instruments. DebtInstrument
collateralDescription string Yes Collateral package. None
securityStatus current | released | proposed | unknown Yes Current status. None

Relationships

  • Joins LegalEntity grantors to DebtInstrument obligations

Key invariants

  • Grantor and secured instrument endpoints must be explicit and valid.
02.6

Findings, analysis and gaps

Separates flexible factual claims, deterministic calculations, analyst judgement and failed searches.

Research finding research_finding researchFindings[] 641 records An evidence-backed company fact that does not fit a more specific typed record.
direct evidence 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
evidenceLinks[] EvidenceLink[1..n] Yes Supporting, contradicting or contextual citations. SourceCitation
findingTitle string Yes Concise fact label. None
factualStatement string Yes Direct factual statement. None
subjectLegalEntityResearchRecordIds[] StableIdentifier[] Yes Exact subjects when known. LegalEntity
findingCategory string Yes Domain classification such as foreign exchange rate. None
applicablePeriod DateRangeWithPrecision No Period for which the fact applies. None
findingStatus current | historical | superseded | disputed | unknown Yes Current fact status. None
supersededByResearchRecordId StableIdentifier No Replacement record. ResearchRecord

Relationships

  • May reference LegalEntity subjects and a superseding ResearchRecord

Key invariants

  • Use a more specific record type where one exists.
  • Supersession lineage must resolve.
Calculated finding calculated_finding calculatedFindings[] 27 records A deterministic result whose exact inputs point back to canonical research fields.
derived lineage 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
calculationDescription string Yes Method and purpose of the calculation. None
calculationInputs[] ResearchRecordFieldReference[1..n] Yes Exact input records or fields. ResearchRecord
calculatedResult MeasuredValue Yes Numeric output. None
calculationDate ISO date Yes Date on which the calculation was made. None

Relationships

  • Lineage recursively resolves through input ResearchRecord fields to direct evidence

Key invariants

  • Inputs must exist and belong to the company; direct factual input fields are evidence-covered.
  • Lineage cycles are rejected.
Analyst conclusion analyst_conclusion analystConclusions[] 406 records An analyst judgement, including the curated reasons a company is on the watchlist.
derived lineage 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
conclusionTitle string Yes Concise analytical label. None
conclusionText string Yes Analyst-authored conclusion. None
supportingResearchRecords[] ResearchRecordFieldReference[1..n] Yes Exact supporting facts, calculations or documented gaps. Deep Dive publication applies a narrower rule to gaps. ResearchRecord

Relationships

  • May be selected by SnapshotEditorialPlan and DeepDiveSpec

Key invariants

  • An analyst conclusion cannot cite another analyst conclusion as support.
  • Public conclusions require public supporting records.
Research gap research_gap researchGaps[] 643 records An unresolved question with an auditable log of sources, URLs and searches already checked.
research process 0..n
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Corpus-wide immutable record identifier. None
researchRecordType literal Yes Discriminator for the research-record union. None
publicationVisibility internal_only | public Yes Eligibility for public output use. None
researchQuestion string Yes Bounded missing-information question. None
relatedResearchRecordIds[] StableIdentifier[] Yes Related facts or records. ResearchRecord
searchAttempts[] SearchAttempt[1..n] Yes Dates, checked documents or URLs, result and next check date. SearchAttempt
gapStatus open | partially_resolved | resolved Yes Current resolution state. None

Relationships

  • May reference related ResearchRecord records
  • Contains one or more SearchAttempt records
  • Dataset validation permits an AnalystConclusion to depend on a public ResearchGap; the public Deep Dive publisher rejects that dependency, including through conclusion lineage

Key invariants

  • Every search attempt names at least one checked source document or URL.
  • A gap records research process, not an evidence-backed fact.
  • Snapshot manufacture may report a selected gap; public Deep Dive publication rejects any ResearchGap in the dependency closure.
02.7

Shared value and reference types

Dates, measured values and cross-record references retain precision and lineage consistently across domain records.

Stable identifier StableIdentifier shared scalar reused throughout A lowercase, durable identifier used for company, record, source and output references.
embedded type reused throughout
FieldTypeRequiredMeaningReferences
value string 1..160 Yes Lowercase alphanumeric segments separated by dot, underscore or hyphen. None

Relationships

  • Forms all cross-object reference keys except content-addressed blob IDs

Key invariants

  • Must match ^[a-z0-9]+(?:[._-][a-z0-9]+)*$.
Debt-instrument identifier DebtInstrumentIdentifier debtInstrument.instrumentIdentifiers[] 0..n per DebtInstrument A LoanX, ISIN, CUSIP, common-code or explicitly described alternative instrument identifier.
embedded type 0..n per DebtInstrument
FieldTypeRequiredMeaningReferences
identifierScheme loanx | isin | cusip | common_code | other Yes Identifier namespace. None
identifierValue non-empty string Yes Identifier value. None
identifierSchemeDescription string No Required only when identifierScheme is other. None

Relationships

  • Embedded in DebtInstrument; its parent record carries the evidence links

Key invariants

  • LoanX values use LX followed by digits.
  • The other scheme requires a description; named schemes forbid one.
Measured value MeasuredValue shared value type reused in metrics and finance A finite numeric value with an explicit unit, optional currency and precision qualifier.
embedded type reused in metrics and finance
FieldTypeRequiredMeaningReferences
value finite number Yes Numeric magnitude. None
unit string Yes Unit such as EUR_millions, employees or percent_of_par. None
currency ISO 4217 code No Three-letter currency when applicable. None
valueQualifier exact | approximately | at_least | at_most Yes Precision qualifier; defaults to exact. None

Relationships

  • Embedded by metric, debt, market, covenant and calculated-finding records

Key invariants

  • Currency is a three-letter uppercase code when present.
Date with precision DateWithPrecision shared value type reused throughout A date whose precision is explicitly day, month, year or unknown.
embedded type reused throughout
FieldTypeRequiredMeaningReferences
precision day | month | year | unknown Yes Interpretation of the stored value. None
value YYYY-MM-DD | YYYY-MM | YYYY | string Yes Value matching the declared precision. None

Relationships

  • Embedded by observations, events, matters, documents and debt maturities

Key invariants

  • Day and month values must be valid calendar dates.
Date range with precision DateRangeWithPrecision shared value type reused throughout A bounded or described period whose endpoints retain their reported precision.
embedded type reused throughout
FieldTypeRequiredMeaningReferences
startDate DateWithPrecision No Period start. DateWithPrecision
endDate DateWithPrecision No Period end. DateWithPrecision
periodDescription string No Source wording when dates alone are insufficient. None

Relationships

  • Embedded by metrics, ownership, legal matters and findings

Key invariants

  • At least one endpoint or description is present.
  • A comparable end date cannot precede the start date.
Research-record field reference ResearchRecordFieldReference shared reference type reused in lineage and outputs Points to a whole canonical research record or an explicit set of RFC 6901 JSON-pointer fields.
embedded type reused in lineage and outputs
FieldTypeRequiredMeaningReferences
researchRecordId StableIdentifier Yes Referenced record. ResearchRecord
fieldReferenceType whole_record | specific_fields Yes Reference breadth. None
referencedFieldJsonPointers[] JSON Pointer[1..n] No Required for specific_fields references. None

Relationships

  • Used by calculations, conclusions, SnapshotContent and DeepDiveSpec

Key invariants

  • Pointers resolve on the target record and cannot target provenance fields.
Search attempt SearchAttempt researchGap.searchAttempts[] 1..n per ResearchGap An auditable bounded search for an unresolved question, recording what was checked and the result.
research process 1..n per ResearchGap
FieldTypeRequiredMeaningReferences
searchAttemptId StableIdentifier Yes Attempt identifier. None
searchedOn ISO date Yes Date the search was performed. None
checkedSourceDocumentIds[] StableIdentifier[] Yes Corpus source documents checked; may be empty only when checkedUrls is non-empty. SourceDocument
checkedUrls[] URL[] No Additional live URLs checked. None
searchQueries[] non-empty string[] No Queries used during the search. None
searchResult not_found | partial | ambiguous | paywalled | blocked | unreachable Yes Bounded outcome. None
resultDescription string Yes What was found or why the search did not resolve the question. None
checkAgainAfter ISO date No Earliest sensible date for another attempt. None

Relationships

  • Embedded in ResearchGap
  • checkedSourceDocumentIds resolve to global SourceDocument records

Key invariants

  • At least one checked source document or checked URL is present.
  • Search attempts describe research activity and do not themselves evidence a company fact.
03

Evidence and files

A citation is not a file, and a file is not a source publication. The layers preserve that distinction while keeping every supported fact traceable.

EvidenceLinkfact-to-citation binding SourceCitationprecise location SourceDocumentlogical publication SourceFileRepresentationretained form ResearchFileBlobimmutable bytes
938 repository-backed blobs 52 R2-backed blobs Downloadability is controlled on the representation, not inferred from storage.
Source citation SourceCitation sourceCitations[] 3,099 records A precise location in a retained file or live URL, with separately controlled excerpt visibility.
global evidence 3,099 current
FieldTypeRequiredMeaningReferences
sourceCitationId StableIdentifier Yes Global citation identifier. None
sourceDocumentId StableIdentifier Yes Logical source publication. SourceDocument
citationBasis quotation | paraphrase | table | registry_entry Yes Nature of the cited material. None
sourceExcerpt string No Retained excerpt when permitted. None
citationNote string No Citation-specific note. None
citationLocationType stored_file | url_only Yes Storage-backed or live-web location. None
sourceFileRepresentationId StableIdentifier No Retained representation when stored-file based. SourceFileRepresentation
locator StoredFileLocator | LiveWebLocator Yes Page, section, table, lines, cells, selector or whole resource. None
accessedOn ISO date No Required access date for a url_only citation. None
urlOnlyReason not_downloaded | dynamic_page | download_prohibited | other No Required reason that a url_only citation has no retained file. None
citationMetadataVisibility internal_only | public Yes Visibility of citation metadata. None
sourceExcerptVisibility internal_only | public Yes Visibility of any excerpt. None

Relationships

  • References SourceDocument and optionally SourceFileRepresentation

Key invariants

  • Stored-file citations reference a retained representation.
  • Public excerpt visibility requires an excerpt.
Source document SourceDocument sourceDocuments[] 1,452 records The logical publication: report, filing, contract, website, article, market data or other source.
global evidence 1,452 current
FieldTypeRequiredMeaningReferences
sourceDocumentId StableIdentifier Yes Global source identifier. None
title string Yes Document title. None
publisher string Yes Publisher or originator. None
documentType annual_report | interim_report | investor_presentation | regulatory_filing | credit_opinion | press_release | company_website | news_article | market_data | registry_record | contract | court_record | email_attachment | other Yes Source-document classification. None
contentAsOfDate DateWithPrecision No Date represented by the content. None
publicationDate DateWithPrecision No Publication date. None
originalUrl URL No Original web location. None
languageCode string No Document language. None
sourceAccessType public | licensed | confidential | company_provided Yes Access basis. None
publicationPolicy object Yes Independent metadata and original-URL visibility controls. None

Relationships

  • One document may have many citations and retained file representations

Key invariants

  • A public original URL policy requires an original URL.
Source file representation SourceFileRepresentation sourceFileRepresentations[] 1,032 records An original, archive, OCR, extraction, table or translation of a source document.
global evidence 1,032 current
FieldTypeRequiredMeaningReferences
sourceFileRepresentationId StableIdentifier Yes Representation identifier. None
sourceDocumentId StableIdentifier Yes Logical source represented. SourceDocument
representationRole original | web_archive | ocr_text | extracted_text | extracted_table | translation Yes Relationship of this retained form to its source document. None
researchFileBlobId sha256 identifier Yes Immutable file bytes. ResearchFileBlob
displayFileName filename Yes Safe display and download name. None
declaredMediaType string Yes Declared content type. None
acquisitionEvents[] SourceFileAcquisitionEvent[] Yes Download, email, upload or repository acquisition trail. None
derivedFromSourceFileRepresentationId StableIdentifier No Parent representation for derived files. SourceFileRepresentation
transformation FileTransformation No OCR, extraction or translation metadata. None
retainedFileAccess internal_only | public_download_allowed Yes Download eligibility. None
publicDownloadAuthorization authorization record No Who authorized public download and why. None

Relationships

  • Joins SourceDocument metadata to immutable ResearchFileBlob bytes

Key invariants

  • Derived representations require a parent and matching transformation.
  • Public download requires explicit authorization.
Research file blob ResearchFileBlob researchFileBlobs[] 990 records Content-addressed immutable bytes stored in the repository or R2.
global evidence 990 current
FieldTypeRequiredMeaningReferences
researchFileBlobId sha256:<64 hex> Yes Content-derived identifier. None
byteLength non-negative integer Yes Expected file size. None
detectedMediaType string No Sniffed media type. None
ingestedAt ISO timestamp Yes Ingestion time. None
storageLocation { storageType: repository; repositoryPath } | { storageType: r2; objectKey } Yes Discriminated retrieval location. None

Relationships

  • Referenced by one or more SourceFileRepresentation records

Key invariants

  • Identifier equals the SHA-256 of the stored bytes.
  • Repository paths are relative and cannot traverse.
Source file acquisition event SourceFileAcquisitionEvent sourceFileRepresentation.acquisitionEvents[] 0..n per representation Records how bytes entered Odin: URL download, email attachment, manual upload or repository import.
embedded type 0..n per representation
FieldTypeRequiredMeaningReferences
acquisitionEventId StableIdentifier Yes Acquisition event identifier. None
acquiredAt ISO 8601 timestamp Yes Acquisition time. None
acquisitionMethod url_download | email_attachment | manual_upload | repository_import Yes Acquisition route. None
sourceUrl URL No Required for URL downloads. None
emailMessageId string No Email message identifier when available. None
receivedFileName filename No Required for email, upload and repository import. None
acquisitionNote string No Manual-upload note. None
repositoryRelativePath POSIX path No Required for repository imports. None

Relationships

  • Embedded in SourceFileRepresentation

Key invariants

  • Original and web-archive representations have at least one acquisition event.
Stored file locator StoredFileLocator sourceCitation.locator when stored_file exactly 1 per stored-file citation Locates evidence within retained bytes by page, section, table, lines, spreadsheet cells, XML path or HTML selector.
embedded type exactly 1 per stored-file citation
FieldTypeRequiredMeaningReferences
locatorType whole_file | pdf_page | section | table | text_lines | spreadsheet_cells | xml_path | html_selector Yes Locator discriminator. None
pageNumber / printedPageLabel integer / string No PDF-page location. None
sectionTitle / localAnchor string No Document section location. None
tableName / rowDescription string No Table location; at least one is present. None
startLine / endLine positive integer No Inclusive extracted-text line range. None
sheetName / cellRange string No Spreadsheet range. None
xmlPath / cssSelector string No Structured-document location. None

Relationships

  • Embedded in a stored-file SourceCitation

Key invariants

  • Line ranges are ordered; table locators identify a table or row.
Live web locator LiveWebLocator sourceCitation.locator when url_only exactly 1 per URL-only citation Locates evidence on a live page by whole page, PDF page, URL fragment, section or HTML selector.
embedded type exactly 1 per URL-only citation
FieldTypeRequiredMeaningReferences
locatorType whole_page | pdf_page | url_fragment | section | html_selector Yes Locator discriminator. None
pageNumber / printedPageLabel integer / string No PDF-page location. None
fragment string No URL fragment without inference. None
sectionTitle string No Visible section title. None
cssSelector string No HTML selector. None

Relationships

  • Embedded in a URL-only SourceCitation

Key invariants

  • URL-only citations also store accessedOn and urlOnlyReason.
04

Output composition

Output models reference canonical records. Snapshot plans select ordered records and manufacture exact field lineage; Deep Dive specifications select fields directly within a company-specific, publication-aware composition.

DimensionSnapshotDeep Dive
PurposeStandard four-slide company snapshotTailored company research page
SelectionOrdered record IDs; manufactured content records exact field lineageExact field references, supported claims and structured views
LayoutDeterministic template; optional structure coordinatesFlexible sections; typed tables, timelines and diagrams
Fact storageNo duplicated canonical factsAuthored wording carries canonical field references with publication-time evidence closure
Snapshot editorial plan SnapshotEditorialPlan snapshotEditorialPlans[] 169 records Ordered featured records and watchlist conclusions used by the deterministic four-slide Snapshot renderer. Every company in the current assembled corpus has one, but the dataset schema does not require full coverage.
output selection 0..1 per company (169 current; one for every current company)
FieldTypeRequiredMeaningReferences
snapshotEditorialPlanId StableIdentifier Yes Plan identifier. None
companyRecordId StableIdentifier Yes Owning company aggregate. CompanyResearchRecord
snapshotDisplayTitle string No Publication-specific title. None
featuredResearchRecordIds[] StableIdentifier[] Yes Ordered featured records, including facts and documented research gaps. ResearchRecord
curatedWatchListConclusionIds[] StableIdentifier[] Yes Ordered watchlist analysis. AnalystConclusion
structureDiagramLayout entity position map No Layout hints only; never creates entities or ownership edges. None

Relationships

  • Stored beside the CompanyResearchRecord revision
  • Manufactures SnapshotContent then PPTX

Key invariants

  • At most one plan may reference a given company in an assembled dataset; zero is schema-valid.
  • Selections belong to the company and contain no duplicates.
  • Watchlist IDs resolve only to AnalystConclusion.
Deep Dive specification DeepDiveSpec deepDiveSpecs[] 11 records A company-tailored publication recipe combining supported prose, analyst commentary and typed structured views.
output selection 11 current
FieldTypeRequiredMeaningReferences
deepDiveSpecId StableIdentifier Yes Specification identifier. None
deepDiveSlug route slug Yes Published route. None
deepDiveTitle string Yes Publication title. None
primaryCompanyRecordId StableIdentifier Yes Primary aggregate. CompanyResearchRecord
relatedCompanyRecordIds[] StableIdentifier[] Yes Additional company perimeters when needed. CompanyResearchRecord
publicationVisibility internal_only | public Yes Output eligibility. None
contentExpansionStatus not_in_progress | expansion_in_progress Yes Editorial expansion state. None
sections[] DeepDiveSection[1..n] Yes Ordered custom sections with claims, commentary and structured views. None

Relationships

  • Selects exact ResearchRecord fields; public manufacture follows their publishable evidence closure

Key invariants

  • Public specs can reference only public companies, records and evidence.
  • Every section contains prose or a structured view.
Snapshot content SnapshotContent manufactured Snapshot artifact one per manufactured Snapshot plan result Format-neutral manufactured output that closes a Snapshot plan over exact company records before rendering.
output selection one per manufactured Snapshot plan result
FieldTypeRequiredMeaningReferences
snapshotContentId StableIdentifier Yes Manufactured content identifier. None
snapshotEditorialPlanId StableIdentifier Yes Source selection plan. SnapshotEditorialPlan
companyRecordId StableIdentifier Yes Company aggregate selected by the plan. CompanyResearchRecord
publicationVisibility internal_only | public Yes Output visibility. None
contentItems[] SnapshotContentItem[] Yes Manufactured display values with exact field lineage. SnapshotContentItem

Relationships

  • Manufactured from SnapshotEditorialPlan and its owning CompanyResearchRecord
  • Each item points back to one selected canonical ResearchRecord field reference
  • Consumed by the Snapshot render-input and PPTX stages; not stored as a second canonical fact model

Key invariants

  • The plan exists and belongs to companyRecordId.
  • Public content requires a public company and public referenced records.
  • Every plan-selected record, plus company identity, appears exactly once; unselected records cannot appear.
  • Each item content type matches its source record discriminator.
Snapshot content item SnapshotContentItem snapshotContent.contentItems[] 0..n per SnapshotContent One manufactured display label/value pair with a whole-record or field-specific pointer to its canonical source.
output selection 0..n per SnapshotContent
FieldTypeRequiredMeaningReferences
snapshotContentItemId StableIdentifier Yes Stable item identifier within the manufactured output. None
contentItemType company_identity | legal_entity | ownership_relationship | business_activity | operating_asset | operational_metric_observation | financial_metric_observation | debt_instrument | debt_market_observation | covenant_record | guarantee | security_interest | company_event | legal_matter | research_finding | calculated_finding | analyst_conclusion | research_gap Yes Source research-record discriminator. None
displayLabel string Yes Renderer-facing label manufactured from the selected record. None
displayValue string Yes Renderer-facing value manufactured from the selected record. None
sourceResearchRecord ResearchRecordFieldReference Yes Exact canonical record or fields from which the display value was manufactured. ResearchRecordFieldReference

Relationships

  • Embedded in SnapshotContent
  • sourceResearchRecord resolves inside the Snapshot company and the owning editorial plan selection

Key invariants

  • contentItemType equals the referenced record researchRecordType.
  • The same source research record cannot appear in two content items.
  • Field pointers resolve and preserve publication-aware evidence lineage where applicable.
Structure diagram layout StructureDiagramLayout snapshotEditorialPlan.structureDiagramLayout optional per Snapshot plan Editorial coordinates for already-evidenced legal entities; never a source of structure facts.
embedded type optional per Snapshot plan
FieldTypeRequiredMeaningReferences
positionsByLegalEntityResearchRecordId record of { xPosition; yPosition } Yes Finite layout coordinates keyed by legal-entity record ID. LegalEntity

Relationships

  • Embedded in SnapshotEditorialPlan

Key invariants

  • Every key resolves to a LegalEntity in the owning company.
Deep Dive section DeepDiveSection deepDiveSpec.sections[] 1..n per Deep Dive An ordered company-specific section containing typed structured views, supported prose and/or analyst commentary.
embedded type 1..n per Deep Dive
FieldTypeRequiredMeaningReferences
deepDiveSectionId StableIdentifier Yes Section identifier. None
sectionTitle string Yes Displayed section title. None
structuredViewResearchRecords[] ResearchRecordFieldReference[] Yes Rows, charts, timelines or structure nodes. ResearchRecordFieldReference
usdEquivalentBindings[] DeepDiveUsdEquivalentBinding[] Yes Explicit non-USD/EUR/GBP conversion pairings. DeepDiveUsdEquivalentBinding
contentNodes[] DeepDiveContentNode[] Yes Supported prose and analyst commentary. DeepDiveContentNode

Relationships

  • Embedded in DeepDiveSpec

Key invariants

  • A section has at least one content node or structured-view record.
Deep Dive content node DeepDiveContentNode deepDiveSection.contentNodes[] 0..n per section Either authored supported wording with exact field references or a pointer to canonical analyst commentary.
embedded type 0..n per section
FieldTypeRequiredMeaningReferences
nodeType supported_claim | analyst_commentary Yes Node discriminator. None
deepDiveClaimId StableIdentifier No Required for supported_claim. None
authoredText string No Required publication wording for supported_claim. None
supportingResearchRecords[] ResearchRecordFieldReference[1..n] No Exact supporting fields for supported_claim. ResearchRecordFieldReference
analystConclusionResearchRecordId StableIdentifier No Required for analyst_commentary. AnalystConclusion

Relationships

  • Embedded in DeepDiveSection

Key invariants

  • Supported claims have at least one exact reference; commentary points to AnalystConclusion.
Deep Dive USD-equivalent binding DeepDiveUsdEquivalentBinding deepDiveSection.usdEquivalentBindings[] 0..n per section Pairs one non-USD/EUR/GBP measured field with the exact calculated USD result displayed beside it.
embedded type 0..n per section
FieldTypeRequiredMeaningReferences
sourceValueReference single-field ResearchRecordFieldReference Yes Original measured-value field. ResearchRecordFieldReference
calculatedFindingResearchRecordId StableIdentifier Yes USD conversion result. CalculatedFinding

Relationships

  • Embedded in DeepDiveSection; calculation inputs include the source value and an FX-rate ResearchFinding

Key invariants

  • Source field is not USD, EUR or GBP; result is USD.
  • Each source value and calculation is bound only once per section.
05

Revisions and storage

Current active company pointers resolve to immutable revision folders that pair research with a Snapshot plan. At the assembled dataset boundary, validation permits a company without a plan but rejects more than one. Global evidence objects are shared outside company folders; file blobs alone are content-addressed by their bytes.

corpus/
|-- company-active/<slug>.json
|-- company-revisions/<slug>/<revision>/
|   |-- company-research.json
|   +-- snapshot-editorial-plan.json
|-- deep-dive-specs/
|-- source-documents/
|-- source-citations/
|-- source-file-representations/
+-- research-file-blobs/

research/source-materials/sha256/<prefix>/<hash>.raw
  1. 1
    Stage

    Fetch, hash and extract source candidates inside an isolated research run.

  2. 2
    Validate

    Check structural schemas, references, evidence coverage and file integrity.

  3. 3
    Review

    A separate semantic review approves the exact candidate fingerprint.

  4. 4
    Promote

    Install blobs, global evidence and an immutable company revision under a lock.

  5. 5
    Activate

    Move the company pointer atomically; earlier revisions remain intact.

06

Cross-record validation

Zod enforces local shapes; the dataset validator enforces identity, perimeter, lineage, evidence, output and publication rules across objects.

Identity

Company and research-record IDs are globally unique; routes and automatic MCP/email aliases resolve unambiguously, while search aliases may intentionally overlap.

Evidence

Every direct fact has at least one supporting citation, and field-scoped support covers every output-selected field.

Entity endpoints

Ownership, borrower, guarantee, security and asset-owner references resolve to exact legal entities in the company aggregate; corporateStructure may include contextual entities outside researchScope.

Lineage

Calculated findings resolve exact inputs without cycles; analyst conclusions cite facts, calculations and/or documented gaps, but never another conclusion.

Research-gap publication

Dataset validation permits a public AnalystConclusion to depend on a public ResearchGap. Snapshot manufacture can report selected gaps, while public Deep Dive publication rejects any gap dependency; this is a publication-boundary inconsistency, not a corpus-wide prohibition.

Visibility

Public outputs cannot traverse internal-only companies, records, citations, excerpts or unauthorized files.

Files

Blob identifiers match SHA-256 bytes; retained representations have valid acquisition and transformation lineage.

Outputs

An assembled dataset permits zero or one Snapshot plan per company; current corpus coverage is one per company. Plans select company-owned records, and manufactured Snapshot content and Deep Dive field references must resolve valid, evidence-covered fields where applicable.

Host paths

Canonical data cannot contain absolute machine paths; storage paths remain repository-relative or R2 keys.