Repository navigation
Major 18 retirements justified "lossless, so no semantic residue" carry no D3 entry, which ruling B on #17152 now requires (tenancy.organizationField, and a census of the rest) #20201
Description
Activity
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsMore sites of this card's family, from the at-tier contract review of PR #20181 (record
5854088720, ③) ·domain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T08:12ZEach is single-entry prose that justifies a retirement having no D3 entry by the pre-ruling rule. The reviewer classed each one as (b): only a new entry makes it true. They belong to this card's census:
packages/spec/src/conversions/registry.ts:3446–3449 (「Why D2 and not D3」), :9291–9292 and :9781–9782 (「which is why this is a D2 conversion rather than a semantic TODO」).packages/spec/src/migrations/entries/retired-keys/18.api__ApiEndpoint__cacheTtl.ts:11–12 (「a D2 CONVERSION rather than a semantic entry」). This one is major 18, unreleased.packages/spec/scripts/build-migration-registry.ts:276(「semantic residue is genuinely nil (protocol 14)」): vocabulary about one major.- Step 17: the reviewer adds that the
semantic:17generated region is non-empty. So the docblock's 「thesemanticlist is deliberately empty」 (registry.ts:82–83) is already stale as a fact, whichever way the released-major question is routed.
The governed-text sibling (
.claude/skills/spec-property-retirement/SKILL.md§3) goes to #20188, not here.objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsPath: the road — 发布并装进一个环境 | 缺项 (
cli.migrate-meta-codemoddoes not assert one D3 entry per retirement family) | P4Triage: first grade —
bug·priority:p3·domain:spec·area:devpath·pm:queue. The spec half of the family; #20188 carries the governed-text halfTriage: lands in
packages/spec/src/migrations/entries/semantic/(the missing D3 entries),packages/spec/src/migrations/registry.ts(the rationale prose, thengen:migration-registry), and the single-entry prose sites that5854110917appended ⇒domain:spec. Rationale: ruling B on #17152 (5615360777/5634031140, on the maintainer's #15954 authority) requires one D3 entry per retirement family, even when D2 is lossless. Step 18 retirestenancy.organizationField, andapi.ApiEndpoint.cacheTtl(entries/retired-keys/18.api__ApiEndpoint__cacheTtl.ts:11-12), with none, justified by the pre-ruling rule. It is incomplete, not wrong: the data repair still runs, and no checklist item asserts the entries (state ③) ⇒ p3.reach:is a named producer: retirement devs read these texts to decide what a retirement owes.Triage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T08:21Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its thread (5854110917), #20188 and its thread (5854114102), #17152 and PR #20181 (open, in flight, referencing #20188).The family, split by gate tier, not duplicated.
- This card holds the
packages/specside: the entries, the rationale prose, and the sites5854110917lists (conversions/registry.ts:3446-3449,:9291-9292and:9781-9782; thecacheTtlretired key;scripts/build-migration-registry.ts:276). - ADR-0087 still defines each step's D3
semanticlist as "the residue D2 cannot express losslessly", contradicting ruling B on #17152 (one D3 entry per retirement family, even when a lossless D2 conversion exists) #20188 holds the governed texts: the ADR-0087 sentence, and.claude/skills/spec-property-retirement/SKILL.md§3. They aredomain:skills, Tier H, and graded in the same round. - PR fix(spec): D3 gets one semantic entry per retirement family, even when D2 is lossless (#17152) #20181 ([Decision] 一次退役,要写一条记录还是两条?—— 迁移条目的 D2/D3 约定,两处成文相互矛盾 #17152, in flight) keeps the two code-side prose sites it already corrects. ⛔ This card does not touch them.
Scope decision on step 17.
- In scope: the
registry.tsdocblock sentence 「thesemanticlist is deliberately empty」 (:82-83) is stale as a fact, because thesemantic:17generated region is non-empty (the review's reading). Correct that sentence. - Not in scope: backfilling D3 entries into the released step 17. It changes what
os migrate meta --from 16prints, which is migration-window work.docs/NORTH-STAR.md〈阶段姿态〉 makes that p3 by default, and ruling B's execution clauses name no backfill. No reader is named ⇒ ⛔ no card filed.
Execution notes.
- Census first: pair every major-18 retirement family with its D3 entry, or name it as missing one. The grep for 「lossless」 misses families with no such wording. Record the census in the PR.
- Add one D3 entry per missing family, as ruling B defines it (why the consumer still owes a judgment). Correct each rationale sentence. Regenerate with
pnpm --filter @objectstack/spec gen:migration-registry, and ⛔ never hand-edit the generated regions. - Pin: assert the census in an existing test or
check:migration-registry, so a new major-18 retirement without a D3 entry fails. Find the existing check first. A new gate is not presumed (「新增门禁默认否」).
- This card holds the
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't working
on Sep 27, 2026 objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsOne more site of this card's family, from the at-tier contract review of PR #20181 at
5d7f7f8822(③) ·domain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T09:01Zpackages/spec/src/migrations/entries/semantic/18.metadata-endpoints-switch-radius-repartitioned.ts:11: 「exactly the residue D2 cannot express, which is why this is a semantic entry」.
This entry does carry a D3 entry. What is stale is its stated reason: under ruling B an entry exists per family, not because D2 cannot express the break. So this is a wording correction inside the census, not a missing entry.
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01CiCTczDo7tGhafXjf61dUJ
Account:os-sales(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20201-d3-entry-per-family
Worktree:objectstack-issue-20201
Domain:domain:spec
Seat:domain:spec#4(seat post #18917)
File surface: triage's scope (5854164872). New D3semanticentries underpackages/spec/src/migrations/entries/semantic/, one per major-18 retirement family the census finds without one. The rationale prose inpackages/spec/src/migrations/registry.ts: step 17's docblock sentence at :82–83 (a fact correction only, ⛔ no step-17 backfill) and step 18's rationale at about :5253. The generated regions, regenerated withgen:migration-registryand never hand-edited. The single-entry prose sites appended in5854110917and5854456343:packages/spec/src/conversions/registry.ts:3446–3449, :9291–9292 and :9781–9782;entries/retired-keys/18.api__ApiEndpoint__cacheTtl.ts:11–12;entries/semantic/18.metadata-endpoints-switch-radius-repartitioned.ts:11;packages/spec/scripts/build-migration-registry.ts:276. The census pin goes into an existing test or check, ⛔ never a new check script..changeset/if a published file's text changes. ⛔ Not the governed texts (#20188,domain:skills). ⛔ Notconversions/registry.ts'spage-component-filter-record-to-rule-arrayregion (this seat's #17321). (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default judgment tier(dispatch-gates.mjs --tieron the two registries and the build script: 「no path-derived mandate」, the default slot taken; the census is the judgment). The diff touches non-test files underpackages/spec/src/**, so the at-tier review is owed on the path limb before enqueue.
Clause-②: no
Thread-read: 5854456343
Serial constraints cleared: read at 2026-09-27T12:50Z. Open-PR census: 12 open PRs besides the release PR, 310 file rows (lit control: 104packages/rows). PR #20227 (#20085, seat 1) touchesconversions/registry.tsat :42, :10294 and :10877, all disjoint from the three prose sites above. It touchesmigrations/registry.tsat :5291–5298, near step 18's rationale (:5253), so if the two meet, this card mergesmainafter #20227 lands. PRs #20223 and #19637 touchmigrations/registry.tsin generated regions and add their ownsemantic/entries; those regions follow the regen merge. In-flight claims, 29pm:dispatchedcards read: seven namemigrations/registry.tsfor their own regenerated region (#20186, #20161, #20116, #20085, #20045, #19992, #18459), which is ordinary regen concurrency. This seat's #17321 holdsconversions/registry.tsat thepage-component-filter-record-to-rule-arrayentry only.Ruling carried: ruling B on #17152 (director
5615360777, restated5634031140, on the maintainer's #15954 authority5559778263): every retirement family has one D3 entry, even when a lossless D2 conversion exists; D2 carries only the mechanical data repair. Triage's scope decision on step 17 (5854164872): correct the stale docblock fact; ⛔ no D3 backfill into the released step 17.objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20201, "status": "done", "branch": "claude/issue-20201-d3-entry-per-family", "pr": "https://github.com/objectstack-ai/objectstack/pull/20255", "session": "session_01CiCTczDo7tGhafXjf61dUJ — the Claude-Session trailer on every commit of this branch (subagent run: the parent PM session)", "premise_still_valid": true, "summary": "Census taken at base 3cb84d084 (185 retired-keys, 146 retired-defs, 186 semantic, 36 step-18 D2 conversions; 331 records): 11 of 36 D2-backed families had their D3 entry, 25 had none (metric-filters-removed was named only in passing by analytics-authorable-unknown-keys-refused, judged missing by reading); all 273 D2-less records are named by one of 68 existing D3 entries. Added the 25 D3 entries (one per missing family, each naming its D2 id, what D2 repairs and the judgment the consumer still owes), corrected the pre-ruling prose at all claimed sites (step-17 docblock fact only, step-18 organizationField rationale, conversions/registry.ts x3, the cacheTtl retired key, the metadata-endpoints entry comment, build-migration-registry.ts:276), and pinned the census in the existing migrations.test.ts: from protocol 18 on every graduated conversion must be named by a D3 entry of its step. 25 is AT the dispatch threshold (more than about 25 stops after the census), not over it, so this ships whole with Fixes. PR #20238 (this seat, draft) adds D2 report-joined-chart-removed with no D3 entry naming it: whichever of #20238 / #20255 lands second is red on the pin until a step-18 D3 entry names that id.", "tests": "All at final head 3197fce29 unless stated. pnpm --filter @objectstack/spec build: VERDICT command-exit 0. check:generated: all 15 generated artifacts up to date (exit 0). pnpm --filter @objectstack/spec typecheck: exit 0 (test-typecheck 53 files / 255 errors / 142 signatures, unchanged). vitest run --project local (spec): 549 files, 16119 passed, 2 todo, VERDICT command-exit 0. Pin logic evaluated read-only: base 3cb84d084 = 24 unnamed of 36, head = 0 of 36. Ablation at c8656ad35 (entries committed first): rm 18.object-tenancy-organization-field-retired.ts, absence confirmed on disk, pin run = 1 failed | 140 skipped with \"protocol 18: object-tenancy-organization-field-removed\"; restored via git checkout HEAD -- PATH inside trap EXIT INT TERM, blob 2cf3007d9fff == HEAD blob, git diff HEAD empty; direction red as expected; no build or dist involved (test imports src and reads entry files). dispatch-gates --commands (no paths) re-derived at 3197fce29, every command run with exit recorded, --ran: 89 derived, 86 run all exit 0, 3 NOT MEASURED (dual-build-cjs-loads exit 3 and type-check-debt exit 3: PREREQUISITE NOT MET, full 86-package build over the foreground cap; pm-dispatch-gates: self-test and main run each exceeded 560s/500s at d4c7a41c8, exit 124). ESLint narrowed: 31 changed .ts files, --no-inline-config --format json, 0 errors 0 warnings 0 ignored under eslint.config.mjs; config enables no type-aware linting (eslint.config.mjs:326-328), so no untouched file verdict can move. spec-changes.json and protocol-upgrade-guide.md unchanged (both checks green; step 18 is beyond the current protocol major).", "mcp_calls": "0 — none", "api_writes": "3 — all through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, PR #20255, body read back byte-identical 28744 bytes); assign via label-write.mjs (POST /repos/objectstack-ai/objectstack/issues/20255/assignees os-sales, read back); this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/20201/comments via post-stamped.mjs). Plus git push (not REST). Reads: REST GETs only.", "open_questions": [], "out_of_scope_findings": [ "carrier: PR #20238 (this seat, #20161) · noted, not filed · its D2 conversion report-joined-chart-removed has no step-18 D3 entry naming it at 94a2c634d (ruling B owes one); after #20255 lands it is red on the census pin, or #20255 is red if #20238 lands first", "carrier: 承接者:无 · noted, not filed (PR Acceptance notes) · released step-17 rationale registry.ts:108 still says the sharing-rule full conversion leaves no semantic residue; outside the claimed surface, step-17 backfill scoped out by triage 5854164872", "carrier: 承接者:无 · noted, not filed · step 17: 53 of 57 graduated conversions are named by no step-17 D3 entry (same pin logic); the pin starts at 18 by design, per the no-backfill scope" ], "gates": [ "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0 @ 3197fce29", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 @ 3197fce29", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-ci-filter-parity.mjs :: exit 0 @ 3197fce29", "node scripts/check-closing-keyword-parity.mjs :: exit 0 @ 3197fce29", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-comment-mask-adoption.mjs :: exit 0 @ 3197fce29", "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-comment-mask-corpus.mjs :: exit 0 @ 3197fce29", "node scripts/check-dev-prereqs.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0 @ 3197fce29", "node scripts/check-empty-changeset.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-keyed-text-bounds.mjs :: exit 0 @ 3197fce29", "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-platform-object-tenancy-census.mjs :: exit 0 @ 3197fce29", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-plugin-teardown-shape.mjs :: exit 0 @ 3197fce29", "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-registry-log-declared.mjs :: exit 0 @ 3197fce29", "node scripts/check-registry-log-declared.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-rest-log-spy-declared.mjs :: exit 0 @ 3197fce29", "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0 @ 3197fce29", "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-system-context-census.mjs :: exit 0 @ 3197fce29", "node scripts/check-system-context-census.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/check-undeclared-dep-imports.mjs :: exit 0 @ 3197fce29", "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/docs-audit/check-affected-docs.mjs :: exit 0 @ 3197fce29", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0 @ 3197fce29", "node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0 @ 3197fce29", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:api-surface :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:docs :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:empty-state :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:export-origins :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:exported-any :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:liveness :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:llms-txt :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:migration-registry :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:objectui-pin-citations :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:skill-refs :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:spec-changes :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:upgrade-guide :: exit 0 @ 3197fce29", "pnpm --filter @objectstack/spec run check:variant-docs :: exit 0 @ 3197fce29", "pnpm check:changeset-gate-self-tests :: exit 0 @ 3197fce29", "pnpm check:cross-package-test-inputs :: exit 0 @ 3197fce29", "pnpm check:dispatcher-error-vocabulary :: exit 0 @ 3197fce29", "pnpm check:doc-authoring :: exit 0 @ 3197fce29", "pnpm check:driver-memory-census :: exit 0 @ 3197fce29", "pnpm check:dts-closure :: exit 0 @ 3197fce29", "pnpm check:dual-build-cjs-loads :: exit 3 @ 3197fce29", "pnpm check:engine-double-contract :: exit 0 @ 3197fce29", "pnpm check:future-spec-major :: exit 0 @ 3197fce29", "pnpm check:gitlink-declared :: exit 0 @ 3197fce29", "pnpm check:issue-citations :: exit 0 @ 3197fce29", "pnpm check:lean-entry-closure :: exit 0 @ 3197fce29", "pnpm check:logger-receiver-detach :: exit 0 @ 3197fce29", "pnpm check:merge-driver :: exit 0 @ 3197fce29", "pnpm check:nul-bytes :: exit 0 @ 3197fce29", "pnpm check:objectql-double-limit :: exit 0 @ 3197fce29", "pnpm check:objectui-changeset :: exit 0 @ 3197fce29", "pnpm check:org-identifier :: exit 0 @ 3197fce29", "pnpm check:page-declaration-shape :: exit 0 @ 3197fce29", "pnpm check:pm-changeset-deadline-census :: exit 0 @ 3197fce29", "NOT-MEASURED pnpm check:pm-dispatch-gates :: timeout — at d4c7a41c8 its --self-test and its main run each exceeded a 560s / 500s budget on this shared box (exit 124 both times), so no verdict was reached; not re-attempted at the final head; CI runs it @ 3197fce29", "pnpm check:pm-governed-merges :: exit 0 @ 3197fce29", "pnpm check:pm-prior-rulings :: exit 0 @ 3197fce29", "pnpm check:pm-widening-tells :: exit 0 @ 3197fce29", "pnpm check:published-files :: exit 0 @ 3197fce29", "pnpm check:query-options-erasure :: exit 0 @ 3197fce29", "pnpm check:refd-timer-probe :: exit 0 @ 3197fce29", "pnpm check:slot-lookup :: exit 0 @ 3197fce29", "pnpm check:sourcemap-no-sources-content :: exit 0 @ 3197fce29", "pnpm check:spec-parsed-alias :: exit 0 @ 3197fce29", "pnpm check:test-source-alias :: exit 0 @ 3197fce29", "pnpm check:tier-file-adoption :: exit 0 @ 3197fce29", "pnpm check:type-check-coverage :: exit 0 @ 3197fce29", "pnpm check:type-check-debt :: exit 3 @ 3197fce29", "pnpm check:watch-hint-literal :: exit 0 @ 3197fce29", "pnpm check:where-matcher :: exit 0 @ 3197fce29" ], "line_budget": "not applicable — no skills/** file and no line-ratcheted ledger touched; diff vs merge base 08c8484a1: 32 files, +1733 / -36 (under the 5000 human-merge threshold)", "deviations": [ "Assumption 1 measured: step-17 docblock :82-83 and rationale :108, step-18 rationale :5253 held at base 3cb84d084; :108 not edited (outside the claimed surface).", "Assumption 4: 25 missing families equals the about-25 threshold, not more; proceeded to ship all 25 with Fixes #20201 rather than Part of.", "Assumption 5: #20227 had already landed at the worktree base (its view-item family is in the census, row 36); #20223 and #20245 landed during the work (D3 entries only, no new D2) and were merged via os-regen-merge.sh (a70cd62e5, region regenerated in 3197fce29, both sibling entries verified present); #20238 still open (see findings).", "Line numbers in conversions/registry.ts had shifted since the thread was written: :3446 to :3460, :9291 to :9306, :9781 to :9796 at base.", "Prose correction at conversions/registry.ts:3460 concerns a protocol-17 conversion (datasource-driver-mongo-to-mongodb): corrected as prose only, no step-17 entry added.", "Projections spec-changes.json / docs/protocol-upgrade-guide.md did not move (checks green), so no regeneration commit for them.", "A WIP commit subject (92af158fb) says seventeen entries while it carries twenty; cosmetic, squash-merged away.", "Report fields: added gates / line_budget / deviations / files_changed at the dispatch word's request, beyond the agent-definition template." ], "files_changed": [ "A .changeset/20201-d3-entry-per-family-major-18.md", "M packages/spec/scripts/build-migration-registry.ts", "M packages/spec/src/conversions/registry.ts", "M packages/spec/src/migrations/entries/retired-keys/18.api__ApiEndpoint__cacheTtl.ts", "A packages/spec/src/migrations/entries/semantic/18.api-endpoint-cache-ttl-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.chart-config-aria-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.connector-error-mapping-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.connector-resilience-durations-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.cube-metric-filters-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.dashboard-refresh-interval-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.element-input-target-variable-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.field-inline-and-related-list-columns-closed.ts", "A packages/spec/src/migrations/entries/semantic/18.field-reference-to-spelling-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.form-view-option-default-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.hook-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.job-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.list-view-page-mount-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.list-view-sort-string-clause-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.mapping-lookup-params-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.memory-persistence-auto-save-interval-unit-in-key.ts", "M packages/spec/src/migrations/entries/semantic/18.metadata-endpoints-switch-radius-repartitioned.ts", "A packages/spec/src/migrations/entries/semantic/18.object-grid-default-sort-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.object-kanban-quick-add-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.object-tenancy-organization-field-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.page-component-responsive-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.permission-restore-purge-bits-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.record-highlights-field-icon-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.translation-component-submit-label-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.turso-config-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.view-item-owner-hidden-retired.ts", "M packages/spec/src/migrations/migrations.test.ts", "M packages/spec/src/migrations/registry.ts" ] }objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20201, "status": "done", "branch": "claude/issue-20201-d3-entry-per-family", "pr": "https://github.com/objectstack-ai/objectstack/pull/20255", "session": "session_01CiCTczDo7tGhafXjf61dUJ — the Claude-Session trailer on every commit of this branch (subagent run: the parent PM session)", "premise_still_valid": true, "summary": "Patch round 1 on contract review 5857834457 (FAIL at 3197fce29). Blocking finding addressed: the four bare citations the PR added (#10329, #10926, #12868, #14676, in the leading comments of mapping-lookup-params-retired, translation-component-submit-label-retired, form-view-option-default-retired and connector-error-mapping-retired, plus their regenerated mirrors) are classed deleted by check-issue-citations --probe-cause (web endpoint 404 too; none transferred, so none is another repo's reference to qualify). Each comment now anchors to the landing commit in this repo's history and says in words what it decided (15d58dbf1, d173125fb, c459da6bc, 13c48c2a5; all ancestors of origin/main), following the commit 66e266c93 precedent (ruling C+D on #19123); only comments moved, the region was regenerated. The judging pass exactly as CI runs it went exit 2 (8 findings) at 3197fce29 to exit 0 at a930cacea. The census pin now carries an assertion message naming the unnamed protocol N: conversion-id pairs and the remedy; logic and scope unchanged. PR body: Table 1 row 16 to row 20 move for integration/Connector:connectionTimeoutMs; the registry.ts:108 line recorded as one Acceptance note; #20238 now carries a D3 entry naming report-joined-chart-removed at 4aecf01d2f, so the pin is green in either landing order. main merged twice this round with os-regen-merge.sh (21418c4d2: two sibling D3-only entries; a930cacea: #20268 step-17 rationale prose), no conflict, regeneration a no-op both times. #20286 was open and unmerged at push time (and at the body write), so the view-item entry sentence about the flattened overlay is left as is, per the PM note.", "tests": "Head a930cacea unless stated. Issue-citations judging pass as CI runs it (pnpm check:issue-citations && node scripts/check-issue-citations.mjs, base origin/main): exit 0, 112 citations across 29 files, 106 resolve, 6 cross-repo, 0 findings (was exit 2 at 3197fce29, reproduced locally before the fix). spec build under the lock: build-exit=0. check:generated: exit 0, all 15 up to date (a first attempt read PREREQUISITE NOT MET because a concurrent turbo closure build had emptied dist; re-run after it finished). check:migration-registry: exit 0 (292 semantic). vitest --project local (spec): 552 files, 16257 passed, 1 todo, VERDICT command-exit 0; src/migrations/: 3 files, 151 passed. spec typecheck at 21418c4d2: exit 0, test-typecheck 53/255/142 unchanged (the a930cacea merge brought only another PR's prose into this diff's files). Pin message shown firing at 21418c4d2: rm 18.object-tenancy-organization-field-retired.ts (absence confirmed), migrations.test.ts = 1 failed | 140 passed with AssertionError naming protocol 18: object-tenancy-organization-field-removed and the remedy; trap restore, blob 2cf3007d9fff == HEAD blob, git diff HEAD empty. dispatch-gates --commands (no paths) at a930cacea, every command run, --ran: 89 derived, 87 run all exit 0, 2 NOT MEASURED (dual-build-cjs-loads and type-check-debt exit 3, PREREQUISITE NOT MET: full 86-package build). check:pm-dispatch-gates measured this round: exit 0 in 907.6s. ESLint on 31 changed .ts files: 0/0/0 ignored; no type-aware linting in eslint.config.mjs.", "mcp_calls": "0 — none", "api_writes": "2 this round, both through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): PR body rewrite via post-stamped.mjs --body=20255 --ack-through=5857834457 (issue_patch = PATCH /repos/objectstack-ai/objectstack/issues/20255, read back byte-identical 32119 bytes; a first attempt was REFUSED by the tool before any write because two newer comments were unacknowledged); this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/20201/comments via post-stamped.mjs). Plus git push x3 (5c60be7ee, 21418c4d2, a930cacea; not REST). Reads: REST GETs only.", "open_questions": [], "out_of_scope_findings": [ "carrier: PR #20286 (#20230, open) · noted, not filed · once it lands, 18.view-item-owner-hidden-retired.ts's sentence that a flattened view overlay keeps its own owner/hidden becomes false; per the PM note #20286 corrects it if #20255 lands first", "carrier: 承接者:无 · noted, not filed (PR Acceptance notes) · released step-17 rationale registry.ts:108 still says the sharing-rule full conversion leaves no semantic residue; triage scoped step-17 backfill out" ], "gates": [ "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0 @ a930cacea", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0 @ a930cacea", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-ci-filter-parity.mjs :: exit 0 @ a930cacea", "node scripts/check-closing-keyword-parity.mjs :: exit 0 @ a930cacea", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-comment-mask-adoption.mjs :: exit 0 @ a930cacea", "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-comment-mask-corpus.mjs :: exit 0 @ a930cacea", "node scripts/check-dev-prereqs.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0 @ a930cacea", "node scripts/check-empty-changeset.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-keyed-text-bounds.mjs :: exit 0 @ a930cacea", "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-platform-object-tenancy-census.mjs :: exit 0 @ a930cacea", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-plugin-teardown-shape.mjs :: exit 0 @ a930cacea", "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-registry-log-declared.mjs :: exit 0 @ a930cacea", "node scripts/check-registry-log-declared.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-rest-log-spy-declared.mjs :: exit 0 @ a930cacea", "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0 @ a930cacea", "node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-system-context-census.mjs :: exit 0 @ a930cacea", "node scripts/check-system-context-census.mjs --self-test :: exit 0 @ a930cacea", "node scripts/check-undeclared-dep-imports.mjs :: exit 0 @ a930cacea", "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0 @ a930cacea", "node scripts/docs-audit/check-affected-docs.mjs :: exit 0 @ a930cacea", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0 @ a930cacea", "node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0 @ a930cacea", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0 @ a930cacea", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:api-surface :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:docs :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:empty-state :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:export-origins :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:exported-any :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:liveness :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:llms-txt :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:migration-registry :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:objectui-pin-citations :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:skill-refs :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:spec-changes :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:upgrade-guide :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec run check:variant-docs :: exit 0 @ a930cacea", "pnpm check:changeset-gate-self-tests :: exit 0 @ a930cacea", "pnpm check:cross-package-test-inputs :: exit 0 @ a930cacea", "pnpm check:dispatcher-error-vocabulary :: exit 0 @ a930cacea", "pnpm check:doc-authoring :: exit 0 @ a930cacea", "pnpm check:driver-memory-census :: exit 0 @ a930cacea", "pnpm check:dts-closure :: exit 0 @ a930cacea", "pnpm check:dual-build-cjs-loads :: exit 3 @ a930cacea", "pnpm check:engine-double-contract :: exit 0 @ a930cacea", "pnpm check:future-spec-major :: exit 0 @ a930cacea", "pnpm check:gitlink-declared :: exit 0 @ a930cacea", "pnpm check:issue-citations :: exit 0 @ a930cacea", "pnpm check:lean-entry-closure :: exit 0 @ a930cacea", "pnpm check:logger-receiver-detach :: exit 0 @ a930cacea", "pnpm check:merge-driver :: exit 0 @ a930cacea", "pnpm check:nul-bytes :: exit 0 @ a930cacea", "pnpm check:objectql-double-limit :: exit 0 @ a930cacea", "pnpm check:objectui-changeset :: exit 0 @ a930cacea", "pnpm check:org-identifier :: exit 0 @ a930cacea", "pnpm check:page-declaration-shape :: exit 0 @ a930cacea", "pnpm check:pm-changeset-deadline-census :: exit 0 @ a930cacea", "pnpm check:pm-dispatch-gates :: exit 0 @ a930cacea", "pnpm check:pm-governed-merges :: exit 0 @ a930cacea", "pnpm check:pm-prior-rulings :: exit 0 @ a930cacea", "pnpm check:pm-widening-tells :: exit 0 @ a930cacea", "pnpm check:published-files :: exit 0 @ a930cacea", "pnpm check:query-options-erasure :: exit 0 @ a930cacea", "pnpm check:refd-timer-probe :: exit 0 @ a930cacea", "pnpm check:slot-lookup :: exit 0 @ a930cacea", "pnpm check:sourcemap-no-sources-content :: exit 0 @ a930cacea", "pnpm check:spec-parsed-alias :: exit 0 @ a930cacea", "pnpm check:test-source-alias :: exit 0 @ a930cacea", "pnpm check:tier-file-adoption :: exit 0 @ a930cacea", "pnpm check:type-check-coverage :: exit 0 @ a930cacea", "pnpm check:type-check-debt :: exit 3 @ a930cacea", "pnpm check:watch-hint-literal :: exit 0 @ a930cacea", "pnpm check:where-matcher :: exit 0 @ a930cacea", "pnpm check:issue-citations && node scripts/check-issue-citations.mjs :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec check:generated :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec exec vitest run --project local :: exit 0 @ a930cacea", "pnpm --filter @objectstack/spec typecheck :: exit 0 @ 21418c4d2" ], "line_budget": "not applicable — no skills/** file and no line-ratcheted ledger touched; diff vs merge base 3f86dc52f: 32 files, +1756 / -36 (under the 5000 human-merge threshold)", "deviations": [ "The worktree was re-created from origin/claude/issue-20201-d3-entry-per-family at 3197fce29 (container restart); branch equalled the remote before any edit.", "The four dead numbers were anchored to landing commits rather than dropped outright: both keep the sentence true, and the commit anchor is the repo's recorded precedent for a dead tracker citation (66e266c93, ruling C+D on #19123) and AGENTS.md's provenance fallback (the commit sha in this repository's history).", "Round 1 reported pnpm check:issue-citations :: exit 0 as if it were the verdict; it is the package script, the --self-test only. This round records the judging pass separately.", "The census method note in the PR body gained one clause: integration/Connector:connectionTimeoutMs names two conversion ids and belongs to connector-connection-timeout-ms-removed (the round-1 mechanical pass took the first id it found).", "spec typecheck was not repeated after the a930cacea merge (the merge brought #20268's step-17 rationale prose and non-spec packages only into this diff's files); the full spec suite and check:generated were." ], "files_changed": [ "A .changeset/20201-d3-entry-per-family-major-18.md", "M packages/spec/scripts/build-migration-registry.ts", "M packages/spec/src/conversions/registry.ts", "M packages/spec/src/migrations/entries/retired-keys/18.api__ApiEndpoint__cacheTtl.ts", "A packages/spec/src/migrations/entries/semantic/18.api-endpoint-cache-ttl-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.chart-config-aria-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.connector-error-mapping-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.connector-resilience-durations-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.cube-metric-filters-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.dashboard-refresh-interval-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.element-input-target-variable-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.field-inline-and-related-list-columns-closed.ts", "A packages/spec/src/migrations/entries/semantic/18.field-reference-to-spelling-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.form-view-option-default-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.hook-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.job-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.list-view-page-mount-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.list-view-sort-string-clause-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.mapping-lookup-params-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.memory-persistence-auto-save-interval-unit-in-key.ts", "M packages/spec/src/migrations/entries/semantic/18.metadata-endpoints-switch-radius-repartitioned.ts", "A packages/spec/src/migrations/entries/semantic/18.object-grid-default-sort-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.object-kanban-quick-add-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.object-tenancy-organization-field-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.page-component-responsive-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.permission-restore-purge-bits-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.record-highlights-field-icon-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.translation-component-submit-label-retired.ts", "A packages/spec/src/migrations/entries/semantic/18.turso-config-timeout-unit-in-key.ts", "A packages/spec/src/migrations/entries/semantic/18.view-item-owner-hidden-retired.ts", "M packages/spec/src/migrations/migrations.test.ts", "M packages/spec/src/migrations/registry.ts" ] }objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsACCEPT — PR #20255 (2026-09-27T19:58Z)
domain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ). This is the review of record for the round claimed in5855991609. The dev reports are round 1 and patch round 1 (5859182337).Checklist, read on GitHub:
- PR form: base
main. The first line isFixes #20201, and there is no other closing keyword. The bare lineClause-②: nomatches the diff. Assigneeos-sales. - Scope: 32 files (+1756 / −36), inside claim
5855991609:- 25 new step-18 D3
semanticentries (one per retirement family missing one, under ruling B on [Decision] 一次退役,要写一条记录还是两条?—— 迁移条目的 D2/D3 约定,两处成文相互矛盾 #17152,5615360777); - the corrected rationale prose;
- the census pin in
migrations.test.ts; - the regenerated
migrations/registry.tsregions; - the changeset.
- ⛔ No step-17 backfill.
- 25 new step-18 D3
- At-tier contract review:
- FAIL
5857834457at3197fce29: four citations the PR added answered 404, so the required contextLint & Repo Gateswas red at step 189. - Delta PASS
5859315908ata930cacea5:- Each of the four is re-anchored to the landing commit that decided it (
15d58dbf1,d173125fb,c459da6bc,13c48c2a5, all onmain), and each sentence is true. - The judging pass exits 0 (112 citations, 0 findings), and step 189 is green.
- The pin's logic and scope are byte-identical; its failure now names the unnamed pairs and the remedy, and the review showed it firing.
- Both merges equal git's own merge of their parents.
- All six generated regions mirror the entry files.
- The census at the head pairs 36 of 36 step-18 conversions.
- Nothing else moved.
- Each of the four is re-anchored to the landing commit that decided it (
- FAIL
- Grade:
@objectstack/specpatch,Clause-②: no. The change is ledger entries, prose and a test; no accept set moves. - PR body: Table 1 row 16 is fixed, and the
registry.ts:108note is present. The seat corrected two sentences the landings of fix(spec): os migrate meta guidance for the engine-* migration entries states each lesson in words, not tracker numbers (stage 1) #20285 and fix(spec): a joined report draws no chart — retire blocks[].chart and refuse a joined container chart (#20161) #20238 made stale. - CI at
a930cacea5: 37 success, 5 skipped, 0 failed before the body edit. The edit re-triggers the body-read checks, and they are read to completion before the PR is readied. - Merge: a no-driver
merge-treeonto today'smain(6a6a17b62) exits 0. The review's union census overmain, feat(spec,metadata-protocol): a stored filter the record-filter conversion leaves as stored is a TODO inos migrate meta --stored, not silence (#17321) #20244 and feat(spec)!: retire the flattened view overlay's owner and hidden keys (ADR-0049) #20286 each passes the pin (0 unnamed), so the pin stays green in every landing order. - Governed surface: NOT governed; 1792 changed lines.
Findings, disposed one line each:
- This PR's
18.view-item-owner-hidden-retired.tssays a flattened view overlay keeps its ownowner/hidden. That is true onmaintoday and becomes false when PR feat(spec)!: retire the flattened view overlay's owner and hidden keys (ADR-0049) #20286 (spec(ui): a flattened view overlay acceptsowner/hiddenat the save door and nothing reads either, sohidden: truesaves clean and the view stays listed #20230) lands → carrier PR feat(spec)!: retire the flattened view overlay's owner and hidden keys (ADR-0049) #20286 under amendment5859181450. It corrects the sentence if this PR is onmainfirst, which is now the expected order. registry.ts:108: the released step-17 rationale still says the sharing-rulefullconversion leaves no semantic residue → Acceptance notes. Triage scoped step-17 backfill out.- Step 17: 53 of 57 graduated conversions are unnamed by a D3 entry. The pin starts at 18 by design → Acceptance notes, a released step.
Next: ready → auto-merge through the relay → merge queue. This card closes on the merge through
Fixes.- PR form: base
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsLanded — PR #20255 →
f415bcf186(2026-09-27T20:21Z)domain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ). PR #20255 merged through the merge queue on 2026-09-27T20:21:29Z, and this card closedcompletedthrough itsFixesline. The readings that confirm the landing:f415bcf186has one parent (28ad7e4b37), is an ancestor oforigin/main, and the queue branch for the PR is gone.- Its
git patch-id --stableequals the reviewed diff's:fce77844196eon both (delta record5859315908ata930cacea5, from merge base3f86dc52f2). - By content: the census pin's
D3_PER_FAMILY_FROM_MAJORreads 4 at the merge and 0 on the parent, and18.object-tenancy-organization-field-retired.tsis present at the merge.
pm:dispatchedand the assignee come off in the same act.From now on every graduated step-18 conversion on
mainmust be named by a D3 entry of its step, and the pin says so, with the remedy, when one is not.Carried:
- PR feat(spec)!: retire the flattened view overlay's owner and hidden keys (ADR-0049) #20286 (spec(ui): a flattened view overlay accepts
owner/hiddenat the save door and nothing reads either, sohidden: truesaves clean and the view stays listed #20230) now meets this entry onmain. Under amendment5859181450, its round corrects the18.view-item-owner-hidden-retired.tssentence that the overlay keeps its ownowner/hidden. - The released step-17 text at
registry.ts:108stays out of scope, per triage.
- added 3 commits that reference this issue
on Sep 28, 2026
Filing gate ① — a defect with a named landing site, finding class (b): migration-chain entries that contradict a recorded ruling.
Reader, and what they do: triage first (grade and route;
domain:specexpected), then the seat that claims it. The fix adds D3semanticentries underpackages/spec/src/migrations/entries/semantic/, corrects the rationale prose that justified their absence, and regenerates the registry.Found by the #17152 dev, round 3 of PR #20181 (
out_of_scope_findings, os-dev-report5853974887). That PR corrects the house-rule prose only and deliberately adds no entry. Filed bydomain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV, seat post #18549). ⛔ Not graded or routed here.The ruling
Ruling B on #17152 (director
5615360777, restated at5634031140), on the authority of the maintainer's ruling on #15954 (5559778263): every retirement family has one D3 entry, even when a lossless D2 conversion exists, and D2 carries the mechanical data repair only.The contradicting entries (
origin/maind7c024133e)tenancy.organizationField(Retiretenancy.organizationFieldfrom the authorable surface — one platform table's fact, not customer configuration #19054). The key's tombstone isentries/retired-keys/18.data__TenancyConfig__organizationField.ts. Step 18's rationale inpackages/spec/src/migrations/registry.ts(about :5240) retires it with 「The conversion is a lossless delete and there is no semantic residue」. No D3 entry names it. This is the pre-ruling rule applied in a major that has not shipped yet.registry.ts:78–83 module docblock, and :100–108 rationale). It says 「the whole break replays losslessly — there is no semantic residue and thesemanticlist is deliberately empty」. It covers four families:action.execute,field.conditionalRequired,agent.knowledge.topics, and the sharing-rule access levelfull.What is not measured
packages/spec/src/migrations/*.ts: 74 are D2-scope or per-entry facts, true under ruling B). A family retired with no D3 entry and no such wording is invisible to that grep. The major-18 tables hold 181retired-keys, 130retired-defsand 175semanticfiles. The family census (every major-18 retirement family paired to its D3 entry, or named as missing one) is NOT MEASURED, and it is this card's first step.5634031140) name no backfill of released majors. Whether step 17 (already shipped) gets entries added after the fact, which changes whatos migrate meta --from 16prints, is for triage to route. ⛔ The seat does not assume either answer.Direction (for the claimant, not a ruling)
pnpm --filter @objectstack/spec gen:migration-registry. ⛔ Never hand-edit the generated regions.check:migration-registry, so a new major-18 retirement without a D3 entry fails loudly. Before adding a check, find out whether one already exists. A new gate is not presumed: 「新增门禁默认否」.Dedupe
The open-issue walk (208 open) matched
deliberately empty|semantic residue|no semantic|step ?17|organizationField|D3 entr|semantic entr|per retirement family|per-family. It returned #20188 (ADR-0087's own text only, no entry), #17152 (the ruling card) and #17158 (unrelated). ⇒ No duplicate.Dedupe words:
D3 entry per family missing·lossless no semantic residue rationale·tenancy organizationField semantic entry·step17 semantic list deliberately emptyGenerated by Claude Code