FORGE-101 — The Runtime Architecture of Project Forge
Project Forge — Second Engineering Document Status: Architectural Constitution (normative). Extends FORGE-100; implements FORGE-001, FORGE-002, FORGE-003. Precedence: FORGE-002 governs meaning; FORGE-100 governs construction; FORGE-101 governs composition — how constructed parts are organised into a runtime, domains, and deployments. FORGE-101 MUST NOT contradict its predecessors; where a reading of this document appears to contradict them, the reconciling reading governs, and an unreconcilable sentence is a defect in this document, to be amended.
Preamble
The founding trilogy defined what Forge means. FORGE-100 proved it constructable: a unidirectional pipeline from reality to reader, in which a fact is stored exactly once and everything a reader sees is a pure function of stored facts and identity.
This document exists because of a realisation that FORGE-100 anticipated but did not name.
FORGE-100’s Preamble already declared: “Forge is an architecture, not an application. Mjolnir is the first implementation, not the subject.” But the working assumption throughout the project’s first year remained that Project Forge was building an HPC Analytics platform, of which Mjolnir was the destination. That assumption is now retired:
Project Forge is not an HPC platform and not a framework for building one. Project Forge is the runtime for scientific platforms. The HPC Analytics platform is the first production domain implemented on Forge. Mjolnir is the first Forge Instance. BioHPC will be the second. Systems not yet imagined must be implementable without changing Forge Core.
FORGE-100 drew one seam — the Implementation Layer (Part 2.9) — between the instrument-neutral core and everything specific. That seam was drawn in the right place, but with one line where two were needed. “Everything specific” turns out to contain two different kinds of knowledge that change at different rates, are owned by different people, and are reused at different scopes:
- Domain knowledge — what a scheduler is, what a batch job means, how queues behave, what a basecaller produces. This is the expertise of a scientific practice. It is not universal, but it is also not Mjolnir’s: every Slurm cluster on Earth shares it.
- Instance knowledge — Mjolnir’s hostnames, credentials, branding, policies, carbon-intensity feed, aggregation floors. This is the fact of one deployment. Nobody else shares it, and nothing about it is expertise.
Collapsing these into one layer produces a forced error the moment a second instance appears: either BioHPC rewrites the scheduler adapters and queue projections Mjolnir already built (duplication — the cardinal bug of FORGE-002 §3.6 applied to code), or those adapters migrate “down” into the shared core, and the core learns what a scheduler is — at which point the telescope facility of FORGE-100 Part 13.3 inherits scheduler code it can never use and never delete. Both failures are slow, both are fatal over a decade, and the only structural cure is a third layer.
This document therefore defines the three-plane architecture — Forge Core → Forge Domain → Forge Instance — and everything that follows from it: what modules and services are, where entities live, how the planes communicate, what may depend on what, how the repository is organised, how today’s HPC Analytics platform maps into the planes, and how it migrates there without disrupting production.
The reader this document is written for is the person who arrives in five years knowing nothing about Mjolnir, nothing about BioHPC, nothing about HPC — wanting only to build a scientific platform on Forge. Every part below should tell that reader exactly how the architecture works and exactly what they must write, what they inherit, and what they are forbidden to touch.
Terminology and naming discipline
RFC-2119 terms (MUST / SHOULD / MAY) are used as in FORGE-100.
Two naming collisions must be disarmed immediately, because this document introduces runtime concepts whose natural names are already taken by the ontology:
- Module. In FORGE-002 §3.2, a Module is an ontology object: a version-build of a Software installed on the instrument. In this document, a Forge Module is a unit of runtime capability (Part 7). The two are unrelated. This document always writes Forge Module for the runtime concept, and implementations MUST NOT abbreviate it to “module” in any context where the ontology object could be meant.
- Instance. In FORGE-002 §3.5, instance-of is the relation between a Module and its Software. In this document, a Forge Instance is a deployment (Part 5). This document always writes Forge Instance for the deployment concept.
New defined terms introduced here: Plane, Forge Core, Forge Domain, Forge Instance, Forge Module, Forge Service, Domain Extension Package, Manifest, Signal, Composition, Promotion.
Part 1 — From Platform to Runtime
1.1 What “runtime” means in Forge
The word “runtime” usually implies a request-serving process. Forge’s constitution forbids that reading: ADR-007 makes build-time projection and static delivery the default substrate, and FORGE-100 Part 12 defends it as the source of speed, durability, and abandonment-grace.
Forge Core is a publication runtime, not a request-serving runtime. It is the machinery that ingests reality, keeps canonical truth, freezes snapshots, derives projections, and publishes artifacts — plus the thin read-time shell (Interaction Layer) that composes published artifacts for a reader and surfaces private facets after sign-in.
“Running a scientific platform on Forge” therefore means: configuring the publication pipeline with a domain’s adapters and modules and an instance’s connections and policies, and letting it publish. The reader-facing result is still, deliberately, mostly static files. Nothing in this document weakens ADR-007; the query-service exception of FORGE-100 Part 12.3 remains the only sanctioned dynamic read path, unchanged.
1.2 What changes, and what does not
Nothing in FORGE-100 Parts 1–12 changes. The layers (Ontology → Truth → Publication → Knowledge → Derivation → Presentation → Interaction, with Identity orthogonal), the governing invariant, the contracts, the privacy architecture, the performance architecture — all stand, verbatim. This document calls those the strata, to distinguish them from what it adds.
What changes is FORGE-100 Part 2.9 and Part 13. The single orthogonal “Implementation Layer” is refined into two planes — Domain and Instance — and the adoption story of Part 13.4 (“a new instrument writes adapters and configuration”) is corrected to its true form: a new instrument in an existing domain writes almost nothing; a new domain writes adapters and domain modules once, for all its instances. FORGE-100 Part 13.3’s own mapping table was the evidence: it mapped four classes of instrument, not four instruments — and a class is precisely a Domain.
This is a refinement, not a contradiction. FORGE-100 Part 2.9 said the Implementation Layer “owns everything Mjolnir-specific, BioHPC-specific, telescope-specific.” FORGE-101 observes that “Mjolnir-specific” and “HPC-specific” are different words, and gives each its own home.
1.3 Why a runtime and not a framework
The distinction is enforceable, not rhetorical:
- A framework is code you extend by writing more code inside its extension points; the boundary between framework and application blurs by design, and every application couples to framework internals over time.
- A runtime is machinery you configure and feed; the boundary is a contract, and the things running “on” it cannot reach inside it.
Forge chooses runtime because the constitution demands properties that only hard boundaries preserve: truth kept once (a framework extension can smuggle a second store; a contract-bound module cannot), implementation independence (Part 13 of FORGE-100 is only true if the core is unreachable from above), and abandonment-grace (published snapshots must remain readable when every extension is gone). Concretely: Forge Domains and Forge Instances do not subclass Forge Core. They supply declared, validated artifacts — adapters, extension packages, modules, configuration, content — across versioned contracts. If a domain needs to patch Core behaviour, Core has a missing capability, and the fix is a Core amendment, never a reach-in.
Part 2 — The Three Planes
2.1 Definitions
┌─────────────────────────────────────────────────────────────────┐
│ FORGE INSTANCE a real deployment: Mjolnir, BioHPC, Rubus │
│ "this one" configuration · branding · connections · │
│ policies · content — and no logic │
├─────────────────────────────────────────────────────────────────┤
│ FORGE DOMAIN the expertise of a scientific practice: │
│ "this kind" Forge HPC, Forge Imaging, Forge Genomics │
│ adapters · extension packages · domain │
│ modules · domain knowledge templates │
├─────────────────────────────────────────────────────────────────┤
│ FORGE CORE the permanent runtime: truth, publication, │
│ "any kind" identity, search, presentation, loading — │
│ everything universal, nothing domainal │
└─────────────────────────────────────────────────────────────────┘
- Forge Core is the permanent runtime: the machinery of FORGE-100’s strata, made concrete and instrument-agnostic. It knows how to keep and publish scientific truth; it does not know what any particular science is.
- A Forge Domain is a packaged body of expertise for one class of scientific platform. It knows what the class’s Systems of Record look like, what its measures mean, what its readers ask, and what honest projections of its truth look like. A domain has no deployment of its own; it exists to be composed into instances.
- A Forge Instance is one real deployment: one instrument (or family of instruments) at one institution, composing Forge Core with one or more domains, supplying everything that is true of it and of nothing else.
2.2 Why exactly three
Each plane exists because it removes a real constraint; none exists for elegance. The planes separate along three axes at once, and the fact that all three axes cut in the same place is the argument that the separation is real:
-
Rate of change. Core changes on a constitutional timescale (years; amendments). Domains change on the timescale of a scientific practice (months; a new scheduler version, a new pipeline convention). Instances change freely (days; a policy, a node purchase, a rebrand). Software that mixes rates of change forces its fastest-changing part’s release cadence onto its slowest-changing part’s stability guarantees — the classic failure of every “unified platform.”
-
Who knows it. Core encodes what the Forge project knows (truth-maintenance, publication, privacy). A domain encodes what a practice community knows (HPC operations, imaging pipelines). An instance encodes what one institution knows (its machines, its policies, its people). These are different authors with different authority, and architecture that muddles them muddles accountability — the same argument FORGE-100 Part 4.6 makes for per-facet truth ownership, applied to code.
-
Scope of reuse. Core is reused by every scientific platform. A domain is reused by every instance of its class. An instance is reused by nobody. Placing knowledge at the wrong reuse scope produces either duplication (too high) or contamination (too low), and both are named failures of the two-layer model (Preamble).
Why not two planes is answered in the Preamble: the second instance forces the error. Why not four deserves an answer too, because the temptation will arise (a “sub-domain” for Slurm-vs-PBS, an “institution” plane above instances sharing policy across a university’s clusters). The rule: within a domain, variation is handled by the domain’s own internal structure (adapter families, optional modules — Part 4.4); across instances, shared policy is handled by configuration inheritance inside the instance plane (Part 5.5). Neither needs constitutional standing. A plane earns constitutional standing only when it has its own author class, rate of change, and reuse scope — and only three of those exist.
2.3 What the planes are forbidden to know
These prohibitions are the constitution of this document. Each is stated with the failure it prevents.
- Core MUST NOT know any domain. No domain name, no domain vocabulary (scheduler, queue, sample, exposure, basecall), no domain-conditional branch (
if domain == "hpc"), no registry of known domains compiled into Core. Core discovers domains only through the manifests presented at composition time (Part 7.3). Prevents: Core accreting a special case per domain until it is the thirteenth system FORGE-001 warned against. - Core MUST NOT know any instance. Not even the first one. The string “Mjolnir” appearing anywhere in Forge Core outside an illustrative comment is a build failure. Prevents: the first instance becoming the silent definition of “normal,” which is how generic software ossifies around its first customer.
- A Domain MUST NOT know any instance. Forge HPC must be equally true of Mjolnir, BioHPC, and a cluster that does not exist yet. Instance-conditional behaviour in a domain is expressible only as a declared configuration parameter with a documented meaning (Part 5.3). Prevents: the domain becoming Mjolnir’s private codebase wearing a general name — the exact failure mode this document exists to preclude.
- A Domain MUST NOT know another domain. No imports, no shared mutable anything, no reliance on another domain’s extension types (Part 4.5 gives the one mediated exception). Prevents: the domain graph becoming a mesh, which would make domains un-adoptable individually and un-retirable ever.
- An Instance MUST NOT contain logic. Configuration, selection, binding, policy values, credentials, branding, and authored content — nothing else (Part 5.2). Prevents: the instance becoming a shadow domain that the next instance cannot reuse.
- A Forge Module MUST NOT know its instance. A module receives declared configuration; it never reads instance identity, and it MUST behave identically given identical configuration and identical snapshots (Part 7.6). Prevents: untestable modules and unportable domains.
The mirror-image permissions are equally constitutional: Domains depend on Core. Instances depend on domains and Core. Everything depends on the constitution (ontology + contracts). The full dependency law, with its graph, is Part 14.
2.4 The planes and the strata form a matrix
The strata of FORGE-100 (vertical flow of truth) and the planes of FORGE-101 (horizontal scope of knowledge) are orthogonal. Every piece of the system has a coordinate in both: which stratum does it serve, and which plane owns it? Part 6 draws the full matrix; the rule of thumb that generates it:
Core owns every stratum’s machinery. Domains own stratum content that is true of a class. Instances own stratum content that is true of one deployment.
The Truth Layer engine is Core; the fact that a Slurm sacct row becomes a Job facet is Forge HPC; the credential that reads Mjolnir’s Slurm is Mjolnir’s. Same stratum, three planes, no ambiguity.
Part 3 — Forge Core
3.1 What Forge Core is
Forge Core is the permanent, instrument-agnostic, domain-agnostic runtime: the concrete implementation of FORGE-100’s strata plus the composition machinery this document adds. It is the part of Forge that should still be recognisable in ten years, which is why its contents are defined by a test rather than a list:
The Core test: a capability belongs in Core if and only if (a) every conceivable Forge Instance needs it, (b) it can be specified without any domain vocabulary, and (c) it enforces or implements a constitutional principle. Failing any one of the three, it belongs in a domain or an instance.
3.2 What Forge Core knows
The universal concepts, organised by the strata they serve. Each entry is machinery, per Part 2.4 — Core provides the mechanism; planes above provide the content.
The truth spine (FORGE-100 Parts 3–4, 9–10):
- Truth — the Truth Store: single-homed, provenance-stamped, append-only canonical facts; identity resolution and the identity map (FORGE-100 Part 4.2); the observed/derived split (ADR-003).
- Ontology — the machine-readable trunk ontology (the sixteen objects, events, measures, relations, facet classifications) and the amendment machinery, including validation of Domain Extension Packages (Part 4.3).
- Publication — the Publisher: immutable, content-addressed, self-describing, self-timed snapshots (ADR-009); the snapshot contract; time-addressing.
- Events — both kinds: the Record (ontology Events, FORGE-100 Part 9) and the Signal machinery (runtime notifications, Part 11), including the constitutional rule that signals carry addresses, never facts.
- Versioning — of the ontology, of contracts (ADR-015), of Forge Modules and their resolution (Part 7.5), and of Core itself.
The reader surface (FORGE-100 Parts 5–8, 12):
- Presentation — the design system: the calibrated-instrument visual grammar, typography, colour semantics, motion discipline (FORGE-002 Part 7), the five-question object anatomy renderer.
- Interaction — the read-time shell: walking edges, scrubbing time, composing published artifacts.
- Navigation & Routing — permanent URLs as pure functions of identifiers (ADR-001); world/altitude orientation; the rule that URLs never encode views.
- Search — the search projection engine and its contract (ADR-010): typed answers, explicit forks, the honest zero. Domains contribute vocabulary; Core owns the machinery.
- Theme — theming as constrained variation within the design system (an instance recolours nothing that carries semantics; Part 5.2).
- Accessibility — structural: textual truth beneath every signal, keyboard-walkable edges, view models that carry their accessible form (FORGE-100 Part 12.6). Not a stratum content but a property Core enforces on every view model it accepts.
The gate (FORGE-100 Parts 2.8, 11):
- Identity, Authentication, Authorization, Permissions — the orthogonal Identity Layer: (reader, facet) → {emit, occlude, aggregate}, fail-closed, public-path-unauthenticated, aggregation-as-privacy-bearing (ADR-005, ADR-012, ADR-017). Authentication is delegated to instance-supplied providers; the enforcement point is Core’s and non-negotiable.
The composition machinery (new in FORGE-101):
- Module loading — manifest validation, dependency resolution, deterministic build-time composition (Part 7).
- Services — the service harness: scheduling, supervision, health, and the ingestion contract services must speak (Part 8).
- APIs — the contract surface of FORGE-100 Part 10, packaged and versioned (Part 12).
- Configuration — the typed configuration mechanism through which instances parameterise everything (Part 5.3): schema, validation, provenance of configuration values themselves.
- Lifecycle — of objects (FORGE-100 Part 4.3), of Forge Modules and domains (proposed → active → deprecated → retired, Part 7.7), and of the composition itself (Part 6.3).
- Deployment — the build-and-publish pipeline; every deployed composition recorded as a Deployment event in the Record (FORGE-100 Part 9.1 already names the kind).
- State — the rule of state: Core’s Truth Store and snapshot chain are the only durable state in the system; everything else is derived and regenerable (Part 10.3).
- Logging & Observability — the runtime observes itself by its own standards: pipeline health, build determinism checks, adapter freshness, signal delivery — all timestamped, all honest about staleness (Principle 3 applied to the machinery itself). The platform that shows the age of every fact MUST know the age of its own pipelines.
- Dependency rules — Part 14, enforced mechanically at composition time, not aspirationally in review.
3.3 What Forge Core is forbidden to contain
Everything domain-specific, restated concretely because the temptations will be concrete: no scheduler concepts, no queue semantics, no biology, no astronomy, no microscopy, no genomics, no notion of GPU or basecall or exposure or sample, no predictive model of anything (Part 8.5 places prediction), no domain’s display vocabulary, and no instance’s anything.
The subtle exclusions matter more than the obvious ones:
- Core MAY know that measures can be forecast (a derived-measure kind with error bars and recorded issuance — Part 8.5) but MUST NOT know what a queue wait is.
- Core MAY know that objects have display labels (a configuration mechanism) but MUST NOT contain the label “Sequencer.”
- Core MAY know that adapters exist (the ingestion contract) but MUST NOT contain an adapter.
3.4 The temptation Core must survive
The gravest long-term risk to this architecture is not a domain violating the rules; it is Core absorbing domain logic for convenience — because Core’s maintainers are closest to the machinery, and “we’ll just handle this in Core for now” is always locally cheaper. The constitutional defence: any Core change is reviewed against the Core test (3.1), and a Core capability that mentions a domain concept in its specification is rejected regardless of how many domains would benefit. If three domains need the same thing, the thing is abstracted first (specified domain-neutrally) and only then admitted. The Promotion rule (Part 7.8) provides the legitimate path; there is no other.
Part 4 — Forge Domains
4.1 What a domain is
A Forge Domain is the reusable middle: everything that is true of a class of scientific platform and false of others. Its relationship to Core, in one line each way:
Core provides infrastructure; domains provide expertise. Core knows how to keep truth about something; a domain knows what that something is for one scientific practice. Core without domains publishes nothing (it has no adapters, no vocabulary, no readers’ questions). Domains without Core are folklore (expertise with no truth machinery under it).
Illustrative domains (illustrations, not commitments — see 4.6): Forge HPC (shared computational infrastructure — the first production domain), Forge Imaging (microscopy, CryoEM), Forge Genomics (sequencing platforms), Forge Earth Observation, Forge Chemistry. The brief’s suggested “Forge AI” is examined and re-placed in Part 8.5.
4.2 What a domain contains
Five kinds of artifact, and only these five:
- Adapter families (Source → Truth). The domain’s knowledge of its class’s Systems of Record: what a Slurm accounting record is, how a PBS queue differs, how an instrument-vendor’s export format maps to ontology facts. Adapters are Forge Services (Part 8) written against Core’s ingestion contract. A domain ships families — the Slurm adapter, the PBS adapter — and an instance binds the ones its reality requires (Part 5.3).
- A Domain Extension Package (Part 4.3). The domain’s ratified additions to the ontology: extension object types, facet families on trunk objects, measure types with units and methods, event kinds, relation types.
- Domain Forge Modules (Part 7). The domain’s projections and views: the queue outlook, the fleet view, software usage shapes — expertise expressed as pure functions over published truth.
- Domain knowledge templates. Document and Story scaffolding written in the domain’s register with transclusion points ready (FORGE-100 Part 7): the “your job failed with an out-of-memory ending” document exists once, in Forge HPC, with instance facts transcluded per deployment. Judgment is authored once per practice, not once per institution.
- Domain vocabulary. Display labels, search synonyms, and unit conventions for the domain’s readers — the configuration content that Core’s labelling and search mechanisms consume (“Node” presented as “Compute Node” here, “Sequencer” there — FORGE-100 Part 13.3 already established labels are presentation, not ontology).
What a domain MUST NOT contain: truth stores of its own (Part 10.3), presentation machinery (it uses Core’s design system — a domain has an atmosphere within the visual grammar, never a costume outside it, per Principle 10), identity machinery, instance facts, or another domain’s anything.
4.3 Domain Extension Packages — the constitutional mechanism
This is FORGE-101’s one genuine amendment to prior law, and it must be handled with care because ADR-016 is explicit: “new object types require amending the shared ontology (constitutional); no instrument gets a private object type.”
FORGE-100 Part 13.5 already anticipated that new instrument classes would justify amendments, and insisted such types “enter the shared ontology or not at all.” FORGE-101 keeps that discipline and gives it structure:
The ontology becomes a trunk and ratified branches. The trunk is the sixteen objects, their relations, events, and measures — Core-owned, universal, amended as rarely as ever. A Domain Extension Package is a namespaced, versioned set of ontology additions (
hpc:Accelerator,genomics:Sample,imaging:AcquisitionSession) proposed by a domain and ratified through the same constitutional amendment process as trunk changes, then owned by the domain but binding on all its instances.
The discipline this preserves, point by point:
- No instance gets a private type — still. Extension types belong to domains; instances still amend nothing. ADR-016’s target (an instrument forking the language) remains impossible.
- Shared means shared. Every instance of Forge HPC speaks the same
hpc:extension. Two HPC instances can be federated, compared, and understood with one vocabulary — the entire point of FORGE-002’s “unification of meaning,” now at domain scope. - Ratification is real. An extension package amendment carries the same obligations as a trunk amendment (FORGE-002 §3.6 rule 5): the questions only this type can answer, its relations (including which trunk objects it may relate to), its facet classifications, its upkeep cost. Core validates extension packages mechanically against the trunk (legal relation endpoints, classification completeness, namespace discipline).
- The trunk is defended. An extension type MUST NOT duplicate or shadow a trunk type (
hpc:Jobis illegal; Job exists), and a concept needed by two domains MUST be promoted to the trunk rather than defined twice (Part 4.5). Extension is for what is genuinely of the practice.
Why this is an extension of ADR-016 and not its violation: ADR-016 forbade private types and accretion; it demanded amendment. Extension packages are amendments — namespaced, ratified, shared within their reuse scope. What FORGE-101 adds is only the recognition that “shared” has two legitimate radii: universal (trunk) and practice-wide (extension). A radius of one (instance) remains forbidden, exactly as before.
4.4 Variation within a domain
Domains face internal variation (Slurm vs PBS; short-read vs long-read sequencing) and MUST absorb it internally rather than leaking it upward or downward: adapter families cover source variation; optional domain Forge Modules cover capability variation; configuration parameters (declared, typed, documented) cover behavioural variation. If variation within a domain grows so deep that two sub-communities share almost nothing, that is evidence of two domains wearing one name, and the domain SHOULD split — a governance act, recorded, with both successors keeping the ratified extension types they genuinely use.
4.5 When two domains need the same concept
Forbidden: Domain A importing Domain B’s extension type. Required: promotion. If Forge Genomics and Forge Imaging both need Sample, then Sample is evidently not genomics expertise — it is a concept of laboratory science generally, and it is proposed for the trunk (or, if the trunk’s guardians judge it insufficiently universal, for a deliberately shared extension package owned jointly and ratified as such). The mechanism matters less than the rule it enforces: a concept lives at exactly one place in exactly one namespace, at the widest radius that genuinely needs it — FORGE-002’s one-home rule, applied to meaning itself.
An instance composing two domains (BioHPC = Forge HPC + Forge Genomics is the expected first case) is normal and requires no domain-to-domain dependency: each domain binds trunk objects and its own extensions; where their truths meet, they meet on trunk objects (a genomics Sample relates to a trunk Job; the HPC domain projects that Job without knowing samples exist). Composition happens in the ontology’s shared trunk, never in domain code. This is the load-bearing reason the trunk must stay rich enough to be the meeting ground — and a standing argument against over-eager extension.
4.6 No speculative domains
A domain is extracted from evidence, never invented ahead of it. A Forge Domain may be created only when a committed Forge Instance requires it, and its claim to generality is unproven until its second instance ships. Forge HPC is legitimate today because Mjolnir exists and BioHPC is committed. Forge Imaging is a name in this document, not a codebase, and MUST remain so until an imaging deployment is real. The graveyard of platform projects is full of frameworks generalised from zero examples; Forge generalises from one and verifies with the second (Part 16.6 makes BioHPC the formal acceptance test).
Part 5 — Forge Instances
5.1 What an instance is
A Forge Instance is one real deployment: the composition of Forge Core with one or more Forge Domains, plus everything true of this deployment alone. Mjolnir is the first. BioHPC will be the second. Rubus, future clusters, future laboratories follow the same shape. An instance is small — and its smallness is the measure of the architecture’s success: every line an instance contains is a line the next adopter cannot reuse, so the architecture succeeds exactly insofar as instances approach pure declaration.
5.2 What an instance contains
- Composition manifest. Which domains, which Forge Modules (of those the domains and Core offer), which versions — pinned exactly, resolved reproducibly (Part 7.5).
- Connection information. Endpoints and credentials for its Systems of Record, bound to the domain’s adapter families; its identity provider; its carbon-intensity feed (or the honest absence thereof — FORGE-100 Final Review: decline to derive rather than derive dishonestly).
- Policies. Aggregation floors (ADR-017), retention and coarsening cadences per measure type (FORGE-100 Part 12.5), publishing cadence, the transparency-gradient parameters the constitution leaves to stewardship, limits and quotas surfaced as facts.
- Branding. Name, wordmark, theme tokens within the design system’s constrained variation (Part 3.2). The design grammar is shared; the identity is not (FORGE-100 Part 13.4). An instance can look like itself; it cannot behave like anyone.
- Instance knowledge and narrative. Its own Documents and Stories — authored content in the Knowledge Layer, instantiating domain templates or standing alone. Content, not code.
- Instance-specific behaviour — as selection, never as implementation. The brief asks for “instance-specific behaviour,” and the architecture grants it in exactly one form: choosing among declared options (which modules, which parameters, which policies). If a desired behaviour cannot be expressed by selection and parameters, the instance has discovered a missing domain or Core capability, and the behaviour is implemented there, as an option — becoming the next instance’s inheritance. This is the no-logic rule, and it is what “they must never duplicate Core logic” cashes out to: an instance never duplicates logic because an instance never contains any.
5.3 Configuration as contract
Instance configuration is not a folder of ad-hoc YAML. Core defines a typed configuration schema assembled from the declared parameters of Core, the composed domains, and the selected Forge Modules; the instance supplies values; composition fails loudly on unknown keys, missing required values, or type violations. Configuration values are themselves provenance-stamped (who set this floor, when) — the platform whose every fact carries provenance extends the same honesty to its own settings, because an aggregation floor is a privacy-bearing decision (ADR-017) and “who decided this?” must be answerable.
5.4 The instance is also an object of its own platform
An instance’s deployed composition — Core version, domain versions, module set, configuration (public facets thereof) — is recorded as Deployment events in its own Record (Part 3.2, Deployment). The platform accounts for itself: “what was running in March?” is a query, like every other question about the past (FORGE-100 Part 9.3). Instance-private configuration (credentials, obviously; policies where sensitive) is classified like any facet — the transparency gradient applies to the platform’s own account of itself.
5.5 Shared policy across sibling instances
When one institution operates several instances (a university with three clusters), shared policy is expressed by configuration inheritance within the instance plane — a base configuration document that sibling instances extend. This is data composition, not a new plane (Part 2.2), and it MUST NOT become one: a “university layer” with logic in it is a shadow domain, rejected by the same rule as 5.2.
Part 6 — The Matrix: Planes × Strata
6.1 The layered architectural diagram
The full picture — FORGE-100’s strata as rows, FORGE-101’s planes as columns. Every cell answers: what does this plane contribute at this stratum?
────────────────┬──────────────────────────┬─────────────────────────────┬────────────────────────────
STRATUM │ FORGE CORE │ FORGE DOMAIN (e.g. HPC) │ FORGE INSTANCE (e.g. Mjolnir)
(FORGE-100) │ machinery — universal │ content — of the practice │ content — of the deployment
────────────────┼──────────────────────────┼─────────────────────────────┼────────────────────────────
Interaction │ read-time shell: walk, │ — │ —
│ ask, scrub, sign-in │ │
Presentation │ design system, object │ domain atmosphere & │ wordmark, theme tokens,
│ anatomy renderer, a11y │ vocabulary (labels, units) │ (constrained variation)
Derivation │ projection engine, │ domain Forge Modules: │ module selection +
│ search engine, │ queue outlook, fleet view, │ parameters; no projections
│ core Forge Modules │ software intelligence, … │ of its own
Knowledge │ transclusion & binding │ domain Document/Story │ instance Documents,
│ machinery │ templates (judgment, once) │ Stories, translations
Publication │ Publisher, snapshot │ — │ publishing cadence,
│ format, time-addressing │ │ retention/coarsening policy
Truth │ Truth Store, identity │ — │ —
│ resolution, provenance │ │
Ontology │ the trunk (sixteen), │ Domain Extension Package │ — (forbidden)
│ amendment machinery │ (namespaced, ratified) │
Source │ ingestion contract, │ adapter families │ adapter bindings:
│ service harness │ (Slurm, PBS, vendor X, …) │ endpoints, credentials
────────────────┼──────────────────────────┼─────────────────────────────┼────────────────────────────
Identity (⊥) │ enforcement: (reader, │ facet classifications for │ identity provider,
│ facet)→emit/occlude/agg, │ extension types │ authorization mapping,
│ fail-closed │ │ aggregation floors
────────────────┴──────────────────────────┴─────────────────────────────┴────────────────────────────
Empty cells are constitutional, not accidental: a domain contributes nothing to Truth machinery (it feeds truth through adapters; it never keeps it), an instance contributes nothing to the ontology (Part 4.3), and nobody but Core touches Interaction (the reader’s shell must be identical across every Forge platform on Earth — that uniformity is the product, per FORGE-002 §3.6 rule 3 scaled up: learn one Forge Instance, and you have learnt them all).
6.2 One flow, three plane-crossings
Truth still moves in exactly one direction (FORGE-100 Part 1.2). The planes do not add flows; they annotate ownership along the one flow:
reality ──▶ Systems of Record (external; instance's reality)
│
▼ adapter family (DOMAIN) × binding/credentials (INSTANCE)
Truth Store (CORE machinery; trunk + extension shapes)
│ freeze (CORE)
▼
Snapshots (CORE; the durable record)
│ project: core modules (CORE) + domain modules (DOMAIN),
│ parameterised by configuration (INSTANCE)
▼
Published artifacts (views, indices, receipts, documents)
│ render (CORE design system; DOMAIN vocabulary; INSTANCE theme)
▼
Reader (gated by Identity: CORE enforcement,
INSTANCE provider, floors)
6.3 The composition lifecycle
The lifecycle of a Forge Instance, from declaration to retirement — the lifecycle diagram the brief requests:
DECLARED instance manifest exists: domains, modules, config
│ compose: resolve versions, validate manifests, schema-check config,
│ verify dependency law (Part 14) mechanically
▼
COMPOSED a reproducible, recorded composition (lockfile + Deployment event)
│ first build: adapters ingest → truth → first snapshot → projections
▼
PUBLISHED the instance exists as a public record; readers arrive
│ steady state: ingest → snapshot → incremental projection → publish,
│ at the instance's declared cadence; observability watches every stage
▼
EVOLVING recomposition events: module added/retired, domain upgraded,
│ policy changed — each a recorded Deployment event, each rebuilt
│ deterministically, each reversible to the prior composition
▼
DEGRADED (entered and left automatically) a pipeline fails → affected
│ surfaces show staleness or vanish (ADR-014); the Record steps
│ forward; recovery is undramatic
▼
ENDED the instrument retires: final snapshot published, marked final;
the static record remains readable forever with zero running
services (ADR-007, ADR-009) — the instance ends; its account
does not vanish. Objects end but never vanish (§3.6 rule 1),
and an instance is no exception.
Part 7 — Forge Modules
7.1 Definition
A Forge Module is a versioned, manifest-described unit of derivation-and-presentation capability that consumes published truth and knowledge through Core’s contracts and contributes projections, view models, routes, knowledge bindings, and search vocabulary — owning no truth, holding no durable state, and knowing nothing of its instance.
In FORGE-100’s terms: a Forge Module is a bundled set of Projections (Part 5) with their presentation, packaged for composition. Everything FORGE-100 says about views therefore applies: pure, deterministic, regenerable, disposable, owning nothing. The Forge Module is the unit in which views are shipped, versioned, selected, and retired — the packaging FORGE-100 Part 5 implied but did not name.
Modules exist at two planes: core modules (universal capability: the object anatomy pages, the Record browser, the Ledger projection, search) and domain modules (practice capability: the queue outlook, the fleet view, software intelligence). Instances select; they do not author (Part 5.2). There are no instance modules — the pressure that seems to demand one is, every time, a missing domain option or a missing Core capability, and Part 7.8 gives the pressure a legitimate outlet.
7.2 The manifest
Every Forge Module declares, machine-readably:
-
Identity and version — name, semantic version, owning plane (core domain:name). - Requirements — the ontology trunk version range it can read; the extension packages (and versions) it requires; the Core contract versions it consumes (object, measure, event, search, view — FORGE-100 Part 10).
- Inputs — which object types, facet families, measure types, and event kinds its projections read. Declared inputs are the whole of its access: the composition grants a module exactly what it declares, nothing more (least privilege as build-time law, which is also what makes incremental rebuilds computable — Core knows precisely which modules a changed fact invalidates, FORGE-100 Part 12.4).
- Contributions — projections and their view models, routes claimed (validated against the URL law, ADR-001 — a module claims view-routes; it can never claim or alter an object’s permanent URL), knowledge bindings, search vocabulary, signals consumed.
- Configuration parameters — typed, documented, defaulted where safe; the instance’s only lever (Part 5.3).
- Constitutional declarations — upkeep owner and degraded appearance (Principle 11, Principle 12; FORGE-100 Part 5.3 requires both of every view; the manifest is where the requirement becomes unskippable: no manifest field, no composition).
7.3 Discovery
Discovery is declarative and closed at composition time. The instance manifest names its domains; domains and Core publish module catalogues; the instance selects from the union. There is no runtime plugin scanning, no dynamic marketplace, no module arriving after the build — because every module is a promise (Principle 11), and promises are made deliberately, in a recorded composition, not discovered at midnight. Core discovers everything — domains and modules alike — solely through manifests presented at composition; this is what keeps Core free of any compiled-in registry of names (Part 2.3).
7.4 Loading — the module loading sequence
Loading is primarily a build-time act (Part 1.1). The sequence:
1. READ instance manifest: domains, modules, versions, config
2. RESOLVE exact versions (lockfile); fail on conflict, never guess
3. VALIDATE each manifest: ontology range ∩ deployed trunk+extensions ≠ ∅;
contract versions supported; declared inputs exist in the
ontology; routes collision-free; config schema satisfied;
upkeep owner and degraded state present
4. CHECK LAW dependency rules (Part 14) verified mechanically:
plane direction, contract-only edges, acyclicity,
no cross-domain module edges
5. ORDER topological sort of declared module-to-module dependencies
6. REGISTER projections, routes, knowledge bindings, vocabulary,
signal subscriptions — into the composition plan
7. RECORD the resolved composition as a Deployment event (Part 5.4)
8. BUILD projections run (incrementally) against the current snapshot;
view models render through the design system
9. PUBLISH content-addressed artifacts; the site is the output
10. SERVE statically; the Interaction shell composes at read time;
signals (Part 11) trigger the next incremental cycle
Steps 1–7 are the composition phase — pure validation and planning, no truth touched, failures cheap and loud. Steps 8–10 are the standing publication cycle. A module failing at build time (a projection whose transclusion no longer resolves, FORGE-100 Part 7.4) fails its own artifacts into their declared degraded state without halting the pipeline for others — module isolation is what makes a composition of twenty modules operable by a small team.
7.5 Versioning
- Modules version semantically against the things they consume: a module’s compatibility statement is expressed entirely in ontology versions and contract versions, never in Core release numbers — modules program against the constitution’s interfaces, not against Core’s internals, which is what lets Core be reimplemented under them (FORGE-100 Part 10’s purpose, preserved).
- Instances pin exact versions and upgrade deliberately; the lockfile is part of the recorded composition. There are no silently floating dependencies in a system whose output is a public record.
- Because projections are deterministic, a version upgrade is auditable by diff: recompose, rebuild from the same snapshot, and diff the published artifacts. The upgrade’s entire effect is inspectable before it ships. This property — inherited from FORGE-100 Part 2.5’s determinism — is the single most operationally valuable consequence of the architecture, and Part 16 builds the whole migration on it.
7.6 Communication and boundaries
How modules communicate is answered by what they are: pure functions over shared truth.
- Modules communicate through the snapshot, not with each other. Module A does not call module B. If A’s work should influence B, A’s contribution must exist as published truth or published view models, and B declares it as an input. There are no runtime module-to-module calls, no shared mutable state, no side channels. Coupling through truth is the only coupling, and it is visible, versioned, and contract-shaped.
- Module-to-module dependencies (A declares B’s view models among its inputs) are permitted when: same plane or downward (a domain module may depend on a core module; never the reverse); acyclic; contract-only (B’s published view-model contract, never B’s internals); and within one domain (a Forge HPC module MUST NOT depend on a Forge Genomics module — cross-domain needs are promoted per Part 4.5). Dependencies between modules SHOULD nonetheless be rare: the natural meeting ground is the ontology, and a module dependency where an ontology input would do is altitude error.
- Boundary enforcement is mechanical, not exhortative: declared inputs are the only granted access (7.2); undeclared imports fail composition (step 4); route collisions fail composition; a module reading instance identity has no API through which to do so — the instance is simply not among the things a module can name. The strongest boundary is the one with no door.
7.7 Module lifecycle
Proposed → Active → Deprecated (still composable; instances warned at composition; replacement named) → Retired (no longer composable; existing published artifacts remain — published views are part of the record and do not vanish retroactively). Retirement honours FORGE-100 Part 5.5: view URLs a retired module claimed either redirect to the underlying objects/snapshot or their removal is recorded in the Record. Deprecation and retirement are recorded events; a module, like everything in Forge, ends but does not vanish from history.
7.8 The Promotion rule
Logic gravitates toward generality only on evidence:
- An instance needs behaviour no option provides → the domain implements it as a declared option (the instance gets selection; the practice gets capability).
- Two domains independently implement the same capability → it is abstracted (respecified domain-neutrally) and promoted to Core, or its concept promoted to the trunk (Part 4.5).
- Promotion is a recorded governance act with an owner, never a copy-paste drift. Demotion (Core capability used by only one domain, domain capability used by only one instance) is reviewed annually with equal seriousness — misplaced altitude in either direction is debt.
Part 8 — Forge Services
8.1 Definition and the placement rule
A Forge Service is a long-running or scheduled process with its own lifecycle, supervised by Core’s service harness, that produces truth (through the ingestion contract), publishes artifacts, or serves projections — and never renders UI.
The rule distinguishing Service from Forge Module is positional, and therefore unambiguous:
Modules live above Publication: they consume snapshots and exist only at build/read time. Services live at or below Publication: they run on their own clock, because reality does not wait for a build.
Something becomes a Service instead of a Module exactly when it must act independently of a reader or a build — polling a scheduler, training a model nightly, freezing a snapshot every N minutes, serving queries for an instance past the static threshold. If it can be a pure function of a snapshot, it MUST be a module (the cheaper, safer, more disposable form); Services are the expensive form, each one a standing operational promise, and their number is watched the way the ontology’s object count is watched.
8.2 The service roster
- Core services: the Publisher (snapshot freeze), the incremental build orchestrator, the signal dispatcher (Part 11), the identity-enforcement point for the authenticated read path, and — where an instance’s scale demands it — the bounded read-only query service of FORGE-100 Part 12.3, unchanged in its constraints (reads snapshots, never holds authoritative state, degrades to the static record).
- Domain services: adapter families (the dominant case — every adapter is a service), and domain computation that must run on its own schedule (a nightly queue-pattern analysis; a prediction engine, 8.5).
- Instance services: none. Instances configure and credential services; they do not author them (the no-logic rule, applied to the plane where it will be most tempted).
8.3 Services and UI, services and events
- Can Services exist without UI? They MUST. A service’s only outputs are ingestion-contract submissions, published artifacts, signals, and observability readings. If a service needs a face, the face is a module projecting the service’s published outputs — the service’s health itself being a measure on an object like any other (Part 3.2, Observability).
- Can Services publish events? Both kinds, and the distinction is constitutional (Part 11): a service may originate Record events (an adapter materialises a maintenance event from a source; a detection service records a node-fault event, with the service as author per FORGE-100 Part 9.2) through the ingestion path; and a service may emit Signals (snapshot published; ingestion cycle complete) through the dispatcher.
- Can Services consume events? Yes: signals as triggers (the build orchestrator wakes on “adapter cycle complete”), and Record events as data (read from truth/snapshots like any fact). What a service MUST NOT do is treat a signal as a data source — signals carry addresses, never facts (Part 11.2).
8.4 Adapters, re-homed
FORGE-100 Part 2.9 placed adapters in the undifferentiated Implementation Layer. FORGE-101 splits them along the seam the Preamble identified: adapter logic is domain (what a Slurm record means — expertise, reusable across every Slurm shop), adapter binding is instance (which endpoint, which credential, which enabled subset — deployment fact). The migration (Part 16) performs this split on the existing adapter code as its central surgery.
8.5 Prediction, and why “Forge AI” is not a domain
The brief lists “Forge AI” among example domains. Examined against Part 2.2’s tests, it fails them: prediction has no instances of its own, no Systems of Record of its own, and no reader community of its own — it is a capability that serves domains, not a scientific practice. Calling it a domain would create the mesh Part 2.3 forbids (every domain depending on Forge AI). The architecture places prediction in three pieces:
- The forecast mechanism is Core. Issuing a forecast as a derived measure with stated method, stated basis, and error bars; recording each issued forecast as an observed fact whose System of Record is the issuing service (a forecast, once issued, is a historical fact about the service — this is what makes calibration honest: “how wrong have our outlooks been?” is a query, and FORGE-002 §1.2’s demand that prediction “announce its error bars when it arrives” becomes mechanically checkable); labelling and presentation of the soft future (FORGE-003 Part 4). Universal machinery, no domain vocabulary — it passes the Core test.
- The models are domain services. Queue-wait models are HPC expertise; beam-time models are the telescope domain’s. A model is a domain service issuing forecasts through Core’s mechanism.
- The thresholds, features, and deployment of a model are instance configuration. Which model variant, trained on whose history, gated by what quality floor.
The same decomposition pre-answers the assistant question FORGE-004 must settle (FORGE-100 Part 16.3): whatever conversational capability arrives, its mechanism (projection-bound reading, source-carrying answers, “unknown” with dignity) would be Core; its knowledge is domain; its deployment is instance. FORGE-101 reserves the sockets and defers the constitution of the thing itself, as FORGE-100 did.
Part 9 — Canonical Entities Revisited
The brief asks where entities belong. The answer has a general form, then the specific placements.
9.1 The placement rule
The trunk holds what is true of any shared scientific instrument that does work for people and produces science. A Domain Extension Package holds what is true of one practice. An instance holds no types at all — only instances of types, which is what the name always meant.
A useful test for trunk membership, inherited from FORGE-100 Part 13.2’s defence of the sixteen: does the concept survive translation across the four instruments of Part 13.3 (supercomputer, sequencing centre, telescope, biobank) without becoming a metaphor? Job does (a unit of executed work). GPU does not (a telescope has no GPU in any non-metaphorical sense).
9.2 The entities, placed
- Job — trunk (Core). The atomic act of any instrument: batch job, sequencing run, observation, imaging session. Each domain binds it (labels, typical facets, receipt vocabulary) without owning it. The Receipt contract (FORGE-100 Part 10.7) stays universal.
- User — a correction, then trunk. The ontology has no User; it has Person (FORGE-002 §3.2), and “user” is a role — a relation between a Person and an instrument or Project, not an object type. The distinction is load-bearing for privacy: roles change, Person endures, and the transparency gradient attaches to the Person’s facets. Trunk.
- Node — trunk (Core). The unit at which hardware lives, works, fails, and retires — compute node, sequencer, detector, microscope. Domains bind its vocabulary and facet families.
- GPU — domain (Forge HPC). Core has no reason to know accelerators exist. Forge HPC defines an accelerator facet family on Node; if accelerators require identity of their own — individually tracked, individually retired, individually storied — the domain proposes
hpc:Acceleratorin its extension package, ratified per Part 4.3. The choice between facet family and extension type is the domain’s to argue and the amendment process’s to judge; the trunk stays out of it. - Storage Volume — trunk at system grain, domain below it. The trunk’s Storage System (FORGE-002 §3.2) is the public, policy-bearing grain. Volume/allocation granularity is practice-specific:
hpc:StorageAllocationif Forge HPC needs it as an object, a facet family if it does not. - Dataset — trunk (Core). First-class research output across every practice, and the natural middle link of provenance chains (FORGE-002 §3.2). Domains bind heavily (a genomics dataset’s facets differ from an EO scene’s) — bindings, not new types.
- Project — trunk (Core). The accountability bridge between the money world and the machine world, everywhere.
- Publication — trunk (Core). The instrument’s product, everywhere.
- Prediction — not an object at all. A forecast is a derived measure with recorded issuance (Part 8.5). Making Prediction an object would store derivable claims as things — the exact confusion (measure torn from object) that FORGE-002 §3.1 diagnoses as the root error of dashboards, recommitted in the future tense.
- Sample — domain, watched for promotion. Born in
genomics:(or a laboratory-science extension); the moment a second domain needs it, Part 4.5 promotes it. Sample is the likeliest first promotion in the ecosystem’s life, and handling it well will set the precedent. - Workflow — domain, in two forms. The history of a multi-step undertaking is already expressible in the trunk: correlated events and related Jobs (FORGE-100 Part 9’s event chains — Part 11.4 below). A domain that needs workflow identity — a named pipeline with versions and a public account — defines
hpc:Workflow(orgenomics:Pipeline) as an extension type relating trunk Jobs. The trunk does not adopt Workflow until multiple domains demonstrably converge on one meaning; premature trunk adoption of ambiguous nouns is how ontologies rot.
9.3 The general lesson
Note the pattern in every hard case (GPU, Sample, Workflow, Prediction): the architecture never asks “is this important?” — everything on the list is important. It asks “what is the radius of the community that means the same thing by this word?” Universal → trunk. One practice → extension. One deployment → not a type at all. Importance is not altitude; shared meaning is altitude. That is FORGE-001’s founding insight — unify meaning, not systems — operating at the level of individual nouns.
Part 10 — The Invariant Across the Planes
FORGE-100 Part 1.5’s governing invariant is restated, because every architecture document must carry it:
A fact is stored exactly once, in canonical form, with its provenance and time; everything a reader ever sees is a pure function of stored facts and the reader’s identity.
FORGE-101 adds no second invariant. It answers how the one invariant propagates through composition — what it demands of each thing the brief names.
- APIs. Every API response is a projection of a snapshot (plus identity). No API invents, caches-beyond-content-addressing, or restates a fact from anywhere but the canonical home. An API that “enriches” a response from a side source has created a second home and is rejected (Part 12).
- Databases. There is exactly one durable truth store per instance — Core’s. Forge Modules hold no databases. Domain services may hold working state (an adapter’s cursor, a model’s parameters) but never facts: anything a reader could ever see must have passed through the Truth Store. A module or service with a private store of presentable facts is the invariant’s canonical violation, and composition-time input declarations (Part 7.2) make it detectable.
- Modules. A module’s output is a pure function of (snapshot, knowledge, configuration). Same inputs, same bytes (FORGE-100 Part 2.5). This is what makes modules safe to compose, upgrade-by-diff auditable (Part 7.5), and free to delete.
- Caches. Content-addressed derivation caching only; TTL caches of facts remain forbidden (FORGE-100 Part 12.4). Composition adds one clarification: a module MUST NOT implement private caching of inputs across builds — caching is Core machinery, applied uniformly, or it is a second home wearing a performance costume.
- Views. Unchanged from FORGE-100 Part 5, now packaged in modules: own nothing, regenerable, disposable.
- Publications (in the FORGE sense — the snapshot record). The snapshot chain is the only durable derivative of truth, and it is not a copy but a freeze: append-only, content-addressed, the same facts at published moments. Two instances never share a truth store or snapshot chain; federation (FORGE-100 Part 13.6) reads across published records, never merges them.
- Derived knowledge. Transclusion, not transcription, at every plane: domain templates carry transclusion points, instance documents resolve them per deployment (Part 4.2). A domain template with a typed fact in it fails composition exactly as an instance document would (FORGE-100 Part 7.4). Derived measures state method and inputs’ age wherever they surface, in whatever plane’s module surfaces them.
Why every user-visible representation must remain a pure function of canonical facts and identity — stated once, plainly, because the brief asks for the justification and not just the law: purity is what makes trust compositional. A reader who trusts the Truth Store and can read a projection’s stated method needs no separate reason to trust any page, module, domain, or instance built on them — trust flows through function application, and nowhere else does trust have to be re-earned or re-audited. The moment one surface holds one fact of its own, that surface must be audited independently, forever, and the platform’s trust budget fragments into as many pieces as there are surfaces. One thousand pure views cost one audit; one impure view costs one thousand.
Part 11 — Event Architecture
11.1 Two kinds of event, never confused
Forge has exactly two event concepts, and conflating them would break the invariant:
- Record events — ontology Events (FORGE-002 §3.4; FORGE-100 Part 9): historical truth. When, what happened, to which objects, recorded by whom. Authored, permanent, published in snapshots. The Record is made of these.
- Signals — runtime notifications between machinery: “snapshot S published,” “adapter cycle A complete,” “composition changed.” Ephemeral, unordered beyond causality, at-least-once, and content-free: a signal carries the address of published truth (a snapshot identifier, an object identifier, a content hash), never facts themselves.
11.2 Thin signals, fat record
The content-free rule is constitutional, and it is what keeps an event system from quietly becoming a second database:
Signals carry addresses; the Record carries truth. A consumer that needs the facts follows the address to the canonical copy. A signal with a payload is a fact in flight — a copy that can be stale, reordered, or lost while diverging from its home — and is forbidden.
Consequences, each earning its keep: consumers can never act on data fresher or staler than the published record (Principle 3 holds even in plumbing); lost signals degrade latency, never correctness (the next cycle finds the same truth at the same address — which is why at-least-once delivery suffices and no exactly-once machinery is needed); and replay is trivial (re-emit addresses; the truth was never in the pipe). The signal system can be replaced wholesale without touching truth — it is, deliberately, the least interesting component in the architecture.
11.3 How modules and services communicate, assembled
The full communication model, in one place:
- Module ↔ module: through the snapshot (declared inputs), or declared view-model dependencies (Part 7.6). Never calls, never signals — modules are build-time pure functions and have no runtime to signal in.
- Service → truth: the ingestion contract, always (adapters, authored events, forecast issuance).
- Service ↔ service: signals as triggers; snapshots as data. Two services MUST NOT share working state; if they need the same fact, the fact’s home is the Truth Store.
- Core → everything: the composition plan (build time) and signals (run time).
- Reader → platform: reads projections; the sole write path remains the authored event, an operator act mediated through the ingestion path (FORGE-100 Part 2.7), never a reader-side write.
11.4 Long-running workflows
Reality’s undertakings (a maintenance campaign, a data-release pipeline, a month-long observing programme) outlive any build cycle. Forge represents them as what they leave behind, not as live orchestration state:
- A workflow’s account is a set of Record events and Jobs correlated by relation — begun, progressed, concluded, each event authored and attached to its objects. “Where is the campaign?” is a query over the Record (FORGE-100 Part 9.3), sharp for the past, pencilled (reservations, planned events) for the future.
- The orchestration of a workflow — deciding what runs next — is either reality’s business (the scheduler’s, the lab’s) observed through adapters, or a domain service’s business run on its own clock. Core contains no workflow engine. A workflow engine in Core would make Forge an operational system — the “second operational system nobody asked for” that FORGE-100 Part 2.0 explicitly refuses to become. Forge keeps the record of workflows; it never becomes their executor.
11.5 The event flow diagram
reality: a node fails at 03:12
│
▼
System of Record registers it (TSDB alarm / operator observes)
│
▼
DOMAIN adapter service (next cycle) materialises:
Record event {kind: incident-detected, affected: node c042,
author: detection service, at: 03:12}
│ ingestion contract
▼
CORE Truth Store: validate · resolve identity · stamp provenance · append
│
▼ ┌────────────────────────────────┐
CORE Publisher freezes snapshot S ───▶│ SIGNAL: "snapshot S published" │
│ └───────────────┬────────────────┘
│ (the truth) │ (the address)
▼ ▼
incremental build: modules whose declared inputs include
node events / incident kinds are recomputed against S —
the node's page (core module), the fleet view (domain module),
the Record browser (core module), search index (core module)
│
▼
published artifacts update; the operator later authors the
resolution event (same path, human as System of Record);
the reader at 08:00 sees the incident and its resolution,
each timestamped, each attributed — and nothing anywhere
holds a copy of the fact outside the Truth Store and its
snapshots.
Part 12 — API Philosophy
12.1 What Forge APIs expose
The brief asks: entities, commands, events, or queries? Forge’s answer follows from what already exists — FORGE-100 Part 10’s contracts are the API, and FORGE-101 packages rather than reinvents them:
- Entities: yes — as published objects. The Object, Relationship, Measure, Event, Receipt, and Snapshot contracts, served as content-addressed published artifacts (the static path) or through the bounded query service behind identical contracts (the dynamic path, FORGE-100 Part 12.3). The API for an object is its permanent URL and contract shape; there is no separate “API version” of an object — one home, machine-readable and human-readable projections of the same canonical facts.
- Queries: yes — as the Search contract and the query service’s contract-bound reads. Ranked by stated method, typed answers, honest zero (ADR-010).
- Events: yes — as the Record, readable through the Event contract; and as a signal subscription surface for machinery (addresses only, Part 11.2).
- Commands: almost none, deliberately. The sole command family is the authored event (an authorised operator records maintenance, an incident, an erratum) — mediated through the ingestion path with the author as System of Record. There is no general write API, no CRUD, no “update object” verb — because Forge is not the system where facts are born (FORGE-100 Part 2.0); it is the system where they are kept and published. An API consumer wanting to change reality talks to reality; Forge will notice through adapters.
12.2 Evolution and compatibility
Inherited whole from ADR-015, restated as the consumer’s guarantee: contracts are versioned, additive-by-default; breaking changes require a new contract version with a declared deprecation window recorded in the Record; consumers bind to contract versions, never implementations. FORGE-101 adds the composition-era corollaries:
- The ontology version is part of the API. A response says which trunk + extension versions it speaks (snapshots are self-describing, ADR-009 — the API inherits it). Consumers can therefore hold a five-year-old snapshot and today’s side by side and know exactly what changed in the language between them.
- Extension packages version independently of the trunk, and a domain’s API additions (its extension types on the same contracts) follow the same additive-by-default law. A consumer that knows only the trunk reads any Forge Instance on Earth at trunk fidelity, ignoring extensions it does not speak — extensions MUST be ignorable, which is the machine-readable form of “sparse relations are legitimately empty” (Part 10.2 of FORGE-100).
- Backwards compatibility has an expiry policy, not an expiry date. Old contract versions are supported through their declared window; but published artifacts never expire — a 2027 snapshot speaks its 2027 contracts forever, readable by the schema published beside it (ADR-009). The living API evolves; the record does not. This split — evolve the interface, never the artifact — is how Forge avoids both eternal-compatibility paralysis and broken citations.
Part 13 — Repository Architecture
13.1 The shape: one repository per plane artifact
forge THE CONSTITUTION (this repository — unchanged in role)
│ founding documents · trunk ontology · contracts ·
│ ADRs · governance · templates · design grammar
│ No production code (FORGE-100 Part 14, still law).
│
├──▶ forge-core THE RUNTIME (one repository)
│ truth store · publisher · projection engine ·
│ search · design system · identity enforcement ·
│ composition machinery · service harness ·
│ core Forge Modules (in-repo: modules/)
│
├──▶ forge-hpc ONE REPOSITORY PER DOMAIN
│ forge-genomics extension package (ontology/) · adapter families
│ forge-imaging … (adapters/) · domain modules (modules/) ·
│ knowledge templates (knowledge/) · vocabulary
│
└──▶ mjolnir ONE REPOSITORY PER INSTANCE
biohpc composition manifest + lockfile · configuration ·
rubus … branding assets · instance knowledge & stories ·
adapter bindings (credentials via secret store,
never in-repo)
13.2 Why this shape and not a monorepo
The choice is argued, because it will be questioned:
- Repository boundaries enforce the dependency law physically. In a monorepo, an illegal import (Core reaching into a domain) is one lazy line that review must catch forever. Across repositories, it is impossible without declaring a dependency that composition-time checking (Part 7.4) and plain visibility will refuse. The architecture’s most important rules should be enforced by the cheapest mechanism that makes violation structurally awkward, and repository separation is that mechanism.
- Release cadence matches the plane (Part 2.2’s rate-of-change axis, made operational): Core releases like a runtime (deliberate, versioned, migration-noted); domains release like libraries; instances deploy like configuration. One repository per rhythm.
- Ownership and authority match the plane (the who-knows-it axis): the Forge project maintains forge and forge-core; a practice community can genuinely co-own forge-hpc; an institution owns its instance repository outright. Access control follows repository, and so does accountability.
- Adoption is a checkout, not an excavation. The five-years-later reader builds a platform by creating one small instance repository and depending on published Core and domain versions — never by forking or even reading a monorepo containing Mjolnir.
- Modules live inside their owning plane’s repository (core modules in forge-core, domain modules in their domain), because a module’s plane is its identity (Part 7.2) and separate module repositories would multiply versioning surfaces without adding any boundary the plane doesn’t already provide. A module graduating between planes (Promotion, Part 7.8) moves repositories — making promotion visible, deliberate, and recorded, exactly as governance wants it.
The counter-argument is acknowledged honestly: multi-repository coordination costs real friction (a trunk ontology change ripples through repositories on different clocks). The mitigation is the same discipline the API has — additive-by-default, versioned, windowed deprecations (ADR-015) — and the friction is accepted because it is honest: a change that ripples across planes SHOULD feel heavy, since it is constitutionally heavy. A monorepo would make constitutional changes feel free precisely when they are most expensive.
13.3 What lives in forge (this repository) after FORGE-101
FORGE-100 Part 14’s structure stands, with two additions: ontology/extensions/ — the registry of ratified Domain Extension Packages (the packages’ definitions live here in their ratified form, because the ontology including its branches is constitutional; domains develop proposals in their repositories and ratification lands them here); and governance/domains/ — the domain lifecycle process: creation criteria (Part 4.6), extension ratification, promotion/demotion, split and retirement.
Part 14 — The Dependency Rules
These rules are constitutional. They are checked mechanically at composition time (Part 7.4, step 4); a violation is not a code smell but a composition failure.
14.1 The dependency graph
┌──────────────────────────────┐
│ FORGE INSTANCE │
│ (Mjolnir, BioHPC, Rubus) │
└──────┬───────────────┬───────┘
selects, pins, │ │ configures, binds,
configures │ │ supplies credentials
▼ ▼
┌──────────────────────────────┐ ┌──────────────────────────┐
│ FORGE DOMAIN(S) │ │ (Core's configuration │
│ (Forge HPC, Forge │ │ surface, directly) │
│ Genomics, …) │ │ │
│ — no edges between │ │ │
│ domains, ever — │ │ │
└──────────────┬───────────────┘ └────────────┬─────────────┘
extends via ratified │
extension packages; │
consumes contracts │
▼ ▼
┌──────────────────────────────┐
│ FORGE CORE │
│ (runtime + core modules) │
└──────────────┬───────────────┘
conforms to │
▼
┌──────────────────────────────┐
│ THE CONSTITUTION │
│ trunk ontology · contracts │
│ · principles · ADRs │
└──────────────────────────────┘
Every arrow points downward. There are no upward arrows,
no lateral arrows between domains, and no arrow may skip
the contract at its boundary.
14.2 The rules, enumerated and explained
Each rule names what it permits or forbids, and why — because a rule whose reason is forgotten will be repealed by convenience.
-
Everything may depend on the constitution. The trunk ontology and the contracts are the root; they depend on nothing and everything speaks them. Why: a shared language must have exactly one definition (FORGE-001’s founding argument), and it must sit below every party that speaks it.
-
Domains depend on Core. Core MUST NOT depend on domains — permanently. Not on their code, their names, their vocabulary, or their existence. Core compiled today must be byte-identical whether one domain exists or fifty. Why: the moment Core knows one domain, every other domain inherits that knowledge as dead weight, and Core’s release cadence couples to the fastest-moving practice it knows about. Core’s ignorance is every domain’s independence.
-
Instances depend on domains and on Core’s configuration surface. Domains and Core MUST NOT depend on instances — permanently. Why: an instance is the narrowest possible knowledge (radius of one, Part 9.3). Anything below it that learns its name has moved deployment fact into shared machinery, where it becomes the next adopter’s inherited falsehood.
-
Domains MUST NOT depend on other domains. Shared needs are promoted (Part 4.5), never imported. Why: one lateral edge makes two domains un-adoptable separately and un-retirable ever; a handful make the domain plane a mesh, and a mesh has no seams — which is to say, no architecture.
-
Instances MAY depend on Forge Modules — by selection and pinned version, through manifests only. An instance names modules and supplies their declared parameters; it MUST NOT reach into module internals, fork a module, or patch one in place. Why: the manifest is the module’s whole promise (upkeep, degraded state, inputs); an instance that bypasses it holds an unrecorded promise, which Principle 11 forbids.
-
Forge Modules MUST NOT know their instance. A module receives (snapshot, knowledge, configuration) and nothing else; instance identity is not among the things a module can name (Part 7.6). Why: a module that behaves differently on Mjolnir than on BioHPC under identical configuration is untestable, unportable, and secretly instance logic — the no-logic rule (Part 5.2) evaded by relocation.
-
Modules depend downward or laterally-within-plane, on contracts, acyclically (the full statement is Part 7.6). Core modules on Core only; domain modules on Core, core modules, their own domain, and same-domain modules; never across domains. Why: module edges are the finest-grained place the plane law could leak, so the plane law is restated at module grain.
-
Services obey their owning plane’s rules, and additionally MUST NOT be depended on directly by anything — a service’s consumers read what it publishes (truth, snapshots, signals), never call it. Why: the unidirectional flow (FORGE-100 Part 1.2) admits no runtime call graphs; a called service is a runtime dependency that can fail at read time, which the static thesis exists to preclude.
-
Nothing depends on a view, ever. Citations point at objects and moments (FORGE-100 Part 5.5); machinery reads truth, not renderings. Why: views must stay free to delete (§3.3), and anything depended-upon is no longer free.
-
Skipping a boundary’s contract is forbidden even in the permitted direction. A domain module reading Core’s truth store directly (rather than snapshots), an instance writing a domain service’s working state — these follow the arrows and still violate the law, because the contract at the boundary is part of the boundary. Why: contracts are what make each layer reimplementable (FORGE-100 Part 10); a permitted-direction bypass destroys that property as surely as a forbidden-direction import.
14.3 Answering the brief’s questions directly
- Can Domains depend on Core? Yes — it is the definitional edge (rule 2).
- Can Core depend on Domains? Never (rule 2). This is the single most important prohibition in FORGE-101, as Truth-must-not-know-views was in FORGE-100 (Part 2.2 there): the moment it breaks, Forge stops being a runtime and becomes the HPC platform with aspirations.
- Can Instances depend on Modules? Yes — by manifest, pin, and parameters only (rule 5).
- Can Modules know their Instance? No (rule 6). They know their configuration, which the instance supplied — and that indirection is the entire difference between a runtime and a codebase with customers.
Part 15 — Mapping Today’s HPC Analytics Platform
The existing platform is not ignored; it is the evidence base. Every major subsystem below is mapped to its plane and stratum. The goal is evolution: nearly everything survives; what changes is where it lives and what may know about it. Where a subsystem’s internal function is not fully visible from the constitutional record, the mapping is by function as named, and the migration’s Phase 1 audit (Part 16.2) verifies it.
| Today’s subsystem | Destination plane | Destination stratum | The mapping, reasoned |
|---|---|---|---|
| Scheduler abstraction | Forge HPC | Source (adapter family) | The existence of an abstraction over schedulers is itself the proof of the domain plane: it is not Mjolnir-specific (any Slurm shop needs it) and not universal (a telescope has no scheduler). It becomes Forge HPC’s flagship adapter family; Mjolnir keeps only endpoint bindings and credentials. |
| Node inventory | Split: Forge HPC + Core | Source → Truth | The ingestion of node facts (CMDB/procurement adapters) is domain. The keeping of Node objects — identity, lifecycle, service records — is Core’s Truth machinery operating on trunk types. The inventory UI (fleet view, generations) is a domain module in Derivation. |
| Queue insights | Forge HPC | Derivation (domain module) | Queue semantics are pure HPC expertise. The queue remains a view, never an object (§3.3). The honest outlook (FORGE-002 §1.2) is projected here; any predictive upgrade issues forecasts through Core’s mechanism (Part 8.5). |
| Software Intelligence | Split: Core + Forge HPC | Truth + Derivation | Software and its installed builds are trunk objects (FORGE-002 §3.2 Software / ontology-Module). The intelligence — usage shapes, adoption trends, deprecation surfacing — is a Forge HPC domain module projecting trunk truth. |
| LEAF (energy/efficiency accounting, as deployed today) | Split three ways | Truth + Derivation + Instance config | Energy measures on objects and the Ledger projection are Core (FORGE-100 Part 8.5 — the Ledger owns no truth). HPC-specific energy interpretation (node power models, job attribution methods) is Forge HPC. The grid carbon-intensity feed — and whether carbon is derived at all — is Mjolnir instance configuration (FORGE-100 Final Review: no honest feed, no derived carbon). |
| User analytics | Split: Core + Forge HPC | Truth + Derivation, gated by Identity | Person/Group/Project truth and the aggregation machinery (floors, differencing resistance — ADR-017) are Core. HPC-specific usage projections are domain modules. Everything person-grained is private facets; the migration MUST re-audit today’s analytics against ADR-017 rather than porting them as-is — this is the one subsystem where migration is also correction. |
| Prediction services | Split per Part 8.5 | Core mechanism + domain services + instance config | Forecast issuance/recording/calibration → Core. Queue-wait and similar models → Forge HPC services. Model selection, thresholds → Mjolnir config. |
| Presentation | Core | Presentation | The design system, object anatomy, visual grammar — universal by Principle 10. Mjolnir retains wordmark and theme tokens only. |
| Publication (the publishing pipeline) | Core | Publication | Snapshot freezing, content addressing, static artifact generation — the constitutional heart, domain-blind by construction. |
| Authentication | Split: Core + Mjolnir | Identity (orthogonal) | Enforcement (facet gating, fail-closed, null-identity public path) → Core. The identity provider, authorization mapping, and floors → instance (already FORGE-100 Part 13.4’s position). |
| Routing | Core | Interaction/Navigation | Permanent URLs as functions of identifiers (ADR-001) — constitutionally universal. Domain modules claim view-routes through manifests; nobody owns routing but Core. |
| Static frontend | Core (shell) + modules | Presentation/Interaction | The shell — walking, asking, scrubbing, sign-in — is Core. Individual surfaces decompose into core modules (object pages, Record, Ledger, search) and Forge HPC modules (queue, fleet, software intelligence). |
| Search | Core, fed by domain vocabulary | Derivation | Engine, contract, typed answers, honest zero → Core (ADR-010). HPC synonyms and vocabulary → Forge HPC content. Mjolnir contributes nothing — searching Mjolnir and searching BioHPC MUST feel like the same instrument. |
| Canonical entities | Core (trunk) + Forge HPC (bindings/extensions) | Ontology | The sixteen remain trunk. HPC-specific facet families (accelerators, interconnect, storage allocations) become the first ratified Domain Extension Package — regularising, through Part 4.3’s process, whatever HPC-specific vocabulary today lives mixed into the entity definitions. |
Two observations the table compresses. First, almost every subsystem splits — which is the empirical confirmation that the old two-layer model was storing two kinds of knowledge in one place; a mapping under which subsystems landed whole in single planes would suggest the planes were unnecessary. Second, nothing lands in Mjolnir but configuration, bindings, branding, and content — the first demonstration of Part 5.1’s smallness criterion, performed on real code.
Part 16 — Migration Strategy
A migration, not a rewrite: production keeps publishing throughout, and no reader should be able to date the migration from the outside. The strategy rests on one inherited property: projections are deterministic (FORGE-100 Part 2.5), so any refactor that claims to preserve behaviour can be proven to — rebuild from the same snapshot and diff the published artifacts. Byte-equivalence is the migration’s regression suite, and it is the strongest one an architecture has ever handed its own refactoring.
16.1 The roadmap
Phase 0 CONSTITUTION FORGE-101 ratified; ADRs 018–027 written;
(now) │ governance for domains established.
▼
Phase 1 THE AUDIT Label every file/component of HPC Analytics
(weeks) │ core / hpc / mjolnir — annotation only,
│ nothing moves. Disagreements about labels
│ are the architecture being debugged cheaply.
▼
Phase 2 INSTANCE EXTRACTION Pull every Mjolnir-specific value into one
(weeks) │ typed configuration document consumed by the
│ rest. Mjolnir is born as data, not code.
│ ✓ verify: byte-identical output
▼
Phase 3 CORE EXTRACTION Move core-labelled machinery into forge-core;
(months) │ the existing platform becomes forge-core's
│ first consumer (strangler pattern — the old
│ shell shrinks as the runtime grows inside it).
│ ✓ verify: byte-identical output per move
▼
Phase 4 DOMAIN EXTRACTION Move hpc-labelled expertise into forge-hpc:
(months) │ adapter families (split logic from bindings,
│ Part 8.4), domain modules, knowledge
│ templates; ratify the hpc: extension package.
│ ✓ verify: byte-identical output per move
▼
Phase 5 THE RESIDUE IS MJOLNIR What remains — manifest, config, branding,
(weeks) │ content — becomes the mjolnir repository.
│ The old codebase is empty; retire it with a
│ Deployment event, honestly recorded.
▼
Phase 6 THE PROOF: BIOHPC Compose forge-core + forge-hpc + new instance
│ repo. Acceptance test (constitutional):
│ BioHPC MUST require zero changes to Core and
│ zero domain changes beyond new adapter
│ bindings or genuinely new source adapters.
│ Any other change failing this test is a
│ misplacement escaping Phase 1–4, fixed by
│ relocation, not exception.
▼
STEADY STATE New instances are repositories of declaration;
new domains are extracted when committed
instances demand them (Part 4.6).
16.2 The phase disciplines
- Phase 1 is the highest-value, lowest-risk work in the whole migration and MUST NOT be skipped in eagerness to move code. The audit converts the architecture from assertion to inventory, surfaces every case where one component holds two planes’ knowledge (the splits of Part 15), and costs nothing to be wrong about — a mislabel found in Phase 3 is an annotation change; a mis-move found in Phase 5 is surgery.
- Order is Instance → Core → Domain, and the order is load-bearing. Instance extraction (Phase 2) comes first because it is the cheapest and it unlocks verification: once Mjolnir-the-config exists, “the platform parameterised by Mjolnir” is a function, and byte-equivalence testing becomes possible for every later phase. Core before domain because Core’s contracts are what the extracted domain will be written against; extracting the domain first would couple it to the old shell’s internals and require a second migration.
- Every move ships. No long-lived migration branch, no big-bang cutover: each extraction merges behind the byte-equivalence check and deploys in the normal cadence. The migration is, from production’s perspective, a long sequence of null-effect releases — which is exactly what “without disrupting production” means, made testable.
- Migration events are Record events. Phase completions, the old codebase’s retirement, the extension package’s ratification — authored, dated, in the platform’s own Record (Part 5.4). The platform’s own reconstruction is part of the instrument’s history, and hiding it would violate the platform’s character (FORGE-003 Part 5).
16.3 What is deliberately not migrated
Correction is separated from relocation, with one named exception. The migration moves knowledge to its right plane; it does not simultaneously redesign features — with the single exception of user analytics, where Part 15’s ADR-017 re-audit is a constitutional obligation, not an improvement, and where porting-as-is would migrate a privacy defect into a new decade. Everything else that deserves redesign gets it after its relocation, as ordinary view-layer work — because views are free (Part 5 of FORGE-100), and the migration’s job is to make them free, not to spend the freedom early.
Part 17 — Future-Proofing: Six Systems That Must Cost Core Nothing
The test of this document is a system its authors have not imagined. The nearest available proxies, walked through the planes. In every case the claim is the same and falsifiable: Forge Core changes by zero lines.
- Microscopy / CryoEM → Forge Imaging. Node = microscope/detector; Job = acquisition session (trunk, bound); Dataset = image stacks/volumes (trunk, heavily bound); extension candidates:
imaging:Specimen(or promotion-track Sample, Part 9.2),imaging:AcquisitionProtocol. Adapters read vendor acquisition databases and facility booking systems; Reservation covers instrument booking unchanged (FORGE-100 Part 13.3 anticipated this). Domain modules: acquisition calendars, detector health, dataset lineage. The privacy architecture is stressed by unpublished structural data — and holds, because facets fail closed (ADR-005) regardless of what the facets describe. - Earth Observation → Forge EO. The “instrument” may be a satellite constellation plus a ground segment: multiple Clusters (FORGE-002 §3.2 allowed it: “there may someday be more than one”). Job = acquisition/processing run; Dataset = scenes/products with heavy spatial facet families (
eo:footprint); the produced chain (scene → product → publication) is the same sparse, celebrated edge. Domain modules: coverage views, product catalogues. Spatial search may pressure the Search contract with a genuinely new query kind — the contract evolves additively (ADR-015) if so; the engine behind it remains swappable (FORGE-100 Part 6.5). - Climate modelling → an instance of Forge HPC, mostly. The deliberately boring case, included because boring is the success mode: a climate-modelling centre is a shared computational instrument — Forge HPC fits as-is, plus perhaps
climate:extensions for experiment/ensemble structure (or a thin Forge Climate domain composed alongside HPC, per Part 4.5’s trunk-mediated composition). The architecture’s best outcome for a new adopter is discovering they need no new domain at all. - Prediction engines are not a future system but a capability already placed (Part 8.5): Core mechanism, domain models, instance deployment. A future “prediction-heavy” platform composes them; nothing new is needed at the architectural level, which is the point of having placed them correctly now.
- Laboratory Information Systems → Forge Lab. The instrument is the laboratory itself. Job = protocol execution;
lab:Sample(promotion-track); Person/Group/Project govern access exactly as in HPC. This domain stresses privacy hardest (sample metadata can be human-subject data) — precisely the case FORGE-100 Part 13.3 said the biobank stresses, and the reason privacy is architecture (Part 11 there), not policy. A LIMS also tempts Forge toward operating the lab (scheduling, e-signatures, chain of custody) — and the workflow rule (Part 11.4) holds the line: Forge keeps the lab’s record; it does not run the lab. A Forge Lab domain that needs an execution engine builds it as an external System of Record and lets Forge observe it. - Digital collections / archives → Forge Collections. The hardest test, included because it strains the trunk: there is no machine, no jobs, no queues. What remains? Almost everything that matters: Dataset (the holdings), Publication, Person, Group, Project, Document, Story, Event (acquisition, conservation, digitisation — authored events are a conservator’s record of care), Measure (digitisation coverage, access statistics), Storage System. Node and Job go unused — and that is legal: the trunk is a vocabulary, not a quota; domains bind what they need and leave the rest silent, exactly as sparse relations are legitimately empty (FORGE-100 Part 10.2). If a domain someday needs a physical-carrier object the trunk lacks, that is an amendment argued on its merits. What Forge offers a digital collection is not HPC machinery but the constitution itself: permanent identity, provenance, honest time, published immutable record — which is, for an archive, very nearly the entire job description.
The pattern across all six: new science lands as bindings, extensions, adapters, and modules — the planes built for it — and the further a system sits from HPC, the more its value concentrates in the constitutional core rather than any domain. That inversion is the strongest available evidence that the Core/Domain split was drawn along the true grain.
Part 18 — New Architectural Decision Records
Continuing FORGE-100’s numbering (ADR-001–017 stand unchanged). Each entry: decision, and why it must be an ADR — that is, why future maintainers will need the reasoning, not just the rule.
ADR-018 — The Three Planes: Core, Domain, Instance. The Implementation Layer of FORGE-100 Part 2.9 is refined into Domain (practice expertise) and Instance (deployment fact); planes separate by rate of change, author class, and reuse radius. Exists because it is FORGE-101’s founding decision, and every later argument (“shouldn’t this just live in Core?”) must be answerable by citation.
ADR-019 — Domain Extension Packages: Trunk and Ratified Branches. The ontology is a universal trunk plus namespaced, constitutionally ratified, domain-owned extension packages; instance-level types remain forbidden; concepts needed by two domains are promoted. Exists because it deliberately extends ADR-016, and the boundary between “extension” and “fork of the language” must be citable when a domain pushes on it.
ADR-020 — Instances Contain No Logic. An instance is manifest, configuration, bindings, branding, and authored content; behaviour is selection among declared options; anything else is a missing capability implemented in the domain or Core. Exists because this is the rule most eroded by deadline pressure (“just a small script in the instance repo”), and erosion must be nameable as violation.
ADR-021 — Forge Modules: Manifest-Declared, Build-Time Composed, Contract-Bound. Capability ships as modules declaring identity, requirements, inputs, contributions, parameters, upkeep owner, and degraded state; composition is closed, validated, recorded; declared inputs are the whole of granted access. Exists because the manifest is where Principles 11 and 12 become unskippable fields, and the closed-composition choice (no runtime plugins) will be challenged by every future marketplace fantasy.
ADR-022 — Thin Signals, Fat Record. Two event kinds only: Record events (truth, authored, published) and Signals (runtime notifications carrying addresses, never facts); payload-bearing signals are forbidden. Exists because an event bus with payloads is the single most common way modern architectures silently duplicate truth, and the prohibition needs a permanent, citable reason.
ADR-023 — Module and Plane Dependency Law. The rules of Part 14, mechanically enforced at composition: downward-only across planes, no lateral domain edges, contract-only boundaries, modules blind to their instance, nothing depends on views or calls services. Exists because dependency rules not written as law decay into lore, and lore loses arguments with convenience.
ADR-024 — Services Below Publication, Modules Above. The positional rule: what can be a pure function of a snapshot must be a module; services exist only for work on reality’s clock; services are never called by consumers, only read through what they publish. Exists because every future capability will arrive asking to be a service (services feel powerful), and the presumption must run the other way.
ADR-025 — Forecasts Are Derived Measures with Recorded Issuance. Prediction is Core mechanism (issue, label, record, calibrate), domain models, instance deployment; an issued forecast becomes an observed fact about its issuing service; Prediction is never an object type. Exists because it operationalises FORGE-002 §1.2’s error-bar demand and pre-answers part of FORGE-004, and because “just store the predictions” will be proposed within the year.
ADR-026 — One Repository Per Plane Artifact. Constitution, Core, each domain, each instance: separate repositories; modules live in their owning plane’s repository; promotion moves code between repositories as a recorded act. Exists because the monorepo argument will recur with every new hire, and the answer — boundaries enforced physically, cadence and ownership per plane — deserves better than repetition.
ADR-027 — Promotion on Evidence, Never Speculation. Logic moves toward generality only when demonstrated (instance need → domain option; two domains → Core or trunk); domains are created only for committed instances; generality is proven by the second instance; altitude is reviewed in both directions. Exists because speculative generality is the death of platform projects, and the burden of proof must be citable in every “while we’re at it, let’s make it generic” review.
Ten planes-era decisions, deliberately few, mirroring FORGE-100’s restraint: each ADR is itself a promise of upkeep.
Final Review — What Remains Unresolved Before Implementation
The honest account, in FORGE-100’s tradition: what this document has decided is above; what it has not decided, and must not pretend to have, is below. Each item names the question, why it is genuinely open, and what bounds it in the meantime.
1. Who ratifies a Domain Extension Package? Part 4.3 reuses “the constitutional amendment process,” but FORGE-001 §23 Q7’s question — who holds the authority to say no? — was answered for one instrument’s platform, not for an ecosystem where a domain’s community and the trunk’s guardians may disagree. A domain denied an extension can fork nothing (the law forbids private types), so the ratifier holds real power over practices they may not understand. Bound by: governance/domains/ (Part 13.3) must define the ratification body and an appeal path before the first extension package — which is Phase 4 of the migration, so the deadline is real and near.
2. Two domains binding the same trunk object for one instance. BioHPC composes Forge HPC and (eventually) Forge Genomics; both bind Job — one as batch computation, one as sequencing run, sometimes the same Job. Part 4.5 establishes that they meet on trunk objects without knowing each other, but the presentation question is open: whose vocabulary labels that Job’s page? Whose module claims its primary view-route when both offer one? Composition-time route collision detection (Part 7.4) makes the conflict loud, and manifest-declared precedence configurable by the instance is the likely shape — but the answer is deferred to the first real collision, on the principle that presentation conflicts should be designed from an actual case, not an imagined one. Bound by: it is a Derivation/Presentation question only; truth is unaffected whatever the answer.
3. The Core–Domain compatibility matrix. Modules declare compatibility in ontology and contract versions (Part 7.5), which is clean — but Core itself evolves, and the question of how many trunk versions Core must simultaneously serve (a 2027 snapshot beside a 2032 one, per Part 12.2) has a cost curve nobody has measured. Supporting every version forever is the record’s promise (ADR-009); supporting every version in the live pipeline is not the same promise, and the distinction needs an operational policy. Bound by: the published record’s readability is constitutional and non-negotiable; only live-pipeline support width is open.
4. Federation across instances. FORGE-100 Part 13.6 kept federation possible and unbuilt. The planes sharpen the question: a cross-instance view (a national portal over Mjolnir + BioHPC) is a projection over multiple snapshot chains — but whose projection? It is not an instance (radius > 1), not a domain (it is a deployment, not expertise), and making it Core machinery smuggles a product into the runtime. The honest answer may be a fourth kind of composition — an instance whose “sources” are other instances’ published records — which would be elegant precisely because it adds no plane. Bound by: instrument-scoped identifiers (ADR-001) and self-describing snapshots already guarantee federation remains buildable; only its constitutional shape is open.
5. Staffing the planes. FORGE-100’s Final Review named editorial capacity the project’s largest existential risk; the planes multiply the question. A domain is a community’s codebase in theory — but Forge HPC at birth will be maintained by the same small team as Core and Mjolnir, and the plane boundaries this document enforces mechanically will be socially fictional until at least one plane has a genuinely distinct owner. The risk is not that the boundaries break but that they become ceremony — three repositories, one mind — and ceremony without benefit erodes the will to maintain the discipline when it finally matters (at BioHPC, at the first external domain contributor). Bound by: Phase 6’s acceptance test is mechanical and does not care who maintains what; but the governance documents of Part 13.3 should name plane owners explicitly, even if today several names are the same person, so that divergence is a planned event rather than a crisis.
6. The composition of FORGE-004. Twice deferred before this document, and deferred again here with sockets reserved (Part 8.5): the assistant question. FORGE-101 adds one new urgency to FORGE-100’s: a conversational layer will be domain-flavoured (it must speak HPC to HPC users), which tempts implementers to build it inside a domain, coupling the most constitutionally dangerous capability to the least constitutionally supervised plane. The pre-commitment stands and is now plane-specific: whatever FORGE-004 permits, its mechanism is Core, bound by the invariant — sources, ages, “unknown” with dignity — and no domain ships its own assistant machinery in the interim. Bound by: the reservation just stated, which this document makes law until FORGE-004 supersedes it.
Closing judgment
FORGE-100 proved the vision constructable. FORGE-101’s claim is narrower and, if anything, harder: that the construction can be shared — that the machinery built for one Danish supercomputer can be the runtime for sciences not yet chosen, institutions not yet met, and instruments not yet built, without those futures paying for HPC’s past or Mjolnir’s particulars.
The claim rests on three decisions, and it is worth being plain about which carries the most weight. The three planes (ADR-018) are the skeleton; the extension-package mechanism (ADR-019) is the joint that lets the skeleton grow without fracturing the shared language; but the load-bearing decision is the humblest one: Core’s permanent ignorance (Part 14, rule 2). Every failed platform in this document’s ancestry — the portal of doors, the framework that knew its first customer too well, the unified system that unified nothing — failed by knowing too much. Forge Core is designed to know almost nothing about the sciences it serves, and to be incapable of learning, because what the runtime does not know, it cannot impose; what it cannot impose, it cannot break; and what it cannot break, a stranger in five years can trust.
That stranger is this document’s reader of record. They will compose a platform for an instrument nobody in this project has heard of, out of a Core that has never heard of them — and if Parts 1 through 18 have done their work, both parties will find that mutual ignorance is precisely what makes the collaboration safe, cheap, and durable. The architecture’s authority ends where the evidence begins; BioHPC is the first evidence, and Phase 6 is its test.
— End of FORGE-101.