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
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:
parent
b93928330e
commit
af9f5996e2
34 changed files with 1891 additions and 56 deletions
|
|
@ -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>/<kind>/<document>/<version>/
|
<pre>/<kind>/<document>/<version>/
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
244
build/architecture/net-kingdom/v0.1/index.html
Normal file
244
build/architecture/net-kingdom/v0.1/index.html
Normal 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>
|
||||||
244
build/architecture/net-kingdom/v0.1/revisions/draft-1/index.html
Normal file
244
build/architecture/net-kingdom/v0.1/revisions/draft-1/index.html
Normal 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>
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
245
build/architecture/railiance/v0.1/index.html
Normal file
245
build/architecture/railiance/v0.1/index.html
Normal 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>
|
||||||
245
build/architecture/railiance/v0.1/revisions/draft-1/index.html
Normal file
245
build/architecture/railiance/v0.1/revisions/draft-1/index.html
Normal 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>
|
||||||
246
build/architecture/state-hub/v0.1/index.html
Normal file
246
build/architecture/state-hub/v0.1/index.html
Normal 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>
|
||||||
246
build/architecture/state-hub/v0.1/revisions/draft-1/index.html
Normal file
246
build/architecture/state-hub/v0.1/revisions/draft-1/index.html
Normal 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>
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 §§3–8 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 §§3–8 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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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": [
|
||||||
|
|
|
||||||
10
docs/adr-review/packets/README.md
Normal file
10
docs/adr-review/packets/README.md
Normal 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`.
|
||||||
23
docs/adr-review/packets/activity-core.md
Normal file
23
docs/adr-review/packets/activity-core.md
Normal 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.
|
||||||
18
docs/adr-review/packets/coulomb-social.md
Normal file
18
docs/adr-review/packets/coulomb-social.md
Normal 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.
|
||||||
24
docs/adr-review/packets/net-kingdom.md
Normal file
24
docs/adr-review/packets/net-kingdom.md
Normal 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/`.
|
||||||
24
docs/adr-review/packets/railiance-hosts.md
Normal file
24
docs/adr-review/packets/railiance-hosts.md
Normal 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.
|
||||||
23
docs/adr-review/packets/railiance-infra.md
Normal file
23
docs/adr-review/packets/railiance-infra.md
Normal 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`).
|
||||||
15
docs/adr-review/packets/railiance-platform.md
Normal file
15
docs/adr-review/packets/railiance-platform.md
Normal 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).
|
||||||
38
docs/adr-review/packets/the-custodian.md
Normal file
38
docs/adr-review/packets/the-custodian.md
Normal 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/`.
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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.",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue