Skip to content

Commit 4aa01b8

Browse files
committed
docs: record structural-key registry reopen outcome
1 parent da290d2 commit 4aa01b8

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

planning/decisions/2026-07-12-reject-structural-key-registry.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,35 @@ the key-*name* list from each owning module.
5555
snapshot + disjoint tests already guard loudly (no silent-bug risk). Not worth
5656
it at this size and stage.
5757

58+
## Reopened 2026-07-15 — reaffirmed
59+
60+
Reopened at the maintainer's request during an architecture review. The registry
61+
question was handed to **two independent reviewers, each blind to this decision**
62+
— one mandated to build the strongest case *for* a structural-key registry, one
63+
*against*. They converged on this decision's holding: a universal registry is a
64+
false seam, and `secrets`/`configs` (`stores.py`), `dns`/`sysctls`/`extra_hosts`
65+
(`pod.py`), `deploy` (`resources.py`), `depends_on`/`networks`/`hostname`/
66+
`container_name` (`graph.py`), and the positional `command`/`entrypoint`/`image`
67+
argv keys all belong in their owning module. The clinching disproof of the
68+
universal case: a single `entrypoint` value emits tokens on *both sides* of the
69+
`image` token and a string `entrypoint` silently cancels `command`
70+
(`emit.py:199-207`) — no `emit(value) -> list[Token]` slot can express that.
71+
72+
The reopen surfaced exactly one crack, and it does **not** reach this rejection.
73+
Four per-service keys have no owning noun — `environment`, `env_file`, `volumes`,
74+
`tmpfs` — and of those, `environment` is provably `_map("-e")` (same
75+
`validate_map`, same `["-e", Expand(str(pair))]` emit loop as `labels`/
76+
`annotations`, same `pairs_to_mapping` map-merge), fitting the *existing*
77+
`emit(value)` signature at zero interface cost. `tmpfs` is nearly `_list("--tmpfs")`.
78+
But `env_file`/`volumes` need `project_dir`, which would force widening
79+
`KeySpec.emit` to `emit(value, ctx)` across all ~29 current keys to house two —
80+
a real cost this decision still declines. So the strongest "reopen" collapses
81+
from *"structural-key registry"* all the way down to *"optionally move
82+
`environment``tmpfs`) into `SERVICE_KEYS`"*, which is this decision's own
83+
narrow revisit-trigger #2, not an overturn of it. That narrow move was examined
84+
and left unscheduled (same category as the option-2 single-sourcing declined
85+
above); it is recorded here so a third review does not re-derive it from scratch.
86+
5887
## Revisit trigger
5988

6089
Reopen — and when reopening, reach for the **narrow name single-sourcing**, not

0 commit comments

Comments
 (0)