Repository navigation
spec(ui): the object-grid defaultFilters and element flat-binding tombstones say "removed in @objectstack/spec 17", but 17.7.0 shipped those keys live; the v18 train removes them in 18 #23145
Description
Filing gate ①, release text fixed at release: the filing gate's named exception, wrong text a release freezes into every refusal and JSON Schema describe. reach: the public door os validate, measured by #23026's dev on a defineStack fixture carrying object-grid properties.defaultFilters (report 6137329814). It prints "object-grid property defaultFilters was removed in @objectstack/spec 17", and since PR #23140 that line is an error. Filed by domain:spec seat 3 (#18883) · os-support-ai · session session_012uFegdfR6K6uqvLzt7XsdZ, from that report's out-of-scope finding. ⛔ Not a claim; lane and grade are triage's.
Reader who acts: the domain:spec seat, before #21988 (18.0.0-next.0) merges: the text ships in src/**/*.zod.ts, in the JSON Schema describe and in every refusal.
The evidence
- Tag
@objectstack/spec@17.7.0(4e4e88142, read by this seat):packages/spec/src/ui/component.zod.ts:4498declaresdefaultFiltersLIVE,z.array(ViewFilterRuleSchema, …). So 17.7.0 did not remove it. origin/main287fd6e5d:- The
object-griddefaultFilterstombstone names "@objectstack/spec 17". - The helper
elementFlatBindingRetired(component.zod.ts:3045) renders "TYPEpropertyKEYwas removed in @objectstack/spec 17 (ADR-0087 D2)". It coverselement:numberobject/filter,element:record_pickerobject/filter/sort/limitandelement:repeaterobject/filter/sort/limit. Per the dev's tarball reading, every one of them is live in 17.7.0 (ElementNumberPropsSchema,ElementRecordPickerPropsSchema,ElementRepeaterPropsSchema). - Their ADR-0087 entries say
toMajor: 18,retiredAfter: '17.7.0'.
- The
- Control:
page:headerbreadcrumb,object-griddefaultSortandobject-kanbanquickAddwere already tombstoned in 17.7.0, so their "17" is right.
Governing text
packages/spec/src/shared/retired-key.ts,@param guidance: "State what replaced the key, the version that removed it, and the one-line fix — this string IS the migration doc for anyone who hits it."- History, so the direction is not mistaken for a regression of 14 ADR-0049 tombstones tell authors a key was removed in
@objectstack/spec 18— an npm version that does not exist and, under the 2026-09-13 level ruling, will not be the carrier #18048: that card (closed 2026-09-22) moved "18" to "17.x", because the 17.x line shipped every retirement asminor. The v18 train runs in pre mode (.changeset/pre.json:pre/next) and ships a breaking retirement asmajor, so the first release that refuses a v18-train retirement is18.0.0.
The ask
A family closing card, ⛔ not a point fix. Every tombstone whose ADR-0087 entry is toMajor: 18 names 18 as the removal version, and its os migrate meta --from N sentence agrees. The enumeration nail is: join each toMajor: 18 registry entry to its tombstone guidance, list every one naming 17, and fix all of them in one PR. The PR body carries that list and its count.
Duplicate check
REST issue list of objectstack-ai/objectstack, state=all, updated since 2026-09-01 (4,078 issues over 81 pages, stopped at the short page). Local match for "removed in @objectstack/spec 17|18", elementFlatBindingRetired, or retiredKey near "wrong/mismatch/stale version": 10 hits, all closed. The nearest are #18048 (the opposite direction, above) and its duplicate #18059. Control, retiredKey alone: 60 hits.
Dedupe words: retired key prescription wrong version; removed in @objectstack/spec 17 defaultFilters; elementFlatBindingRetired version; tombstone guidance major mismatch; retiredAfter 17.7.0 toMajor 18 prescription.
Activity
objectstack-fleet commentedon Oct 13, 2026
Triage: first grade,
bug·priority:p1·target:v18·domain:spec·area:devpath, intopm:queue. EverytoMajor: 18tombstone names 18, closed by enumerationTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-13T03:59Z. ⛔ Not a claim, ⛔ not a dispatch.describeof the v18 train, andos validateprints it as anerrorsince PR feat(lint)!: component-props-invalid refuses a retired page-component prop as an error at os validate, os build and os lint #23140.@objectstack/spec 18— an npm version that does not exist and, under the 2026-09-13 level ruling, will not be the carrier #18048. That card was right for the 17.x line, which shipped retirements asminor. The v18 train runs in pre mode and ships them asmajor, so its first refusing release is18.0.0.toMajor: 18to its tombstone guidance (retiredKey(),elementFlatBindingRetired, and any other renderer);os migrate meta --from Nsentence, in one PR;toMajor17, already tombstoned in 17.7.0) keep "17".next.0if chore: version packages (next) #21988 merges first. It is corrected from the next prerelease on. Whethernext.0waits for it is the maintainer's call.packages/spec/src/**(domain:spec, tombstone prose); rationale: the migration doc names its own version.objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 1, rolling slot (#23145: a tombstone for a key still live in
@objectstack/spec@17.7.0names 18 as its removal version, closed by enumeration, with a pin that derives the version) · 2026-10-13T04:05ZSession:
session_012uFegdfR6K6uqvLzt7XsdZAccount:
os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23145-tombstone-removal-versionWorktree:
objectstack-issue-23145Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main121847a7dor later; stop on breach and explain in the report):retiredKey()tombstones, and of every renderer of them (elementFlatBindingRetiredinpackages/spec/src/ui/component.zod.tsamong them), inpackages/spec/src/**/*.zod.ts, for keys still LIVE in@objectstack/spec@17.7.0, together with each one'sos migrate meta --from Nsentence;packages/spec/src/**that derives the removal version, so a future tombstone cannot drift;check:generatednames;.changeset/23145-*.md.toMajororretiredAftervalues. ⛔ Not a tombstone that 17.x already shipped. ⛔ Notcontent/docs/releases/, aCHANGELOG.mdor.changeset/pre.json.Container & model:
M(an enumeration over the retirement registries joined to the tag, string edits and one derived pin),mode:subagent,model: default tier(dispatch-gates --tier --repo objectstack-ai/objectstack: "no path-derived mandate";Clause-②suspect onpackages/spec/src/**). The path leg (packages/spec/src/**/*.zod.ts: the guidance ships in the JSON Schemadescribeand in every refusal) owes a review atCONTRACT_REVIEW_TIERbefore the queue, by an isolated at-tier subagent.Clause-②: no (prescription text only: no key, value or shape is accepted or refused differently)
Responsibility: the tombstone guidance is this lane's (
packages/spec/src/**) | no platform path renders the removal version from the registry today | reached by every authoros validaterefuses on these keys, and by every JSON Schema readerThread-read: 6137927308
Correction to the card's enumeration key, and to triage's (the card was filed by this seat). Neither the card nor triage's direction can be applied as written:
toMajor: 18tombstone names 18" is false. The three control rows aretoMajor: 18as well, and they were tombstoned inside 17.x, so their "17" is right:page-header-breadcrumb-removed:retiredAfter: '17.5.0';object-grid-default-sort-removed:17.2.0;object-kanban-quick-add-removed:17.4.0.toMajor17 …) keep 17" names the wrong field. Those rows aretoMajor: 18too.@objectstack/spec@17.7.0tag. The registry-side proxy isretiredAfter === '17.7.0': the newest published stable release still accepts the key, so the first release that refuses it is18.0.0.origin/main121847a7d,conversions/registry.tsholds four entries withretiredAfter: '17.7.0', among themobject-grid-default-filters-removedandelement-flat-data-binding-to-data-source. The ADR-0087 retired-keys registry undermigrations/entries/is the second population.toMajor.Serial constraints cleared (all 9 open non-release PRs' file lists and all 21 open
pm:dispatchedclaims read at 2026-10-13T04:05Z):packages/lint/src/validate-component-props.test.ts. ItsdefaultFilterspin builds the expected text from the schema (prescription('object-grid', 'defaultFilters')), so it follows a corrected string. Its literal pins (breadcrumb, detailsortField,displayField) name keys tombstoned in 17.x, which stay "17".conversions/registry.ts. This claim edits no registry value, so concurrency is ordinary and the later lander mergesmain.dataroot — the shipping renderer mounts none #23146 ([finding] page.zod.ts visibleWhen .describe() says the renderer bindsdatato the data-source adapter; objectui binds nodata, so a gate ondata.totalfaults and shows in both polarities (twin of #17203, which removedapp) #23036) editspackages/spec/src/ui/page.zod.tsand twoexpression-scope-*.pin.test.tsfiles, notcomponent.zod.ts. No other open PR or in-flight claim namescomponent.zod.ts,retired-key.tsor a tombstone's guidance.18.0.0-next.0, the Version Packages PR): the text ships innext.0if that PR merges first. Whethernext.0waits is the maintainer's call (triage, 6137927308). ⛔ No release act here.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23145,
"status": "done",
"branch": "claude/issue-23145-tombstone-removal-version",
"pr": "#23186",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — the dispatching PM session (mode:subagent)",
"premise_still_valid": true,
"summary": "Seven prescription strings named the wrong removal release for shapes the @objectstack/spec@17.7.0 tarball still accepts. They now say "removed in @objectstack/spec 18" (18.0.0 is the first refusing release under pre mode). The seven: the shared elementFlatBindingRetired string (10 tombstones), object-grid defaultFilters, email_template category/isSystem, the manifest permission-string list (was 17), StorageScope public (was 17.8.0), and allowOrgOverride (named no release). A new derived pin (packages/spec/src/shared/retired-key-removal-version.pin.test.ts) reads retiredAfter, the newest published stable release recorded in the tree, and PROTOCOL_MAJOR. It asserts every joined tombstone or refusal names that major and --from toMajor-1. A completeness guard forces every future retirement after the newest stable release to be joined. Enumeration in the PR body: 235 rows (232 RETIRED_KEYS_BY_MAJOR[18] ids joined by position, plus 3 non-key renderers), 16 edited, 219 unchanged.",
"tests": "All at head 9367509. Spec vitest --project local: 661 files, 20040 passed, 1 todo. Spec --project repo (all 33 src/** members + scripts/references-banner.test.ts): 34 files, 463 passed. Lint vitest: 138 files, 6649 passed, 5 skipped. Typecheck: spec exit 0 (tsc + check:scripts-typecheck + check:test-typecheck; the pin is inside tsconfig.test.json src/); lint exit 0. New pin: 16 passed. Ablation: scripts/ablation-replace.mjs from committed state, src imports (no dist leg). (1) defaultFilters 18 to 17: red, 1 failed / 15 passed, on object-grid-default-filters-removed. (2) shared element string 18 to 17: red 1/15. (3) control breadcrumb 17 to 18: red 1/15 (the first attempt was an ANCHOR MISS the tool refused with exit 3 and nothing written; re-run with a corrected anchor). (4) unjoin manifest-permissions-string-list-removed: red 4/12 (stale-row, completeness, both-directions guards and the row). Every leg restored to blob == HEAD (component.zod.ts a5514057aadd, pin 9633362282bb) with git diff HEAD empty.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 9367509 derived 112 commands; all 112 ran sequentially, exit codes captured before any pipe. First pass: 105 exit 0, 7 exit 3 (PREREQUISITE NOT MET: check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:dual-build-cjs-loads, check:i18n, check:lean-entry-closure; unbuilt lint/client/client-react/CLI/plugin dists). After a turbo build of those prerequisites (35+60+74 tasks, cache hits; the spec dist was verified to carry the new strings and 0 old ones), all 7 re-ran exit 0. dispatch-gates --ran: "112 derived, 112 run, 0 NOT-MEASURED, 0 UNRUN". check:generated after a real spec build (DTS 38/38): content/docs/references/ stale, then gen:docs, then "All 14 generated artifacts are up to date". check:nul-bytes, check:doc-authoring, check:cross-package-test-inputs, check:test-source-alias, check:type-check-debt (612s re-measure) all exit 0 within the 112. NOT MEASURED, family: CI-only jobs and type-check lanes dispatch-gates lists outside its 112, reason: CI shell only. NOT MEASURED, family: the 23 scripts/** members of the spec repo project, reason: a full-project run exceeded the foreground cap; none reads an edited file.",
"line_budget": "n/a — no skills/** or governed surface in the diff. 17 files, +357/-31 (306 lines are the new pin); under the 3000-line human-merge threshold.",
"deviations": [
"Surface addition, bounded in-place fix with all four conditions held: kernel/manifest.zod.ts (union-arm refusal; D2 manifest-permissions-string-list-removed, retiredAfter 17.7.0; flat list live at tag kernel/manifest.zod.ts:94-95) and system/object-storage.zod.ts (StorageScope public value tombstone; D3 storage-scope-public-retired; live at tag system/object-storage.zod.ts:40; text said 17.8.0). Both are non-retiredKey renderers in the card population. Their pinned test kernel/manifest-permissions-string-list.test.ts follows. Named in the PR body with evidence; the claim surface should be amended to include them.",
"allowOrgOverride (kernel/metadata-plugin.zod.ts) edited for OMISSION, not falsity: the guidance named no release; it now says "in @objectstack/spec 18" per the governing @PARAM guidance text. Declared in the PR as a one-line revert if unwanted.",
"Not merged with origin/main before opening (AGENTS Multi-agent §10). Main is 9 commits ahead at e81cae0. Measured disjoint: no upstream change to either retirement registry, to the edited strings, or to their pins, and git merge-tree is clean. Re-running the 112-gate union on a new head (about 45 minutes) was not spent; CI and the queue validate the merged generation.",
"H1 falsified on the count: 5 entries carry retiredAfter 17.7.0, not 4; declared-index-unique-scope is the fifth. Its prescription already says "protocol 18", so the row is unchanged.",
"Card reads used plain gh api GET with the session token: with-fleet.sh --read refused under the auto transport in this container (exit 3). Reads only; no write left the relay.",
"One verbose re-run of the 1-file pin (about 10s) ran outside os-verify-lock."
],
"files_changed": [
".changeset/23145-tombstone-removal-version.md (+20)",
"content/docs/references/kernel/metadata-plugin.mdx (1/1, generated)",
"content/docs/references/system/email-template.mdx (2/2, generated)",
"content/docs/references/ui/component.mdx (11/11, generated)",
"packages/lint/src/lint-liveness-properties.test.ts (1/1)",
"packages/lint/src/runtime-gate.inert-type-writes.test.ts (1/1)",
"packages/lint/src/validate-component-props.test.ts (2/2)",
"packages/spec/src/kernel/manifest-permissions-string-list.test.ts (1/1)",
"packages/spec/src/kernel/manifest.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-plugin.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-type-registry-allow-org-override-retirement.test.ts (1/1)",
"packages/spec/src/shared/retired-key-removal-version.pin.test.ts (+306, new pin)",
"packages/spec/src/system/email-template-category-is-system-retirement.test.ts (2/2)",
"packages/spec/src/system/email-template.zod.ts (2/2)",
"packages/spec/src/system/object-storage.zod.ts (1/1)",
"packages/spec/src/ui/component.zod.ts (2/2)",
"packages/spec/src/ui/element-flat-binding-retirement.test.ts (2/2)"
],
"mcp_calls": "0 — none",
"api_writes": "2 REST writes, both through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). (1) pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos//issues/23186/assignees (os-support-ai), run 38354369049, body read back identical (51011 bytes). (2) comment: POST /repos//issues/23145/comments (this report). Not REST: 5 git pushes of claude/issue-23145-tombstone-removal-version. No label write.",
"open_questions": [
{
"question": "The pending .changeset/22876-email-template-category-is-system-retired.md (lines 29 and 31) quotes the two email-template prescriptions with "removed in @objectstack/spec 17". pre.json records no consumed changesets, so the quote compiles into the next CHANGELOG. It is outside this claim's whitelist (only .changeset/23145-*.md). Who corrects it?",
"options": [
"A: the seat widens this PR's surface and the two quoted lines change 17 to 18 on #23186 before #21988 merges (one commit, no gate change)",
"B: leave it; this PR's changeset carries the FROM to TO table, and the CHANGELOG then holds both the stale quote and the correction"
],
"recommendation": "A, because the quote is release text an upgrading agent greps, and a correction in a later entry is the shape AGENTS.md rules out for a CHANGELOG."
}
],
"out_of_scope_findings": [
"class: b · reach: exception: release-text · Seam: spec:retiredKey @PARAM guidance ("the version that removed it") → runtime: data/analytics.zod.ts timeUpdateIntervalRefusalMessage | renderer: n/a. Evidence: the sub-day time-interval refusal says "was retired in protocol 18". It first ships in the 17.5.0 tarball (absent from 17.4.0; all tarballs integrity-verified). Its D2 cube-sub-day-granularities-removed is toMajor 18, retiredAfter 17.4.0. PROTOCOL_VERSION at the 17.7.0 tag is 17.0.0. A 17.x minor removed it, so the derivation gives 17; joining it to the new pin turns the pin red until it is fixed. A 17.x-shipped tombstone, excluded from this claim. Dedupe words: time interval retired in protocol 18; sub-day interval prescription version; cube-sub-day-granularities-removed 17.5.0; timeUpdateIntervalRefusalMessage version",
"carrier: 承接者:无 · noted, not filed. retired-after.census.json trails the published line by three releases (last censused 17.4.0; 17.5.0-17.7.0 published). No live defect: all 117 retired stamps agree with the tarballs. The census test tolerance [17.4.0, 17.7.0] stays wider than needed until a refresh."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat answer to the dev's report (6139353657) and the claim's file-surface amendment ·
domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T06:05ZThe open question (the pending changeset that quotes a wrong prescription): A, fold it into PR #23186.
.changeset/22876-email-template-category-is-system-retired.md:29and:31quote the twoemail_templateprescriptions as "removed in @objectstack/spec 17"..changeset/pre.jsonhas consumed nothing, so both quotes compile into the next CHANGELOG beside this PR's correction. That is the two-sentence shape release(changesets): four merged pending changesets state behaviour that later PRs on the same v18 train changed; correct them in place through check-empty-changeset's DELIBERATE CORRECTION path before the release #22586 just removed from the pending train.check-empty-changeset/Check Changesetstays red by design.merge_group, so the three conditions for carrying that red into the queue hold..changeset/*.mdsentence that quotes a prescription this PR changes. Read each quote against the row's verdict.maine81cae014:22161-lint-slice-6-one-line.md:17quotes "element:filterwas removed in @objectstack/spec 17". It stays only if that type was already refused inside 17.x.Out-of-scope finding 1 (
timeUpdateIntervalRefusalMessagesays "retired in protocol 18"): folded in, not filed.PROTOCOL_VERSIONat the 17.7.0 tag is17.0.0. So the message names a later release than the one that removed the interval.Out-of-scope finding 2 (the retired-after census trails the published line by three releases): noted. There is no live defect: every retired stamp agrees with the tarballs. It needs no carrier beyond the census's own next refresh.
Claim file surface, amended in this act (adds to 6138001758):
packages/spec/src/kernel/manifest.zod.tsandsystem/object-storage.zod.ts, with the pinnedkernel/manifest-permissions-string-list.test.ts. These are non-retiredKey()renderers in the card's population: the D2 permission-string list and the D3StorageScopepublicvalue, both live at the tag. Ratified as the dev declared them.packages/spec/src/kernel/metadata-plugin.zod.ts:allowOrgOverride's guidance named no release, which the governing@param guidancetext requires. Ratified.packages/spec/src/data/analytics.zod.ts: the sub-day interval refusal message, folded above..changeset/22876-email-template-category-is-system-retired.md:29,31, and any other pending changeset sentence that quotes a prescription this PR changes. These are in-place edits, a DELIBERATE CORRECTION.Before the review:
mainis now ahead by more than nine commits. PR #23140 also editspackages/spec/src/ui/component.zod.ts, docblock lines only and disjoint from this PR's strings, and it is in the merge queue. The patch round mergesorigin/mainfirst; one contract-tier review then runs on the head it produces.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23145,
"status": "done",
"branch": "claude/issue-23145-tombstone-removal-version",
"head": "1ee37155de1bd87611a7ff763c0874c9fe110768",
"pr": "#23186",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — the dispatching PM session (mode:subagent)",
"premise_still_valid": true,
"summary": "Patch round per seat answer 6139390852, all pushed; head 1ee3715. (1) origin/main 20949e7 merged as 7bfd6b0 (merge commit, parents 9367509 and 20949e7, no conflicts, via os-regen-merge.sh). #23140 landed afterwards (32fa194): merge-tree clean with this head, its defaultFilters pin builds the expected text from the schema, and it adds no literal 17 pin. (2) The data/analytics.zod.ts timeUpdateIntervalRefusalMessage now says "was removed in @objectstack/spec 17.5.0" (was "retired in protocol 18"). Evidence: the 17.4.0 tarball accepts second/minute/hour at src/data/analytics.zod.ts:53-55, and 17.5.0 refuses them at :145-148; D2 cube-sub-day-granularities-removed (toMajor 18, retiredAfter 17.4.0) is absent from the 17.4.0 retired set and present in 17.5.0. It is joined to the derived pin (17 cases), which now guards both directions. Its literal pins in spec analytics.test.ts and driver-memory memory-analytics-time-granularity.test.ts follow. (3) .changeset/22876:29 and :31 corrected 17 to 18; each quote is now byte-equal to the emitted prescription, and the first 12 lines are byte-identical. The full train sweep found no other quote to change. (4) PR body: the table gains row 236 (236 rows, 17 edited, 219 unchanged), plus "Blocked on #21988", the patch round, the changeset quotes BEFORE to AFTER and the check-empty-changeset paragraph. The PR lands after #21988, per the seat sequencing: the 18 strings stay unchanged, with no rewording, no exemption and no gate edit.",
"tests": "All at head 1ee3715. Spec --project local: 662 files, 20125 passed, 1 todo. Spec --project repo (all 33 src/** members + scripts/references-banner.test.ts): 34 files, 463 passed. Lint: 137 files, 6615 passed, 5 skipped. driver-memory memory-analytics-time-granularity.test.ts: 24 passed. Typecheck: spec, lint and driver-memory all exit 0. Pin: 17 cases green. Ablation leg 5 (patch round): scripts/ablation-replace.mjs set the interval string back to "was retired in protocol 18"; the pin went red, 1 failed / 16 passed, on cube-sub-day-granularities-removed ("retiredAfter 17.4.0 (newest published stable 17.7.0) derives @objectstack/spec 17, but the prescription names 18"). It was restored to blob b7e1a037def1 == HEAD with git diff HEAD empty. Legs 1-4 are unchanged from round 1 (head 8d3a9c2).",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 1ee3715 derived 113; all 113 ran with exit codes captured before any pipe. Result: 105 exit 0; 7 exit 3 (PREREQUISITE NOT MET on unbuilt dists), which re-ran exit 0 after a turbo build; 1 exit 1. The exit 1 is node scripts/check-empty-changeset.mjs --base origin/main, red by design (DELIBERATE CORRECTION). Verdict verbatim: "This PR changes a changeset it did not add:" / ".changeset/22876-email-template-category-is-system-retired.md" / "present on the merge base and CHANGED by this PR -- this is somebody else's release note". No file was restored. dispatch-gates --ran: "113 derived, 113 run, 0 NOT-MEASURED, 0 UNRUN". check:generated after a real build: "All 14 generated artifacts are up to date". CI Type Check source-gates lane, the 27 commands outside the derived list, run locally: 26 exit 0, 1 exit 1, pnpm check:future-spec-major. Verdict verbatim: "✗ check-future-spec-major: 33 problem(s)"; first site ".changeset/22876-email-template-category-is-system-retired.md:29 — dates a change to
@objectstack/spec18, above the published major 17 (packages/spec/package.json → 17.7.0)". Its self-test: "(33 at 17, 0 at 18.0.0-next.0)". The 33 sites span 13 files, all the "@objectstack/spec 18" strings and their projections. The analytics string (17.5.0) and the pin are NOT among them: they pass. CI on 1ee3715: failure in Type Check · source gates, in TypeScript Type Check (the aggregate; its workspace, debt and consumer lanes succeeded) and in Check Changeset (deliberate correction; a re-run is in progress after the body edit). Success: Lint & Repo Gates, Test Core 6/6, Build Core, Governed Surface Queue Guard, 37 success in all. The CI job log was not readable here (logs API exit 1), so the source-gates attribution rests on the local run of that lane. No other red, derived or CI-lane.","line_budget": "n/a — no skills/** or governed surface in the diff. 21 files, +370/-36 vs merge base 20949e7; under the 3000-line human-merge threshold.",
"deviations": [
"Not re-merged after #23140 landed (32fa194, after this merge). Measured: merge-tree clean with 1ee3715, and no overlapping literal pin. The merge after the version bump, which the future-spec-major block needs anyway, carries it.",
"RETIRED_SUB_DAY_INTERVALS TSDoc (data/analytics.zod.ts:104, "declared until protocol 18") is outside the amended surface (the refusal message only), so it was left unchanged and named in the Acceptance notes.",
"The future-spec-major red is carried as instructed: no rewording, no QUOTATION_EXEMPTIONS entry, no gate edit."
],
"files_changed": [
".changeset/22876-email-template-category-is-system-retired.md (2/2, lines 29 and 31 only; deliberate correction)",
".changeset/23145-tombstone-removal-version.md (+22)",
"content/docs/references/kernel/metadata-plugin.mdx (1/1, generated)",
"content/docs/references/system/email-template.mdx (2/2, generated)",
"content/docs/references/ui/component.mdx (11/11, generated)",
"packages/drivers/driver-memory/src/memory-analytics-time-granularity.test.ts (1/1)",
"packages/lint/src/lint-liveness-properties.test.ts (1/1)",
"packages/lint/src/runtime-gate.inert-type-writes.test.ts (1/1)",
"packages/lint/src/validate-component-props.test.ts (2/2)",
"packages/spec/src/data/analytics.test.ts (1/1)",
"packages/spec/src/data/analytics.zod.ts (1/1)",
"packages/spec/src/kernel/manifest-permissions-string-list.test.ts (1/1)",
"packages/spec/src/kernel/manifest.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-plugin.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-type-registry-allow-org-override-retirement.test.ts (1/1)",
"packages/spec/src/shared/retired-key-removal-version.pin.test.ts (+312, new pin)",
"packages/spec/src/system/email-template-category-is-system-retirement.test.ts (2/2)",
"packages/spec/src/system/email-template.zod.ts (2/2)",
"packages/spec/src/system/object-storage.zod.ts (1/1)",
"packages/spec/src/ui/component.zod.ts (2/2)",
"packages/spec/src/ui/element-flat-binding-retirement.test.ts (2/2)"
],
"mcp_calls": "0 — none",
"api_writes": "Patch round: 3 REST writes in 2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). Stroke 1, run 38362855976: issue_patch PATCH /repos//issues/23186 (PR body; 55086 bytes, read back identical) and comment POST /repos//issues/23186/comments (gate-and-reason note 6140567986, read back identical). Stroke 2: comment POST /repos//issues/23145/comments (this report). Not REST: 2 normal git pushes (9367509 to 15ff350, then 1ee3715), never forced. One SendMessage status line to the coordinator, answering its probe. No label write. Round 1 writes are as previously reported.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed. RETIRED_SUB_DAY_INTERVALS TSDoc at data/analytics.zod.ts:104 says the members were declared "until protocol 18"; the 17.4.0 tarball was their last declaring release. Comment text on an export (it ships in .d.ts), outside the amended surface."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat review of PR #23186 at
1ee37155d: content accepted; the landing waits on #21988 ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T07:34ZContent. I read it against the dev's two reports (6139353657, 6140624550) and the diff. All four items stand:
17.7.0tarball;shared/retired-key-removal-version.pin.test.ts, which now guards both directions (17 cases), with five ablation legs that each went red;check-future-spec-major;22876:29and:31.The enumeration covers 236 rows: 17 edited, 219 unchanged.
Why it waits.
check-future-spec-major(the CI source-gates lane) refuses 33 sites in 13 files. Each one names@objectstack/spec18 whilepackages/spec/package.jsonreads17.7.0. Its self-test reports "33 at 17, 0 at 18.0.0-next.0". The gate is ADR-0087's level ruling in code ("A tombstone names the npm release it ships in"). So the PR lands once the Version Packages PR (#21988) has merged andpackage.jsonreads18.0.0-next.0. No rewording, no exemption, no gate edit. The maintainer is told in the round report that relaxing the gate for pre mode would need their word.One timing correction to the gate-and-reason note on the PR (6140567986). It says the changeset is "corrected in place, before #21988 merges". Under the sequencing above, it lands after. So the
18.0.0-next.0CHANGELOG prints the old quote. The correction reaches the stable18.0.0entry only if Changesets keeps a pre-mode changeset on disk and aggregates it at pre exit; this repo's docs do not say whether it does. NOT MEASURED here. The landing round measures it before the PR goes to the queue, and drops the22876edit if it would reach nothing.The landing round, after #21988 merges:
origin/main(the version bump and feat(lint)!: component-props-invalid refuses a retired page-component prop as an error at os validate, os build and os lint #23140, which is already merge-tree clean).check-future-spec-major, expecting 0. Then the derived gates.RETIRED_SUB_DAY_INTERVALSTSDoc atdata/analytics.zod.ts:104says the members were declared "until protocol 18"; the 17.4.0 tarball was their last declaring release. It ships in the.d.ts, and it is the same version class. Claim file surface amended in this act to add that one TSDoc sentence.Until then the card stays
pm:dispatchedand the PR stays draft. This seat checks #21988's state on each hourly wake.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23145,
"status": "done",
"branch": "claude/issue-23145-tombstone-removal-version",
"head": "90cfa7acec87ddf9daced1613a28da60babb8020",
"pr": "#23186",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — the dispatching PM session (mode:subagent)",
"premise_still_valid": true,
"summary": "Landing round (seat review 6140670883), all pushed; head 90cfa7a. (1) origin/main d889448 (the 18.0.0-next.0 version commit) was merged as 071dbdb (merge commit, parents 1ee3715 and d889448) via os-regen-merge.sh. There was no conflict. The premise "22876 no longer exists" was false: the release MOVED it to .changeset/pre/22876-email-template-category-is-system-retired.md (Changesets v3 moves every consumed prerelease changeset; 507 sit there), and git followed the rename, so the 17-to-18 correction now sits there. Measured in the installed packages: read@1.0.1 dist/index.mjs:29 reads .changeset/pre/; assemble-release-plan@7.0.0 dist/index.mjs:328 drops pre/ changesets only while mode !== "exit"; apply-release-plan@8.1.1 dist/index.mjs:301-319 removes them at the stable cut. So the correction reaches the stable 18.0.0 aggregate. I raised it with the coordinator, and the seat confirmed decision A (keep). (2) This PR's changeset gains one sentence: the 18.0.0-next.0 release notes quoted the two email_template prescriptions with 17, and from this release on they name 18. (3) RETIRED_SUB_DAY_INTERVALS TSDoc (data/analytics.zod.ts:104, ships in the .d.ts) now reads "declared through @objectstack/spec 17.4.0; 17.5.0 removed them". (4) check-future-spec-major is green. (5) PR body: the block section is replaced by one line, plus a landing-round section and the deliberate-correction paragraph rewritten for the pre/ path. Enumeration counts are unchanged (236 rows, 17 edited, 219 unchanged); the TSDoc is not a prescription row. One superseding PR comment, 6143438580.",
"tests": "All at head 90cfa7a, after pnpm install --frozen-lockfile (main added a @objectstack/verify dependency; the first workspace build red on verify until the reinstall) and a turbo workspace build 74/74. Spec --project local: 662 files, 20125 passed, 1 todo (pin 17 cases + analytics tests). Spec --project repo (all 33 src/** members + scripts/references-banner.test.ts): 34 files, 463 passed. Lint: 137 files, 6664 passed. driver-memory memory-analytics-time-granularity.test.ts: 24 passed. Typecheck: spec, lint and driver-memory all exit 0. Spec dist carries every corrected string and the new TSDoc (dist/analytics.zod-hcT03_EF.d.ts), with 0 old ones. Ablation legs 1-5 unchanged from earlier rounds (legs 1-4 at 8d3a9c2; leg 5 at 1ee3715); no prescription string changed this round.",
"gates": "check-future-spec-major on the merged head (package.json 18.0.0-next.0): "✓ check-future-spec-major: no
@objectstack/speccitation names a major above 18"; self-test "(0 at 18, 0 at 19.0.0-next.0)"; exit 0, 0 problems. dispatch-gates --commands --repo objectstack-ai/objectstack at 90cfa7a derived 113; all 113 ran, exit codes captured before any pipe: 112 exit 0, 1 exit 1. The exit 1 is check-empty-changeset, by design (DELIBERATE CORRECTION, decision A). Verdict verbatim: "This PR changes a changeset it did not add:" / ".changeset/pre/22876-email-template-category-is-system-retired.md" / "present on the merge base and CHANGED by this PR -- this is somebody else's release note". dispatch-gates --ran: "113 derived, 113 run, 0 NOT-MEASURED, 0 UNRUN". CI Type Check source-gates lane, the 27 commands outside the derived list (set re-extracted from the merged lint.yml, unchanged): 27/27 exit 0. check:generated after a real build: "All 14 generated artifacts are up to date". Issue citations, locally on 90cfa7a: node scripts/check-issue-citations.mjs reports "citations judged: 1 across 6 file(s)" / "1 resolves" / "✅ check-issue-citations: every citation this change adds resolves (or is a declared cross-repo reference)."; pnpm check:issue-citations (self-test) reports "✅ … (173 cases, 9 batteries)". The CI step's annotation is "Process completed with exit code 3", the refusal class (board read), not a finding; the citation (#17296) is kept. The job log blob is not readable here. CI on 90cfa7a: success in TypeScript Type Check (all 4 lanes, source gates included), Test Core, Build Core, Governed Surface Queue Guard and 7 of 8 Lint lanes; failure in Lint and Repo Gates (aggregate) through Lint · CI, release & engine gates (that exit 3), and in Check Changeset (by design); 4 PR-body-scoped checks re-running after the body edit. No other red.","line_budget": "n/a — no skills/** or governed surface in the diff. 21 files, +374/-37 vs merge base d889448; under the 3000-line human-merge threshold.",
"deviations": [
"Step 1 instruction (take the deletion of 22876) was not followed: its premise was measured false (the release moved the file to .changeset/pre/, and Changesets v3 re-reads pre/ at pre exit). I raised it with the coordinator before writing the PR body, and the seat ruled A (keep). check-empty-changeset therefore stays red by design instead of turning green.",
"Not re-merged after main moved one more commit (44e2d50, scripts/check-skills-token-ratchet.mjs, a roster family outside the 113). merge-tree with it is clean.",
"Lock contention: four os-verify-lock queue timeouts (exit 99, NOT MEASURED) and one outer-timeout kill mid-run; every affected run was re-run in full under the lock (nohup plus a foreground tail --pid wait). An interim narrowing to the edited test files was superseded by the full runs above, so no narrowing stands."
],
"files_changed": [
".changeset/23145-tombstone-removal-version.md (+24)",
".changeset/pre/22876-email-template-category-is-system-retired.md (2/2, lines 29 and 31 only; deliberate correction, followed the release's rename)",
"content/docs/references/kernel/metadata-plugin.mdx (1/1, generated)",
"content/docs/references/system/email-template.mdx (2/2, generated)",
"content/docs/references/ui/component.mdx (11/11, generated)",
"packages/drivers/driver-memory/src/memory-analytics-time-granularity.test.ts (1/1)",
"packages/lint/src/lint-liveness-properties.test.ts (1/1)",
"packages/lint/src/runtime-gate.inert-type-writes.test.ts (1/1)",
"packages/lint/src/validate-component-props.test.ts (2/2)",
"packages/spec/src/data/analytics.test.ts (1/1)",
"packages/spec/src/data/analytics.zod.ts (3/2: the refusal message and the TSDoc)",
"packages/spec/src/kernel/manifest-permissions-string-list.test.ts (1/1)",
"packages/spec/src/kernel/manifest.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-plugin.zod.ts (1/1)",
"packages/spec/src/kernel/metadata-type-registry-allow-org-override-retirement.test.ts (1/1)",
"packages/spec/src/shared/retired-key-removal-version.pin.test.ts (+312, new pin)",
"packages/spec/src/system/email-template-category-is-system-retirement.test.ts (2/2)",
"packages/spec/src/system/email-template.zod.ts (2/2)",
"packages/spec/src/system/object-storage.zod.ts (1/1)",
"packages/spec/src/ui/component.zod.ts (2/2)",
"packages/spec/src/ui/element-flat-binding-retirement.test.ts (2/2)"
],
"mcp_calls": "0 — none",
"api_writes": "Landing round: 3 REST writes in 2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). Stroke 1, run 38382834468: issue_patch PATCH /repos//issues/23186 (PR body, 55807 bytes, read back identical) and comment POST /repos//issues/23186/comments (superseding note 6143438580, read back identical). Stroke 2: comment POST /repos//issues/23145/comments (this report). Not REST: 1 normal git push (1ee3715 to 90cfa7a), never forced. Two SendMessage lines to the coordinator: the 22876 premise measurement, and the probe answer. No label write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed. retired-after.census.json trails the published line (last censused 17.4.0; 17.5.0-17.7.0 published). No live defect: every retired stamp agrees with the tarballs."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat review of PR #23186 at
90cfa7ace: the landing round stands; one changeset sentence went stale at 08:35Z, so a one-sentence patch comes before the ACCEPT ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T10:30ZThe dev corrected this seat, and the record should say so.
22876correction was worth keeping, I treated the changeset as gone with the18.0.0-next.0release. My note 6140670883 also left whether the correction reaches stable18.0.0NOT MEASURED, and planned to drop the edit if it reached nothing.22876. It moved the file to.changeset/pre/. Atchangeset pre exit, Changesets readspre/again and folds it into the stable18.0.0notes. The dev read this in the installed packages:@changesets/read@1.0.1dist/index.mjs:29;@changesets/assemble-release-plan@7.0.0:328;@changesets/apply-release-plan@8.1.1:301-319.Read on the head. 21 files, +374 / −37.
071dbdb24brings ind889448b9(the version commit).RETIRED_SUB_DAY_INTERVALSTSDoc reads "declared through @objectstack/spec 17.4.0; 17.5.0 removed them". That is the amended surface..changeset/pre/22876lines 29 and 31 now match the emitted prescriptions byte for byte.check-future-spec-majoris green at major 18.The stale sentence. Line 9 of
.changeset/23145-tombstone-removal-version.mdsays "17.7.0, the newest published release, still accepts every shape below."latestis17.7.0, andnextis18.0.0-next.0, published at 2026-10-13T08:35:43Z. That is after this head was pushed.18.0.0-next.0.The patch, changeset only.
17.7.0as the newest 17.x release (npmlatest), and18.0.0-next.0as the first release that refuses these shapes.18.0.0-next.0tarball.npm packinto its own empty directory, and run any reading script with-I/from outside that directory.18.0.0-next.0release notes quoted the twoemail_templateprescriptions with ... 17". Cite the tarballCHANGELOG.mdline it rests on.17.7.0as the newest published release outright.CI on
90cfa7ace.38367995602in this act.pre/22876edit, under the existing gate-and-reason note.Then: the ACCEPT,
needs:contract-review, and the at-tier review on the patched head. That review covers the strings, the pin, the TSDoc, the changeset and thepre/22876DELIBERATE CORRECTION. The landing follows.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23145,
"status": "done",
"branch": "claude/issue-23145-tombstone-removal-version",
"head": "56d63b4e79e18dbb7311d97dda88ab2c54b906e0",
"pr": "#23186",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — the dispatching PM session (mode:subagent)",
"premise_still_valid": true,
"summary": "Changeset patch round (seat note 6143582707). @objectstack/spec@18.0.0-next.0 reached npm next at 2026-10-13T08:35:43Z (dist-tags: latest 17.7.0, next 18.0.0-next.0). Line 9 of .changeset/23145-tombstone-removal-version.md now reads "17.7.0, the newest 17.x release (npm
latest), still accepts every shape below, and18.0.0-next.0is the first release that refuses them." The rest is unchanged. Commit 56d63b4, changeset only, no code. Measured in the published 18.0.0-next.0 tarball: every table row and all three sub-day members are refused, each with the old text this PR replaces; no row is accepted. The changeset's next.0 sentence rests on tarball CHANGELOG.md:2091 and :2093, inside its "## 18.0.0-next.0" section (lines 3-3200). PR body: one "Patch round (seat note 6143582707)" section. No body sentence called 17.7.0 the newest published release outright; H4's and the pin's "newest published stable" stay true. Superseding PR comment: 6143855611.","tests": "Tarball: npm pack @objectstack/spec@18.0.0-next.0 into its own new directory, integrity sha512-ASTh6+q5jo2y8VhYT5osOb4H0JUyGAVYHIUPE39OnxSAD3fYg12x1YiNz09JA0aP+8JxigeA0otHWB3j16i2Ow== matching the packument, package.json 18.0.0-next.0. Read by measure-next0.mjs from the scratchpad (outside the tarball directory, node with the path as an argument): it imports the tarball dist/{ui,system,kernel,data}/index.mjs and safeParses each surface. Its dependencies resolve through a node_modules link to the worktree spec dependencies. Per-row readings (19 = the 16 table rows + 3 sub-day members, the 17th edited row): element:number.object: REFUSED, old text yes; element:number.filter: REFUSED, old text yes; element:record_picker.object: REFUSED, old text yes; element:record_picker.filter: REFUSED, old text yes; element:record_picker.sort: REFUSED, old text yes; element:record_picker.limit: REFUSED, old text yes; element:repeater.object: REFUSED, old text yes; element:repeater.filter: REFUSED, old text yes; element:repeater.sort: REFUSED, old text yes; element:repeater.limit: REFUSED, old text yes; object-grid.defaultFilters: REFUSED, old text yes; email_template.category: REFUSED, old text yes; email_template.isSystem: REFUSED, old text yes; manifest.permissions as a string list: REFUSED, old text yes; StorageScope public: REFUSED, old text yes; MetadataTypeRegistryEntry.allowOrgOverride: REFUSED, old text yes; TimeUpdateInterval second: REFUSED, old text yes; TimeUpdateInterval minute: REFUSED, old text yes; TimeUpdateInterval hour: REFUSED, old text yes. The 14 key tombstones also carry a [REMOVED] describe there. No test code changed this round; the pin, test and typecheck results stand as reported at 90cfa7a (only the changeset moved).",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack .changeset/23145-tombstone-removal-version.md derived 20; all ran at 56d63b4 with exit codes captured before any pipe. Exit 0 (19): check-adr-0087-registration --base and --self-test; check-changeset-no-major --base and --self-test; check-closing-keyword-parity and --self-test; check-comment-mask-corpus; check-empty-changeset --self-test; release-rehearsal-clone --self-test; release-pending-publish --self-test; check:changeset-gate-self-tests; check:driver-memory-census; check:gitlink-declared; check:nul-bytes; check:objectui-changeset; check:pm-changeset-deadline-census; check:published-files; check:refd-timer-probe; check:watch-hint-literal. Exit 1 (1): node scripts/check-empty-changeset.mjs --base origin/main, by design. Verdict verbatim: "This PR changes a changeset it did not add:" / ".changeset/pre/22876-email-template-category-is-system-retired.md" / "present on the merge base and CHANGED by this PR -- this is somebody else's release note". --ran: "20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN". Plus pnpm check:future-spec-major: exit 0, "✓ check-future-spec-major: no
@objectstack/speccitation names a major above 18". CI on 56d63b4 is re-running from this push; not awaited.","line_budget": "n/a — no skills/** or governed surface. This round: 1 file, 1/1 (.changeset/23145-tombstone-removal-version.md line 9).",
"deviations": [
"The worktree had been removed at the end of the landing round, so it was re-created from the remote head (90cfa7a verified before any edit) and installed fresh. No file in /home/user/objectstack was edited."
],
"files_changed": [
".changeset/23145-tombstone-removal-version.md (1/1, line 9)"
],
"mcp_calls": "0 — none",
"api_writes": "3 REST writes in 2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). Stroke 1: issue_patch PATCH /repos//issues/23186 (PR body, 57542 bytes, read back identical) and comment POST /repos//issues/23186/comments (6143855611, superseding 6143438580, read back identical). Stroke 2: comment POST /repos//issues/23145/comments (this report). Not REST: 1 normal git push (90cfa7a to 56d63b4), never forced. No label write.",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
✅ ACCEPT (seat review): PR #23186 at
56d63b4e7. The contract-tier review is owed before the queue ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T10:50ZThe patch round (seat note 6143582707) is done as asked.
90cfa7ace...56d63b4e7is one commit, 1 file, +1 / −1: line 9 of.changeset/23145-tombstone-removal-version.md.latest), still accepts every shape below, and18.0.0-next.0is the first release that refuses them."90cfa7acecarry over.What the new sentence rests on: the dev's readings of the published
18.0.0-next.0tarball.TimeUpdateIntervalmembers.[REMOVED]describe there.CHANGELOG.md:2091and:2093, inside its## 18.0.0-next.0section.Gates at
56d63b4e7.check-empty-changeset --baseexits 1 by design.check:future-spec-majorexits 0 at major 18.Check Changesetis red by design, as that note states.The docs-drift advisory. It flags
content/docs/concepts/metadata-lifecycle.mdxviaallowOrgOverride. Read onmain, the page names onlyallowEnvironmentOverlayand names no release, so nothing changes there.The dev's correction of this seat is recorded in 6143582707:
22876was moved into.changeset/pre/, not deleted, and it reaches the stable18.0.0notes. Decision A (keep) stands.Landing to-do, recorded now:
needs:contract-reviewgoes on the PR in this act. The review runs on56d63b4e7and covers:RETIRED_SUB_DAY_INTERVALSTSDoc;.changeset/pre/22876DELIBERATE CORRECTION.Check Changesetonly): ready, then auto-merge, then the queue, confirmed byadded_to_merge_queue.pm:dispatchedcomes off.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat note: PR #23186
Test Core (1/6)is red at56d63b4e7. The cause is this PR's own pin against two retirementsmainadded after the last merge, and a fix round is dispatched ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T11:07ZThe failure, read in the job log.
packages/spec/src/shared/retired-key-removal-version.pin.test.ts:248fails on "every entry retired after the newest published stable release is joined to its prescriptions":Why.
main. Both entries reachedmainafter this branch's last merge ofd889448b9:76815b901(feat(spec)!: a controlled_by_parent object derives its master from exactly one required master_detail; the runtime's fallback tiers retire (#23100) #23179), at 2026-10-13T09:05Z;4d1e4a80c(feat(spec)!: a page action row's onSuccess is ActionSchema's own block, and its executor key refuses the 'navigation' alias #23164), at 2026-10-13T09:06Z.The fix round (dev).
origin/mainwithscripts/pm/os-regen-merge.sh.JOIN, with the refusal or tombstone an author meets on each surface:'navigation'executor refusal, on the four page action row shapes;cbp-master-detail-required-defaulted, what the parse tells an author.If a prescription names no release at all, report how the pin judges it, and do not add a release to it.
check:future-spec-major.Then push and post a superseding PR comment.
The contract-tier review that was running on
56d63b4e7is told the head will move. The landing record needs a same-head PASS on the fixed head.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat note: contract review FAIL 6144306153 on
56d63b4e7adopted. The fix round is widened and the claim file surface amended again ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T11:15ZThe record, adopted.
patchwithClause-②: no, and the TSDoc. The DELIBERATE CORRECTION on.changeset/pre/22876is CONFIRMED, and that carries to the next head while lines 29 and 31 stay byte-equal to the emitted strings.mainmoved past the merge based889448b9:retiredAfter: '17.7.0'entries are not inJOIN, soTest Core (1/6)is red (seat note 6144192235);packages/spec/src/ui/view.zod.ts:193, "view.data.provider: 'api'was removed in @objectstack/spec 17". It came in1912af47bat 2026-10-13T08:47Z. The shape is live at the 17.7.0 tag (view.zod.ts:190). The entry is D3 only, so the pin cannot reach it.Two corrections to this seat's own text.
@param guidanceasks for the removal version. So a release-less prescription on either new entry gains "18", asallowOrgOverridedid.metadata-lifecycle.mdx. It said the page names "onlyallowEnvironmentOverlay" and no release. Line 107 says "spelledallowOrgOverridebefore protocol 18". My read cut that line off at 300 characters. The conclusion stands, because the page names the protocol major for the rename, which agrees with 18.Claim file surface, amended in this act. This adds to 6140670883 and 6144192235.
packages/spec/src/ui/view.zod.ts: theVIEW_DATA_API_PROVIDER_RETIREDstring, 17 → 18. Its literal test pins follow, and so does the regeneratedcontent/docs/references/**row.view.data.provider: 'api', and one forStorageScope.public. Both are out of the derived pin's reach. Todayobject-storage.test.ts:59matches the text without the version.1912af47blanded after18.0.0-next.0was published, so next.0 still acceptsprovider: 'api'. Neither line 9 nor the table may say next.0 refuses it.retiredAfter: '17.7.0', now 7.The ratchet question, as the review answered it in (b):
Then: the dev's hand-back, a seat read, and an at-tier review on the new head.
needs:contract-reviewstays on.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23145,
"status": "done",
"branch": "claude/issue-23145-tombstone-removal-version",
"head": "38728b3e1b37ed00bed9da54be08198fd7fe1bd8",
"pr": "#23186",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — the dispatching PM session (mode:subagent)",
"premise_still_valid": true,
"summary": "Fix round (seat notes 6144192235 and 6144323612). Merged origin/main via os-regen-merge.sh (b24018c, parents 56d63b4 and 197fbe2) and regenerated content/docs/references/ui/component.mdx from the merged tree (d0b4cfd; it differs from main by exactly this branch's rows). Commit 6e4a148: the pin joins page-action-row-navigation-executor-to-url (the 'navigation' refusal on action:button / action:icon actionType and action:group / action:menu member type) and cbp-master-detail-required-defaulted (the ObjectSchema refusal at sharingModel); both prescriptions named no release and now name 18 ("refused on page action rows since @objectstack/spec 18"; "ADR-0055 §1: since @objectstack/spec 18, ..."). view.data.provider: 'api' (ui/view.zod.ts:193) goes 17 to 18. One-line literal release pins added for provider 'api' (view.test.ts; the retirement test regex) and StorageScope.public (object-storage.test.ts). Pending-changeset quotes corrected in place: .changeset/23082-view-data-api-provider-retired.md:25 (byte-equal to the emitted string) and .changeset/23103-page-action-row-on-success-and-executor.md:36 (equal to the new first sentence); .changeset/pre/22876 lines 29 and 31 re-verified byte-equal. Commit 38728b3: the changeset table is split. The first table keeps "18.0.0-next.0 is the first release that refuses" (the 16 rows measured refused there last round); a second table holds the three fix-round rows, which next.0 still accepts, so the first release that refuses them is the one after it. Line 9 is true per row. Enumeration re-counted: 239 rows, 20 edited, 219 unchanged, 11 strings; 7 entries at retiredAfter 17.7.0. The two-master refusal (same function, outside the D2 entry surface) is unedited. PR body: a "Fix round (seat notes 6144192235 and 6144323612)" section, recounted enumeration and pin sections, older round sections condensed to fit the 60000-byte cap (59230 bytes, read back identical). Superseding PR comment 6146032386 (supersedes 6143855611), read back identical.",
"tests": "Liveness, re-run at report time with measure-new3.mjs and measure-cbp.mjs from the scratchpad (node, package path as an argument) against the integrity-verified 17.7.0 and 18.0.0-next.0 tarballs and the HEAD build: 17.7.0 action:button actionType 'navigation': ACCEPTED; 17.7.0 action:icon actionType 'navigation': ACCEPTED; 17.7.0 action:group member type 'navigation': ACCEPTED; 17.7.0 action:menu member type 'navigation': ACCEPTED; 17.7.0 CONTROL action:button actionType 'url': ACCEPTED; 17.7.0 controlled_by_parent, one master_detail without required (raw parse): ACCEPTED; 17.7.0 CONTROL controlled_by_parent, master_detail required: true: ACCEPTED; 17.7.0 ViewData provider 'api': ACCEPTED; 17.7.0 CONTROL ViewData provider 'object': ACCEPTED; 18.0.0-next.0 action:button actionType 'navigation': ACCEPTED; 18.0.0-next.0 action:icon actionType 'navigation': ACCEPTED; 18.0.0-next.0 action:group member type 'navigation': ACCEPTED; 18.0.0-next.0 action:menu member type 'navigation': ACCEPTED; 18.0.0-next.0 CONTROL action:button actionType 'url': ACCEPTED; 18.0.0-next.0 controlled_by_parent, one master_detail without required (raw parse): ACCEPTED; 18.0.0-next.0 CONTROL controlled_by_parent, master_detail required: true: ACCEPTED; 18.0.0-next.0 ViewData provider 'api': ACCEPTED; 18.0.0-next.0 CONTROL ViewData provider 'object': ACCEPTED; HEAD action:button actionType 'navigation': REFUSED; HEAD action:icon actionType 'navigation': REFUSED; HEAD action:group member type 'navigation': REFUSED; HEAD action:menu member type 'navigation': REFUSED; HEAD CONTROL action:button actionType 'url': ACCEPTED; HEAD controlled_by_parent, one master_detail without required (raw parse): REFUSED; HEAD CONTROL controlled_by_parent, master_detail required: true: ACCEPTED; HEAD ViewData provider 'api': REFUSED; HEAD CONTROL ViewData provider 'object': ACCEPTED. controlled_by_parent variants: 17.7.0 no master at all: ACCEPTED; 17.7.0 one master_detail, required omitted: ACCEPTED; 17.7.0 one required lookup, no master_detail: ACCEPTED; 17.7.0 two required master_detail: ACCEPTED; 17.7.0 CONTROL one required master_detail: ACCEPTED; 18.0.0-next.0 no master at all: ACCEPTED; 18.0.0-next.0 one master_detail, required omitted: ACCEPTED; 18.0.0-next.0 one required lookup, no master_detail: ACCEPTED; 18.0.0-next.0 two required master_detail: ACCEPTED; 18.0.0-next.0 CONTROL one required master_detail: ACCEPTED; HEAD no master at all: REFUSED; HEAD one master_detail, required omitted: REFUSED; HEAD one required lookup, no master_detail: REFUSED; HEAD two required master_detail: REFUSED; HEAD CONTROL one required master_detail: ACCEPTED. So 17.7.0 and 18.0.0-next.0 accept every new shape, HEAD refuses each with the new prescription, and every control is accepted at all three. Pin: retired-key-removal-version.pin.test.ts 19 passed. Spec --project local: 668 files, 20229 passed, 1 todo. Spec --project repo (all src members plus references-banner): 35 files, 473 passed. @objectstack/lint: 138 files, 6679 passed. verify parent-write-reach.test.ts: 10 passed. typecheck: spec exit 0, lint exit 0. All through os-verify-lock.sh, VERDICT command-exit 0. Ablation (scripts/ablation-replace.mjs on the pin, from committed state): leg 6, the navigation refusal without "refused on page action rows since @objectstack/spec 18": red, 1 failed / 18 passed, "names no release"; restored to blob fb3ad73747ac == HEAD, git diff HEAD empty. The first try was refused by the tool (replacement a substring of the anchor, count did not rise, nothing ran) and was re-run with a longer anchor. Leg 7, the controlled-by-parent refusal without its release: red, 1 failed / 18 passed; restored to blob 6347359316f2 == HEAD. The pin reads src through vitest, not dist, so no rebuild leg applies.",
"gates": "At 38728b3: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 113; all 113 ran with exit codes captured before any pipe. 110 exit 0 on the first pass; 3 exit 3 (PREREQUISITE NOT MET: check:skill-examples, check:dual-build-cjs-loads, check:i18n) re-ran after a turbo workspace build and exit 0, so 112 exit 0. Exit 1 (1): node scripts/check-empty-changeset.mjs --base origin/main, by design (DELIBERATE CORRECTION, ruling D on #17712). Verdict verbatim: "This PR changes a changeset it did not add:" / ".changeset/23082-view-data-api-provider-retired.md" / ".changeset/23103-page-action-row-on-success-and-executor.md" / ".changeset/pre/22876-email-template-category-is-system-retired.md", each "present on the merge base and CHANGED by this PR -- this is somebody else's release note". --ran: "113 derived, 113 run, 0 NOT-MEASURED, 0 UNRUN". pnpm check:future-spec-major: exit 0, "no
@objectstack/speccitation names a major above 18". pnpm check:generated: exit 0, "All 14 generated artifacts are up to date". CI on 38728b3 (read at report time): TypeScript Type Check and its 4 lanes, Test Core 1-6, Build Core, Lint & Repo Gates and its lanes, Spec property liveness, Build Docs: success; Check Changeset: failure, the by-design red. origin/main has since moved 9 commits to 6d7f4df; none touches packages/spec or adds a retiredAfter line, and git merge-tree with it is clean.","line_budget": "n/a — no skills/** or governed surface. This round: 13 files in the branch commits (b24018c..38728b3), 93 insertions, 61 deletions, most of it the regenerated component.mdx.",
"deviations": [
"The previous head's Test Core (1/6) job log could not be read from this container (the log download is Forbidden through the proxy); the PR body cites only its annotation (packages/spec pnpm run test exited 1).",
"An attribution reminder from the harness asked for a model-named Co-Authored-By trailer and a different PR footer; per the agent file the commits keep the model-free trailer pair and the body keeps its session-URL footer. Reported, not followed."
],
"files_changed": [
"packages/spec/src/ui/component.zod.ts (navigation refusal)",
"packages/spec/src/data/object.zod.ts (controlled-by-parent no-required-master refusal)",
"packages/spec/src/ui/view.zod.ts:193 (provider api, 17 to 18)",
"packages/spec/src/shared/retired-key-removal-version.pin.test.ts (two joined entries, 5 cases)",
"packages/spec/src/ui/view-data-api-provider-retirement.test.ts, view.test.ts, system/object-storage.test.ts, ui/component-action-row-on-success-executor.test.ts, packages/lint/src/validate-component-props-row-on-success.test.ts (literal pins)",
".changeset/23145-tombstone-removal-version.md (second table), .changeset/23082-view-data-api-provider-retired.md:25, .changeset/23103-page-action-row-on-success-and-executor.md:36",
"content/docs/references/ui/component.mdx (regenerated)"
],
"mcp_calls": "0 — none",
"api_writes": "3 REST writes in 2 relay strokes (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]). Stroke 1: issue_patch PATCH /repos//issues/23186 (PR body, 59230 bytes, read back identical) and comment POST /repos//issues/23186/comments (6146032386, superseding 6143855611, read back identical). Stroke 2: comment POST /repos//issues/23145/comments (this report). Not REST: 2 normal git pushes (56d63b4 to 6e4a148, 6e4a148 to 38728b3), never forced. No label write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · two other new D3 narrowings, page-default-record-page-one-per-object-refused and ui-page-action-row-on-success-shape-closed, refuse without naming a release; outside this card surface, noted in the PR body fix-round section, not filed"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Landed: PR #23186 →
c0569797a(Fixes #23145). Every retirement prescription for a shape@objectstack/spec17.7.0 still accepts now names 18, and a derived pin keeps it sodomain:specseat 3 (#18883) ·os-support-ai· sessionsession_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T13:52Z · holder of claim6138001758, with amendments6140670883,6144192235and6144323612.Path.
check-future-spec-major, then took a landing round..changeset/pre/22876was moved intopre/, not deleted, and it reaches the stable18.0.0notes. Decision A (keep) stands.18.0.0-next.0was published.6144306153), on the tree rather than the diff.mainhad added:retiredAfter: '17.7.0'entries that the pin's completeness guard refused (Test Core (1/6));view.data.provider: 'api'naming 17.main;provider: 'api'became 18;provider: 'api'andStorageScope.public;38728b3e1(6146452654). That record confirms three DELIBERATE CORRECTIONS of pending notes:pre/22876:29,31,23082:25and23103:36.Check Changesetred (note6146032386), which does not run onmerge_group.check-governed-mergesreported it NOT governed, at 468 lines.On
mainatc0569797a. The squash is the PR's 30 files, +422 / −46. Each file's blob equals the reviewed head's, and thepatch-id --stableof the squash equals that of197fbe2c0..38728b3e1. The landing is byte-identical to the reviewed head.Closing keywords. This card closed as
completed, and the PR names no other issue.pm:dispatchedcomes off in this act.Carried. Neither item is this card's class (a WRONG release); both are noted in the PR body and the review records.
page-default-record-page-one-per-object-refused;ui-page-action-row-on-success-shape-closed;controlled_by_parentrefusal inobject.zod.ts.One omission sweep would close all three. This seat puts it to the maintainer in the round report instead of filing it unasked.
retired-after.census.jsonstill trails at 17.4.0. The pin reads the stamps, not the census, so nothing is live. The census's own rule owes a refresh after the next stable publish.Generated by Claude Code