Commit a8300f2
authored
docs(architecture): sandbox tier — workload-trust runc+gVisor floor (#163)
* arch(next/v1): §02 add "Sandbox tier — workload-driven selection" sub-section (E1)
Adds the workload-trust-profile axis as a first-class §02 concept ahead of
the catalogue rows that reference it. Three named profiles:
- trusted_operator (solo / dev) → runc
- internal_workforce (vetted employees) → gVisor (v1 hardened default)
- untrusted (unknown actors) → microVM (post-v1, #161; not deployable v1 GA)
Cites Anthropic Self-Hosted Sandboxes (May 2026) as the published
multi-provider precedent. Forward-links NFR-SEC-38/39 (enforceability,
landing in the next commit) and AP-13 (anti-pattern, landing with the
row edits).
* arch(next/v1): §02 reframe tier rows; add NFR-SEC-38/39; AP-13; drop tech-name leaks
Row edits (E2-E11) + new rows (N1/N2) + new anti-pattern (AP-13):
- E2 NFR-PERF-03: cold-start target generalised to hardened tier; per-tier
baselines in PERF-07/08/09.
- E3 NFR-PERF-09: explicitly gated on microVM tier shipping (#161); not
enforced in v1.
- E4 NFR-SEC-02: dropped "microVM-default" framing; gVisor v1 hardened
default; microVM hardware-virt post-v1; tier-appropriate escape
resistance with seccomp BPF + Landlock + cap-drop in every tier.
- E5 NFR-SEC-29: broker binding substrate matches tier (loopback/UDS on
runc and gVisor; vsock CID + JWT scope on microVM post-v1).
- E6 NFR-SEC-35: KVM precondition limited to microVM tier; Helm
pre-install probe ≤2 s with clear error on KVM-absent host;
CI test on KVM-absent runner.
- E7 NFR-FLEX-02: runtime ladder reframed (runc + gVisor v1; microVM
post-v1, Firecracker named as example, Kata as one packaging option).
- E8 NFR-FLEX-06: same egress invariant qualified by microVM tier ship.
- E9 NFR-FLEX-09: dropped Kata+RKE2 / bare-VM Firecracker tech names.
- E10 AP-13 (new): picking sandbox tier by data classification is
forbidden; trust profile picks tier, data class governs custody /
retention / residency. Backed by vale lint rule landing in next commit.
- E11: pruned remaining "minimal-capability shelf" / "full-capability
shelf" occurrences inside §02 (NFR-SEC-03 only).
- E12: Open Question 5 parenthetical clarifies microVM is post-v1.
New rows:
- NFR-SEC-38: workload-trust profile declaration is a deployment-time
invariant; mismatch is admission-time hard error; untrusted profile is
NOT deployable in v1 GA (admission rejects with pointer to #161).
- NFR-SEC-39: tier-downgrade alarm via audit event
`config.trust_profile.downgraded`; SIEM-bridge HIGH; SOAR webhook ≤30s.
Both new rows ship as commitments; implementation lands when control-plane
code exists.
* arch(next/v1): vale rule AP-13 — block "(NPI|RESTRICTED|CONFIDENTIAL) → microVM" phrasing
Enforces §02 anti-pattern AP-13 at the prose level: data classification
does not pick the sandbox substrate. Trust profile picks the tier; data
class governs custody / retention / residency.
Standalone file rather than appended to banned-phrases.yml because vale
existence rules share message/level per-file; AP-13 needs its own message
pointing the author to the §02 anchor.
* arch(next/v1): Layer 3 shelf→tier rename; multi-tenant invariant in trust-profile terms (L1-L14)
Aligns Layer 3 with the §02 workload-trust-driven tier model.
- L1: §2 Compute plane row reframed in tier terms (runc / gVisor / microVM)
with forward link to the new §02 "Sandbox tier" sub-section.
- L3: §4 multi-tenant invariant rewritten in trust-profile terms — bare
runc multi-tenant forbidden; gVisor as v1 default; microVM post-v1.
- L4: T0 tier-table label "single-tenant minimal-capability" →
"solo / dev / single-operator".
- L5, L11, L13, L14: shelf → tier renames in §3, §6, §8, §9, §10, §12 (key
custody, audit sink, signer narrative, Open question 4).
- L6, L7, L8: §3 actor-table "Optional?" cells use tier names instead of
shelf labels.
- L9: §6 data-class-gating sentence reframed — trust profile picks the
tier; data class still picks BYOK + customer-managed audit sink. AP-13
is the load-bearing forbidder of data-class-driven substrate selection.
- L10: §8 table column headers renamed (Solo / dev tier vs Hardened tier
and above).
- L12: §8.1 signer paragraph renamed to tier vocabulary.
last-reviewed bumped to 2026-05-27.
* arch(next/v1): drop competitor-listing slop from §02 sandbox-tier sub-section
The "Anthropic Self-Hosted Sandboxes — Cloudflare microVM, Daytona container,
Modal gVisor, Vercel container" line was AI-slop preamble citing a competitor
product launch as if it justified our design. §02 is a normative NFR catalogue,
not a press-release. Evidence stays in the RESEARCH artifact.
* arch(next/v1): slop sweep on §02 sub-section + tier NFR rows + Layer 3 invariant
Removes self-praise, forward-references, and duplication introduced by the
prior commits in this PR:
- §02 sub-section gVisor row drops "Production precedent at AI scale:
OpenAI, Modal, Anthropic, Google App Engine" — competitor listing in a
normative NFR catalogue is marketing, not requirement.
- §02 sub-section drops "Honest v1 deployability" header + the
re-articulation paragraph (the table already says what the trust profile
is and what tier it maps to).
- §02 sub-section drops forward references to NFR-SEC-38/39 + AP-13 —
reader sees those below; preamble pointing forward is slop.
- NFR-SEC-02 drops "Runtime brand pick within a tier is a component-spec
decision" — already covered by NFR-FLEX-02.
- NFR-SEC-38 / NFR-SEC-39 row cells compressed; same load-bearing content.
- AP-13 drops "Enforced at the prose level by a vale rule on ..." —
anti-pattern is normative, the implementation note belongs in the vale
rule itself.
- Layer 3 §2 Compute plane row drops "(see ...)" preamble before the §02
link.
- Layer 3 §4 multi-tenant invariant drops v1/post-v1 narrative — that
already lives in §02 + §2 zone table.
* arch(next/v1): fix CRIT F-01 self-contradiction + WARN F-02 matrix count + INFO F-05 back-link
Code-review findings from REVIEW-PR-163-code.md:
- F-01 (CRIT): Layer 3 §6 line 110 was internally contradictory — it
asserted "CONFIDENTIAL+ workloads require the hardened tier (gVisor)..."
(the data-class→tier mapping AP-13 forbids) and immediately added "Tier
selection is workload-trust-driven, not data-class-driven (forbidden by
AP-13)". Rewritten so data class drives custody / audit sink / residency
obligations and trust profile drives the tier.
- F-02 (WARN): NFR-SEC-38 admission-matrix count "6 valid v1 + 3 rejected
v1" was ambiguous. Now spells out: 6 cells valid by pairing rules
(3 require post-v1 microVM); 3 cells rejected by pairing; v1 GA
deployable = 3; v1 GA rejected = 6 (3 pairing + 3 microVM-not-shipped).
- F-05 (INFO): NFR-SEC-38 had no back-link to AP-13; added one clause.
* arch(next/v1): plan-check WARN fixes — restore #161 link + AP-13 concrete example
Plan-check findings from PLAN-CHECK-PR-163.md:
- PC-1 (WARN): Layer 3 §4 multi-tenant invariant lost the direct #161
link in the slop sweep; reader now needs §02→sub-section→#161 (2 hops).
Restored one inline [#161].
- PC-2 (WARN): AP-13 example was dropped in the slop sweep; without it the
anti-pattern is abstract. Added the minimal concrete form ("NPI →
microVM" / "PUBLIC → runc") that names the forbidden phrasing without
re-introducing the long description.1 parent 3e6ae98 commit a8300f2
3 files changed
Lines changed: 52 additions & 25 deletions
File tree
- .vale/styles/Architecture
- docs/architecture
- manifesto
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
50 | | - | |
51 | | - | |
52 | | - | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
63 | | - | |
| 63 | + | |
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
107 | 107 | | |
108 | 108 | | |
109 | 109 | | |
110 | | - | |
| 110 | + | |
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
| |||
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
141 | | - | |
| 141 | + | |
142 | 142 | | |
143 | 143 | | |
144 | 144 | | |
| |||
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
153 | | - | |
| 153 | + | |
154 | 154 | | |
155 | 155 | | |
156 | 156 | | |
157 | | - | |
| 157 | + | |
158 | 158 | | |
159 | 159 | | |
160 | 160 | | |
161 | | - | |
| 161 | + | |
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
165 | | - | |
| 165 | + | |
166 | 166 | | |
167 | 167 | | |
168 | 168 | | |
| |||
188 | 188 | | |
189 | 189 | | |
190 | 190 | | |
191 | | - | |
| 191 | + | |
192 | 192 | | |
0 commit comments