Skip to content

Commit 9c1b31f

Browse files
committed
docs: call an authority Evidence deployment a gateway
"Cell" was a coinage of the authority-owned reset that no visitor-facing surface ever defined. Registry Stack itself calls the service that answers a requirement over an authority's own source an Evidence gateway, so the lab now uses that noun everywhere a reader sees it: the Visitor Center copy, the published DCAT titles, the docs, and the README. Identities keep their existing spelling. Directory names, hostnames, volume paths, the `solmara-authority-cells` catalogue id, and the `SOLMARA_<CELL>_EVIDENCE_PUBLIC_HOST` variables are addresses rather than descriptions, and renaming them would move deployed routes and break anyone who has harvested the catalogue. The purposes parser gained a test for the three-column row, the only shape the published catalogue actually has, because the previous suite covered only the five-column fixture and so never exercised the hardcoded enforcing-service string this rename touches. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
1 parent 3d5c492 commit 9c1b31f

20 files changed

Lines changed: 111 additions & 88 deletions

‎README.md‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ The reset has two evidence cadences:
1111
- CRA civil links and death status, MoSD enrolment, SIPF pension and survivor
1212
cases, and NAgDI agriculture requirements use named Relay V2 exact lookups.
1313

14-
Six Evidence cells have distinct providers, issuers, signing keys, JWKS, audit
14+
Six Evidence gateways have distinct providers, issuers, signing keys, JWKS, audit
1515
sinks, subject-binding secrets, and endpoints. Five Relays expose only the
1616
named non-enumerating operations needed by the lab. NIA's Relay is reserved for
1717
the optional eSignet UserInfo profile; NIA Evidence reads its own extract.
@@ -60,11 +60,12 @@ Local entry points after startup are:
6060

6161
- Visitor Center: `http://127.0.0.1:4301`
6262
- Programme portal: `http://127.0.0.1:4300`
63-
- Authority Evidence gateway: `https://localhost:4341/evidence/{authority}`
63+
- Local TLS front door: `https://localhost:4341/evidence/{authority}`
6464
- Static metadata: `http://127.0.0.1:4331`
6565

66-
The gateway strips `/evidence/{authority}` before forwarding. Application code
67-
uses six authority base URLs and never assumes a national Evidence host.
66+
The front door strips `/evidence/{authority}` before forwarding, so one local
67+
port reaches all six gateways. Application code uses six authority base URLs and
68+
never assumes a national Evidence host.
6869

6970
## Architecture
7071

@@ -103,7 +104,7 @@ uv run python -m solmara_lab.publisher --root .. publish-extract \
103104

104105
The live MoSD mutation is visible on the next Relay-backed Evidence request
105106
without a restart. A newly named SRO extract is not visible until only the SRO
106-
Evidence cell is rebound and restarted. Invalid, stale, or overwritten extracts
107+
Evidence gateway is rebound and restarted. Invalid, stale, or overwritten extracts
107108
fail closed. Run lifecycle smoke in isolated volumes or restore the deterministic
108109
fixture state afterward.
109110

@@ -131,9 +132,9 @@ Relay/Evidence authoring inputs are tracked.
131132

132133
- `relays/` contains five authority-governed Relay V2 projects.
133134
- `evidence/cells/` contains six authority Evidence bundle templates and
134-
runtime bindings.
135+
runtime bindings, one per gateway.
135136
- `generator/solmara_lab/publisher.py` publishes deterministic SQLite sources.
136-
- `scenarios/` and `scenario-runner/` route requirements to authority cells,
137+
- `scenarios/` and `scenario-runner/` route requirements to authority gateways,
137138
verify multiple JWKS, and compose application outcomes.
138139
- `portal/` and `home/` display safe authority, issuer, and source-type labels.
139140
- `metadata/` and `requests/registry-lab/` publish discovery and request

‎docs/changelog.md‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@
33
A small dated log of what changed in the visitor center and the lab topology.
44
Newest entry first.
55

6+
## 2026-08-20 Evidence gateways replace "cells"
7+
8+
Every visitor-facing surface now calls an authority's Evidence deployment an
9+
Evidence gateway. "Cell" was a private coinage of the reset and was never
10+
defined for a reader; "gateway" is the noun Registry Stack itself uses for the
11+
service that answers a requirement over an authority's own source. Nothing in
12+
the topology changed. Directory names, hostnames, volume paths, and the
13+
`solmara-authority-cells` catalogue identifier keep their existing spelling
14+
because they are identities rather than descriptions.
15+
616
## 2026-08-20 Registry Stack v0.23.0
717

818
Solmara pins Registry Stack v0.23.0 across `versions.env`, the release-pin
@@ -13,10 +23,10 @@ topology is unchanged. The reason to move is security: v0.23.0 upgrades `h2`
1323
to 0.4.17, past RUSTSEC-2026-0258, where a peer could queue unlimited empty
1424
DATA frames on the HTTP/2 path that Relay and Evidence both serve over.
1525

16-
The Evidence deployment contract gained three required fields, so the six cell
26+
The Evidence deployment contract gained three required fields, so the six gateway
1727
bundles are authored rather than only re-pinned. `service.publicOrigin` names
18-
the one routed origin RFC 9728 discovery answers on, which is each cell's own
19-
`<cell>-evidence.solmara.registrystack.org`. Every requirement and every
28+
the one routed origin RFC 9728 discovery answers on, which is each gateway's own
29+
`<authority>-evidence.solmara.registrystack.org`. Every requirement and every
2030
concept now carries a `handle`, the stable key a client reads a result under;
2131
each is authored to the last segment of the identifier it names. v0.23.0 also
2232
adds Registry Discovery and published Discovery client packages, neither of
@@ -53,7 +63,7 @@ digest input.
5363

5464
## 2026-08-12 Authority-owned Relay and Evidence reset
5565

56-
Solmara now authors six independent Evidence cells and five Relay V2 projects.
66+
Solmara now authors six independent Evidence gateways and five Relay V2 projects.
5767
CRA, NIA, and SRO publish immutable SQLite extracts for direct Evidence use;
5868
CRA, MoSD, SIPF, and NAgDI expose only named exact Relay lookups, with NIA's
5969
Relay reserved for the optional eSignet UserInfo profile. The programme code

‎docs/hosted-deployment.md‎

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Hosted deployment
22

3-
Deploy the authority-cell reset only from the exact Registry Stack release
3+
Deploy the authority-owned reset only from the exact Registry Stack release
44
recorded in `versions.env`. Relay, Evidence, and Mint must use their official
55
Registry Stack OCI images pinned by digest. Solmara-owned images are also
66
digest-pinned, while the local Relayctl helper is assembled from its
@@ -41,7 +41,7 @@ Do not reuse an unrelated package or deploy a mutable tag.
4141
## Authority topology
4242

4343
The hosted topology contains five Relay V2 services, six independently signed
44-
Evidence cells, one shared lab Mint, and the programme application. The optional
44+
Evidence gateways, one shared lab Mint, and the programme application. The optional
4545
eSignet profile uses the NIA Relay lookup.
4646

4747
Evidence hosts are:
@@ -53,8 +53,8 @@ Evidence hosts are:
5353
- `sipf-evidence.solmara.registrystack.org`
5454
- `nagdi-evidence.solmara.registrystack.org`
5555

56-
Each host is also the cell's own identity. The signed bundle carries it as
57-
`service.publicOrigin`, and the cell answers with it as the `resource` and the
56+
Each host is also the gateway's own identity. The signed bundle carries it as
57+
`service.publicOrigin`, and the gateway answers with it as the `resource` and the
5858
`jwks_uri` prefix of its RFC 9728 protected-resource metadata and in the
5959
`WWW-Authenticate` challenge it returns. `SOLMARA_<CELL>_EVIDENCE_PUBLIC_HOST`
6060
moves the route without moving that identity, so a deployment that sets one
@@ -72,16 +72,16 @@ paths are:
7272
|---|---:|---|
7373
| Shared Mint | 3 | Runtime, secrets, and Transit socket |
7474
| Five Relays | 10 | One runtime and one mutable source path per authority |
75-
| Six Evidence cells | 21 | Runtime, secrets, and Transit socket per cell, plus the CRA, NIA, and SRO immutable-extract paths |
75+
| Six Evidence gateways | 21 | Runtime, secrets, and Transit socket per gateway, plus the CRA, NIA, and SRO immutable-extract paths |
7676

7777
Each application also joins a Coolify-managed container network that carries the
7878
ingress proxy, alongside the private runtime network its services address. A
7979
listener bound only to its private runtime address refuses that proxy and never
80-
answers its public route, so Mint and every Evidence cell bind every interface.
80+
answers its public route, so Mint and every Evidence gateway bind every interface.
8181
Evidence records this as `networkExposure: container-private`, the exposure its
8282
runtime requires before it accepts a wildcard bind. Isolation rests on network
8383
membership rather than on the bind address: an application's networks carry only
84-
its own containers and the proxy, so no authority reaches another's cells.
84+
its own containers and the proxy, so no authority reaches another's gateways.
8585

8686
Joining two networks makes a container's routable address ambiguous. Traefik
8787
reads the address from the first network it iterates when no network is named,
@@ -111,7 +111,7 @@ to two different empty directories. Co-locating the provision, signer, core, and
111111
four authority applications is a deployment precondition.
112112

113113
Each ministry runs its own signer application, which creates and owns the
114-
Transit socket paths of its cells and runs one isolated signer per cell:
114+
Transit socket paths of its gateways and runs one isolated signer per gateway:
115115

116116
| Application | File | Signers |
117117
|---|---|---|
@@ -156,7 +156,7 @@ least-authority source clients, each limited to its named operation:
156156
- `nia-esignet`
157157

158158
The ninth client, `solmara-demo`, belongs to the programme application and is
159-
used to request assertions from the authority Evidence cells. The shared Mint
159+
used to request assertions from the authority Evidence gateways. The shared Mint
160160
is a lab convenience, not production tenancy guidance.
161161

162162
## Secret boundary
@@ -170,7 +170,7 @@ Compose file, repository file, build log, or delivery record:
170170
- authority-specific Relay audit HMAC keys, plus cursor HMAC keys for the Relay
171171
contracts that require cursors;
172172
- Mint and Evidence audit HMAC keys;
173-
- one subject-binding HMAC key for each Evidence cell;
173+
- one subject-binding HMAC key for each Evidence gateway;
174174
- the programme federator token;
175175
- when eSignet is enabled, its database credential, KYC-token and PSUT HMAC
176176
secrets, KYC keystore credentials, and portal OIDC client key.
@@ -195,14 +195,14 @@ hosted provisioner creates the initial checked publication and reuses the exact
195195
active filename on a restart. It never overwrites an active extract in place.
196196

197197
Reuse does not re-apply the extract's serving age. `maximumExtractAgeSeconds` is
198-
a policy each Evidence cell applies to live requests, so re-checking it while
198+
a policy each Evidence gateway applies to live requests, so re-checking it while
199199
re-adopting an already published extract would only make the provision
200200
application refuse to redeploy a day after it last ran. Every other binding,
201201
metadata, schema, and integrity check still applies, and an extract published in
202202
the future is still refused. Publishing a newer checkpoint remains the deliberate
203203
`publish-extract` operation below.
204204

205-
To publish a later checkpoint, override the matching direct-cell provisioner
205+
To publish a later checkpoint, override the matching direct-gateway provisioner
206206
service command with:
207207

208208
```text
@@ -211,8 +211,9 @@ publish-extract --target <cra|nia|sro>-evidence --assets /opt/solmara-hosted-ass
211211

212212
The operation validates the current binding, appends the checked publication
213213
under a fresh immutable filename, preserves the old file, and atomically
214-
rebinds only that cell's runtime configuration. Restart only the matching
215-
Evidence cell after the operation succeeds. The running cell continues to read
214+
rebinds only that gateway's runtime configuration. Restart only the matching
215+
Evidence gateway after the operation succeeds. The running gateway continues to
216+
read
216217
the old mounted extract until that restart. A malformed, metadata-mismatched,
217218
or non-newer publication fails closed.
218219

@@ -248,7 +249,7 @@ Deploy the reset alongside the existing deployment in this order:
248249
`compose.coolify.social-development.yaml`,
249250
`compose.coolify.labour-pensions.yaml`, and
250251
`compose.coolify.agriculture.yaml`. Confirm all five Relays and all six
251-
Evidence cells are ready on the private routes.
252+
Evidence gateways are ready on the private routes.
252253
6. Run the hosted programme, denial, JWKS, source-label, redaction, and UI smoke
253254
against the new routes before changing public routing.
254255
7. If required for this deployment, add `compose.coolify.esignet.yaml` and run
@@ -274,7 +275,7 @@ requires:
274275
- wrong-purpose and unauthorized calls to fail generically;
275276
- the portal to prove authority URL selection, per-authority JWKS verification,
276277
source-type labels, and redaction;
277-
- the Visitor Center to show the publisher, six Evidence cells, five Relays,
278+
- the Visitor Center to show the publisher, six Evidence gateways, five Relays,
278279
shared Mint, and programme application;
279280
- when the optional profile is deployed, eSignet login to complete through the
280281
NIA Relay V2 lookup.

‎docs/purposes.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Status: normative for the authority-owned Evidence reset.
44

55
Evidence requests carry one closed purpose code in the signed request body.
6-
For Relay-backed requirements, the Evidence cell authenticates to Registry Mint
6+
For Relay-backed requirements, the Evidence gateway authenticates to Registry Mint
77
with a dedicated private-key JWT client. Mint issues a token whose registration
88
fixes the full purpose IRI, exact Relay scope, and `solmara-runtime` audience.
99
The caller cannot select or override downstream Relay authority.
@@ -30,4 +30,4 @@ Responses and logs never include selectors, tokens, source rows, secrets,
3030
private keys, audit material, or sensitive dependency details.
3131

3232
The programme application verifies every authority JWS and owns the final
33-
cross-authority outcome. No Evidence cell returns an application decision.
33+
cross-authority outcome. No Evidence gateway returns an application decision.

‎docs/solmara.md‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# Solmara lab architecture
22

3-
Solmara is a fictional institutional lab. Its core boundary is an authority
4-
cell: an authority publishes a governed source, operates its Evidence service,
5-
signs its assertions, and owns its audit trail. A programme consumes assertions
6-
from several cells and owns the programme decision.
3+
Solmara is a fictional institutional lab. Its core boundary is the authority:
4+
each one publishes a governed source, operates its own Evidence gateway, signs
5+
its assertions, and owns its audit trail. A programme consumes assertions from
6+
several authorities and owns the programme decision.
77

88
## Runtime topology
99

@@ -16,9 +16,9 @@ from several cells and owns the programme decision.
1616
| SIPF | live read-only SQLite | pension payment and survivor exact lookups |
1717
| NAgDI | live read-only SQLite | voucher and livestock exact lookups |
1818

19-
There are six Evidence cells and five Relays. A Relay exists only for governed
20-
live consultation. It is not a façade over an Evidence cell's immutable local
21-
extract.
19+
There are six Evidence gateways and five Relays. A Relay exists only for
20+
governed live consultation. It is not a façade over an Evidence gateway's
21+
immutable local extract.
2222

2323
Every Relay operation has one dedicated Mint client registration, exact scope,
2424
fixed purpose claim, access profile, and disclosure profile. Relays do not
@@ -27,10 +27,11 @@ offer list, search, cursor, or generic record routes. The shared
2727

2828
## Evidence authority
2929

30-
Each cell has a unique provider IRI, authority DID issuer, ES256 signing key and
31-
JWKS, audit destination, subject-binding secret, runtime binding, and hostname.
32-
The application chooses the cell from a closed requirement directory, fetches
33-
only that cell's JWKS, verifies the exact requirement, evidence type, concepts,
30+
Each gateway has a unique provider IRI, authority DID issuer, ES256 signing key
31+
and JWKS, audit destination, subject-binding secret, runtime binding, and
32+
hostname. The application chooses the gateway from a closed requirement
33+
directory, fetches only that gateway's JWKS, verifies the exact requirement,
34+
evidence type, concepts,
3435
purpose, nonce, issuer, provider, audience, and validity window, then retains a
3536
safe presentation projection.
3637

@@ -57,7 +58,7 @@ profile.
5758
Wrong scope, wrong purpose, malformed selectors, invalid source rows,
5859
unavailable source, and unavailable audit fail closed. No-match, ambiguous
5960
match, and policy-hidden matches use the same data-free unresolved class. An
60-
Evidence cell does not infer a negative assertion from an unresolved Relay
61+
Evidence gateway does not infer a negative assertion from an unresolved Relay
6162
consultation.
6263

6364
## Programme stories

‎docs/stories/birth-to-child-benefit.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ unregistered birth, duplicate enrolment, and wrong purpose. An unregistered
2121
birth is a valid CRA record with no BRN and produces signed false, not an
2222
unresolved consultation. The mutable MoSD source changes on the next request;
2323
the three immutable sources change only after a reviewed replacement is bound
24-
and the owning cell is restarted.
24+
and the owning gateway is restarted.
2525

2626
The response surface contains safe authority, issuer, provider, source type,
2727
and verified concept values. It does not contain selectors, tokens, source

‎docs/stories/death-to-pension-survivor.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
The pension application combines a CRA death assertion and a SIPF active
44
payment assertion under `pension-payment-review`. The application, not either
5-
Evidence cell, derives whether payment should stop.
5+
Evidence gateway, derives whether payment should stop.
66

77
CRA calls only `civil-person/death-by-uin` and discloses the governed death
88
status. SIPF calls only `pension-payment/by-pensioner-uin` and discloses active

‎home/e2e/home.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ test('problem-codes anchors resolve, including current Evidence authorization de
164164
await expect(page.locator('[id="malformed_request"]')).toBeVisible();
165165
});
166166

167-
test('anatomy lists five Relay V2 projects and six authority Evidence cells with config links', async ({ page }) => {
167+
test('anatomy lists five Relay V2 projects and six authority Evidence gateways with config links', async ({ page }) => {
168168
await page.goto('/anatomy');
169169
await expect(page.locator('#relays .entity')).toHaveCount(5);
170170
for (const id of ['cra-evidence', 'nia-evidence', 'sro-evidence', 'mosd-programme-evidence', 'sipf-evidence', 'nagdi-evidence']) {
@@ -241,10 +241,10 @@ test('purpose lens: the live review reveals evidence and the wrong-purpose chall
241241
await page.goto('/');
242242

243243
await expect(
244-
page.locator('#proof .proof-grid > div').filter({ hasText: 'authority Evidence cells' }).locator('strong')
244+
page.locator('#proof .proof-grid > div').filter({ hasText: 'authority Evidence gateways' }).locator('strong')
245245
).toHaveText('6');
246246
await expect(
247-
page.locator('#solmara-preview .country-facts > div').filter({ hasText: 'Evidence cells' }).locator('dd')
247+
page.locator('#solmara-preview .country-facts > div').filter({ hasText: 'Evidence gateways' }).locator('dd')
248248
).toHaveText('6');
249249

250250
// The boundary challenge appears only after a successful live evidence run.

‎home/src/lib/components/ProofStrip.svelte‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<div class="content proof-grid">
1818
<div><strong>1</strong><span>synthetic country</span></div>
1919
<div><strong>{authorities ?? 'Unavailable'}</strong><span>live authorities</span></div>
20-
<div><strong>{evidenceCells ?? 'Unavailable'}</strong><span>authority Evidence cells</span></div>
20+
<div><strong>{evidenceCells ?? 'Unavailable'}</strong><span>authority Evidence gateways</span></div>
2121
<div><strong>{journeys ?? 'Unavailable'}</strong><span>guided policy journeys</span></div>
2222
<div><strong>0</strong><span>real resident records</span></div>
2323
</div>

‎home/src/lib/components/SolmaraPreview.svelte‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
</p>
2828
<dl class="country-facts">
2929
<div><dt>Live authorities</dt><dd>{authorities ?? 'Unavailable'}</dd></div>
30-
<div><dt>Evidence cells</dt><dd>{evidenceCells ?? 'Unavailable'}</dd></div>
30+
<div><dt>Evidence gateways</dt><dd>{evidenceCells ?? 'Unavailable'}</dd></div>
3131
<div><dt>Real records</dt><dd>0</dd></div>
3232
</dl>
3333
<a class="button-link secondary-link" href="/country">Explore Solmara and its full synthetic cast</a>

0 commit comments

Comments
 (0)