Repository navigation
fix(spec): the step-18 upgrade rationale states the element data-binding ruling in words instead of a tracker id - #24201
Conversation
…ing ruling in words instead of a tracker id Two STEP18_RATIONALE fragments, the ones `os migrate meta` prints for the 17 -> 18 hop and the upgrade guide renders, cited their decision as a tracker number and a ruling letter. Each parenthetical now states the decision with the ruling's date: the element layer loses its second data door while the object-* blocks keep their native keys, and object-grid's defaultFilters retires together with the element layer's flat binding keys, in the shape of the defaultSort retirement. Text only: fragment ids, orders and every other fragment are unchanged. Claude-Session: https://claude.ai/code/session_01TyRhWbVbbQpQJTDbW8VahJ Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 143 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: Inputs: card #24179 (body, triage ① Derived judgments
② Semver level
③ Boundary flagsDev flags (os-dev-report
Out-of-scope finding (step 17's Check-runs on Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 · ACCEPT · PR #24201 @
|
Fixes #24179
Clause-②: no
Two
STEP18_RATIONALEfragments inpackages/spec/src/migrations/registry.ts.templatetold the upgrading author "(#11509, ruling A-narrow…)": a tracker number and a ruling letter.os migrate meta --from 17prints that text for the 17 → 18 hop (packages/cli/src/commands/migrate/meta.ts:933,hop.rationale), and the generated upgrade guide renders it (packages/spec/scripts/build-upgrade-guide.ts:114). Each parenthetical now states what was decided, with the ruling's date, in theruled DATE …form the earlier step-18 sweep (f623e2f71) used for the rest of the list. Text only: fragment ids, orders and the other 122 fragments are byte-identical. Scope is triage's grade6236131058: these two strings, no new gate fortext:fields.Dev executor for the
domain:specseat 1 PM (claim6236550221, sessionsession_01TyRhWbVbbQpQJTDbW8VahJ).What changed
element-flat-data-binding-retiredobject-*blocks their native keys): the flat…"object-grid-default-filters-retireddefaultFilters(#11509, ruling A-narrow, in the shape of thedefaultSortretirement): the legacy…"defaultFilters(ruled 2026-10-08 together with the element layer's flat binding keys, in the shape of thedefaultSortretirement): the legacy…"Where the words come from. The ruling of record is comment
6051498447on the tracker: the maintainer's 「11509 同意」 of 2026-10-08T03:20Z, letter A-narrow. In its words: the element layer's ten flat data-binding keys retire andobject-grid.defaultFiltersretires with them, while "theobject-*block layer keeps its native keys"; sub-question 1 saysdefaultFilters"retires with a conversion in the shapedefaultSort's took". The first sentence already said that an element now binds throughdataSourceonly, so its parenthetical carries the part it did not say: the narrowing, meaning the block layer keeps its keys. The second keeps itsdefaultSortclause and gains what the ruling joined it to. Neither parenthetical names ADR-0049: the ruling decides a synonym consolidation (one data door per element) and does not cite enforce-or-remove.Provenance. The
#11509id stays in the//comment at the head of each fragment's D3 entry, the file the fragmentidnames:packages/spec/src/migrations/entries/semantic/18.element-flat-data-binding-retired.ts:5and18.object-grid-default-filters-retired.ts:5, both// #11509 (v18, ruling A-narrow). No//comment was added inside the list, though the dispatch suggested one.scripts/step18-rationale-merge.test.tsparses the list against a fixed element shape (id,order,text, then the literal chain) and fails on any residue. Measured on a scratch copy with that test's ownELEMENTregex: a// #11509 …line put above the element, or betweenid:andorder:, stops the parse at fragment 28 of 124 (residueOk false). The list has no//lines today, and thef623e2f71sweep added none.Changeset
.changeset/24179-step18-rationale-tracker-ids.md,@objectstack/specpatch. The text ships: afterpnpm --filter @objectstack/spec build,dist/migrations/index.jsanddist/migrations/index.mjscarry the new wording (2 files), and the oldsecond data door (#11509occurs 0 times indist/. Positive control: the neighbouring conversion idaction-block-endpoint-to-targetoccurs in 8dist/files.protocol-upgrade-guide.mdis infiles[]and is generated at publish. No committed generated artifact moves:check:generatedreports all 14 up to date, andregistry.tsis gitignored.Measured (tree
objectstack-ai/objectstackat base2bcaefba9, headf953eaa70)git grep -n '#11509, ruling A-narrow' packages/spec/src/migrations/registry.ts.templateat base gives 2 hits,:1746and:2336. Control:STEP18_RATIONALEgives 3 hits in the same file (:41,:1207,:3319).#followed by digits on the template's non-comment lines (base). 6 lines. 2 are the targets. The other 4 (:279,:665,:756,:910) arePrime Directive #12/PD #12/Prime Directive #10in step 17's rationale. Those are directive numbers, not tracker ids. None is inSTEP18_RATIONALE.#followed by digits (element-flat-data-binding-retiredandobject-grid-default-filters-retired, each#11509). At head: 124 fragments, 0 do.MIGRATIONS_BY_MAJOR[18].rationale, 121,772 chars), the head text has 0#followed by digits.tsx scripts/build-upgrade-guide.ts --out SCRATCHwrites a guide with 0 occurrences of#11509, and the new wording appears.git grepfor "second data door", for the olddefaultFiltersparenthetical and forruling A-narrowin non-comment test lines finds nothing. The two tests that read these entries (element-flat-binding-retirement.test.ts,page-component-filter-record-to-rule-array.test.ts) assertconversionIdsandsemanticids only.Tests and gates (all at
f953eaa70)pnpm --filter @objectstack/spec build: VERDICT command-exit 0.pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2gave Test Files 691 passed (691), Tests 20961 passed, 1 todo, VERDICT command-exit 0.scripts/step18-rationale-merge.test.tsandsrc/ui/element-flat-binding-retirement.test.tsgave 2 files, 65 tests passed. The other 65repo-project files are CI's (Test Core).pnpm --filter @objectstack/spec typecheck(tsc, scripts typecheck and test typecheck): VERDICT command-exit 0.pnpm --filter @objectstack/spec check:generated: exit 0, "All 14 generated artifacts are up to date".node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackgave 80 commands, and--ranreconciliation says 80 derived, 79 run, 1 NOT-MEASURED, 0 UNRUN. 79 exited 0.pnpm check:dual-build-cjs-loadsexited 3 (PREREQUISITE NOT MET: it needs every package'sdist, which needs a whole-repo build), so it is NOT MEASURED locally and left to CI'sLint & Repo Gates. Four gates first exited non-zero because of how I ran them, and each was re-run green on a stabledist.check:doc-formula-expressionsandcheck:lean-entry-closurefirst exited 3 because their prerequisite builds were missing; they passed after building@objectstack/lintand@objectstack/objectql.check:entry-nameabilityandcheck:exported-anyfirst read adistthat a concurrent rebuild of mine was rewriting. All 19 derived commands that overlapped that rebuild (17 speccheck:*gates,check:changeset-gate-self-testsandcheck:cross-package-test-inputs) were re-run too, all green.node scripts/check-nul-bytes.mjs: exit 0. A control-byte grep over both changed files gives no hits.Acceptance notes
registry.ts.template:279,:665,:756,:910) and several step-18 conversion texts in the generated guide citePrime Directive #12/#10/#2. Those are AGENTS.md directive numbers, not tracker ids, so they fall outside this card's class. The text is already published, and nobody carries it.origin/mainmoved one commit past the base (7d6ec91d2,packages/clionly, no overlap with this diff). The branch was not merged forward; PR CI and the merge queue validate the merged tree.check:doc-authoringstill does not reachtext:fields. Per the triage grade, no gate is added.Generated by Claude Code