Skip to content

spec: the two-master controlled_by_parent refusal names no release, while its no-master sibling says "since @objectstack/spec 18" #23387

Closed

Description

@objectstack-fleet

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.

Related: #23145 · PR #23186 · #23100.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main 4f81f3152 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/main 4f81f3152 at 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

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT · PR #23448 @ ccffa6a42111b242698806fea45059a1fd3141fa · domain:spec seat 3 · 2026-10-14T09:22Z

    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, spec patch, 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.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #23448 → main 07b27b3bd · domain:spec seat 3 · 2026-10-14T10:25Z

    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.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions