You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(adr): ADR-0104 addendum revision — D2 flips strict in 17.0; D1 stays per-deployment, wired into the upgrade path (#3438) (#4199)
Revises the 2026-07-30 addendum per maintainer review of #4188: the
amortisation argument (every 16.x deployment performs the 16→17 ceremony
anyway) stands, so each half is asked what an extra major actually protects.
- D2 action params: nothing — no data at risk, rejection is a loud 400 to
the party who can fix it, the dangerous half of R3 is closed by
ACTION_PARAM_BUILTIN_KEYS, and v17 already ships harsher zero-window
flips. Default flips in 17.0; OS_ACTION_PARAMS_STRICT_ENABLED (RC-only,
never on latest) is deleted before GA; OS_ALLOW_LAX_ACTION_PARAMS is the
one escape hatch.
- D1 references + structured JSON: records, not callers — read-modify-write
re-submits ancient malformed values, and part of that data is our own
fault (the dead LocationCoordinatesSchema declared {latitude, longitude}
while storage is {lat, lng}). Stays per-deployment; os migrate meta and
boot logs now surface the scan so clean deployments get one-ceremony
strictness.
Design doc only — releases nothing.
docs(adr): ADR-0104 addendum — evidence for the remaining #3438 strict flips (D1 references/structured JSON gate on a per-deployment `os migrate value-shapes` scan; fresh datastores attest both flags at creation; the D2 action-param flip rides the 18.0 major with an escape hatch) — releases nothing.
4
+
docs(adr): ADR-0104 addendum — evidence for the remaining #3438 strict flips (D1 references/structured JSON gate on a per-deployment `os migrate value-shapes` scan, advertised on the 16→17 upgrade path; fresh datastores attest both flags at creation; D2 action params flip strict-by-default in 17.0, `OS_ACTION_PARAMS_STRICT_ENABLED` deleted before it reaches `latest`, `OS_ALLOW_LAX_ACTION_PARAMS` as the escape hatch) — releases nothing.
docs(adr): revise the ADR-0104 2026-07-30 addendum — D2 action params flip strict-by-default in 17.0 (opt-in env var deleted before it reaches `latest`, `OS_ALLOW_LAX_ACTION_PARAMS` escape hatch); D1 non-media keeps the per-deployment scan gate, now advertised on the 16→17 upgrade path — releases nothing.
Copy file name to clipboardExpand all lines: docs/adr/0104-field-runtime-value-shape-contract.md
+97-48Lines changed: 97 additions & 48 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -719,21 +719,32 @@ point into `sys_file`" reaches production rather than revisiting whether to do
719
719
it. A future choice that stands on its own (say, a chunked-migration protocol,
720
720
or byte-layer content dedup) would earn its own ADR.
721
721
722
-
## Addendum (2026-07-30) — evidence for the remaining flips: a scan gate for references / structured JSON; the action-param flip rides a declared major
722
+
## Addendum (2026-07-30) — evidence for the remaining flips: a scan gate for references / structured JSON; the action-param default flips in 17.0
723
723
724
724
The 2026-07-27 amendment split #3438 into three and settled only the first:
725
725
media value shapes flip per deployment, on the `adr-0104-file-references` flag
726
726
(#3681). The other two were left "blocked on someone deciding what would
727
727
constitute evidence." This addendum decides — differently for the two, because
728
-
their facts have different epistemic reach — and fixes the release vehicle for
729
-
each around the v17 major.
728
+
their facts have different epistemic reach — and lands both on the v17 major.
730
729
731
-
One timeline fact frames everything: **warn-first itself first reaches stable
730
+
One timeline fact frames the choice: **warn-first itself first reaches stable
732
731
deployments in 17.0.** D1 and D2 ride the v17 train (their changesets sit in
733
732
the same pre-mode window as this addendum), so no stable deployment has served
734
-
a single day of the warn window yet. Whatever the right gate is, 17.0 cannot
735
-
flip any default version-wide without deleting the warn window R2/R3 promised
736
-
— independent of the per-deployment argument.
733
+
a single day of the warn window yet. That does *not* settle the question, and
734
+
an earlier draft of this addendum wrongly treated it as if it did. It bounds
735
+
one option only: no deployment can have *already* produced warn-window
736
+
evidence, so a gate that requires such evidence must either produce it fresh
737
+
(D1, below) or be declined on the merits (D2, below). It is not an argument
738
+
for postponement — a break served later is not a break served gently.
739
+
740
+
The governing consideration is the one D4 already stated and the 2026-07-24
741
+
addendum repeated: **ride a planned breaking window to amortise the migration
742
+
cost.** Every deployment on 16.x must perform a substantial, tested 16→17
743
+
upgrade regardless. Spreading this ADR's own breaking changes across two
744
+
majors charges that ceremony twice, and the second charge buys something only
745
+
where it buys real safety. So the question is asked per half — *what does
746
+
withholding the version-wide flip actually protect here?* — and the answers
747
+
differ.
737
748
738
749
### D1 references + structured JSON: the evidence can exist, so build it
#3438 then tracks two work items instead of an open question: the scan
870
-
migration (command, engine wiring, creation-time attestation) targeting the
871
-
17.0 train, and the D2 flip parked for the 18.0 train with its release-note
872
-
announcement landing now.
915
+
| 17.0 | D2 strict by default (`OS_ACTION_PARAMS_STRICT_ENABLED` deleted, `OS_ALLOW_LAX_ACTION_PARAMS` added, dogfood duals flipped). `os migrate value-shapes` + the `adr-0104-value-shapes` gate wiring. Fresh-datastore attestation of both flags. `os migrate meta` / boot-log advertisement of the scan. D1 non-media stays warn-first until the deployment's own gate opens. |
916
+
| each deployment, ≥17.0 | runs `os migrate value-shapes --apply` (or is born attested) → its own D1 non-media classes flip to strict. Clean data ⇒ one upgrade, done. |
917
+
918
+
#3438 then tracks two work items instead of an open question, both on the
0 commit comments