Architecture meta-model¶
Decision
This page records a decision and its status. A Proposed decision is not binding; an Accepted decision is binding on the Factory until amended or superseded.
Decided on 2026-10-09 (ADR-0016; decisions D22–D26). This page is the vocabulary every other architecture page uses.
The hierarchy¶
flowchart TB
PL["Plane (9)<br/>logical responsibility layer"] --> PF["Platform (16)<br/>product / delivery grouping inside a plane"]
PF --> BC["Bounded context (BC-nn)<br/>one authoritative writer per state"]
BC --> SVC["Logical microservice<br/>deployment granularity: standalone · module-of-host · external-canonical · later"]
SVC --> AGG["Aggregates → entities / value objects → DDL tables"]
SVC --> API["APIs: REST (public, BFF) · gRPC (internal, code-first)"]
SVC --> MSG["Messages: events (topic context.area.vN.name) · commands · consumed events"]
SVC --> RUN["Workers / jobs · grains · sagas"]
SVC --> OPS["Options · metrics · security · dependencies · failure modes · NFR class · deployment"]
X["Cross-cutting entities: agents · skills · tools · model profiles · workflows · templates · libraries · descriptors / DSLs · gateways · stores · topologies · NFR classes · externals · components · traceability"] -.-> SVC
| Level | Meaning | Owns | Does not own |
|---|---|---|---|
| Plane | A logical boundary that names what must be owned, decided and observed. The nine planes come from the October-2026 target architecture. | Its platforms; a plane index page with generated sections | Deployables, teams, budgets |
| Platform | A product or delivery grouping inside one plane: the twelve June-2026 platforms plus four added on 2026-10-09. A platform has one default host for its modules and a documentation page set. | Bounded contexts; a page set of 8 generated catalogs and 7 hand-written narrative pages | State (that belongs to contexts) |
| Bounded context | A DDD boundary with exactly one authoritative writer per state; ids BC-01…BC-33 come from the ownership map, BC-34…BC-42 from the design plan. Its slug is the first segment of every topic its services publish. | Aggregates and their invariants; the services that implement them | Another context's state (reads go through APIs or events) |
| Logical microservice | The unit of design: one page, one model entry. Granularity says how it ships at first (decision D23). | Aggregates, tables, APIs, messages, workers, grains, sagas, options, metrics, security, dependencies, failure modes | A deployment unit of its own unless standalone |
Deployment granularity¶
| Value | Meaning | Design obligation |
|---|---|---|
standalone |
A host: its own process, database connection and pipeline. Sixteen exist, one per platform (for example ControlPlaneApi, AgentRuntimeWorker). |
Full page; deployment, ports, replicas, topologies |
module-of-host |
A module inside a host; same process and database, separate schema ownership and namespace. Extraction into a host needs a documented trigger, owner, migration, event compatibility, authorization changes and rollback. | Full page; host named; no own pipeline |
external-canonical |
Provided by a ConnectSoft foundation, template or external system of record (Identity Platform, Config Platform, SaaS templates, Azure DevOps, OpenTelemetry backends). The Factory integrates, it does not own. | Page describes the integration contract and the external_ref; no aggregates or tables of its own |
later |
A named target outside early scope. | Page states the trigger that brings it into scope |
The former catalog disposition (module, merge, external, conditional, defer) is kept on every registry row as provenance; it maps to granularity as module and merge → module-of-host, external → external-canonical, conditional → standalone, defer → later.
Statuses¶
Pages carry doc_status: target (design intent), current (what exists at the recorded revisions), decision (an ADR or recorded choice), evidence (verified facts with a date), historical (kept for provenance). Model entities carry status target / current / evidence; a registry service without a model file renders as unmodelled in every catalog so that links never break.
Where things are written¶
| Artefact | Source of truth | Rendered where |
|---|---|---|
| Facts about a service (fields, tables, endpoints, events, workers, options, metrics, security, dependencies, failure modes, NFR class, deployment) | model/services/<platform>/<ServiceId>.yaml |
The eight generated catalog pages of its platform, the global catalogs, and the fragment sections included by its design page |
| Narrative about a service (purpose, boundaries, reasoning, examples, current implementation, later capabilities) | <platform docs_dir>/services/<slug>/index.md (hand-written, scaffolded once) |
Itself |
| Platform narrative | overview, workflows, ui, security, observability, deployment, later-capabilities pages (hand-written) |
Themselves, with generated summary fragments |
| Plane narrative | planes/<plane>/index.md and its hand pages |
With six generated sections (platforms, contexts, services, boundary events, gateways, coverage) |
| Cross-cutting entities | model/*.yaml, model/agents, model/tools, model/skills, model/workflows |
architecture/catalogs/* |
| Requirements | model/traceability/{fr,fux,nfr,xl}.yaml |
architecture/traceability/* and the coverage page |
| Decisions | architecture/adr/* |
ADR index |
The generator (tools/docs_model) validates the model on every mkdocs build: unknown references, two producers of one event, a topic whose context segment is not the producer's context slug, a table without a tenant column, a tool whose side-effect class exceeds the agent's policy, or an approval-free shared-write tool all fail the build. The rules are listed on the model report page's companion, the documentation standards.
Identifiers and anchors¶
- Service ids are PascalCase (
RunControlService); slugs are derived (run-control-service), never authored. - Every entity has exactly one canonical anchor:
svc-<slug>on its platform's microservices page,bc-<slug>on bounded contexts,evt-<context-slug>-<event-slug>on events,agg-<service-slug>-<name>on aggregate roots,tbl-<service-slug>-<table>on the DDL appendix,pf-<slug>,pl-<plane>,agent-<id>,tool-<id>,prof-<id>,tpl-<id>,lib-<id>,dsl-<id>,gw-<id>,store-<id>,fr-<id>and so on. - Hand pages link to anchors, never redefine them; a per-platform link file (
includes/generated/links/<platform>.md) offers reference-style definitions.