Skip to content

Commit 13606e0

Browse files
committed
docs: reconcile the value-shapes gate with the creation-attestation notes
#4215 landed #3438's third item (a store created from empty attests both flags) while this branch was open, so the merged docs claimed "both flags" without the second one ever being named. - cli.mdx: the file migration's closing paragraph and writing-rules callout had been split off from their own section by the new one inserted above them; move them back so each command's rules sit under that command, and point the "other value classes keep warning" sentence at the gate that now exists for them. - cli.mdx: the created-from-empty section offers an escape hatch per class, so it names both — the media one and the one this branch adds. - v17.mdx: document `os migrate value-shapes` and why its flag is separate, and give the upgrade checklist its own bullet. The old wording told readers OS_DATA_VALUE_SHAPE_STRICT_ENABLED opts in "classes with no migration behind them", which stopped being true here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zgA8CQMJeJbFEjnbib1Uv
1 parent 23d4084 commit 13606e0

2 files changed

Lines changed: 46 additions & 18 deletions

File tree

content/docs/deployment/cli.mdx

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,23 @@ Exit status is `0` only when the self-check passes, so CI can gate on it.
660660
| **Media value shapes** | A malformed `file` / `image` / `avatar` / `video` / `audio` value is **rejected** (`400 invalid_type`) instead of warned about. Set `OS_ALLOW_LAX_MEDIA_VALUES=1` to re-open leniency while diagnosing. |
661661
| **Released-file collection** | A field file whose one owning record lets go (the field is cleared or the record deleted) is tombstoned into the declared 30-day grace window; re-referencing the id within the window revives it, and after it the platform sweep reclaims the row and its bytes. Unverified deployments keep every released file forever. |
662662

663+
Other value classes are unaffected: a `lookup` or `location` value keeps its own
664+
warn-first rollout until `os migrate value-shapes` (below) supplies *their*
665+
evidence, because this migration is evidence about *file* values and says
666+
nothing about theirs.
667+
668+
<Callout type="warn">
669+
A dry run writes **nothing** — not the conversions, and not the flag either,
670+
even when the self-check would pass. `--apply` is the only writing mode. A
671+
later run that *fails* its self-check clears the flag's verified state, so a
672+
database that has drifted closes its own gate.
673+
674+
A running server reads the flag once; after migrating, **restart it** for
675+
enforcement (and release-time tombstoning) to take effect. The sweep's final
676+
delete check re-reads the flag fresh, so a later failing run stops collection
677+
without a restart.
678+
</Callout>
679+
663680
#### `os migrate value-shapes`
664681

665682
The same gate for the **non-media** value classes — references (`lookup`,
@@ -703,21 +720,9 @@ know my data" lever, not the route to strictness — the route is running the
703720
migration that produces the evidence.
704721
</Callout>
705722

706-
Other value classes are unaffected: a `lookup` or `location` value keeps its own
707-
warn-first rollout, because this migration is evidence about *file* values and
708-
says nothing about theirs.
709-
710-
<Callout type="warn">
711-
A dry run writes **nothing** — not the conversions, and not the flag either,
712-
even when the self-check would pass. `--apply` is the only writing mode. A
713-
later run that *fails* its self-check clears the flag's verified state, so a
714-
database that has drifted closes its own gate.
715-
716-
A running server reads the flag once; after migrating, **restart it** for
717-
enforcement (and release-time tombstoning) to take effect. The sweep's final
718-
delete check re-reads the flag fresh, so a later failing run stops collection
719-
without a restart.
720-
</Callout>
723+
Same writing rules as its sibling: a dry run writes **nothing**, `--apply` is
724+
the only writing mode, a later failing run clears the verified state, and a
725+
running server reads the flag once — **restart it** after a successful apply.
721726

722727
#### A database created by this version needs no migration
723728

@@ -735,8 +740,10 @@ attests nothing and produces its evidence by running the command, because
735740

736741
Importing legacy values into such a deployment is rejected at the write path
737742
rather than silently accepted. That is the intended outcome; if you must admit
738-
them temporarily, `OS_ALLOW_LAX_MEDIA_VALUES=1` re-opens leniency, and
739-
re-running the migration re-establishes the flag from the data itself.
743+
them temporarily, `OS_ALLOW_LAX_MEDIA_VALUES=1` (media) and
744+
`OS_ALLOW_LAX_VALUE_SHAPES=1` (references and structured JSON) re-open leniency
745+
per class, and re-running the corresponding migration re-establishes its flag
746+
from the data itself.
740747

741748
### Scaffolding
742749

content/docs/releases/v17.mdx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,23 @@ records** — never the platform version — is what authorises both strict medi
984984
value shapes and irreversible file collection. Upgrading changes neither;
985985
running the migration does.
986986

987+
**The non-media classes have their own gate** (#3438) — references (`lookup`,
988+
`master_detail`, `user`, `tree`) and structured JSON (`location`, `address`,
989+
`composite`, `repeater`, `record`, `vector`):
990+
991+
```bash
992+
os migrate value-shapes # scan: reports, writes nothing
993+
os migrate value-shapes --apply # scan, then record the flag if clean
994+
```
995+
996+
A separate flag because it attests a separate fact: the file migration says file
997+
values were converted and their ownership reconciled, which tells you nothing
998+
about whether a `lookup` id or a `location` payload is well formed. This one
999+
converts nothing — a malformed `location` is application data only its author
1000+
can correct — so it reports the object, field, type, count, sample record ids
1001+
and parse issue, and you re-run until it is clean. `OS_ALLOW_LAX_VALUE_SHAPES=1`
1002+
re-opens leniency while diagnosing.
1003+
9871004
**A database created by 17 attests both flags at creation** (#3438), so a new
9881005
deployment enforces from its first boot instead of waiting for someone to run a
9891006
migration that, for an empty store, does nothing. The platform attests only a
@@ -1306,7 +1323,11 @@ objectui commits on top of the pin 16.1.0 shipped.
13061323
media value shapes *and* released-file collection for this deployment, so
13071324
read the report before you `--apply`. Do **not** reach for
13081325
`OS_DATA_VALUE_SHAPE_STRICT_ENABLED` to get there: it opts every value class
1309-
in at once, including ones with no migration behind them.
1326+
in at once, regardless of which migrations this deployment has actually run.
1327+
- **Reference and structured-JSON values:** run `os migrate value-shapes` and
1328+
fix what it reports before `--apply`. It converts nothing — the values it
1329+
names are application data — and a scan that was truncated or could not read
1330+
an object fails the gate even at zero violations.
13101331
- **Datasources:** verify every declared datasource connects in every
13111332
environment — a bound datasource that cannot connect now fails the boot
13121333
instead of failing every later query.

0 commit comments

Comments
 (0)