Commit e0f300b
* feat(spec): close chart's last two STRIP sites and migrate the 44 direct alias tables to strictObject (#5583, #5593)
Two issues from the #4001 unknown-key campaign, landed together because they
share one four-step regeneration and one CI lap.
── #5583 · ChartAggregateSchema / ChartGroupBySchema ────────────────────────
Both object shapes are `strictObject` now, so an undeclared key inside
`aggregate={{…}}` is a named rejection carrying the surface, the offending key
and a rename, instead of being silently stripped by the parse. `groupby`,
`fn` and `dateGranularty` each degraded a chart with `build`/`validate` green.
The order is the record worth keeping: `.strict()` is a property of a PARSE,
and until #5020 wired one nothing parsed these schemas. Closing them first
would have shipped a precisely-validated door with nothing behind it (#4583).
The zod-4 union collapse is load-bearing here and pinned on both sides:
`groupBy` is a union, so the arm's `unrecognized_keys` never reaches
`error.issues` — the named message reaches an author only through
`packages/lint`'s `describeIssue` arm unpacking.
The product question this pair carried is ANSWERED and it did not move the
schema: `groupBy` stays REQUIRED. Measured — the example corpus authors one
`ObjectChart aggregate` and it carries `groupBy`; the ungrouped single-value
need is served by objectui's separate `object-metric` block (7 instances in the
showcase); and the renderer's three `schema.aggregate?.groupBy ||
schema.xAxisKey` reads are optional-chained on `aggregate` itself, so they
serve charts with no aggregate at all. #5020's warning-level tolerance stays a
tolerance; its hint now states the ruling rather than an open question.
Records synchronised in three places: the file header, the two `chart.test.ts`
pins (INVERTED in place, not deleted), and the ledger — whose `chart.zod.ts`
remaining-strip row is deleted on the reverse pin (0 strip) with a departure
note. Counts regenerated: strip 185 → 183, authorable 43 → 41.
── #5593 · 44 direct `strictUnknownKeyError` call sites → strictObject ──────
All 44 migrated; 16 hand-transcribed `*_KEYS` arrays and 9 drift-probe tests
deleted; the shrink-only ratchet is a hard ZERO and now forbids the weaker
instrument rather than measuring it; #5483's transitional registry
(`shared/alias-table-registry.ts`) is deleted with its last call site, along
with the suppression hook `strictObject` needed to stay out of it.
The migration found what the transcriptions were hiding — the half route 1
could not close:
* 11 suggestion targets were `retiredKey()` tombstones (`app` ×8, `flow` ×2,
`flow node` ×1), so a near-miss was steered onto the one key guaranteed to
be rejected next — ledger finding 12, live on main;
* the nav `separator` answered with keys it rejects: it spreads nothing and
declares `type`/`id`/`order`, while the shared transcription handed every
variant the base keys, so `title` was answered "did you mean `label`?" and
`label` was rejected too — finding 7;
* three ADR-0010 protection envelopes were missing from their own suggestion
pools (`datasource`, `hook`, `sharing rule`).
Zero-behaviour-regression is proved exhaustively rather than sampled: every
migrated surface's old array is compared against its new derived pool (36 of 42
byte-identical; the 6 differences are exactly the defects above), plus a real
rejection message per surface and per nav variant.
`data/object.zod.ts`'s error map was deferred to dodge a temporal dead zone;
`strictObject` evaluates options at construction, so the deferral is replaced
by declaration order and that order is now documented as load-bearing.
Exemption disposition, with one correction to the migration's own forecast:
`VARIANT_LEGAL_GUIDANCE` is DELETED by a fix (the `children` prescription is
filed only on the seven variants that can fire it), while `PROSE_ALIAS_TARGETS`
MOVED into the shape-backed half rather than dying — migrating the tables did
not turn seven deliberate prose targets into key names, so claim 2 met the same
93 entries from the shape side. It is stronger where it now sits.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
* docs(spec): sync chart.zod.ts header opening + regenerate the ledger counts on the merged tree
The header's first paragraph still said two sites were deliberately left open,
which #5583 closed. It now records the ORDER instead (批 15 refused to close
first, #5020 wired the parse, #5583 moved the posture), because a later sweep
meeting a `no gate` verdict needs the refusal's reasoning, not just the result.
The counts artifact carries merge=os-regen and was merged without a text merge,
so it is recomputed from the merged tree rather than reconciled by hand — main's
etl.zod.ts retirement (#6414) landed in the same window, so the totals move for
two independent reasons and only a wholesale regeneration gets both right:
444 -> 434 sites, 183 -> 180 strip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
* fix(spec): registry array survives the field.zod ↔ suggestions.zod ↔ strict-object import cycle under eager schemas
DECLARATIONS moved from a module-level const (TDZ at import time when the
cycle enters through the automation barrel — an ordering #5593's migration
itself introduced) to a hoisted function-owned store, the same property
flowNodeObject() relies on (#4415). Pinned from both sides; the eager
reproduction path is gen:schema (OS_EAGER_SCHEMAS=1).
Recovery commit: the dev agent was killed by a container restart during
its final verification run; verification re-run to completion by the PM —
gen:schema eager pass, targeted cycle tests 36/36, full spec suite
342 files / 8768 tests green.
---------
Co-authored-by: qq9340100 <sales@objectstack.ai>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 51d74ad commit e0f300b
43 files changed
Lines changed: 2108 additions & 2237 deletions
File tree
- .changeset
- docs/audits
- packages
- lint/src
- services/service-automation/src
- spec
- scripts
- src
- automation
- data
- driver
- identity
- security
- ui
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
Lines changed: 59 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
Lines changed: 8 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
26 | | - | |
| 25 | + | |
| 26 | + | |
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
| 32 | + | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
| 52 | + | |
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| |||
156 | 156 | | |
157 | 157 | | |
158 | 158 | | |
159 | | - | |
| 159 | + | |
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
165 | | - | |
166 | 165 | | |
167 | 166 | | |
168 | 167 | | |
169 | | - | |
| 168 | + | |
170 | 169 | | |
171 | 170 | | |
172 | 171 | | |
173 | | - | |
| 172 | + | |
174 | 173 | | |
175 | 174 | | |
176 | 175 | | |
| |||
0 commit comments