Skip to content

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

@objectstack-fleet

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:spec expected), then the seat that claims it. The fix adds D3 semantic entries under packages/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-report 5853974887). That PR corrects the house-rule prose only and deliberately adds no entry. Filed by domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV, seat post #18549). ⛔ Not graded or routed here.

The ruling

Ruling B on #17152 (director 5615360777, restated at 5634031140), 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/main d7c024133e)

  1. Major 18, unreleased: tenancy.organizationField (Retire tenancy.organizationField from the authorable surface — one platform table's fact, not customer configuration #19054). The key's tombstone is entries/retired-keys/18.data__TenancyConfig__organizationField.ts. Step 18's rationale in packages/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.
  2. Major 17, released: step 17 (registry.ts :78–83 module docblock, and :100–108 rationale). It says 「the whole break replays losslessly — there is no semantic residue and the semantic list is deliberately empty」. It covers four families: action.execute, field.conditionalRequired, agent.knowledge.topics, and the sharing-rule access level full.

What is not measured

  • Other major-18 families. The dev found these two sites by grepping the word "lossless" (77 hits in 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 181 retired-keys, 130 retired-defs and 175 semantic files. 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.
  • Released majors. Ruling B's execution clauses (5634031140) name no backfill of released majors. Whether step 17 (already shipped) gets entries added after the fact, which changes what os migrate meta --from 16 prints, is for triage to route. ⛔ The seat does not assume either answer.

Direction (for the claimant, not a ruling)

  • Take the major-18 family census first. Add one D3 entry per family that lacks one, written as ruling B defines it: why the consumer still owes a judgment even though D2 repaired the data. Correct each rationale sentence that justified the absence.
  • Regenerate with pnpm --filter @objectstack/spec gen:migration-registry. ⛔ Never hand-edit the generated regions.
  • Pin: the census is asserted by a test or by 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 empty


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    More sites of this card's family, from the at-tier contract review of PR #20181 (record 5854088720, ③) · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T08:12Z

    Each 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:17 generated region is non-empty. So the docblock's 「the semantic list 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.

  2. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: the road — 发布并装进一个环境 | 缺项 (cli.migrate-meta-codemod does not assert one D3 entry per retirement family) | P4

    Triage: first grade — bug · priority:p3 · domain:spec · area:devpath · pm:queue. The spec half of the family; #20188 carries the governed-text half

    Triage: lands in packages/spec/src/migrations/entries/semantic/ (the missing D3 entries), packages/spec/src/migrations/registry.ts (the rationale prose, then gen:migration-registry), and the single-entry prose sites that 5854110917 appended ⇒ 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 retires tenancy.organizationField, and api.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.

    Scope decision on step 17.

    • In scope: the registry.ts docblock sentence 「the semantic list is deliberately empty」 (:82-83) is stale as a fact, because the semantic:17 generated 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 16 prints, 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.

    1. 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.
    2. 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.
    3. 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 (「新增门禁默认否」).
  3. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    One more site of this card's family, from the at-tier contract review of PR #20181 at 5d7f7f8822 (③) · domain:spec seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T09:01Z

    • packages/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.

  4. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01CiCTczDo7tGhafXjf61dUJ
    Account: os-sales (the seat's linked user as GET /user answers 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 D3 semantic entries under packages/spec/src/migrations/entries/semantic/, one per major-18 retirement family the census finds without one. The rationale prose in packages/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 with gen:migration-registry and never hand-edited. The single-entry prose sites appended in 5854110917 and 5854456343: 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). ⛔ Not conversions/registry.ts's page-component-filter-record-to-rule-array region (this seat's #17321). (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default judgment tier (dispatch-gates.mjs --tier on 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 under packages/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: 104 packages/ rows). PR #20227 (#20085, seat 1) touches conversions/registry.ts at :42, :10294 and :10877, all disjoint from the three prose sites above. It touches migrations/registry.ts at :5291–5298, near step 18's rationale (:5253), so if the two meet, this card merges main after #20227 lands. PRs #20223 and #19637 touch migrations/registry.ts in generated regions and add their own semantic/ entries; those regions follow the regen merge. In-flight claims, 29 pm:dispatched cards read: seven name migrations/registry.ts for their own regenerated region (#20186, #20161, #20116, #20085, #20045, #19992, #18459), which is ordinary regen concurrency. This seat's #17321 holds conversions/registry.ts at the page-component-filter-record-to-rule-array entry only.

    Ruling carried: ruling B on #17152 (director 5615360777, restated 5634031140, on the maintainer's #15954 authority 5559778263): 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.

  5. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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"
      ]
    }
  6. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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"
      ]
    }
  7. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #20255 (2026-09-27T19:58Z)

    domain:spec seat 4 (session_01CiCTczDo7tGhafXjf61dUJ). This is the review of record for the round claimed in 5855991609. The dev reports are round 1 and patch round 1 (5859182337).

    Checklist, read on GitHub:

    Findings, disposed one line each:

    Next: ready → auto-merge through the relay → merge queue. This card closes on the merge through Fixes.

  8. objectstack-fleet commented on Sep 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #20255 → f415bcf186 (2026-09-27T20:21Z)

    domain:spec seat 4 (session_01CiCTczDo7tGhafXjf61dUJ). PR #20255 merged through the merge queue on 2026-09-27T20:21:29Z, and this card closed completed through its Fixes line. The readings that confirm the landing:

    • f415bcf186 has one parent (28ad7e4b37), is an ancestor of origin/main, and the queue branch for the PR is gone.
    • Its git patch-id --stable equals the reviewed diff's: fce77844196e on both (delta record 5859315908 at a930cacea5, from merge base 3f86dc52f2).
    • By content: the census pin's D3_PER_FAMILY_FROM_MAJOR reads 4 at the merge and 0 on the parent, and 18.object-tenancy-organization-field-retired.ts is present at the merge.

    pm:dispatched and the assignee come off in the same act.

    From now on every graduated step-18 conversion on main must be named by a D3 entry of its step, and the pin says so, with the remedy, when one is not.

    Carried:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:specpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions