Phase C — Data Architecture

The platform's own data: the catalog that describes the enterprise schema, the policies that govern it, the artifacts agents produce, and the governance records that make every screen reproducible. The enterprise's business data itself stays in its systems of record and is only ever read through compiled, scoped queries.

C1 · Conceptual data modelEntities by domain — catalog, policy, use-case artifacts, governance, registry

Everything the generation side touches is metadata about data, never the data. The Release Unit is the entity auditors care about: it names exactly which versions of everything a reviewer approved.

CATALOGPOLICY & GLOSSARYUSE-CASE ARTIFACTSGOVERNANCECOMPONENT REGISTRY CatalogVersionid · crawledAt · trigger (schedule|DDL)diff vs previous versionsourceSystems[]status: building | active | superseded TableCardid (schema.table) · domain · ownerdescription (reviewed) · synonyms[]rowCountApprox · classification[]entitlement: readRoles[] · rowScope ColumnEntryname · type · nullable · pk · fk →classification · enumLike{}profile: nullRate · cardinality · topKglossaryTerms[] JoinPathfrom → to · on · cardinalitysource: fk | querylog | bothfrequency (from query logs)confidence GlossaryTermterm · definition · synonyms[]maps to tables[] · columns[]learnedFrom (ambiguity resolution)owner PolicyVersionid · effectiveFromsource (governance tool of record)coverage report per domainstatus: active | superseded Classificationcode: pii.contact · pii.ssn · phi ·financial · confidential · publichandling: deny-by-default · maskingretention EntitlementPolicypolicyId (finance:read, pii:contact…)roles[] · scope: schema | table | columnrowPredicate template over claimsautonomousSafeTargets[] (for writes) UseCaseSpecuseCaseId · title · archetypeactors[] · questions[] · entities[]actions[] {kind · target · approval}constraints · nonGoals · requester SubgraphtableIds[] (TableCard refs) · joinIds[]rationale per table · confidencecatalogVersion (pinned)ambiguities[] (returned, not guessed) SchemaSlicesliceVersion · SDL (federation v2)fieldMap → catalog columnspoliciesApplied[] · costWeightscatalogVersion · policyVersion PersistedOperationopId@version · document (query text)kind: query | proposalcostWeight · maxPageSizecompiledPlan per role (dry-run) UISpecspecVersion · routes[] · pages{}bindings → opIds · actions → proposalscomponentRefs[] (registry id@version)a11y lint result RunrunId · useCaseId · state (machine)budget: steps · tokens · time · costtrace (retrieval, artifacts, decisions)retries per composer GateReportgate (9) · result · evidencepolicyCoverage% · costActualgoldenTests {pass, fail, replayable}piiScanFindings[] ReviewDecisionreviewer (domain owner | finance)decision: approve | reject · notesscope: read paths | write pathdecidedAt · immutable ReleaseUnitcatalog · slice · spec versionspolicyVersion · modelDeploymentprompt template · component versionsstate: live | degraded | retired ProposalproposalId · target (system of record)payload · proposedBy · reasonstatus: proposed | approved | appliedapprover · appliedBy (owning system) CustomComponentcomponentId · propsContractallowedOperations[] · rationalerequestedBy (UI Composer run)owner ComponentVersionversion · remoteUrl (federated)dependencyAllowList · scanReportscreenshotDiff · reviewerstatus: proposed | published | retired 1 has * 1 has * 2 tables · * per table * map to * 1 classifies * 1 versions * 1 protected by * 1 grounds 1 subgraph pinned to catalog version · cites TableCards by id 1 composes 1 1 exposes * * bound by 1 spec policy per field * runs for 1 1 produces 9 evidence for approves exactly 1 pins slice created by op spec uses reviewed component versions 1 has *

C2 · Data lifecycle & disseminationFrom systems of record to a reproducible screen — and what never crosses which line

Two boundaries matter. Left of the dotted line, only metadata and sampled, masked profiles exist. Right of it, at runtime, production data flows — but only through compiled, entitlement-scoped SQL. Generation never crosses into production data.

METADATA ONLY · SAMPLED & MASKED PROFILES · SYNTHETIC SAMPLE DATA PRODUCTION DATA · RUNTIME ONLY · SCOPED SQL Systems of recordDDL · comments · query logsrow samples (masked) Crawlerextract · profile (PII-aware)mine joins · diff → version Catalog version #Ntable cards · column entriesjoin paths · glossary Owner reviewdescriptions approvedclassification coverage checked Policy catalogclassification · entitlementsversioned · from governance Retrievable indexhybrid (BM25 + vector) + join graphentitlement-filtered per request Agents read cards onlysubgraph → slice → UI specevery table cites a card Sample sandboxsynthetic data, same schemagolden tests · PII scan Review & release unitdecision recorded against versionsimmutable Registryslices · persisted ops · UI specscomponent versions Gatewaypersisted op id + claimsno query text at the edge Query compilerentitlements in the SQLdenied columns → null Systems of record (read replicas where needed)only rows a caller could already open directlywrites only via approved proposals, applied by the owning system Response cachekey = (operation, args, entitlement fingerprint, catalog generation)cannot serve a result to someone not entitled to it · busts on drift Trace & audit storeevery compiled query + predicate set · every run · every decision approved cards become retrievable artifacts + gate reports publish scoped SQL DDL events + schedule → next crawl (metadata only crosses back)

C3 · Data security viewClassification × enforcement point — what happens to each data class at each stage

Data classCrawler / catalogScout (retrieval)ComposerVerifierCompiler / runtimeReview UI
Public / internalProfiled normally; top-k values keptRetrievable to any actor with table readNo policy requiredGroundedness, costRow scope still appliesShown
Confidential / financialProfiled; values summarised, not listedRetrievable only if actors hold the read role@authorize(policy) mandatory; nullablePolicy coverage 100%; entitlement compile per rolePredicate injected; denied → nullSample values only
PII (contact, identity)Masked at profile time; no raw values in cardsExcluded from subgraph if no actor may read; flagged if presentPolicy per field; never in list columns by defaultPII exposure scan on sample resultsDenied → null in projection; never selected-then-redactedMasked preview
PHI / regulatedDomain enabled only with 100% classification coverageRetrievable only for actors with the regulated role; audit event on retrievalPolicy per field; write targets never autonomous-safePII/PHI scan; a11y; golden tests include narrow-permission usersPredicate + column policy; every query logged with predicate setMasked preview; reviewer must hold the role
Secrets / credentialsNever crawled (schema deny-list)Not in the indexCannot be referencedGroundedness gate rejects any unknown table
Principle: post-filtering is a control you have to remember; a query filter is a control you cannot forget. Every cell in the compiler column is a query-time control, never a post-filter.

C4 · Data entity / application component matrixWho creates, reads, updates and retires each entity

EntityCrawlerCatalog svcPolicy svcIntakeScoutComposersVerifierReview UIRegistryCompiler / runtime
CatalogVersionCR URRRRRR (generation stamp)
TableCard / ColumnEntry / JoinPathCR U (owner review)RRRRR (field map)
GlossaryTermCR UR U (learns)R
Classification / EntitlementPolicy / PolicyVersionRC R UR (pre-filter)RRRR (predicates)
UseCaseSpecC URRRRR
SubgraphCRRR
SchemaSlice / PersistedOperationCRRR U (publish)R
UISpecCRRR UR (render)
CustomComponent / ComponentVersionC (request)R (scan)U (approve)C R UR (load)
Run / GateReportUUUCRR
ReviewDecision / ReleaseUnitCC R U (state)R
ProposalRC R (status); applied by owning system
C createR readU updateNothing is hard-deleted: versions are superseded and release units retired.