Filed by the domain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49) at the moment of dispatching #6272, because the 2026-08-28 A1 ruling explicitly split this half out and assigned the filing to this seat. Filed unlabelled beyond routing — domain:*, type and grading are triage's to produce. Suggested routing at the bottom.
⚠️ Dedup run before filing: #6127 is a different, closed defect on this same file (a fence welding a JSX element and a bare object literal so it parsed as neither ts nor tsx). No card covers the spelling.
What
content/docs/fields/location.mdx teaches the deprecated value spelling as though it were canonical, at :53, :101, :116 and :134-140 — including a tsx snippet whose useState is typed as { latitude, longitude }.
The contract says otherwise, measured against the pinned @objectstack/spec@17.2.0:
LocationValue = { lat: number; lng: number; altitude?: number; accuracy?: number } // canonical
LocationCoordinates = { latitude, longitude, … } // @deprecated
valueSchemaFor({ type: 'location' }) REJECTS { latitude, longitude } (invalid_type at [lat], [lng]) and ACCEPTS { lat, lng }.
⇒ Every author — human or AI — who follows this page writes a value the platform's own contract refuses. And because location is in STRUCTURED_JSON_TYPES, which is warn-first by default, that value is persisted with a one-time warning rather than rejected. So the page is not merely wrong; it is a live source of records in a spelling the platform has stated it will never convert (os migrate value-shapes: "This one converts nothing").
Why this is its own card
The A1 ruling made #6272's fix an atomic change — LocationField plus the three plugin-detail assertions that pin the old produce shape plus the two example schemas, all in one commit or CI is red. This page is not load-bearing for that flip and does not need to land atomically with it, so the ruling split it rather than widening a fence that was already one file too small.
Scope
content/docs/fields/location.mdx — stop teaching { latitude, longitude }; teach the spec's { lat, lng }.
- ⚠️ The
tsx snippet on that page is compiled by check:doc-snippets, so the change has to keep it compiling — this is a real deliverable with a gate behind it, not a prose edit.
⛔ Out of scope
Sequencing
Independent of #6272's PR, but it should not land before it: until the widget flips, the page would be describing a shape the shipped widget does not produce. Landing after is correct; landing alongside is fine.
Suggested routing (triage's call)
domain:ui (the page documents a published widget's authoring surface), documentation, type Task. The direction is already ruled — 2026-08-28, verbatim 「6272 A1 其他同意」 — so this needs no decision, only grading into the queue.
Refs: #6272 (the atomic half, dispatched) · #6154 (closed premise-void; carries the full spec measurement) · #6127 (the earlier, closed fence defect on this file).
Filed by the
domain:uiexecution seat (PM sessionsession_01CRJge11jso9TpXRWFt1Z49) at the moment of dispatching #6272, because the 2026-08-28 A1 ruling explicitly split this half out and assigned the filing to this seat. Filed unlabelled beyond routing —domain:*,typeand grading are triage's to produce. Suggested routing at the bottom.tsnortsx). No card covers the spelling.What
content/docs/fields/location.mdxteaches the deprecated value spelling as though it were canonical, at:53,:101,:116and:134-140— including atsxsnippet whoseuseStateis typed as{ latitude, longitude }.The contract says otherwise, measured against the pinned
@objectstack/spec@17.2.0:valueSchemaFor({ type: 'location' })REJECTS{ latitude, longitude }(invalid_typeat[lat],[lng]) and ACCEPTS{ lat, lng }.⇒ Every author — human or AI — who follows this page writes a value the platform's own contract refuses. And because
locationis inSTRUCTURED_JSON_TYPES, which is warn-first by default, that value is persisted with a one-time warning rather than rejected. So the page is not merely wrong; it is a live source of records in a spelling the platform has stated it will never convert (os migrate value-shapes: "This one converts nothing").Why this is its own card
The A1 ruling made #6272's fix an atomic change —
LocationFieldplus the threeplugin-detailassertions that pin the old produce shape plus the two example schemas, all in one commit or CI is red. This page is not load-bearing for that flip and does not need to land atomically with it, so the ruling split it rather than widening a fence that was already one file too small.Scope
content/docs/fields/location.mdx— stop teaching{ latitude, longitude }; teach the spec's{ lat, lng }.tsxsnippet on that page is compiled bycheck:doc-snippets, so the change has to keep it compiling — this is a real deliverable with a gate behind it, not a prose edit.⛔ Out of scope
GeolocationField. Measured:geolocationis not a member of the spec's closedFieldTypeunion, andvalueSchemaForaccepts both spellings for it. It sits outside this contract entirely and must not be swept in.packages/app-shell/src/utils/paramValueShape.ts:164,166(anote:string saying'{ latitude, longitude } object.') — held on a serial constraint by the ruling until the app-shell claims land. It is a string in a note; nothing depends on its timing.packages/fields— that is bug(fields): atype: 'location'value spelled{ lat, lng }reads as0, 0inLocationFieldwhile the same value renders correctly throughLocationCellRenderer#6272's atomic fence.Sequencing
Independent of #6272's PR, but it should not land before it: until the widget flips, the page would be describing a shape the shipped widget does not produce. Landing after is correct; landing alongside is fine.
Suggested routing (triage's call)
domain:ui(the page documents a published widget's authoring surface),documentation, type Task. The direction is already ruled — 2026-08-28, verbatim 「6272 A1 其他同意」 — so this needs no decision, only grading into the queue.Refs: #6272 (the atomic half, dispatched) · #6154 (closed premise-void; carries the full spec measurement) · #6127 (the earlier, closed fence defect on this file).