Deliver ADR cleanup packets and publish first-wave arc42 stubs
Some checks failed
Build and publish policy-nexus image / build-and-push (push) Failing after 48s

Packets go to seven owning repos by inbox and checklist. Railiance,
NetKingdom, and State Hub now have published architecture stubs.
This commit is contained in:
tegwick 2026-08-18 22:36:39 +02:00
parent b93928330e
commit af9f5996e2
34 changed files with 1891 additions and 56 deletions

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0"> <meta name="policy-source-revision" content="b93928330ef7a76976fa62989bb54f47dbe04832">
<meta name="policy-source-digest" content="a28668fb4b8b6c5ec8c94baac000061276d85ef1849ec7ab8d132b913dbfe3be"> <meta name="policy-source-digest" content="a28668fb4b8b6c5ec8c94baac000061276d85ef1849ec7ab8d132b913dbfe3be">
<title>Policy addressing and permanence</title> <title>Policy addressing and permanence</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>policy-nexus-adr-0001</span> <span class="stat">accepted · accepted-1</span> <span>the-custodian</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Policy addressing and permanence</h1><p class="sub">Source: <code>policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#permanence-promise"><span class="n">·</span>Permanence promise</a></li><li><a href="#publication-scope"><span class="n">·</span>Publication scope</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><ul><li>Status: accepted</li><li>Date: 2026-08-18</li><li>Owner: the-custodian</li></ul> <div class="wrap"><header><div class="eyebrow"><span>policy-nexus-adr-0001</span> <span class="stat">accepted · accepted-1</span> <span>the-custodian</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Policy addressing and permanence</h1><p class="sub">Source: <code>policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · b93928330ef7a76976fa62989bb54f47dbe04832</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#permanence-promise"><span class="n">·</span>Permanence promise</a></li><li><a href="#publication-scope"><span class="n">·</span>Publication scope</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><ul><li>Status: accepted</li><li>Date: 2026-08-18</li><li>Owner: the-custodian</li></ul>
<section id="decision"><h2>Decision</h2> <section id="decision"><h2>Decision</h2>
<p>A document has one stable current address and immutable revision addresses:</p> <p>A document has one stable current address and immutable revision addresses:</p>
<pre>/&lt;kind&gt;/&lt;document&gt;/&lt;version&gt;/ <pre>/&lt;kind&gt;/&lt;document&gt;/&lt;version&gt;/
@ -211,4 +211,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="consequences"><h2>Consequences</h2> <section id="consequences"><h2>Consequences</h2>
<ul><li>Builds fail if a source disappears, an id differs, a path collides, or an immutable revision would change; stale output is not silently called fresh.</li><li>Pages show status, revision, owner, last review and exact source revision.</li><li>Availability remains restart recovery on the single-node rail. This contract promises stable addressing, not a high-availability SLA.</li></ul> <ul><li>Builds fail if a source disappears, an id differs, a path collides, or an immutable revision would change; stale output is not silently called fresh.</li><li>Pages show status, revision, owner, last review and exact source revision.</li><li>Availability remains restart recovery on the single-node rail. This contract promises stable addressing, not a high-availability SLA.</li></ul>
</section><footer><span>policy-nexus-adr-0001 · accepted-1 · accepted</span><span>policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0</span></footer></main></div></div></html> </section><footer><span>policy-nexus-adr-0001 · accepted-1 · accepted</span><span>policy-nexus · docs/adr/ADR-0001-addressing-and-permanence.md · b93928330ef7a76976fa62989bb54f47dbe04832</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="e02982ce54691cf1589ac3d04012b9b9282f9eb54ed4b8f2f0544371f9b87f3e"> <meta name="policy-source-digest" content="e02982ce54691cf1589ac3d04012b9b9282f9eb54ed4b8f2f0544371f9b87f3e">
<title>Derived Rail Composition</title> <title>Derived Rail Composition</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0005</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-26</span><span>generated from canonical source — do not edit</span></div><h1>Derived Rail Composition</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0005-derived-rail-composition.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-01-26</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-07-26 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0005</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-26</span><span>generated from canonical source — do not edit</span></div><h1>Derived Rail Composition</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0005-derived-rail-composition.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-01-26</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-07-26 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Knative provides distinct workload activation and revision semantics but runs on Kubernetes. Treating it as an unrelated peer rail would duplicate generic workload lifecycle and substrate assumptions.</p> <p>Knative provides distinct workload activation and revision semantics but runs on Kubernetes. Treating it as an unrelated peer rail would duplicate generic workload lifecycle and substrate assumptions.</p>
</section> </section>
@ -202,4 +202,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="consequences"><h2>Consequences</h2> <section id="consequences"><h2>Consequences</h2>
<ul><li>New platform workloads continue to use <code>rail-kubernetes</code> unless a specialized rail is justified.</li><li>Derived rails declare base-rail compatibility rather than copying lifecycle contracts.</li><li>Fabric and conformance tooling must understand rail dependency and readiness.</li><li>Knative installation stays with the S2 substrate owner.</li></ul> <ul><li>New platform workloads continue to use <code>rail-kubernetes</code> unless a specialized rail is justified.</li><li>Derived rails declare base-rail compatibility rather than copying lifecycle contracts.</li><li>Fabric and conformance tooling must understand rail dependency and readiness.</li><li>Knative installation stays with the S2 substrate owner.</li></ul>
</section><footer><span>RMASTER-ADR-0005 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0005-derived-rail-composition.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0005 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0005-derived-rail-composition.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="36ec3aad5082ceff685d66e091c0a24b52abfc65b36595d00dce2b52a7250f4e"> <meta name="policy-source-digest" content="36ec3aad5082ceff685d66e091c0a24b52abfc65b36595d00dce2b52a7250f4e">
<title>First-Wave reef Rollout</title> <title>First-Wave reef Rollout</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0004</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-26</span><span>generated from canonical source — do not edit</span></div><h1>First-Wave reef Rollout</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0004-first-wave-reef-rollout.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-01-26</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0004</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-26</span><span>generated from canonical source — do not edit</span></div><h1>First-Wave reef Rollout</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0004-first-wave-reef-rollout.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-01-26</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Railiance now has a reef model, but it needs a concrete first rollout.</p> <p>Railiance now has a reef model, but it needs a concrete first rollout.</p>
<p>The current substrate reality is not uniform:</p> <p>The current substrate reality is not uniform:</p>
@ -214,4 +214,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="notes"><h2>Notes</h2> <section id="notes"><h2>Notes</h2>
<p>This ADR chooses the first rollout set. It does not require that every future substrate be modeled the same way.</p> <p>This ADR chooses the first rollout set. It does not require that every future substrate be modeled the same way.</p>
</section><footer><span>RMASTER-ADR-0004 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0004-first-wave-reef-rollout.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0004 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0004-first-wave-reef-rollout.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="276ea38233413f1e23670bbf57c486abc361b0a275ca67efea7d677103713b32"> <meta name="policy-source-digest" content="276ea38233413f1e23670bbf57c486abc361b0a275ca67efea7d677103713b32">
<title>Private-by-default Exposure</title> <title>Private-by-default Exposure</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0008</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-15</span><span>generated from canonical source — do not edit</span></div><h1>Private-by-default Exposure</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0008-private-by-default-exposure.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-02-15</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-08-15 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0008</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-15</span><span>generated from canonical source — do not edit</span></div><h1>Private-by-default Exposure</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0008-private-by-default-exposure.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-02-15</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-08-15 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>ADR-0006 says a topology binding is not permission to run a workload in production. It does not say who may reach a listener. A working deploy, a <code>hosts_rail</code> / <code>binds_rapp</code> line, or an Ingress object has been enough to put something on the public internet.</p> <p>ADR-0006 says a topology binding is not permission to run a workload in production. It does not say who may reach a listener. A working deploy, a <code>hosts_rail</code> / <code>binds_rapp</code> line, or an Ingress object has been enough to put something on the public internet.</p>
<p>Family readiness vocabularies are deliberately not unified (<code>schemas/README.md</code>). Reef <code>lifecycle_state</code> has no <code>production-approved</code>. Rapp <code>readiness_state</code> has no <code>production-approved</code> either. Exposure cannot be derived from those enums.</p> <p>Family readiness vocabularies are deliberately not unified (<code>schemas/README.md</code>). Reef <code>lifecycle_state</code> has no <code>production-approved</code>. Rapp <code>readiness_state</code> has no <code>production-approved</code> either. Exposure cannot be derived from those enums.</p>
@ -215,4 +215,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="consequences"><h2>Consequences</h2> <section id="consequences"><h2>Consequences</h2>
<ul><li>ADR-0006 still answers "may this binding run in production?" This ADR answers "who may reach the listener?" Do not merge the axes.</li><li>The three readiness enums stay distinct on purpose.</li><li>Family schemas grow an additive <code>exposure</code> field. Rapp <code>data_classification: public</code> is a different field and must not be reused as the posture name.</li><li>Implementation stays in the owning repos. This ADR does not install NetworkPolicy, UFW, Ingress, or tunnels.</li><li>Existing public surfaces on <code>reef-railiance</code> remain up until named as grants. This ADR is not a shutdown plan.</li><li>CoulombCore host inventory and Q7 / Goss reaction stay outside this decision.</li></ul> <ul><li>ADR-0006 still answers "may this binding run in production?" This ADR answers "who may reach the listener?" Do not merge the axes.</li><li>The three readiness enums stay distinct on purpose.</li><li>Family schemas grow an additive <code>exposure</code> field. Rapp <code>data_classification: public</code> is a different field and must not be reused as the posture name.</li><li>Implementation stays in the owning repos. This ADR does not install NetworkPolicy, UFW, Ingress, or tunnels.</li><li>Existing public surfaces on <code>reef-railiance</code> remain up until named as grants. This ADR is not a shutdown plan.</li><li>CoulombCore host inventory and Q7 / Goss reaction stay outside this decision.</li></ul>
</section><footer><span>RMASTER-ADR-0008 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0008-private-by-default-exposure.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0008 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0008-private-by-default-exposure.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="7e1fc5aedd7294192d8702a22b9f205e5bae20793836fdc48c0c071d10d7ab9d"> <meta name="policy-source-digest" content="7e1fc5aedd7294192d8702a22b9f205e5bae20793836fdc48c0c071d10d7ab9d">
<title>Wave 1 rail-kubernetes Boundary</title> <title>Wave 1 rail-kubernetes Boundary</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0002</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>Wave 1 rail-kubernetes Boundary</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0002</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>Wave 1 rail-kubernetes Boundary</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Railiance wants <code>rail-*</code> repos to represent workload execution contracts rather than abstract naming ideas.</p> <p>Railiance wants <code>rail-*</code> repos to represent workload execution contracts rather than abstract naming ideas.</p>
<p>Today, the concrete Kubernetes workload contract already exists, but it is embedded in <code>railiance-cluster</code>. That repo currently owns both:</p> <p>Today, the concrete Kubernetes workload contract already exists, but it is embedded in <code>railiance-cluster</code>. That repo currently owns both:</p>
@ -215,4 +215,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
<section id="notes"><h2>Notes</h2> <section id="notes"><h2>Notes</h2>
<p>This ADR does not require all current files to move immediately.</p> <p>This ADR does not require all current files to move immediately.</p>
<p>It requires the ownership line to be explicit now, so practical repo separation can proceed without ambiguity.</p> <p>It requires the ownership line to be explicit now, so practical repo separation can proceed without ambiguity.</p>
</section><footer><span>RMASTER-ADR-0002 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0002 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="263431f88ba04d6ab9ab3b6c0d6a2bb08634bfe83dc0719350f0855d399c18b2"> <meta name="policy-source-digest" content="263431f88ba04d6ab9ab3b6c0d6a2bb08634bfe83dc0719350f0855d399c18b2">
<title>Rapp Declaration Contract</title> <title>Rapp Declaration Contract</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0007</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-13</span><span>generated from canonical source — do not edit</span></div><h1>Rapp Declaration Contract</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0007-rapp-declaration-contract.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-02-13</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-08-13 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0007</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-13</span><span>generated from canonical source — do not edit</span></div><h1>Rapp Declaration Contract</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0007-rapp-declaration-contract.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-02-13</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-08-13 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p><code>RMASTER-WP-0017</code> through <code>RMASTER-WP-0019</code> established the four-axis model and materialized the first family repos. The model held up. Its enforcement did not.</p> <p><code>RMASTER-WP-0017</code> through <code>RMASTER-WP-0019</code> established the four-axis model and materialized the first family repos. The model held up. Its enforcement did not.</p>
<p>A 2026-08-11 survey by <code>railiance-platform</code> found that the three live <code>rapp.yaml</code> files were mutually unreadable: rollout, smoke, and rollback contracts used different shapes; metadata that both rails carry consistently appeared in only one rapp; <code>reef-railiance</code> <code>bound_rapps</code> listed <code>rapp-qonto</code> only, while <code>rapp-openbao</code> and <code>rapp-postgres</code> were already live on the same reef. <code>docs/repo-family-bootstrap-contract.md</code> named fields in prose and could not catch any of this.</p> <p>A 2026-08-11 survey by <code>railiance-platform</code> found that the three live <code>rapp.yaml</code> files were mutually unreadable: rollout, smoke, and rollback contracts used different shapes; metadata that both rails carry consistently appeared in only one rapp; <code>reef-railiance</code> <code>bound_rapps</code> listed <code>rapp-qonto</code> only, while <code>rapp-openbao</code> and <code>rapp-postgres</code> were already live on the same reef. <code>docs/repo-family-bootstrap-contract.md</code> named fields in prose and could not catch any of this.</p>
@ -207,4 +207,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="consequences"><h2>Consequences</h2> <section id="consequences"><h2>Consequences</h2>
<ul><li>Drift across family declarations fails in <code>tools/validate-family-declarations.py</code> instead of accumulating in prose.</li><li><code>railiance-platform</code> <code>RAILIANCE-WP-0015-T02</code> can converge <code>rapp-openbao</code> and <code>rapp-postgres</code> onto one shape. Migration belongs to the owning repos; this ADR does not move any declaration.</li><li><code>reef-railiance</code> must stop treating <code>bound_rapps: [rapp-qonto]</code> as source of truth. The list is already stale.</li><li>Three further <code>rapp-*</code> repos (<code>rapp-secrets-engine</code>, <code>rapp-tenant-engine</code>, <code>rapp-user-engine</code>) carry the family prefix and no declaration. They are visible to the validator as undeclared and must be declared, renamed, or retired by their owners.</li><li>Calling the validator from <code>fix-consistency</code> still waits on <code>the-custodian</code> admitting the family prefixes into the classification standard. That sequencing is not this repo's.</li></ul> <ul><li>Drift across family declarations fails in <code>tools/validate-family-declarations.py</code> instead of accumulating in prose.</li><li><code>railiance-platform</code> <code>RAILIANCE-WP-0015-T02</code> can converge <code>rapp-openbao</code> and <code>rapp-postgres</code> onto one shape. Migration belongs to the owning repos; this ADR does not move any declaration.</li><li><code>reef-railiance</code> must stop treating <code>bound_rapps: [rapp-qonto]</code> as source of truth. The list is already stale.</li><li>Three further <code>rapp-*</code> repos (<code>rapp-secrets-engine</code>, <code>rapp-tenant-engine</code>, <code>rapp-user-engine</code>) carry the family prefix and no declaration. They are visible to the validator as undeclared and must be declared, renamed, or retired by their owners.</li><li>Calling the validator from <code>fix-consistency</code> still waits on <code>the-custodian</code> admitting the family prefixes into the classification standard. That sequencing is not this repo's.</li></ul>
</section><footer><span>RMASTER-ADR-0007 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0007-rapp-declaration-contract.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0007 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0007-rapp-declaration-contract.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="28135e94758b6935518d2e83458c1e607deeabb341879b605eef6529b3168cbc"> <meta name="policy-source-digest" content="28135e94758b6935518d2e83458c1e607deeabb341879b605eef6529b3168cbc">
<title>First-Wave rapp Selection</title> <title>First-Wave rapp Selection</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0003</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>First-Wave rapp Selection</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0003-rapp-first-wave-selection.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0003</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>First-Wave rapp Selection</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0003-rapp-first-wave-selection.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Railiance wants <code>rapp-*</code> repos to represent managed workload packages rather than new ownership layers.</p> <p>Railiance wants <code>rapp-*</code> repos to represent managed workload packages rather than new ownership layers.</p>
<p>The current workload surfaces already suggest several candidates:</p> <p>The current workload surfaces already suggest several candidates:</p>
@ -213,4 +213,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="notes"><h2>Notes</h2> <section id="notes"><h2>Notes</h2>
<p>This ADR chooses sequence, not a mandatory destination for every workload in the ecosystem.</p> <p>This ADR chooses sequence, not a mandatory destination for every workload in the ecosystem.</p>
</section><footer><span>RMASTER-ADR-0003 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0003-rapp-first-wave-selection.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0003 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0003-rapp-first-wave-selection.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="d9fbd9d21d86e461334abc24060c39127f2158ba25317b3d3dc326c4f7eaf08c"> <meta name="policy-source-digest" content="d9fbd9d21d86e461334abc24060c39127f2158ba25317b3d3dc326c4f7eaf08c">
<title>Reef Production Admission</title> <title>Reef Production Admission</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0006</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-15</span><span>generated from canonical source — do not edit</span></div><h1>Reef Production Admission</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0006-reef-production-admission.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-02-15</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-07-26 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0006</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-08-15</span><span>generated from canonical source — do not edit</span></div><h1>Reef Production Admission</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0006-reef-production-admission.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-02-15</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li></ol></nav><main><p>Date: 2026-07-26 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Fabric topology can say that a reef hosts a rail or binds a workload, but that does not demonstrate capacity, isolation, recoverability, or approval for a critical internet-facing service.</p> <p>Fabric topology can say that a reef hosts a rail or binds a workload, but that does not demonstrate capacity, isolation, recoverability, or approval for a critical internet-facing service.</p>
</section> </section>
@ -203,4 +203,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="consequences"><h2>Consequences</h2> <section id="consequences"><h2>Consequences</h2>
<ul><li><code>hosts_rail</code> and <code>binds_rapp</code> no longer imply deployability.</li><li><code>reef-railiance</code> may host Knative in wave 2, but Qonto cannot be called production-approved solely from that declaration.</li><li>Repeated evidence collection should become functional automation.</li><li><code>production-approved</code> is not permission to publish a listener. See ADR-0008.</li></ul> <ul><li><code>hosts_rail</code> and <code>binds_rapp</code> no longer imply deployability.</li><li><code>reef-railiance</code> may host Knative in wave 2, but Qonto cannot be called production-approved solely from that declaration.</li><li>Repeated evidence collection should become functional automation.</li><li><code>production-approved</code> is not permission to publish a listener. See ADR-0008.</li></ul>
</section><footer><span>RMASTER-ADR-0006 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0006-reef-production-admission.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0006 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0006-reef-production-admission.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="debbc13b4018f20db0997516b99afc1cc21084d7"> <meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="b9c993ded8d79d6f871dba9cf08a320b2d619609a448ad3d02b632f5b6f76497"> <meta name="policy-source-digest" content="b9c993ded8d79d6f871dba9cf08a320b2d619609a448ad3d02b632f5b6f76497">
<title>Repository Prefix Architecture</title> <title>Repository Prefix Architecture</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0001</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>Repository Prefix Architecture</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0001-repository-prefix-architecture.md · debbc13b4018f20db0997516b99afc1cc21084d7</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#meaning-of-each-family"><span class="n">·</span>Meaning Of Each Family</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#current-interpretation-for-existing-repos"><span class="n">·</span>Current Interpretation For Existing Repos</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p> <div class="wrap"><header><div class="eyebrow"><span>RMASTER-ADR-0001</span> <span class="stat">accepted · accepted-1</span> <span>railiance-master</span> <span>reviewed 2026-07-25</span><span>generated from canonical source — do not edit</span></div><h1>Repository Prefix Architecture</h1><p class="sub">Source: <code>railiance-master · docs/adr/ADR-0001-repository-prefix-architecture.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-01-25</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#context"><span class="n">·</span>Context</a></li><li><a href="#decision"><span class="n">·</span>Decision</a></li><li><a href="#meaning-of-each-family"><span class="n">·</span>Meaning Of Each Family</a></li><li><a href="#consequences"><span class="n">·</span>Consequences</a></li><li><a href="#current-interpretation-for-existing-repos"><span class="n">·</span>Current Interpretation For Existing Repos</a></li><li><a href="#notes"><span class="n">·</span>Notes</a></li></ol></nav><main><p>Date: 2026-07-25 Status: Accepted</p>
<section id="context"><h2>Context</h2> <section id="context"><h2>Context</h2>
<p>Railiance already has a meaningful set of ownership repos such as <code>railiance-infra</code>, <code>railiance-cluster</code>, <code>railiance-platform</code>, <code>railiance-enablement</code>, <code>railiance-apps</code>, <code>railiance-forge</code>, and <code>railiance-fabric</code>.</p> <p>Railiance already has a meaningful set of ownership repos such as <code>railiance-infra</code>, <code>railiance-cluster</code>, <code>railiance-platform</code>, <code>railiance-enablement</code>, <code>railiance-apps</code>, <code>railiance-forge</code>, and <code>railiance-fabric</code>.</p>
<p>That structure is useful, but it does not by itself capture all of the dimensions Railiance now needs.</p> <p>That structure is useful, but it does not by itself capture all of the dimensions Railiance now needs.</p>
@ -232,4 +232,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="notes"><h2>Notes</h2> <section id="notes"><h2>Notes</h2>
<p>This ADR defines the repository taxonomy. It does not yet mandate a full migration or rename of existing repos. Migration should happen when it produces clearer ownership and lower ambiguity, not merely for naming purity.</p> <p>This ADR defines the repository taxonomy. It does not yet mandate a full migration or rename of existing repos. Migration should happen when it produces clearer ownership and lower ambiguity, not merely for naming purity.</p>
</section><footer><span>RMASTER-ADR-0001 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0001-repository-prefix-architecture.md · debbc13b4018f20db0997516b99afc1cc21084d7</span></footer></main></div></div></html> </section><footer><span>RMASTER-ADR-0001 · accepted-1 · accepted</span><span>railiance-master · docs/adr/ADR-0001-repository-prefix-architecture.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -0,0 +1,244 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="ba5d8642e91a31055eafdaef6993d779f6af7e06">
<meta name="policy-source-digest" content="dd42250edcc444fa9a5007c3f9d561984840af2b19a07cf2916cbcc8434df0f7">
<title>NetKingdom architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>net-kingdom-architecture</span> <span class="stat">proposed · draft-1</span> <span>net-kingdom</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>NetKingdom architecture</h1><p class="sub">Source: <code>net-kingdom · docs/architecture/net-kingdom_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for NetKingdom: the estate's identity and tenancy security core. Chapter 9 lists governing ADRs and standards; it does not paste them.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>NetKingdom is the open security core for DevSecOps on Kubernetes. It owns identity, tenancy posture, and the contracts that flex-auth, key-cape, tenant-engine, and railiance workloads implement.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>One IAM profile, versioned, owned here.</li><li>Tenancy described as graduated axes, not a single on/off switch.</li><li>Workload packaging and credential vending have explicit boundaries.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Provider-neutral identity contract.</li><li>Recursive multi-tenant authorization that implementers can declare.</li><li>Honest about what is not there yet (Tenancy Posture).</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>net-kingdom</td><td>Canon owner for identity and tenancy.</td></tr><tr><td>flex-auth / key-cape / tenant-engine</td><td>Implementers of the contracts.</td></tr><tr><td>railiance-master</td><td>Workload packaging on the rail.</td></tr><tr><td>the-custodian</td><td>Federation; does not redefine these concepts.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> IAM profile, tenancy posture, tenant/user-engine boundaries, credential management, playbook capability contract, NetKingdom ADRs. <strong>Out:</strong> publication (policy-nexus), rail runtime (railiance), estate work-factory (the-custodian).</p>
<h3>3.1 Business Context</h3>
<p>Security here is dynamic and adversarial. The system exists so implementers share one contract instead of copying a neighbour.</p>
<h3>3.2 Technical Context</h3>
<p>Consumers: flex-auth, key-cape, tenant-engine, audit-core, rApps. Published today: Tenancy Posture <code>/standards/tenancy-posture/v0.1/</code>.</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub — recursive multi-tenant identity (ADR-0006) and the IAM profile ownership rule (ADR-0011) are the spine.</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<div class="scroll"><table><thead><tr><th>Source</th><th>Status</th><th>Notes</th></tr></thead><tbody><tr><td><code>canon/standards/tenancy-posture_v0.1.md</code></td><td>proposed</td><td>Published. First publication of this site.</td></tr><tr><td><code>canon/standards/iam-profile_v0.3.md</code></td><td>accepted</td><td>Current profile. Needs a unique publication id (v0.2 still shares <code>netkingdom-iam-profile</code>).</td></tr><tr><td><code>canon/standards/iam-profile_v0.2.md</code></td><td>should be superseded</td><td>v0.3 supersedes it; front-matter still <code>accepted</code>.</td></tr><tr><td><code>docs/adr/ADR-0006</code><code>ADR-0015</code></td><td>see files</td><td>Identity, orchestration, IAM ownership, tenant roles, packaging. Publish after <code>NK-ADR-*</code> prefix and review metadata.</td></tr></tbody></table></div>
<p>Custodian ADR-008 is superseded by Tenancy Posture and is not current.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub. Residual: IAM Profile id collision (WP-0003 packet).</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>IAM Profile</td><td>Provider-neutral OIDC contract owned here.</td></tr><tr><td>Tenancy Posture</td><td>Graduated axes for describing multi-tenancy.</td></tr><tr><td>Tenant-engine</td><td>Lifecycle and capability roles for tenants.</td></tr></tbody></table></div>
</section><footer><span>net-kingdom-architecture · draft-1 · proposed</span><span>net-kingdom · docs/architecture/net-kingdom_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</span></footer></main></div></div></html>

View file

@ -0,0 +1,244 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="ba5d8642e91a31055eafdaef6993d779f6af7e06">
<meta name="policy-source-digest" content="dd42250edcc444fa9a5007c3f9d561984840af2b19a07cf2916cbcc8434df0f7">
<title>NetKingdom architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>net-kingdom-architecture</span> <span class="stat">proposed · draft-1</span> <span>net-kingdom</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>NetKingdom architecture</h1><p class="sub">Source: <code>net-kingdom · docs/architecture/net-kingdom_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for NetKingdom: the estate's identity and tenancy security core. Chapter 9 lists governing ADRs and standards; it does not paste them.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>NetKingdom is the open security core for DevSecOps on Kubernetes. It owns identity, tenancy posture, and the contracts that flex-auth, key-cape, tenant-engine, and railiance workloads implement.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>One IAM profile, versioned, owned here.</li><li>Tenancy described as graduated axes, not a single on/off switch.</li><li>Workload packaging and credential vending have explicit boundaries.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Provider-neutral identity contract.</li><li>Recursive multi-tenant authorization that implementers can declare.</li><li>Honest about what is not there yet (Tenancy Posture).</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>net-kingdom</td><td>Canon owner for identity and tenancy.</td></tr><tr><td>flex-auth / key-cape / tenant-engine</td><td>Implementers of the contracts.</td></tr><tr><td>railiance-master</td><td>Workload packaging on the rail.</td></tr><tr><td>the-custodian</td><td>Federation; does not redefine these concepts.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> IAM profile, tenancy posture, tenant/user-engine boundaries, credential management, playbook capability contract, NetKingdom ADRs. <strong>Out:</strong> publication (policy-nexus), rail runtime (railiance), estate work-factory (the-custodian).</p>
<h3>3.1 Business Context</h3>
<p>Security here is dynamic and adversarial. The system exists so implementers share one contract instead of copying a neighbour.</p>
<h3>3.2 Technical Context</h3>
<p>Consumers: flex-auth, key-cape, tenant-engine, audit-core, rApps. Published today: Tenancy Posture <code>/standards/tenancy-posture/v0.1/</code>.</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub — recursive multi-tenant identity (ADR-0006) and the IAM profile ownership rule (ADR-0011) are the spine.</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<div class="scroll"><table><thead><tr><th>Source</th><th>Status</th><th>Notes</th></tr></thead><tbody><tr><td><code>canon/standards/tenancy-posture_v0.1.md</code></td><td>proposed</td><td>Published. First publication of this site.</td></tr><tr><td><code>canon/standards/iam-profile_v0.3.md</code></td><td>accepted</td><td>Current profile. Needs a unique publication id (v0.2 still shares <code>netkingdom-iam-profile</code>).</td></tr><tr><td><code>canon/standards/iam-profile_v0.2.md</code></td><td>should be superseded</td><td>v0.3 supersedes it; front-matter still <code>accepted</code>.</td></tr><tr><td><code>docs/adr/ADR-0006</code><code>ADR-0015</code></td><td>see files</td><td>Identity, orchestration, IAM ownership, tenant roles, packaging. Publish after <code>NK-ADR-*</code> prefix and review metadata.</td></tr></tbody></table></div>
<p>Custodian ADR-008 is superseded by Tenancy Posture and is not current.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub. Residual: IAM Profile id collision (WP-0003 packet).</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>IAM Profile</td><td>Provider-neutral OIDC contract owned here.</td></tr><tr><td>Tenancy Posture</td><td>Graduated axes for describing multi-tenancy.</td></tr><tr><td>Tenant-engine</td><td>Lifecycle and capability roles for tenants.</td></tr></tbody></table></div>
</section><footer><span>net-kingdom-architecture · draft-1 · proposed</span><span>net-kingdom · docs/architecture/net-kingdom_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</span></footer></main></div></div></html>

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0"> <meta name="policy-source-revision" content="b93928330ef7a76976fa62989bb54f47dbe04832">
<meta name="policy-source-digest" content="179cbb86bca95f71f46f51ca1971ff1c274eed7d900adf0672b537d4bcc5b480"> <meta name="policy-source-digest" content="179cbb86bca95f71f46f51ca1971ff1c274eed7d900adf0672b537d4bcc5b480">
<title>Policy Nexus architecture</title> <title>Policy Nexus architecture</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>policy-nexus-architecture</span> <span class="stat">proposed · draft-1</span> <span>the-custodian</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Policy Nexus architecture</h1><p class="sub">Source: <code>policy-nexus · docs/architecture/policy-nexus_v0.1.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2> <div class="wrap"><header><div class="eyebrow"><span>policy-nexus-architecture</span> <span class="stat">proposed · draft-1</span> <span>the-custodian</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Policy Nexus architecture</h1><p class="sub">Source: <code>policy-nexus · docs/architecture/policy-nexus_v0.1.md · b93928330ef7a76976fa62989bb54f47dbe04832</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>This document follows the <strong>arc42</strong> template for the publication surface at <code>policy.coulomb.social</code>. It is the first-wave architecture document this repository is allowed to author. Other first-wave systems are written in their owning repos.</p> <p>This document follows the <strong>arc42</strong> template for the publication surface at <code>policy.coulomb.social</code>. It is the first-wave architecture document this repository is allowed to author. Other first-wave systems are written in their owning repos.</p>
</section> </section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2> <section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
@ -245,4 +245,4 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
</section> </section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2> <section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Current address</td><td>The stable URL for the document as it now stands.</td></tr><tr><td>Revision address</td><td>Write-once URL for one source digest.</td></tr><tr><td>Publication entry</td><td>One object in <code>publication.json</code>. Discovery is not publication.</td></tr><tr><td>First-wave complete</td><td>Chapters 1, 3, 4, 5.1, 9 and 12 are real; others real or N/A.</td></tr></tbody></table></div> <div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Current address</td><td>The stable URL for the document as it now stands.</td></tr><tr><td>Revision address</td><td>Write-once URL for one source digest.</td></tr><tr><td>Publication entry</td><td>One object in <code>publication.json</code>. Discovery is not publication.</td></tr><tr><td>First-wave complete</td><td>Chapters 1, 3, 4, 5.1, 9 and 12 are real; others real or N/A.</td></tr></tbody></table></div>
</section><footer><span>policy-nexus-architecture · draft-1 · proposed</span><span>policy-nexus · docs/architecture/policy-nexus_v0.1.md · 9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0</span></footer></main></div></div></html> </section><footer><span>policy-nexus-architecture · draft-1 · proposed</span><span>policy-nexus · docs/architecture/policy-nexus_v0.1.md · b93928330ef7a76976fa62989bb54f47dbe04832</span></footer></main></div></div></html>

View file

@ -0,0 +1,245 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="1cc0af5cdb6cae771bc134722672385b8e71df1a778adc3358862a1d8f5d7217">
<title>Railiance architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>railiance-architecture</span> <span class="stat">proposed · draft-1</span> <span>railiance-master</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Railiance architecture</h1><p class="sub">Source: <code>railiance-master · docs/architecture/railiance_v0.1.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for the Railiance runtime substrate. Deeper chapters belong to follow-on work in this repo. Chapter 9 lists the ADRs this repo already publishes; it does not paste them.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>Railiance-master is the authoritative source for Railiance framework architecture: repo families, workload models, and substrate boundaries that implementation repos must not invent locally.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>Name the rails, reefs, and rApps and who owns each boundary.</li><li>Keep those decisions in <code>docs/adr/</code> with publication-grade metadata.</li><li>Consume platform packages; do not fork identity or tenancy.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Reviewable boundary decisions.</li><li>Private-by-default exposure until admission.</li><li>Derived rails compose; they do not fork policy.</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>railiance-master</td><td>Framework language and first-wave rApp set.</td></tr><tr><td>railiance-platform</td><td>S3, placement, substrate services.</td></tr><tr><td>railiance-apps</td><td>Production digest bindings.</td></tr><tr><td>NetKingdom</td><td>Identity and tenancy posture of workloads.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> rails, reefs, rApp packaging, admission, exposure defaults. <strong>Out:</strong> tenant identity semantics (NetKingdom), publication of policy (policy-nexus), OS baseline (railiance-hosts).</p>
<h3>3.1 Business Context</h3>
<p>Implementation repos solve immediate cluster problems. This system holds the shared meaning so those repos do not drift.</p>
<h3>3.2 Technical Context</h3>
<p>Neighbours: <code>railiance-platform</code>, <code>railiance-apps</code>, <code>rapp-*</code> packages, the reef (Traefik, cert-manager), Forgejo, NetKingdom, policy-nexus.</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub — repository-prefix architecture and rapp-first wave are already in the ADRs in §9.</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<p>Published on policy.coulomb.social from this repo:</p>
<div class="scroll"><table><thead><tr><th>Id</th><th>Status</th><th>Decision</th></tr></thead><tbody><tr><td><code>RMASTER-ADR-0001</code></td><td>accepted</td><td>Repository prefix architecture</td></tr><tr><td><code>RMASTER-ADR-0002</code></td><td>accepted</td><td>Wave 1 rail-kubernetes boundary</td></tr><tr><td><code>RMASTER-ADR-0003</code></td><td>accepted</td><td>First-wave rapp selection</td></tr><tr><td><code>RMASTER-ADR-0004</code></td><td>accepted</td><td>First-wave reef rollout</td></tr><tr><td><code>RMASTER-ADR-0005</code></td><td>accepted</td><td>Derived rail composition</td></tr><tr><td><code>RMASTER-ADR-0006</code></td><td>accepted</td><td>Reef production admission</td></tr><tr><td><code>RMASTER-ADR-0007</code></td><td>accepted</td><td>Rapp declaration contract</td></tr><tr><td><code>RMASTER-ADR-0008</code></td><td>accepted</td><td>Private-by-default exposure</td></tr></tbody></table></div>
<p>Unresolved: identical accepted ADR-003/004 copies in railiance-hosts and railiance-infra. Not listed as current here until those owners rule.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub.</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Rail</td><td>A composed runtime path.</td></tr><tr><td>Reef</td><td>The production admission environment.</td></tr><tr><td>rApp</td><td>A packaged workload bound by a declaration contract.</td></tr></tbody></table></div>
</section><footer><span>railiance-architecture · draft-1 · proposed</span><span>railiance-master · docs/architecture/railiance_v0.1.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -0,0 +1,245 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="883533ed8af1703cc9bb4a2b24137e325bbbda47">
<meta name="policy-source-digest" content="1cc0af5cdb6cae771bc134722672385b8e71df1a778adc3358862a1d8f5d7217">
<title>Railiance architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>railiance-architecture</span> <span class="stat">proposed · draft-1</span> <span>railiance-master</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>Railiance architecture</h1><p class="sub">Source: <code>railiance-master · docs/architecture/railiance_v0.1.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for the Railiance runtime substrate. Deeper chapters belong to follow-on work in this repo. Chapter 9 lists the ADRs this repo already publishes; it does not paste them.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>Railiance-master is the authoritative source for Railiance framework architecture: repo families, workload models, and substrate boundaries that implementation repos must not invent locally.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>Name the rails, reefs, and rApps and who owns each boundary.</li><li>Keep those decisions in <code>docs/adr/</code> with publication-grade metadata.</li><li>Consume platform packages; do not fork identity or tenancy.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Reviewable boundary decisions.</li><li>Private-by-default exposure until admission.</li><li>Derived rails compose; they do not fork policy.</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>railiance-master</td><td>Framework language and first-wave rApp set.</td></tr><tr><td>railiance-platform</td><td>S3, placement, substrate services.</td></tr><tr><td>railiance-apps</td><td>Production digest bindings.</td></tr><tr><td>NetKingdom</td><td>Identity and tenancy posture of workloads.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> rails, reefs, rApp packaging, admission, exposure defaults. <strong>Out:</strong> tenant identity semantics (NetKingdom), publication of policy (policy-nexus), OS baseline (railiance-hosts).</p>
<h3>3.1 Business Context</h3>
<p>Implementation repos solve immediate cluster problems. This system holds the shared meaning so those repos do not drift.</p>
<h3>3.2 Technical Context</h3>
<p>Neighbours: <code>railiance-platform</code>, <code>railiance-apps</code>, <code>rapp-*</code> packages, the reef (Traefik, cert-manager), Forgejo, NetKingdom, policy-nexus.</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub — repository-prefix architecture and rapp-first wave are already in the ADRs in §9.</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<p>Published on policy.coulomb.social from this repo:</p>
<div class="scroll"><table><thead><tr><th>Id</th><th>Status</th><th>Decision</th></tr></thead><tbody><tr><td><code>RMASTER-ADR-0001</code></td><td>accepted</td><td>Repository prefix architecture</td></tr><tr><td><code>RMASTER-ADR-0002</code></td><td>accepted</td><td>Wave 1 rail-kubernetes boundary</td></tr><tr><td><code>RMASTER-ADR-0003</code></td><td>accepted</td><td>First-wave rapp selection</td></tr><tr><td><code>RMASTER-ADR-0004</code></td><td>accepted</td><td>First-wave reef rollout</td></tr><tr><td><code>RMASTER-ADR-0005</code></td><td>accepted</td><td>Derived rail composition</td></tr><tr><td><code>RMASTER-ADR-0006</code></td><td>accepted</td><td>Reef production admission</td></tr><tr><td><code>RMASTER-ADR-0007</code></td><td>accepted</td><td>Rapp declaration contract</td></tr><tr><td><code>RMASTER-ADR-0008</code></td><td>accepted</td><td>Private-by-default exposure</td></tr></tbody></table></div>
<p>Unresolved: identical accepted ADR-003/004 copies in railiance-hosts and railiance-infra. Not listed as current here until those owners rule.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub.</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Rail</td><td>A composed runtime path.</td></tr><tr><td>Reef</td><td>The production admission environment.</td></tr><tr><td>rApp</td><td>A packaged workload bound by a declaration contract.</td></tr></tbody></table></div>
</section><footer><span>railiance-architecture · draft-1 · proposed</span><span>railiance-master · docs/architecture/railiance_v0.1.md · 883533ed8af1703cc9bb4a2b24137e325bbbda47</span></footer></main></div></div></html>

View file

@ -0,0 +1,246 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="db89e5463fe8bb8bf6811cf839548244eab28c4b">
<meta name="policy-source-digest" content="f65748fa3c861a6f399365ee5315af4e47ec91823837e3d7d89c17d4b385f2aa">
<title>State Hub architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>state-hub-architecture</span> <span class="stat">proposed · draft-1</span> <span>state-hub</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>State Hub architecture</h1><p class="sub">Source: <code>state-hub · docs/architecture/state-hub_v0.1.md · db89e5463fe8bb8bf6811cf839548244eab28c4b</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for State Hub, the estate's live coordination read-model. This service is in active retirement planning; new permanent ownership should not land here. Chapter 9 points at the estate ADRs that still bind it.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>State Hub is a queryable, auditable memory of work: domains, repos, workplans, tasks, decisions, progress. Files remain the origin. The hub is derived state (custodian ADR-001, ADR-003).</p>
<p>It remains operational until retirement gates in <code>prj-state-hub-retirement</code> are met. Replacement ownership is moving toward <code>repo-manager</code> and <code>hub-core</code>.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>Rebuild coordination state from registered repository files.</li><li>One identifier registrar (ADR-007). This workstation is not it.</li><li>Preserve compatibility; do not take new permanent architectural ownership.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Rebuildability from git.</li><li>Hub never becomes the origin of work.</li><li>Extraction paths stay open.</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>state-hub</td><td>Live read-model during retirement.</td></tr><tr><td>the-custodian</td><td>Estate rules the hub must not invert.</td></tr><tr><td>repo-manager</td><td>Incoming consistency / repo representation.</td></tr><tr><td>product repos</td><td>Workplan files the hub indexes.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub — retirement program is the binding constraint.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> indexing workplans/tasks/decisions, consistency rebuild, query API and dashboard used today. <strong>Out:</strong> being the source of work items; new cross-domain capabilities; publication of policy (policy-nexus).</p>
<h3>3.1 Business Context</h3>
<p>Files are excellent for canon and provenance. The estate still needs a live query surface while retirement proceeds.</p>
<h3>3.2 Technical Context</h3>
<p>Inputs: workplan markdown via <code>fix-consistency</code>. Outputs: HTTP/MCP APIs. Neighbours: every registered repo, activity-core (ops runs), policy-nexus (does not index the hub).</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub. The strategy is already in the estate ADRs: files first, materialized derived state, single registrar, local cache vs authority (ADR-010, proposed).</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<p>This repo has no <code>docs/adr/</code> corpus. Binding decisions live in the-custodian and are listed on the estate map:</p>
<div class="scroll"><table><thead><tr><th>Estate ADR</th><th>Status</th><th>Why it binds this system</th></tr></thead><tbody><tr><td>CUST-ADR-001 (workplans as repo artefacts)</td><td>accepted</td><td>Hub is a read model.</td></tr><tr><td>CUST-ADR-003 (materialized derived state)</td><td>accepted</td><td>How the cache invalidates.</td></tr><tr><td>CUST-ADR-007 (identity and registrar)</td><td>accepted</td><td>One writer of workplan UUIDs.</td></tr><tr><td>CUST-ADR-010 (hub authority / local cache)</td><td>proposed</td><td>Two kinds of hub data.</td></tr></tbody></table></div>
<p>Do not treat a State Hub <code>/decisions</code> row as the published ADR.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub. Residual: this workstation cannot mint registrar UUIDs.</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Read model</td><td>Derived index; never the origin.</td></tr><tr><td>Registrar</td><td>The single instance allowed to mint workplan UUIDs.</td></tr><tr><td>Retirement</td><td>Coordinated move of capabilities out of this repo.</td></tr></tbody></table></div>
</section><footer><span>state-hub-architecture · draft-1 · proposed</span><span>state-hub · docs/architecture/state-hub_v0.1.md · db89e5463fe8bb8bf6811cf839548244eab28c4b</span></footer></main></div></div></html>

View file

@ -0,0 +1,246 @@
<!doctype html>
<html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="db89e5463fe8bb8bf6811cf839548244eab28c4b">
<meta name="policy-source-digest" content="f65748fa3c861a6f399365ee5315af4e47ec91823837e3d7d89c17d4b385f2aa">
<title>State Hub architecture</title>
<style>
:root{
--paper:#EDEEF0; --surface:#F6F7F8; --surface-2:#E4E6E9;
--ink:#171D24; --ink-2:#4A5561; --ink-3:#737E8A;
--rule:#D3D7DC; --rule-strong:#B6BCC3;
--brass:#8A6A2E; --brass-soft:#EFE5CD; --brass-line:#C9AE74;
--clay:#8A3A2C; --clay-soft:#F2DFDA;
--l0:#DCE0E2; --l1:#B9C4C7; --l2:#8CA1A6; --l3:#567D84; --l4:#23555E;
--chip-fg:#F6F7F8;
--font-display:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
--font-body:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
--font-mono:ui-monospace,"SF Mono","Cascadia Code",Menlo,Consolas,monospace;
--measure:66ch;
}
@media (prefers-color-scheme:dark){
:root:not([data-theme="light"]){
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
}
:root[data-theme="dark"]{
--paper:#12161A; --surface:#191E24; --surface-2:#222831;
--ink:#E6E9EC; --ink-2:#A3ADB7; --ink-3:#78838E;
--rule:#2A3138; --rule-strong:#3B444D;
--brass:#C9A45C; --brass-soft:#33290F; --brass-line:#6B5426;
--clay:#D08A76; --clay-soft:#3A211B;
--l0:#262C32; --l1:#35424A; --l2:#4A626B; --l3:#6A939D; --l4:#97C4CD;
--chip-fg:#12161A;
}
*{box-sizing:border-box}
body{
margin:0; background:var(--paper); color:var(--ink);
font-family:var(--font-body); font-size:17px; line-height:1.62;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px 96px}
.layout{display:grid;grid-template-columns:180px minmax(0,1fr);gap:56px;align-items:start}
@media (max-width:960px){.layout{grid-template-columns:1fr;gap:0}.rail{display:none}}
/* ---------- rail ---------- */
.rail{position:sticky;top:28px;padding-top:8px;font-family:var(--font-display);font-size:12px;line-height:1.5}
.rail ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}
.rail a{color:var(--ink-3);text-decoration:none;display:flex;gap:9px}
.rail a:hover,.rail a:focus-visible{color:var(--brass)}
.rail .n{font-family:var(--font-mono);font-size:10px;color:var(--rule-strong);min-width:16px;padding-top:1px}
.rail .grp{margin-top:14px;font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--rule-strong)}
/* ---------- header ---------- */
header{padding:64px 0 40px;border-bottom:2px solid var(--ink);margin-bottom:44px}
.eyebrow{font-family:var(--font-mono);font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);display:flex;flex-wrap:wrap;gap:14px;margin-bottom:22px}
.eyebrow .stat{color:var(--clay)}
h1{font-family:var(--font-display);font-weight:800;letter-spacing:-.035em;line-height:.94;font-size:clamp(46px,9vw,92px);margin:0 0 6px;text-wrap:balance}
.sub{font-family:var(--font-display);font-weight:500;font-size:clamp(16px,2.4vw,21px);letter-spacing:-.01em;color:var(--ink-2);margin:0 0 30px;max-width:34ch;line-height:1.3}
.metagrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px 28px;border-top:1px solid var(--rule);padding-top:20px}
.metagrid dt{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);margin-bottom:5px}
.metagrid dd{margin:0;font-family:var(--font-display);font-size:13.5px;line-height:1.45;color:var(--ink)}
/* ---------- typography ---------- */
section{margin-bottom:60px;scroll-margin-top:24px}
h2{font-family:var(--font-display);font-weight:750;letter-spacing:-.022em;font-size:clamp(24px,3.4vw,31px);line-height:1.12;margin:0 0 18px;text-wrap:balance;display:flex;gap:14px;align-items:baseline}
h2 .sn{font-family:var(--font-mono);font-size:12px;font-weight:400;color:var(--brass);letter-spacing:.06em;flex:none;padding-top:2px}
h3{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-.008em;margin:34px 0 10px;color:var(--ink)}
p{margin:0 0 15px;max-width:var(--measure)}
ul,ol{max-width:var(--measure);margin:0 0 15px;padding-left:20px}
li{margin-bottom:7px}
strong{font-weight:600}
em{font-style:italic}
code{font-family:var(--font-mono);font-size:.855em;background:var(--surface-2);padding:1px 5px;border-radius:2px}
a{color:var(--brass)}
.lede{font-size:19px;line-height:1.55;color:var(--ink-2);max-width:60ch}
/* ---------- devices ---------- */
.callout{border-left:3px solid var(--brass);background:var(--brass-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.callout p:last-child{margin-bottom:0}
.callout .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
.rule-quote{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);padding:26px 0;margin:28px 0;max-width:var(--measure)}
.rule-quote p{font-family:var(--font-display);font-weight:600;font-size:19px;line-height:1.38;letter-spacing:-.014em;margin:0;text-wrap:balance}
.hard{border-left:3px solid var(--clay);background:var(--clay-soft);padding:18px 22px;margin:0 0 24px;max-width:var(--measure)}
.hard .lbl{font-family:var(--font-mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;color:var(--clay);display:block;margin-bottom:8px}
.hard p:last-child{margin-bottom:0}
.dec{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--brass);text-transform:uppercase}
.vec{font-family:var(--font-mono);font-size:.9em;font-weight:600;background:var(--surface-2);padding:2px 7px;border-radius:2px;white-space:nowrap;letter-spacing:.04em}
/* ---------- tables ---------- */
.scroll{overflow-x:auto;margin:0 0 24px;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;width:100%;min-width:520px;font-family:var(--font-display);font-size:13.5px;line-height:1.45}
th{text-align:left;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);font-weight:400;padding:0 16px 8px 0;border-bottom:1px solid var(--rule-strong);vertical-align:bottom}
td{padding:11px 16px 11px 0;border-bottom:1px solid var(--rule);vertical-align:top;color:var(--ink-2)}
td:first-child{color:var(--ink);font-weight:600}
tbody tr:last-child td{border-bottom:none}
.lvl{font-family:var(--font-mono);font-weight:600;font-size:12px;letter-spacing:.04em;color:var(--ink)}
/* ---------- ladders ---------- */
.breakout{margin:34px 0 40px}
.bhead{display:flex;justify-content:space-between;align-items:baseline;gap:20px;border-bottom:1px solid var(--rule-strong);padding-bottom:9px;margin-bottom:22px;flex-wrap:wrap}
.bhead h3{margin:0;font-size:13px;letter-spacing:.1em;text-transform:uppercase;font-family:var(--font-mono);font-weight:400;color:var(--ink-3)}
.bhead .note{font-family:var(--font-display);font-size:12.5px;color:var(--ink-3)}
.ladders{display:grid;gap:26px}
.ladder{display:grid;grid-template-columns:126px minmax(0,1fr);gap:18px;align-items:start}
@media (max-width:700px){.ladder{grid-template-columns:1fr;gap:10px}}
.ladder .pname{font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;padding-top:2px}
.ladder .pname span{display:block;font-family:var(--font-mono);font-size:10px;font-weight:400;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-top:3px}
.rungs{display:grid;gap:3px;grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:700px){.rungs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rung{padding:9px 10px 11px;background:var(--surface);border-top:4px solid var(--l0);min-width:0}
.rung.r1{border-top-color:var(--l1)} .rung.r2{border-top-color:var(--l2)}
.rung.r3{border-top-color:var(--l3)} .rung.r4{border-top-color:var(--l4)}
.rung .code{font-family:var(--font-mono);font-size:11px;font-weight:600;letter-spacing:.06em;color:var(--ink);display:block;margin-bottom:4px}
.rung .txt{font-family:var(--font-display);font-size:11.5px;line-height:1.34;color:var(--ink-2);display:block}
.rung.na{opacity:.42}
/* ---------- matrix ---------- */
.matrix-shell{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:stretch;margin-bottom:14px}
.ylab{writing-mode:vertical-rl;transform:rotate(180deg);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);text-align:center;padding-bottom:22px}
.mgrid{display:grid;grid-template-columns:34px repeat(5,minmax(0,1fr));gap:3px}
.mcell{background:var(--surface);min-height:60px;padding:6px;display:flex;flex-direction:column;justify-content:flex-end;gap:4px;min-width:0}
.mcell.tint1{background:color-mix(in srgb,var(--l1) 26%,var(--surface))}
.mcell.tint2{background:color-mix(in srgb,var(--l2) 26%,var(--surface))}
.mcell.tint3{background:color-mix(in srgb,var(--l3) 24%,var(--surface))}
.mcell.tint4{background:color-mix(in srgb,var(--l4) 22%,var(--surface))}
.mcell.void{background:repeating-linear-gradient(135deg,transparent,transparent 5px,var(--rule) 5px,var(--rule) 6px);opacity:.55}
.rlab,.clab{font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.05em;color:var(--ink-3);display:flex;align-items:center;justify-content:center}
.rlab{min-height:60px}
.clab{padding-top:7px;min-height:22px}
.pin{font-family:var(--font-mono);font-size:9.5px;font-weight:600;letter-spacing:.02em;background:var(--ink);color:var(--paper);padding:2px 5px;border-radius:2px;line-height:1.3;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pin.ghost{background:transparent;color:var(--ink-2);border:1px dashed var(--rule-strong)}
.mnote{display:flex;gap:22px;flex-wrap:wrap;font-family:var(--font-display);font-size:12px;color:var(--ink-3);padding-top:6px}
.mnote .k{display:flex;align-items:center;gap:7px}
.sw{width:13px;height:13px;flex:none;background:var(--ink)}
.sw.g{background:transparent;border:1px dashed var(--rule-strong)}
.sw.v{background:repeating-linear-gradient(135deg,transparent,transparent 4px,var(--rule) 4px,var(--rule) 5px);border:1px solid var(--rule)}
@media (max-width:640px){
.mgrid{grid-template-columns:28px repeat(5,minmax(0,1fr))}
.mcell{min-height:52px;padding:4px}
.pin{font-size:8px;padding:1px 3px}
.rlab{min-height:52px}
}
/* ---------- methodology ---------- */
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule)}
.verb{background:var(--surface);padding:18px 18px 20px}
.verb h4{font-family:var(--font-display);font-weight:750;font-size:15px;margin:0 0 7px;letter-spacing:-.01em}
.verb p{font-family:var(--font-display);font-size:12.5px;line-height:1.46;color:var(--ink-2);margin:0;max-width:none}
.verb .step{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.13em;color:var(--brass);display:block;margin-bottom:9px}
/* ---------- questions ---------- */
.qs{display:flex;flex-direction:column;gap:0;border-top:1px solid var(--rule-strong)}
.q{display:grid;grid-template-columns:34px minmax(0,1fr) 170px;gap:18px;padding:16px 0;border-bottom:1px solid var(--rule);align-items:start}
@media (max-width:760px){.q{grid-template-columns:28px minmax(0,1fr);gap:12px}.q .owner{grid-column:2}}
.q .qn{font-family:var(--font-mono);font-size:11px;color:var(--brass);padding-top:3px}
.q .qt{font-family:var(--font-display);font-size:14px;line-height:1.48;color:var(--ink-2)}
.q .qt b{color:var(--ink);font-weight:700;display:block;margin-bottom:2px;font-size:14.5px}
.owner{font-family:var(--font-mono);font-size:10px;letter-spacing:.05em;color:var(--ink-3);padding-top:4px}
.owner .tag{display:inline-block;border:1px solid var(--rule-strong);padding:2px 7px;border-radius:2px}
.owner .tag.need{border-color:var(--clay);color:var(--clay)}
/* ---------- misc ---------- */
.numbers{font-family:var(--font-mono);font-size:12.5px;line-height:1.85;background:var(--surface);border-left:3px solid var(--l3);padding:16px 20px;margin:0 0 22px;overflow-x:auto;max-width:var(--measure)}
.numbers .v{color:var(--ink);font-weight:600}
.numbers .k{color:var(--ink-3)}
pre{font-family:var(--font-mono);font-size:12.5px;line-height:1.68;background:var(--surface);border-left:3px solid var(--rule-strong);padding:16px 20px;overflow-x:auto;margin:0 0 22px;max-width:var(--measure);color:var(--ink-2)}
.alt{border-bottom:1px solid var(--rule);padding:14px 0;max-width:var(--measure)}
.alt:last-of-type{border-bottom:none}
.alt b{font-family:var(--font-display);font-size:14px;display:block;margin-bottom:3px}
.alt p{font-size:14.5px;margin:0;color:var(--ink-2)}
.alt .verdict{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--clay)}
footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--ink-3);display:flex;justify-content:space-between;gap:20px;flex-wrap:wrap}
.tm td,.tm th{text-align:center}
.tm td:first-child,.tm th:first-child{text-align:left}
.yes{color:var(--l4);font-weight:700}
.no{color:var(--clay);font-weight:700}
.kind{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;padding:2px 6px;border-radius:2px;white-space:nowrap;border:1px solid var(--rule-strong);color:var(--ink-3)}
.kind.adv{border-color:var(--clay);color:var(--clay)}
.routes{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:2px;background:var(--rule);border:1px solid var(--rule);margin:0 0 22px}
.route{background:var(--surface);padding:16px 18px}
.route h4{font-family:var(--font-display);font-weight:750;font-size:14px;margin:0 0 6px}
.route p{font-family:var(--font-display);font-size:12.5px;line-height:1.45;color:var(--ink-2);margin:0;max-width:none}
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style>
<div class="wrap"><header><div class="eyebrow"><span>state-hub-architecture</span> <span class="stat">proposed · draft-1</span> <span>state-hub</span> <span>reviewed 2026-08-18</span><span>generated from canonical source — do not edit</span></div><h1>State Hub architecture</h1><p class="sub">Source: <code>state-hub · docs/architecture/state-hub_v0.1.md · db89e5463fe8bb8bf6811cf839548244eab28c4b</code></p><p class="sub">Review due: 2027-02-18</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#about-this-document"><span class="n">·</span>About this document</a></li><li><a href="#s1"><span class="n">1</span>Introduction and Goals</a></li><li><a href="#s2"><span class="n">2</span>Architecture Constraints</a></li><li><a href="#s3"><span class="n">3</span>System Scope and Context</a></li><li><a href="#s4"><span class="n">4</span>Solution Strategy</a></li><li><a href="#s5"><span class="n">5</span>Building Block View</a></li><li><a href="#s6"><span class="n">6</span>Runtime View</a></li><li><a href="#s7"><span class="n">7</span>Deployment View</a></li><li><a href="#s8"><span class="n">8</span>Cross-Cutting Concepts</a></li><li><a href="#s9"><span class="n">9</span>Architecture Decisions</a></li><li><a href="#s10"><span class="n">10</span>Quality Requirements</a></li><li><a href="#s11"><span class="n">11</span>Risks and Technical Debt</a></li><li><a href="#s12"><span class="n">12</span>Glossary</a></li></ol></nav><main><section id="about-this-document"><h2>About this document</h2>
<p>First-wave arc42 for State Hub, the estate's live coordination read-model. This service is in active retirement planning; new permanent ownership should not land here. Chapter 9 points at the estate ADRs that still bind it.</p>
</section>
<section id="s1"><h2><span class="sn">01</span>Introduction and Goals</h2>
<p>State Hub is a queryable, auditable memory of work: domains, repos, workplans, tasks, decisions, progress. Files remain the origin. The hub is derived state (custodian ADR-001, ADR-003).</p>
<p>It remains operational until retirement gates in <code>prj-state-hub-retirement</code> are met. Replacement ownership is moving toward <code>repo-manager</code> and <code>hub-core</code>.</p>
<h3>1.1 Requirements Overview</h3>
<ul><li>Rebuild coordination state from registered repository files.</li><li>One identifier registrar (ADR-007). This workstation is not it.</li><li>Preserve compatibility; do not take new permanent architectural ownership.</li></ul>
<h3>1.2 Quality Goals</h3>
<ol><li>Rebuildability from git.</li><li>Hub never becomes the origin of work.</li><li>Extraction paths stay open.</li></ol>
<h3>1.3 Stakeholders</h3>
<div class="scroll"><table><thead><tr><th>Role</th><th>Concern</th></tr></thead><tbody><tr><td>state-hub</td><td>Live read-model during retirement.</td></tr><tr><td>the-custodian</td><td>Estate rules the hub must not invert.</td></tr><tr><td>repo-manager</td><td>Incoming consistency / repo representation.</td></tr><tr><td>product repos</td><td>Workplan files the hub indexes.</td></tr></tbody></table></div>
</section>
<section id="s2"><h2><span class="sn">02</span>Architecture Constraints</h2>
<p>N/A for this stub — retirement program is the binding constraint.</p>
</section>
<section id="s3"><h2><span class="sn">03</span>System Scope and Context</h2>
<p><strong>In:</strong> indexing workplans/tasks/decisions, consistency rebuild, query API and dashboard used today. <strong>Out:</strong> being the source of work items; new cross-domain capabilities; publication of policy (policy-nexus).</p>
<h3>3.1 Business Context</h3>
<p>Files are excellent for canon and provenance. The estate still needs a live query surface while retirement proceeds.</p>
<h3>3.2 Technical Context</h3>
<p>Inputs: workplan markdown via <code>fix-consistency</code>. Outputs: HTTP/MCP APIs. Neighbours: every registered repo, activity-core (ops runs), policy-nexus (does not index the hub).</p>
</section>
<section id="s4"><h2><span class="sn">04</span>Solution Strategy</h2>
<p>N/A for this stub. The strategy is already in the estate ADRs: files first, materialized derived state, single registrar, local cache vs authority (ADR-010, proposed).</p>
</section>
<section id="s5"><h2><span class="sn">05</span>Building Block View</h2>
<h3>5.1 Level 1 System/Top-Level</h3>
<p>N/A for this stub.</p>
</section>
<section id="s6"><h2><span class="sn">06</span>Runtime View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s7"><h2><span class="sn">07</span>Deployment View</h2>
<p>N/A for this stub.</p>
</section>
<section id="s8"><h2><span class="sn">08</span>Cross-Cutting Concepts</h2>
<p>N/A for this stub.</p>
</section>
<section id="s9"><h2><span class="sn">09</span>Architecture Decisions</h2>
<p>This repo has no <code>docs/adr/</code> corpus. Binding decisions live in the-custodian and are listed on the estate map:</p>
<div class="scroll"><table><thead><tr><th>Estate ADR</th><th>Status</th><th>Why it binds this system</th></tr></thead><tbody><tr><td>CUST-ADR-001 (workplans as repo artefacts)</td><td>accepted</td><td>Hub is a read model.</td></tr><tr><td>CUST-ADR-003 (materialized derived state)</td><td>accepted</td><td>How the cache invalidates.</td></tr><tr><td>CUST-ADR-007 (identity and registrar)</td><td>accepted</td><td>One writer of workplan UUIDs.</td></tr><tr><td>CUST-ADR-010 (hub authority / local cache)</td><td>proposed</td><td>Two kinds of hub data.</td></tr></tbody></table></div>
<p>Do not treat a State Hub <code>/decisions</code> row as the published ADR.</p>
</section>
<section id="s10"><h2><span class="sn">10</span>Quality Requirements</h2>
<p>N/A for this stub.</p>
</section>
<section id="s11"><h2><span class="sn">11</span>Risks and Technical Debt</h2>
<p>N/A for this stub. Residual: this workstation cannot mint registrar UUIDs.</p>
</section>
<section id="s12"><h2><span class="sn">12</span>Glossary</h2>
<div class="scroll"><table><thead><tr><th>Term</th><th>Meaning</th></tr></thead><tbody><tr><td>Read model</td><td>Derived index; never the origin.</td></tr><tr><td>Registrar</td><td>The single instance allowed to mint workplan UUIDs.</td></tr><tr><td>Retirement</td><td>Coordinated move of capabilities out of this repo.</td></tr></tbody></table></div>
</section><footer><span>state-hub-architecture · draft-1 · proposed</span><span>state-hub · docs/architecture/state-hub_v0.1.md · db89e5463fe8bb8bf6811cf839548244eab28c4b</span></footer></main></div></div></html>

View file

@ -183,4 +183,4 @@ footer{border-top:2px solid var(--ink);margin-top:20px;padding-top:22px;font-fam
.route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px} .route .tag{font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--brass);display:block;margin-bottom:8px}
a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px} a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-offset:3px}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style><div class="wrap"><header><div class="eyebrow"><span>policy surface</span><span>generated from canonical sources — do not edit</span></div><h1>Coulomb Policy Nexus</h1><p class="sub">Canon and architecture decisions at stable addresses, with visible currency.</p></header><main><table><thead><tr><th>Document</th><th>Status</th><th>Lifecycle</th><th>Revision</th><th>Owner</th><th>Reviewed</th><th>Review due</th><th>Currency</th></tr></thead><tbody><tr><td><a href="/standards/tenancy-posture/v0.1/index.html">NetKingdom Tenancy Posture v0.1</a></td><td>proposed</td><td>active</td><td>draft-8</td><td>net-kingdom</td><td>2026-08-17</td><td>2027-02-17</td><td>current</td></tr><tr><td><a href="/architecture/coulomb-estate/v0.1/index.html">Coulomb estate architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/architecture/policy-nexus/v0.1/index.html">Policy Nexus architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/adr/addressing-and-permanence/v1/index.html">Policy addressing and permanence</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/adr/railiance-repository-prefix/v1/index.html">Repository Prefix Architecture</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-rail-kubernetes-wave-1-boundary/v1/index.html">Wave 1 rail-kubernetes Boundary</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-rapp-first-wave-selection/v1/index.html">First-Wave rapp Selection</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-first-wave-reef-rollout/v1/index.html">First-Wave reef Rollout</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-26</td><td>2027-01-26</td><td>current</td></tr><tr><td><a href="/adr/railiance-derived-rail-composition/v1/index.html">Derived Rail Composition</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-26</td><td>2027-01-26</td><td>current</td></tr><tr><td><a href="/adr/railiance-reef-production-admission/v1/index.html">Reef Production Admission</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-15</td><td>2027-02-15</td><td>current</td></tr><tr><td><a href="/adr/railiance-rapp-declaration-contract/v1/index.html">Rapp Declaration Contract</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-13</td><td>2027-02-13</td><td>current</td></tr><tr><td><a href="/adr/railiance-private-by-default-exposure/v1/index.html">Private-by-default Exposure</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-15</td><td>2027-02-15</td><td>current</td></tr></tbody></table></main></div></html> </style><div class="wrap"><header><div class="eyebrow"><span>policy surface</span><span>generated from canonical sources — do not edit</span></div><h1>Coulomb Policy Nexus</h1><p class="sub">Canon and architecture decisions at stable addresses, with visible currency.</p></header><main><table><thead><tr><th>Document</th><th>Status</th><th>Lifecycle</th><th>Revision</th><th>Owner</th><th>Reviewed</th><th>Review due</th><th>Currency</th></tr></thead><tbody><tr><td><a href="/standards/tenancy-posture/v0.1/index.html">NetKingdom Tenancy Posture v0.1</a></td><td>proposed</td><td>active</td><td>draft-8</td><td>net-kingdom</td><td>2026-08-17</td><td>2027-02-17</td><td>current</td></tr><tr><td><a href="/architecture/coulomb-estate/v0.1/index.html">Coulomb estate architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/architecture/railiance/v0.1/index.html">Railiance architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>railiance-master</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/architecture/net-kingdom/v0.1/index.html">NetKingdom architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>net-kingdom</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/architecture/state-hub/v0.1/index.html">State Hub architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>state-hub</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/architecture/policy-nexus/v0.1/index.html">Policy Nexus architecture</a></td><td>proposed</td><td>active</td><td>draft-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/adr/addressing-and-permanence/v1/index.html">Policy addressing and permanence</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>the-custodian</td><td>2026-08-18</td><td>2027-02-18</td><td>current</td></tr><tr><td><a href="/adr/railiance-repository-prefix/v1/index.html">Repository Prefix Architecture</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-rail-kubernetes-wave-1-boundary/v1/index.html">Wave 1 rail-kubernetes Boundary</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-rapp-first-wave-selection/v1/index.html">First-Wave rapp Selection</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-25</td><td>2027-01-25</td><td>current</td></tr><tr><td><a href="/adr/railiance-first-wave-reef-rollout/v1/index.html">First-Wave reef Rollout</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-26</td><td>2027-01-26</td><td>current</td></tr><tr><td><a href="/adr/railiance-derived-rail-composition/v1/index.html">Derived Rail Composition</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-07-26</td><td>2027-01-26</td><td>current</td></tr><tr><td><a href="/adr/railiance-reef-production-admission/v1/index.html">Reef Production Admission</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-15</td><td>2027-02-15</td><td>current</td></tr><tr><td><a href="/adr/railiance-rapp-declaration-contract/v1/index.html">Rapp Declaration Contract</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-13</td><td>2027-02-13</td><td>current</td></tr><tr><td><a href="/adr/railiance-private-by-default-exposure/v1/index.html">Private-by-default Exposure</a></td><td>accepted</td><td>active</td><td>accepted-1</td><td>railiance-master</td><td>2026-08-15</td><td>2027-02-15</td><td>current</td></tr></tbody></table></main></div></html>

View file

@ -13,7 +13,7 @@
"source_digest": "99f802d91a0b3a65f0dac58230d8904f7c61cf3f81eff072fbbc59b634612a8a", "source_digest": "99f802d91a0b3a65f0dac58230d8904f7c61cf3f81eff072fbbc59b634612a8a",
"source_path": "canon/standards/tenancy-posture_v0.1.md", "source_path": "canon/standards/tenancy-posture_v0.1.md",
"source_repo": "net-kingdom", "source_repo": "net-kingdom",
"source_revision": "f4f885289e196b6770fea5d509959e3031fd9295", "source_revision": "ba5d8642e91a31055eafdaef6993d779f6af7e06",
"status": "proposed", "status": "proposed",
"title": "NetKingdom Tenancy Posture v0.1" "title": "NetKingdom Tenancy Posture v0.1"
}, },
@ -34,6 +34,57 @@
"status": "proposed", "status": "proposed",
"title": "Coulomb estate architecture" "title": "Coulomb estate architecture"
}, },
{
"canonical_path": "architecture/railiance/v0.1/index.html",
"currency": "current",
"id": "railiance-architecture",
"last_reviewed": "2026-08-18",
"lifecycle": "active",
"owner": "railiance-master",
"review_due": "2027-02-18",
"revision": "draft-1",
"revision_path": "architecture/railiance/v0.1/revisions/draft-1/index.html",
"source_digest": "1cc0af5cdb6cae771bc134722672385b8e71df1a778adc3358862a1d8f5d7217",
"source_path": "docs/architecture/railiance_v0.1.md",
"source_repo": "railiance-master",
"source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "proposed",
"title": "Railiance architecture"
},
{
"canonical_path": "architecture/net-kingdom/v0.1/index.html",
"currency": "current",
"id": "net-kingdom-architecture",
"last_reviewed": "2026-08-18",
"lifecycle": "active",
"owner": "net-kingdom",
"review_due": "2027-02-18",
"revision": "draft-1",
"revision_path": "architecture/net-kingdom/v0.1/revisions/draft-1/index.html",
"source_digest": "dd42250edcc444fa9a5007c3f9d561984840af2b19a07cf2916cbcc8434df0f7",
"source_path": "docs/architecture/net-kingdom_v0.1.md",
"source_repo": "net-kingdom",
"source_revision": "ba5d8642e91a31055eafdaef6993d779f6af7e06",
"status": "proposed",
"title": "NetKingdom architecture"
},
{
"canonical_path": "architecture/state-hub/v0.1/index.html",
"currency": "current",
"id": "state-hub-architecture",
"last_reviewed": "2026-08-18",
"lifecycle": "active",
"owner": "state-hub",
"review_due": "2027-02-18",
"revision": "draft-1",
"revision_path": "architecture/state-hub/v0.1/revisions/draft-1/index.html",
"source_digest": "f65748fa3c861a6f399365ee5315af4e47ec91823837e3d7d89c17d4b385f2aa",
"source_path": "docs/architecture/state-hub_v0.1.md",
"source_repo": "state-hub",
"source_revision": "db89e5463fe8bb8bf6811cf839548244eab28c4b",
"status": "proposed",
"title": "State Hub architecture"
},
{ {
"canonical_path": "architecture/policy-nexus/v0.1/index.html", "canonical_path": "architecture/policy-nexus/v0.1/index.html",
"currency": "current", "currency": "current",
@ -47,7 +98,7 @@
"source_digest": "179cbb86bca95f71f46f51ca1971ff1c274eed7d900adf0672b537d4bcc5b480", "source_digest": "179cbb86bca95f71f46f51ca1971ff1c274eed7d900adf0672b537d4bcc5b480",
"source_path": "docs/architecture/policy-nexus_v0.1.md", "source_path": "docs/architecture/policy-nexus_v0.1.md",
"source_repo": "policy-nexus", "source_repo": "policy-nexus",
"source_revision": "9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0", "source_revision": "b93928330ef7a76976fa62989bb54f47dbe04832",
"status": "proposed", "status": "proposed",
"title": "Policy Nexus architecture" "title": "Policy Nexus architecture"
}, },
@ -64,7 +115,7 @@
"source_digest": "a28668fb4b8b6c5ec8c94baac000061276d85ef1849ec7ab8d132b913dbfe3be", "source_digest": "a28668fb4b8b6c5ec8c94baac000061276d85ef1849ec7ab8d132b913dbfe3be",
"source_path": "docs/adr/ADR-0001-addressing-and-permanence.md", "source_path": "docs/adr/ADR-0001-addressing-and-permanence.md",
"source_repo": "policy-nexus", "source_repo": "policy-nexus",
"source_revision": "9c6a1d3ce0a76b3cbd342ab74d3914aa339fd4e0", "source_revision": "b93928330ef7a76976fa62989bb54f47dbe04832",
"status": "accepted", "status": "accepted",
"title": "Policy addressing and permanence" "title": "Policy addressing and permanence"
}, },
@ -81,7 +132,7 @@
"source_digest": "b9c993ded8d79d6f871dba9cf08a320b2d619609a448ad3d02b632f5b6f76497", "source_digest": "b9c993ded8d79d6f871dba9cf08a320b2d619609a448ad3d02b632f5b6f76497",
"source_path": "docs/adr/ADR-0001-repository-prefix-architecture.md", "source_path": "docs/adr/ADR-0001-repository-prefix-architecture.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Repository Prefix Architecture" "title": "Repository Prefix Architecture"
}, },
@ -98,7 +149,7 @@
"source_digest": "7e1fc5aedd7294192d8702a22b9f205e5bae20793836fdc48c0c071d10d7ab9d", "source_digest": "7e1fc5aedd7294192d8702a22b9f205e5bae20793836fdc48c0c071d10d7ab9d",
"source_path": "docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md", "source_path": "docs/adr/ADR-0002-rail-kubernetes-wave-1-boundary.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Wave 1 rail-kubernetes Boundary" "title": "Wave 1 rail-kubernetes Boundary"
}, },
@ -115,7 +166,7 @@
"source_digest": "28135e94758b6935518d2e83458c1e607deeabb341879b605eef6529b3168cbc", "source_digest": "28135e94758b6935518d2e83458c1e607deeabb341879b605eef6529b3168cbc",
"source_path": "docs/adr/ADR-0003-rapp-first-wave-selection.md", "source_path": "docs/adr/ADR-0003-rapp-first-wave-selection.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "First-Wave rapp Selection" "title": "First-Wave rapp Selection"
}, },
@ -132,7 +183,7 @@
"source_digest": "36ec3aad5082ceff685d66e091c0a24b52abfc65b36595d00dce2b52a7250f4e", "source_digest": "36ec3aad5082ceff685d66e091c0a24b52abfc65b36595d00dce2b52a7250f4e",
"source_path": "docs/adr/ADR-0004-first-wave-reef-rollout.md", "source_path": "docs/adr/ADR-0004-first-wave-reef-rollout.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "First-Wave reef Rollout" "title": "First-Wave reef Rollout"
}, },
@ -149,7 +200,7 @@
"source_digest": "e02982ce54691cf1589ac3d04012b9b9282f9eb54ed4b8f2f0544371f9b87f3e", "source_digest": "e02982ce54691cf1589ac3d04012b9b9282f9eb54ed4b8f2f0544371f9b87f3e",
"source_path": "docs/adr/ADR-0005-derived-rail-composition.md", "source_path": "docs/adr/ADR-0005-derived-rail-composition.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Derived Rail Composition" "title": "Derived Rail Composition"
}, },
@ -166,7 +217,7 @@
"source_digest": "d9fbd9d21d86e461334abc24060c39127f2158ba25317b3d3dc326c4f7eaf08c", "source_digest": "d9fbd9d21d86e461334abc24060c39127f2158ba25317b3d3dc326c4f7eaf08c",
"source_path": "docs/adr/ADR-0006-reef-production-admission.md", "source_path": "docs/adr/ADR-0006-reef-production-admission.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Reef Production Admission" "title": "Reef Production Admission"
}, },
@ -183,7 +234,7 @@
"source_digest": "263431f88ba04d6ab9ab3b6c0d6a2bb08634bfe83dc0719350f0855d399c18b2", "source_digest": "263431f88ba04d6ab9ab3b6c0d6a2bb08634bfe83dc0719350f0855d399c18b2",
"source_path": "docs/adr/ADR-0007-rapp-declaration-contract.md", "source_path": "docs/adr/ADR-0007-rapp-declaration-contract.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Rapp Declaration Contract" "title": "Rapp Declaration Contract"
}, },
@ -200,7 +251,7 @@
"source_digest": "276ea38233413f1e23670bbf57c486abc361b0a275ca67efea7d677103713b32", "source_digest": "276ea38233413f1e23670bbf57c486abc361b0a275ca67efea7d677103713b32",
"source_path": "docs/adr/ADR-0008-private-by-default-exposure.md", "source_path": "docs/adr/ADR-0008-private-by-default-exposure.md",
"source_repo": "railiance-master", "source_repo": "railiance-master",
"source_revision": "debbc13b4018f20db0997516b99afc1cc21084d7", "source_revision": "883533ed8af1703cc9bb4a2b24137e325bbbda47",
"status": "accepted", "status": "accepted",
"title": "Private-by-default Exposure" "title": "Private-by-default Exposure"
} }

View file

@ -1,6 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"><meta charset="utf-8"> <html lang="en"><meta charset="utf-8">
<meta name="policy-source-revision" content="f4f885289e196b6770fea5d509959e3031fd9295"> <meta name="policy-source-revision" content="ba5d8642e91a31055eafdaef6993d779f6af7e06">
<meta name="policy-source-digest" content="99f802d91a0b3a65f0dac58230d8904f7c61cf3f81eff072fbbc59b634612a8a"> <meta name="policy-source-digest" content="99f802d91a0b3a65f0dac58230d8904f7c61cf3f81eff072fbbc59b634612a8a">
<title>NetKingdom Tenancy Posture v0.1</title> <title>NetKingdom Tenancy Posture v0.1</title>
<style> <style>
@ -191,7 +191,7 @@ a:focus-visible,.rail a:focus-visible{outline:2px solid var(--brass);outline-off
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
</style> </style>
<div class="wrap"><header><div class="eyebrow"><span>netkingdom-tenancy-posture</span> <span class="stat">proposed · draft-8</span> <span>net-kingdom</span> <span>reviewed 2026-08-17</span><span>generated from canonical source — do not edit</span></div><h1>NetKingdom Tenancy Posture v0.1</h1><p class="sub">A framework for describing, holding and improving multi-tenancy — including where we are not there yet.</p><p class="sub">Source: <code>net-kingdom · canon/standards/tenancy-posture_v0.1.md · f4f885289e196b6770fea5d509959e3031fd9295</code></p><p class="sub">Review due: 2027-02-17</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#status"><span class="n">·</span>Status</a></li><li><a href="#s0"><span class="n">0</span>Terminology: axes, not planes</a></li><li><a href="#s1"><span class="n">1</span>Context</a></li><li><a href="#s2"><span class="n">2</span>What this document is</a></li><li><a href="#s3"><span class="n">3</span>Six orthogonal axes</a></li><li><a href="#s4"><span class="n">4</span>Graduated levels</a></li><li><a href="#s5"><span class="n">5</span>The posture vector</a></li><li><a href="#s6"><span class="n">6</span>Conformance is accuracy, not altitude</a></li><li><a href="#s7"><span class="n">7</span>Portability across placement levels</a></li><li><a href="#s8"><span class="n">8</span>Placement triggers</a></li><li><a href="#s9"><span class="n">9</span>Credentials as a tenancy control</a></li><li><a href="#s10"><span class="n">10</span>Blast radius must be published</a></li><li><a href="#s11"><span class="n">11</span>Commercial expression</a></li><li><a href="#s12"><span class="n">12</span>Methodology — analyze, establish, improve, guard</a></li><li><a href="#s13"><span class="n">13</span>Evidence per level</a></li><li><a href="#s14"><span class="n">14</span>Adoption stance — structure, not tooling</a></li><li><a href="#s15"><span class="n">15</span>Alternatives considered</a></li><li><a href="#s16"><span class="n">16</span>Held against outside practice</a></li><li><a href="#s17"><span class="n">17</span>Scaling demands</a></li><li><a href="#s18"><span class="n">18</span>Consequences</a></li><li><a href="#s19"><span class="n">19</span>Review resolutions and residual questions</a></li><li><a href="#s20"><span class="n">20</span>Ratification path</a></li></ol></nav><main><section id="status"><h2>Status</h2> <div class="wrap"><header><div class="eyebrow"><span>netkingdom-tenancy-posture</span> <span class="stat">proposed · draft-8</span> <span>net-kingdom</span> <span>reviewed 2026-08-17</span><span>generated from canonical source — do not edit</span></div><h1>NetKingdom Tenancy Posture v0.1</h1><p class="sub">A framework for describing, holding and improving multi-tenancy — including where we are not there yet.</p><p class="sub">Source: <code>net-kingdom · canon/standards/tenancy-posture_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</code></p><p class="sub">Review due: 2027-02-17</p></header><div class="layout"><nav class="rail" aria-label="Sections"><ol><li><a href="#status"><span class="n">·</span>Status</a></li><li><a href="#s0"><span class="n">0</span>Terminology: axes, not planes</a></li><li><a href="#s1"><span class="n">1</span>Context</a></li><li><a href="#s2"><span class="n">2</span>What this document is</a></li><li><a href="#s3"><span class="n">3</span>Six orthogonal axes</a></li><li><a href="#s4"><span class="n">4</span>Graduated levels</a></li><li><a href="#s5"><span class="n">5</span>The posture vector</a></li><li><a href="#s6"><span class="n">6</span>Conformance is accuracy, not altitude</a></li><li><a href="#s7"><span class="n">7</span>Portability across placement levels</a></li><li><a href="#s8"><span class="n">8</span>Placement triggers</a></li><li><a href="#s9"><span class="n">9</span>Credentials as a tenancy control</a></li><li><a href="#s10"><span class="n">10</span>Blast radius must be published</a></li><li><a href="#s11"><span class="n">11</span>Commercial expression</a></li><li><a href="#s12"><span class="n">12</span>Methodology — analyze, establish, improve, guard</a></li><li><a href="#s13"><span class="n">13</span>Evidence per level</a></li><li><a href="#s14"><span class="n">14</span>Adoption stance — structure, not tooling</a></li><li><a href="#s15"><span class="n">15</span>Alternatives considered</a></li><li><a href="#s16"><span class="n">16</span>Held against outside practice</a></li><li><a href="#s17"><span class="n">17</span>Scaling demands</a></li><li><a href="#s18"><span class="n">18</span>Consequences</a></li><li><a href="#s19"><span class="n">19</span>Review resolutions and residual questions</a></li><li><a href="#s20"><span class="n">20</span>Ratification path</a></li></ol></nav><main><section id="status"><h2>Status</h2>
<p><strong>Proposed, draft-8; ratification-ready.</strong> Relocated from <code>the-custodian/canon/architecture</code> on 2026-08-17: multi-tenancy is part of the IT-security framework NetKingdom provides, so this framework belongs in NetKingdom canon beside the IAM Profile and the tenant-engine boundary contract, not in the work-factory canon.</p> <p><strong>Proposed, draft-8; ratification-ready.</strong> Relocated from <code>the-custodian/canon/architecture</code> on 2026-08-17: multi-tenancy is part of the IT-security framework NetKingdom provides, so this framework belongs in NetKingdom canon beside the IAM Profile and the tenant-engine boundary contract, not in the work-factory canon.</p>
<ul><li><strong>draft-1</strong> proposed a single model with fixed characteristics. Rejected: it could not describe a repo that is not there yet.</li><li><strong>draft-2</strong> reframed to graduated levels per axis. Externally corroborated (§16), but four of its statements were wrong and one thing it needed was missing.</li><li><strong>draft-3</strong> applied those corrections, added the retention axis, and recorded an adoption stance.</li><li><strong>draft-4</strong> closed the two gaps draft-3 left open: <code>R4</code> had no mechanism beyond waiting, and the noisy-neighbour evidence artifact asserted something shared infrastructure cannot provide.</li><li><strong>draft-5</strong> relocated to NetKingdom and renamed the dimensions from <em>planes</em> to <em>axes</em>, because the word was already taken (§0).</li><li><strong>draft-6</strong> applied <code>tenant-engine</code>'s review: five changes, including an axis that did not fit its data shape.</li><li><strong>draft-7</strong> applies <code>audit-core</code>, <code>railiance-platform</code> and <code>flex-auth</code>. Eleven further changes, two of them corrections to statements this document made as fact about other repos. <strong>Every posture I guessed was too generous, on every repo that has now self-reported.</strong></li><li><strong>draft-8</strong> applies <code>adaptive-pricing</code>'s review, the last of the six, and the consistency review across all declarations. It adds the missing availability axis, a canonical declaration schema, explicit authority for tier assurance, retention/placement coupling, downgrade propagation, and honest sanctioned customer language. It also corrects the distinction between an implemented control and an evidenced current level.</li></ul> <ul><li><strong>draft-1</strong> proposed a single model with fixed characteristics. Rejected: it could not describe a repo that is not there yet.</li><li><strong>draft-2</strong> reframed to graduated levels per axis. Externally corroborated (§16), but four of its statements were wrong and one thing it needed was missing.</li><li><strong>draft-3</strong> applied those corrections, added the retention axis, and recorded an adoption stance.</li><li><strong>draft-4</strong> closed the two gaps draft-3 left open: <code>R4</code> had no mechanism beyond waiting, and the noisy-neighbour evidence artifact asserted something shared infrastructure cannot provide.</li><li><strong>draft-5</strong> relocated to NetKingdom and renamed the dimensions from <em>planes</em> to <em>axes</em>, because the word was already taken (§0).</li><li><strong>draft-6</strong> applied <code>tenant-engine</code>'s review: five changes, including an axis that did not fit its data shape.</li><li><strong>draft-7</strong> applies <code>audit-core</code>, <code>railiance-platform</code> and <code>flex-auth</code>. Eleven further changes, two of them corrections to statements this document made as fact about other repos. <strong>Every posture I guessed was too generous, on every repo that has now self-reported.</strong></li><li><strong>draft-8</strong> applies <code>adaptive-pricing</code>'s review, the last of the six, and the consistency review across all declarations. It adds the missing availability axis, a canonical declaration schema, explicit authority for tier assurance, retention/placement coupling, downgrade propagation, and honest sanctioned customer language. It also corrects the distinction between an implemented control and an evidenced current level.</li></ul>
<p><strong>Reviewed by all six. The score:</strong> six repos found three live defects in their own code by reading the ladders — <code>tenant-engine</code>'s unfiltered event accessor, <code>audit-core</code>'s unfiltered read path, <code>flex-auth</code>'s unauthenticated <code>/v1/check</code> — and <code>railiance-platform</code> found <code>apps-pg</code> running with no backup configured at all while writing its §10.2 disclosure. The framework changed to fit the repos; no repo was told to fabricate a posture.</p> <p><strong>Reviewed by all six. The score:</strong> six repos found three live defects in their own code by reading the ladders — <code>tenant-engine</code>'s unfiltered event accessor, <code>audit-core</code>'s unfiltered read path, <code>flex-auth</code>'s unauthenticated <code>/v1/check</code> — and <code>railiance-platform</code> found <code>apps-pg</code> running with no backup configured at all while writing its §10.2 disclosure. The framework changed to fit the repos; no repo was told to fabricate a posture.</p>
@ -441,4 +441,4 @@ per consumer: 14 connections (12 runtime + 2 migration)</pre>
</section> </section>
<section id="s20"><h2><span class="sn">20</span>Ratification path</h2> <section id="s20"><h2><span class="sn">20</span>Ratification path</h2>
<ol><li>Reviewed by <code>tenant-engine</code>, <code>flex-auth</code>, <code>audit-core</code>, <code>rapp-postgres</code>, <code>railiance-platform</code> and <code>adaptive-pricing</code> against §19. <strong>Complete in draft-8.</strong></li><li>Each publishes its own posture vector (§5) as part of review. <strong>The framework is validated by whether it can describe them accurately</strong> — if a repo cannot express itself in these six ladders, the ladders are wrong and this document changes, not the repo. <strong>Complete in draft-8; all six root declarations validate against the canonical schema.</strong></li><li>On acceptance, <strong>supersedes</strong> the routing of <code>rapp-postgres/docs/canon-drafts/shared-platform-relational-storage_v0.1-draft.md</code>, whose §§38 are absorbed here. That draft is withdrawn rather than left pending.</li><li>On acceptance, <code>rapp-postgres</code> ADR-0001 through ADR-0004 move to <code>accepted</code> and are annotated as the PostgreSQL implementation of the E, P, R and shared-capacity rules.</li></ol> <ol><li>Reviewed by <code>tenant-engine</code>, <code>flex-auth</code>, <code>audit-core</code>, <code>rapp-postgres</code>, <code>railiance-platform</code> and <code>adaptive-pricing</code> against §19. <strong>Complete in draft-8.</strong></li><li>Each publishes its own posture vector (§5) as part of review. <strong>The framework is validated by whether it can describe them accurately</strong> — if a repo cannot express itself in these six ladders, the ladders are wrong and this document changes, not the repo. <strong>Complete in draft-8; all six root declarations validate against the canonical schema.</strong></li><li>On acceptance, <strong>supersedes</strong> the routing of <code>rapp-postgres/docs/canon-drafts/shared-platform-relational-storage_v0.1-draft.md</code>, whose §§38 are absorbed here. That draft is withdrawn rather than left pending.</li><li>On acceptance, <code>rapp-postgres</code> ADR-0001 through ADR-0004 move to <code>accepted</code> and are annotated as the PostgreSQL implementation of the E, P, R and shared-capacity rules.</li></ol>
</section><footer><span>netkingdom-tenancy-posture · draft-8 · proposed</span><span>net-kingdom · canon/standards/tenancy-posture_v0.1.md · f4f885289e196b6770fea5d509959e3031fd9295</span></footer></main></div></div></html> </section><footer><span>netkingdom-tenancy-posture · draft-8 · proposed</span><span>net-kingdom · canon/standards/tenancy-posture_v0.1.md · ba5d8642e91a31055eafdaef6993d779f6af7e06</span></footer></main></div></div></html>

View file

@ -1,12 +1,12 @@
# ADR review ledger summary # ADR review ledger summary
Rows: 127 Rows: 130
## Inventory dispositions ## Inventory dispositions
- `excluded`: 2 - `excluded`: 2
- `metadata-pending`: 105 - `metadata-pending`: 105
- `published`: 12 - `published`: 15
- `unsupported-format`: 8 - `unsupported-format`: 8
## Proposed dispositions ## Proposed dispositions
@ -14,7 +14,7 @@ Rows: 127
- `conflict`: 5 - `conflict`: 5
- `publish`: 27 - `publish`: 27
- `superseded`: 5 - `superseded`: 5
- `unreviewed`: 90 - `unreviewed`: 93
## Front-matter `id` collisions ## Front-matter `id` collisions

View file

@ -2229,6 +2229,33 @@
"source_repo": "net-kingdom", "source_repo": "net-kingdom",
"successor": "" "successor": ""
}, },
{
"bare_adr": "",
"bare_adr_collisions": [],
"conflict_kinds": [],
"file_present": true,
"frontmatter": {
"id": "net-kingdom-architecture",
"last_reviewed": "2026-08-18",
"owner": "net-kingdom",
"review_interval": "6m",
"revision": "draft-1",
"status": "proposed",
"title": "NetKingdom architecture",
"updated": "",
"version": "0.1"
},
"id_collisions": [],
"inventory_disposition": "published",
"inventory_reason": "Published through an explicit publication.json document entry.",
"missing_fields": [],
"notes": "",
"proposed_disposition": "unreviewed",
"review_notes": "",
"source_path": "docs/architecture/net-kingdom_v0.1.md",
"source_repo": "net-kingdom",
"successor": ""
},
{ {
"bare_adr": "ADR-0001", "bare_adr": "ADR-0001",
"bare_adr_collisions": [ "bare_adr_collisions": [
@ -2904,6 +2931,33 @@
"source_repo": "railiance-master", "source_repo": "railiance-master",
"successor": "" "successor": ""
}, },
{
"bare_adr": "",
"bare_adr_collisions": [],
"conflict_kinds": [],
"file_present": true,
"frontmatter": {
"id": "railiance-architecture",
"last_reviewed": "2026-08-18",
"owner": "railiance-master",
"review_interval": "6m",
"revision": "draft-1",
"status": "proposed",
"title": "Railiance architecture",
"updated": "",
"version": "0.1"
},
"id_collisions": [],
"inventory_disposition": "published",
"inventory_reason": "Published through an explicit publication.json document entry.",
"missing_fields": [],
"notes": "",
"proposed_disposition": "unreviewed",
"review_notes": "",
"source_path": "docs/architecture/railiance_v0.1.md",
"source_repo": "railiance-master",
"successor": ""
},
{ {
"bare_adr": "ADR-0001", "bare_adr": "ADR-0001",
"bare_adr_collisions": [ "bare_adr_collisions": [
@ -3296,6 +3350,33 @@
"source_repo": "rein-aharness", "source_repo": "rein-aharness",
"successor": "" "successor": ""
}, },
{
"bare_adr": "",
"bare_adr_collisions": [],
"conflict_kinds": [],
"file_present": true,
"frontmatter": {
"id": "state-hub-architecture",
"last_reviewed": "2026-08-18",
"owner": "state-hub",
"review_interval": "6m",
"revision": "draft-1",
"status": "proposed",
"title": "State Hub architecture",
"updated": "",
"version": "0.1"
},
"id_collisions": [],
"inventory_disposition": "published",
"inventory_reason": "Published through an explicit publication.json document entry.",
"missing_fields": [],
"notes": "",
"proposed_disposition": "unreviewed",
"review_notes": "",
"source_path": "docs/architecture/state-hub_v0.1.md",
"source_repo": "state-hub",
"successor": ""
},
{ {
"bare_adr": "ADR-0001", "bare_adr": "ADR-0001",
"bare_adr_collisions": [ "bare_adr_collisions": [

View file

@ -0,0 +1,10 @@
# Cleanup packets
Per-repo checklists from POLICY-NEXUS-WP-0003-T05. They are work
artefacts, not published policy.
`policy-nexus` will not edit your ADR bodies. Apply the checklist in
your repo, then tell this repo the publication `id` is ready.
Contract: `docs/publication-contract.md`.
Conflicts: `docs/adr-review/conflicts.md`.

View file

@ -0,0 +1,23 @@
# Cleanup packet — activity-core
From POLICY-NEXUS-WP-0003-T05.
Ids `ACT-ADR-001``005` are already unique. This site is ready to
publish all five once each file has:
```yaml
owner: activity-core
revision: "accepted-1"
last_reviewed: "YYYY-MM-DD"
review_interval: 6m
```
| File | Why it publishes |
| --- | --- |
| `adr-001-event-bridge-architecture.md` | Cross-repo event bridge |
| `adr-002-definition-format.md` | Definition format others consume |
| `adr-003-rule-instruction-model.md` | Rule vs instruction |
| `adr-004-producer-trust-boundary.md` | Producer trust boundary |
| `adr-005-ops-runs-vs-dev-work-records.md` | Ops-run vs work-record split |
No body rewrite required.

View file

@ -0,0 +1,18 @@
# Cleanup packet — coulomb-social
From POLICY-NEXUS-WP-0003-T05.
## Conflict
- `docs/adr/ADR-0002-space-content-forgejo-markdown.md` — status is
**superseded in part** by ADR-0003 / ADR-0004. Choose one:
1. `status: superseded` with those two as successors, or
2. keep a narrowed `accepted` decision and say which clause survived.
Until that is one status, this site will not publish ADR-0002.
## Also needed before any publish
Prefix publication ids (`CSOC-ADR-0001` …). `ADR-0001` collides with
key-cape and target-revenue. Add `owner`, `revision`, `last_reviewed`,
`review_interval` to 0001, 0003, 0004.

View file

@ -0,0 +1,24 @@
# Cleanup packet — net-kingdom
From POLICY-NEXUS-WP-0003-T05. Do not apply in policy-nexus.
## Blocking
| File | Action |
| --- | --- |
| `canon/standards/iam-profile_v0.2.md` | Set `status: superseded`. Successor is v0.3. Id `netkingdom-iam-profile` is shared. |
| `canon/standards/iam-profile_v0.3.md` | Change `id` to `netkingdom-iam-profile-v0.3` (or similar unique id). Then it can be published. |
## Ready to publish after prefix + review metadata
`docs/adr/ADR-0006` through `ADR-0015`. Suggested ids `NK-ADR-0006`
`NK-ADR-0015`. Add `owner`, `revision`, `last_reviewed` /
`review_interval`.
These are unreviewed for relevance except as NetKingdom chapter 9
candidates. Default if they only bind NetKingdom implementers: still
`publish` — they constrain flex-auth, key-cape, tenant-engine.
## Already published
- Tenancy Posture at `/standards/tenancy-posture/v0.1/`.

View file

@ -0,0 +1,24 @@
# Cleanup packet — railiance-hosts
From POLICY-NEXUS-WP-0003-T05. Shared with `railiance-infra`.
## Already ruled
- `docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md` — superseded by
ADR-003. Add YAML `status: superseded` so the body and metadata agree.
Byte-identical copy exists in railiance-infra.
## Conflict — do not publish both
These files are **byte-identical** and **accepted** in both
`railiance-hosts` and `railiance-infra`:
- `ADR-003-railiance-5repo-stack-architecture.md`
- `ADR-004-forgejo-in-cluster-actions-runner.md`
Pick one publication source. The other becomes `superseded` or a
pointer, not a second current document. If the stack story moved to
`railiance-master`, say so.
Who rules: railiance-hosts, railiance-infra, or railiance-master.
Nothing is published from these two ADRs until that ruling lands.

View file

@ -0,0 +1,23 @@
# Cleanup packet — railiance-infra
From POLICY-NEXUS-WP-0003-T05. Shared with `railiance-hosts`.
## Already ruled
- `docs/adr/ADR-002-repo-boundary-hosts-vs-bootstrap.md` — superseded by
ADR-003. Add YAML `status: superseded`. Identical hosts copy exists.
## Conflict — do not publish both
Byte-identical accepted copies also live in `railiance-hosts`:
- `ADR-003-railiance-5repo-stack-architecture.md`
- `ADR-004-forgejo-in-cluster-actions-runner.md`
One current publication source, not two. See the hosts packet.
## Still unreviewed here
- `docs/adr/ADR-005-k3s-api-tunnel-only.md` — relevance not ruled. If it
still binds cluster access, add publication front-matter and a unique
id (`RINFRA-ADR-0005`).

View file

@ -0,0 +1,15 @@
# Cleanup packet — railiance-platform
From POLICY-NEXUS-WP-0003-T05.
These bind other repos. Add a unique `id` (suggested
`RPLAT-ADR-0001``0003`). 0002 and 0003 already have most other
publication fields; 0001 needs `id`.
| File | Disposition |
| --- | --- |
| `ADR-0001-s3-platform-service-boundary.md` | publish |
| `ADR-0002-placement-policy-ownership.md` | publish (proposed is fine) |
| `ADR-0003-decisions-live-in-the-repo.md` | publish |
`docs/adr/README.md` stays excluded (directory index).

View file

@ -0,0 +1,38 @@
# Cleanup packet — the-custodian
From POLICY-NEXUS-WP-0003-T05. Do not apply in policy-nexus.
## Ready to publish after this packet
Estate architecture ADRs in `canon/architecture/`. Suggested
publication ids (filename can stay):
| File | Suggested `id` |
| --- | --- |
| `adr-001-workplans-as-repo-artefacts.md` | `CUST-ADR-001` |
| `adr-002-custodian-agent-runtime-design.md` | `CUST-ADR-002` |
| `adr-003-materialized-derived-state.md` | `CUST-ADR-003` |
| `adr-004-connectivity-first-network-posture.md` | `CUST-ADR-004` |
| `adr-005-cross-repo-workplans-project-repos.md` | `CUST-ADR-005` |
| `adr-006-canon-federation-concept-ownership.md` | `CUST-ADR-006` |
| `adr-007-workplan-identity-and-repo-worker-topology.md` | `CUST-ADR-007` |
| `adr-010-hub-authority-and-local-cache-model.md` | `CUST-ADR-010` |
| `adr-011-federated-namespaces-and-reconciliation-limits.md` | `CUST-ADR-011` |
Add to each: `owner`, `revision` (or `version`), `last_reviewed` or
`updated`, `review_interval` (`6m` unless you declare otherwise).
Bare `ADR-001``ADR-005` collide with coulomb-loop and kaizen-agentic.
A prefix is required before this site can register them.
## Already ruled, small fix
- `adr-008-multi-tenancy-model.md` — superseded, successor Tenancy
Posture. No body rewrite.
- `canon/standards/iam-profile_v0.1.md` — already superseded; point
`superseded_by` at `iam-profile_v0.3.md`, not v0.2.
## Already published from this repo
- `canon/architecture/coulomb-estate_v0.1.md` at
`/architecture/coulomb-estate/v0.1/`.

View file

@ -16,6 +16,7 @@
"net-kingdom": {"path": "../net-kingdom"}, "net-kingdom": {"path": "../net-kingdom"},
"policy-nexus": {"path": "."}, "policy-nexus": {"path": "."},
"railiance-master": {"path": "../railiance-master"}, "railiance-master": {"path": "../railiance-master"},
"state-hub": {"path": "../state-hub"},
"the-custodian": {"path": "../the-custodian"} "the-custodian": {"path": "../the-custodian"}
}, },
"documents": [ "documents": [
@ -37,6 +38,30 @@
"revision_path": "architecture/coulomb-estate/v0.1/revisions/{revision}/index.html", "revision_path": "architecture/coulomb-estate/v0.1/revisions/{revision}/index.html",
"review_interval": "6m" "review_interval": "6m"
}, },
{
"id": "railiance-architecture",
"source_repo": "railiance-master",
"source_path": "docs/architecture/railiance_v0.1.md",
"canonical_path": "architecture/railiance/v0.1/index.html",
"revision_path": "architecture/railiance/v0.1/revisions/{revision}/index.html",
"review_interval": "6m"
},
{
"id": "net-kingdom-architecture",
"source_repo": "net-kingdom",
"source_path": "docs/architecture/net-kingdom_v0.1.md",
"canonical_path": "architecture/net-kingdom/v0.1/index.html",
"revision_path": "architecture/net-kingdom/v0.1/revisions/{revision}/index.html",
"review_interval": "6m"
},
{
"id": "state-hub-architecture",
"source_repo": "state-hub",
"source_path": "docs/architecture/state-hub_v0.1.md",
"canonical_path": "architecture/state-hub/v0.1/index.html",
"revision_path": "architecture/state-hub/v0.1/revisions/{revision}/index.html",
"review_interval": "6m"
},
{ {
"id": "policy-nexus-architecture", "id": "policy-nexus-architecture",
"source_repo": "policy-nexus", "source_repo": "policy-nexus",

View file

@ -59,7 +59,7 @@
"net-kingdom": { "net-kingdom": {
"branch": "main", "branch": "main",
"remote": "https://forgejo.coulomb.social/coulomb/net-kingdom.git", "remote": "https://forgejo.coulomb.social/coulomb/net-kingdom.git",
"selectors": ["canon/standards/**", "docs/adr/*.md"] "selectors": ["canon/standards/**", "docs/adr/*.md", "docs/architecture/*.md"]
}, },
"policy-nexus": { "policy-nexus": {
"local": true, "local": true,
@ -78,7 +78,7 @@
"railiance-master": { "railiance-master": {
"branch": "main", "branch": "main",
"remote": "https://forgejo.coulomb.social/coulomb/railiance-master.git", "remote": "https://forgejo.coulomb.social/coulomb/railiance-master.git",
"selectors": ["docs/adr/*.md"] "selectors": ["docs/adr/*.md", "docs/architecture/*.md"]
}, },
"railiance-platform": { "railiance-platform": {
"branch": "main", "branch": "main",
@ -95,6 +95,11 @@
"remote": "https://forgejo.coulomb.social/coulomb/rein-aharness.git", "remote": "https://forgejo.coulomb.social/coulomb/rein-aharness.git",
"selectors": ["docs/adr/*.md"] "selectors": ["docs/adr/*.md"]
}, },
"state-hub": {
"branch": "main",
"remote": "https://forgejo.coulomb.social/coulomb/state-hub.git",
"selectors": ["docs/architecture/*.md"]
},
"target-revenue": { "target-revenue": {
"branch": "main", "branch": "main",
"remote": "https://forgejo.coulomb.social/coulomb/target-revenue.git", "remote": "https://forgejo.coulomb.social/coulomb/target-revenue.git",

View file

@ -337,6 +337,12 @@
"source_path": "docs/adr/ADR-0015-netkingdom-railiance-workload-packaging-and-relational-platform.md", "source_path": "docs/adr/ADR-0015-netkingdom-railiance-workload-packaging-and-relational-platform.md",
"source_repo": "net-kingdom" "source_repo": "net-kingdom"
}, },
{
"disposition": "published",
"reason": "Published through an explicit publication.json document entry.",
"source_path": "docs/architecture/net-kingdom_v0.1.md",
"source_repo": "net-kingdom"
},
{ {
"disposition": "published", "disposition": "published",
"reason": "Published through an explicit publication.json document entry.", "reason": "Published through an explicit publication.json document entry.",
@ -439,6 +445,12 @@
"source_path": "docs/adr/ADR-0008-private-by-default-exposure.md", "source_path": "docs/adr/ADR-0008-private-by-default-exposure.md",
"source_repo": "railiance-master" "source_repo": "railiance-master"
}, },
{
"disposition": "published",
"reason": "Published through an explicit publication.json document entry.",
"source_path": "docs/architecture/railiance_v0.1.md",
"source_repo": "railiance-master"
},
{ {
"disposition": "metadata-pending", "disposition": "metadata-pending",
"reason": "In scope; awaits explicit publication addressing and owner/revision/review metadata.", "reason": "In scope; awaits explicit publication addressing and owner/revision/review metadata.",
@ -493,6 +505,12 @@
"source_path": "docs/adr/ADR-001-agent-harness-architecture.md", "source_path": "docs/adr/ADR-001-agent-harness-architecture.md",
"source_repo": "rein-aharness" "source_repo": "rein-aharness"
}, },
{
"disposition": "published",
"reason": "Published through an explicit publication.json document entry.",
"source_path": "docs/architecture/state-hub_v0.1.md",
"source_repo": "state-hub"
},
{ {
"disposition": "metadata-pending", "disposition": "metadata-pending",
"reason": "In scope; awaits explicit publication addressing and owner/revision/review metadata.", "reason": "In scope; awaits explicit publication addressing and owner/revision/review metadata.",

View file

@ -220,7 +220,7 @@ unresolved WP-0003 conflicts.
```task ```task
id: POLICY-NEXUS-WP-0002-T05 id: POLICY-NEXUS-WP-0002-T05
status: progress status: done
priority: medium priority: medium
``` ```
@ -234,8 +234,12 @@ publish. Deeper chapters are the owning repo's follow-on, not a gate here.
This repo authors only `docs/architecture/policy-nexus_v0.1.md`. This repo authors only `docs/architecture/policy-nexus_v0.1.md`.
2026-08-18: policy-nexus stub exists with real chapters 1, 3 and 9. It is 2026-08-18: policy-nexus stub exists with real chapters 1, 3 and 9. It is
published at `/architecture/policy-nexus/v0.1/`. The other four published at `/architecture/policy-nexus/v0.1/`.
documents remain owning-repo work.
Completed 2026-08-18. Stubs now exist in `railiance-master`,
`net-kingdom`, and `state-hub` (`docs/architecture/<system>_v0.1.md`)
with real chapters 1, 3 and 9. Estate map was T04. First wave is
open.
### T06 — Register and publish ### T06 — Register and publish
@ -260,8 +264,9 @@ publication stays explicit.
2026-08-18: `docs/architecture/*.md` is a policy-nexus selector. 2026-08-18: `docs/architecture/*.md` is a policy-nexus selector.
`policy-nexus-architecture` is published at `policy-nexus-architecture` is published at
`/architecture/policy-nexus/v0.1/`. Estate map is published at `/architecture/policy-nexus/v0.1/`. Estate map is published at
`/architecture/coulomb-estate/v0.1/`. Other first-wave documents still `/architecture/coulomb-estate/v0.1/`. First-wave stubs for Railiance,
need owning-repo files. NetKingdom and State Hub are published at
`/architecture/<system>/v0.1/`.
### T07 — Smoke the published collection ### T07 — Smoke the published collection

View file

@ -224,7 +224,7 @@ chapter 9: the listed estate ADRs match; no miss on that document.
```task ```task
id: POLICY-NEXUS-WP-0003-T05 id: POLICY-NEXUS-WP-0003-T05
status: todo status: done
priority: high priority: high
``` ```
@ -237,6 +237,11 @@ Deliver the packet as a message or a PR *checklist* in the owning repo,
not as an edit of the ADR bodies. This repo applies the packet only for not as an edit of the ADR bodies. This repo applies the packet only for
`policy-nexus` itself. `policy-nexus` itself.
Completed 2026-08-18. Checklists in `docs/adr-review/packets/` and
inbox messages from `policy-nexus` to the-custodian, net-kingdom,
railiance-hosts, railiance-infra, coulomb-social, activity-core, and
railiance-platform. No foreign ADR bodies were edited.
### T06 — Register the ready set ### T06 — Register the ready set
```task ```task