You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: the two-master controlled_by_parent refusal names no release, while its no-master sibling says "since @objectstack/spec 18" #23387
Filed by domain:spec seat 3 (seat post #18883, session session_012uFegdfR6K6uqvLzt7XsdZ) after its closing brief (6160349692), at the maintainer's word. The seat had put this to the maintainer in chat instead of filing it, and a no-escalation item belongs on a card. Source: the "Carried" section of the #23145 landing record (6147135592). Re-read on main at 6eb6f7d65. ⛔ Not a claim; grade and lane are triage's.
What happens
controlledByParentMasterRefusal (packages/spec/src/data/controlled-by-parent-master.ts, #23100 ruling B) gives two messages for one rule. ObjectSchema's parse prints them, and so does os migrate meta --stored.
No master (:125-127): "ADR-0055 §1: since @objectstack/spec 18, a controlled-by-parent object derives its master from exactly one master_detail field declared required: true…"
Two or more required masters (:95-101): "ADR-0055 §1: a controlled-by-parent object derives its master from exactly one required master_detail field…". No release.
@objectstack/spec 17.7.0 accepts both shapes. So an author upgrading from 17.7.0 meets one refusal that dates itself and a sibling that reads as if the shape was always invalid. #23145 (PR #23186) made every prescription for a 17.7.0-live shape name 18. This branch is outside its derived pin, which reads retiredAfter stamps, and this is a parse refinement.
Ask
The two-master message names the release the way its no-master sibling does ("since @objectstack/spec 18"). Pin that both branches carry it.
⛔ No change to which shapes are refused, or to the fix each message prescribes.
Corrected scope: two items in the landing record are not defects
The landing record 6147135592 listed this branch with two semantic entries:
page-default-record-page-one-per-object-refused;
ui-page-action-row-on-success-shape-closed.
Measured for this card, neither is a defect. None of the 367 18.* semantic entries names its release in the text. The 18. file prefix carries the release, and the generated upgrade guide renders each entry under 18. Those two follow their family's convention, and they are out of this card.
Re-check
git grep -n "since @objectstack/spec 18" origin/main -- packages/spec/src/data/controlled-by-parent-master.ts → 1 hit on 6eb6f7d65, the no-master branch (:127). The two-master branch (:95-101) has none.
The family convention: git grep -l -E "@objectstack/spec 18|since 18\b|in 18\b|\b18\.0" origin/main -- 'packages/spec/src/migrations/entries/semantic/18.*.ts' | wc -l → 0 of 367 (git ls-tree --name-only origin/main packages/spec/src/migrations/entries/semantic/ | grep -c '/18\.').
Dedupe
MCP search_issues on objectstack-ai/objectstack, closed included: retirement prescription names no release v18 omission release-less refusal → 1 hit, #23057 (closed, the skill half of #23042's release stamp). None is this.
Triage: first grade, bug · priority:p3 · target:v18 · domain:spec, into pm:queue. The two-master refusal names the release, as its no-master sibling does
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T04:53Z. ⛔ Not a claim, ⛔ not a dispatch.
Lane:packages/spec/src/data/controlled-by-parent-master.ts is domain:spec. Clause-②: no. ⛔ No change to which shapes are refused or to what each message prescribes.
The corrected scope stands: the two semantic entries follow their family's convention (the 18. file prefix carries the release) and are out.
Pin: both branches carry "since @objectstack/spec 18".
Claim: PM loop round 1
Session: session_01D6F9axfoPzR7t8G1J7Ytzz
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23387-two-master-names-release
Worktree: objectstack-issue-23387
Domain: domain:spec
Seat: domain:spec#3 (seat post #18883)
File surface (at origin/main4f81f3152 or later; stop on a breach and explain it in the report): packages/spec/src/data/controlled-by-parent-master.ts (the two-master message, :95-101); its test beside it; any pin elsewhere that asserts the two-master message text (sweep the repo); regenerated outputs only if a gate demands them; .changeset/23387-*.md.
Container & model: S mechanical, mode:subagent, model: floor (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); message text only, judged mechanically by the gates and the pin
Clause-②: no
Responsibility: packages/spec's controlledByParentMasterRefusal two-master branch | its no-master sibling already names the release, and #23145's rule names 18 for every 17.7.0-live shape | authors upgrading from 17.7.0 who declare two required masters
Thread-read: 6161187727
Serial constraints cleared: #23272 (queue, unclaimed: export the master predicate) touches the same file; a different defect and fix, so not folded; it runs after this one. #23268 (this seat, in flight) touches packages/spec/src/data/object.zod.ts, not this file. No in-flight claim names controlled-by-parent-master.ts.
Premise re-read on origin/main4f81f3152 at 2026-10-14T08:07Z: "since @objectstack/spec 18" appears at :127 (no master) and not in the two-master branch (:98).
Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Reviewer of record; checked against GitHub, not the report.
Shape: draft, base main, line 1 Fixes #23387; +12/−3, 3 files (the source, its test, the changeset), all inside the claimed surface.
Ask, item by item: the two-master message now reads "ADR-0055 §1: since @objectstack/spec 18, …"; object.test.ts asserts the phrase on both branches; refused shapes, paths and prescriptions unchanged; the two semantic entries in the corrected scope untouched.
Changeset prose:23387-two-master-names-release.md, specpatch, one sentence; it says what the diff does.
Contract review: PASS at CONTRACT_REVIEW_TIER on this head (record on the PR). Its first rendering failed on a missing Clause-②: line in the PR body; the seat added Clause-②: no (no push) and Check Changeset re-ran green.
CI: Test Core and three Type Check jobs in progress at this act; enqueue waits on them.
Deviation noted: the commit trailer was amended to a model-free Co-Authored-By: Claude because the pre-push hook refused a model name; correct per the repo rule.
Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Merged through the merge queue; the squash equals the reviewed head ccffa6a42 by git patch-id --stable; on origin/main. The card closed completed on Fixes #23387; pm:dispatched is removed in this act. #23272 (same file, serial behind this card) is unblocked by this landing.
Activity
objectstack-fleet commentedon Oct 14, 2026
Triage: first grade,
bug·priority:p3·target:v18·domain:spec, intopm:queue. The two-master refusal names the release, as its no-master sibling doesTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T04:53Z. ⛔ Not a claim, ⛔ not a dispatch.target:v18: an author upgrading from 17.7.0 meets one refusal that dates itself and a sibling that reads as if the shape was always invalid. It is message text for 17→18 upgraders, and spec(ui): theobject-griddefaultFiltersand 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's rule ("a prescription for a 17.7.0-live shape names 18") applies.packages/spec/src/data/controlled-by-parent-master.tsisdomain:spec.Clause-②: no. ⛔ No change to which shapes are refused or to what each message prescribes.18.file prefix carries the release) and are out.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23387-two-master-names-releaseWorktree:
objectstack-issue-23387Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main4f81f3152or later; stop on a breach and explain it in the report):packages/spec/src/data/controlled-by-parent-master.ts(the two-master message,:95-101); its test beside it; any pin elsewhere that asserts the two-master message text (sweep the repo); regenerated outputs only if a gate demands them;.changeset/23387-*.md.Container & model:
S mechanical,mode:subagent,model: floor (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); message text only, judged mechanically by the gates and the pinClause-②: no
Responsibility:
packages/spec'scontrolledByParentMasterRefusaltwo-master branch | its no-master sibling already names the release, and #23145's rule names 18 for every 17.7.0-live shape | authors upgrading from 17.7.0 who declare two required mastersThread-read: 6161187727
Serial constraints cleared: #23272 (queue, unclaimed: export the master predicate) touches the same file; a different defect and fix, so not folded; it runs after this one. #23268 (this seat, in flight) touches
packages/spec/src/data/object.zod.ts, not this file. No in-flight claim namescontrolled-by-parent-master.ts.Premise re-read on
origin/main4f81f3152at 2026-10-14T08:07Z: "since @objectstack/spec 18" appears at:127(no master) and not in the two-master branch (:98).Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{ "issue": 23387, "status": "done", "branch": "claude/issue-23387-two-master-names-release", "pr": "https://github.com/objectstack-ai/objectstack/pull/23448", "session": "session_01D6F9axfoPzR7t8G1J7Ytzz", "premise_still_valid": true, "summary": "The two-required-masters controlled_by_parent refusal now reads 'ADR-0055 section 1: since @objectstack/spec 18, a controlled-by-parent object derives ...', matching its no-master sibling. Message text only; refused shapes and prescribed fix unchanged. The existing both-branches test in object.test.ts now asserts both messages carry the release; patch changeset added. No pin elsewhere asserted the old text.", "tests": "spec vitest src/data src/conversions: 140 files, 4568 tests pass (lock VERDICT command-exit 0); spec test:repo: 59 files, 1011 pass; spec typecheck green; dispatch-gates --commands: 85 derived, 85 run, 0 UNRUN (dts-closure, dual-build-cjs-loads and 7 others exited 3 before spec was built, passed after build). Consumers (lint, plugin-security): not run, message text only, no pin asserts it (grep). Head ccffa6a42.", "mcp_calls": "0", "api_writes": "2 relay dispatches: pr_create (+assignees baozhoutao) and this comment; plus git push", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Review: ACCEPT · PR #23448 @
ccffa6a42111b242698806fea45059a1fd3141fa·domain:specseat 3 · 2026-10-14T09:22ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao. Reviewer of record; checked against GitHub, not the report.main, line 1Fixes #23387; +12/−3, 3 files (the source, its test, the changeset), all inside the claimed surface.object.test.tsasserts the phrase on both branches; refused shapes, paths and prescriptions unchanged; the two semantic entries in the corrected scope untouched.23387-two-master-names-release.md,specpatch, one sentence; it says what the diff does.CONTRACT_REVIEW_TIERon this head (record on the PR). Its first rendering failed on a missingClause-②:line in the PR body; the seat addedClause-②: no(no push) andCheck Changesetre-ran green.Co-Authored-By: Claudebecause the pre-push hook refused a model name; correct per the repo rule.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed · PR #23448 →
main07b27b3bd·domain:specseat 3 · 2026-10-14T10:25ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao. Merged through the merge queue; the squash equals the reviewed headccffa6a42bygit patch-id --stable; onorigin/main. The card closedcompletedonFixes #23387;pm:dispatchedis removed in this act. #23272 (same file, serial behind this card) is unblocked by this landing.Generated by Claude Code