Skip to content

tooling: objectui's publish computes each @objectstack/* floor from .objectstack-sha — the first published release that contains the pinned commit — and stops when none does (ruling B on objectui#12955, step 2) #12958

Closed

Description

@objectstack-fleet

Unblocked: #12957 closed completed when PR #12963 merged as 749ed760; re-derived with no new blocker (unlock comment below).

Filing gate: execution of a ruling. This is ruling B on objectui#12955 (comment 6248859734). The maintainer's words, verbatim: 「下限也可以在那时按「哪个已发布版本包含这个提交」机械地算出来」, then 「12955 B」.

  • Filed by and dispatched by: domain:ui seat 1, on the maintainer's 「你负责派发处理相关的issue,包括 objectstack 和 objectui 并测试确认。」. ⛔ Not a claim.
  • Waits for: objectui#12957, which introduces .objectstack-sha.

Why

After objectui#12957, objectui builds against an objectstack commit, not an npm release. Its published packages still declare npm ranges for @objectstack/*. Those ranges must admit no release older than the code they were built against.

Today a floor is written by hand. The 18.0.0-next.3 upgrade left two floors behind (objectui#12943, #12946). A floor computed from the pin cannot fall behind.

Done when

  1. Compute the floor. Before changeset publish runs in pnpm changeset:publish, a step reads .objectstack-sha and finds the earliest published @objectstack/spec version whose release commit contains the pin.
    • objectstack tags each package release as @objectstack/<name>@<version>, for example @objectstack/spec@18.0.0-next.3. Test containment with git merge-base --is-ancestor <pin> <tag>.
    • Only versions present on npm count.
  2. Write the floor. That version becomes ^<version> on every @objectstack/* range in every published manifest that declares one. The step reports each range it moved.
    • Say how a range is treated when it is already at or above the computed floor.
  3. Stop when no release contains the pin. If none does, the step exits non-zero, naming the pin and the newest published release, and changeset publish does not run. This step is the floor computation the maintainer named, ⛔ not a new gate.
  4. scripts/check-spec-range-floors.mjs in changeset:publish. Retire it if a computed floor makes it redundant, or keep it with the reason stated. The nightly Spec Range Floors workflow follows the same decision.
  5. Release notes. A moved range appears in the released CHANGELOG, through a generated changeset or a documented equivalent.
  6. Test. Cover three cases with fixture tags or a recorded tag list: the pin is inside a release; the pin is newer than every release, which stops publishing; and the pin is exactly a release commit.

Generated by Claude Code

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Oct 18, 2026
  2. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-19T00:32Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: priority set, p1 · domain:devx · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-19T00:56Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.

    • No priority:* was set at filing (it went straight to pm:blocked). Triage grades it now.
    • Fresh read: objectui origin/main 749ed76076. changeset:publish runs check-published-dist-tooling then check-spec-range-floors, then publishes. No step computes a floor from .objectstack-sha.
    • p1, as release work (the maintainer's 「发版本优先的都p1」). Once objectui#12971 moves the pin to an unreleased objectstack main commit, a publish with hand-written floors can ship packages built against code no npm release has. This card's step 3, which stops when no release contains the pin, is the guard against that.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01FM29ZqLTrnPNXxijioZwMp
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12958-objectstack-floor-from-pin
    Worktree: objectui-issue-12958
    Domain: domain:devx
    Seat: domain:devx#1 (objectui, seat post #5748)
    File surface: the root package.json changeset:publish script, a new floor step under scripts/ with its test, scripts/check-spec-range-floors.mjs, and the published manifests' @objectstack/* ranges only when the step's own run moves them (stop on breach; explain in the report). .github/workflows/spec-range-floors.yml only if card item 4 retires or changes it — that path is Tier H governed.
    Container & model: M (release-path tooling with a measured tag reading), mode:subagent, model: opus (--tier: no path-derived mandate)
    Clause-②: no
    Responsibility: n/a — not a defect card (the execution of ruling B on #12955)
    Ruling-ref: 6248859734
    Thread-read: 6257384152
    Serial constraints cleared: no open objectui PR touches the root package.json, scripts/check-spec-range-floors.mjs or any objectstack-pin path (read at 2026-10-19T04:55Z). Not linked to objectstack-ai/objectstack#24424 or #24438 (this session's other in-flight cards).


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12958,
    "status": "done",
    "branch": "claude/issue-12958-objectstack-floor-from-pin",
    "pr": "#13024",
    "session": "session_01FM29ZqLTrnPNXxijioZwMp — the harness-stamped Claude-Session id of this run (subagent: the parent's)",
    "premise_still_valid": true,
    "summary": "Added scripts/objectstack-floor.mjs as the first step of pnpm changeset:publish. It computes the floor as the earliest @objectstack/spec version on npm whose objectstack tag @objectstack/spec@VERSION contains .objectstack-sha (git merge-base --is-ancestor, prereleases ordered by semver precedence). It raises every @objectstack/* range below the floor, in all four dependency fields of every published manifest, to ^FLOOR; leaves a range at or above the floor as written; writes a ### Dependency floors entry under the package's CHANGELOG.md version section, which ships in the tarball and the GitHub Release body; and exits 2, so changeset publish does not run, when no published release contains the pin. The tags come from an anonymous treeless fetch of objectstack's public repository plus a commit-graph, so no new secret is needed. check-spec-range-floors is kept after the step, because a release that contains the pin can still have removed a symbol the artifact uses. The nightly Spec Range Floors (Tier H) runs the step between the build and the scan and skips the scan on exit 2. Settled by the four axes: raising ranges only and keeping the floor gate are the contract-tight, loud options, and no gate or CI job was added. Skipping the nightly scan on exit 2 avoids a permanent false-red alarm in the pin-ahead state, which is the normal state under ruling B. The CHANGELOG entry is written on the runner because a generated changeset cannot work on the publish lane.",
    "tests": "Final run on HEAD 27b5fc4 with a clean tree, under os-verify-lock (VERDICT batch-last-exit 0 from a deliberate exit $((V|T))): pnpm exec vitest run scripts/__tests__ --maxWorkers=2 at the repo root gave Test Files 189 passed | 2 skipped (191) and Tests 5661 passed | 2 skipped (5663), VITEST_EXIT=0; pnpm type-check:scripts (tsc -p tsconfig.scripts.json) gave TYPECHECK_SCRIPTS_EXIT=0. The earlier same run on bd57569 had 1 failure: markdown-test-inputs.test.ts flagged the new test's fixture CHANGELOG.md as unadjudicated, and 27b5fc4 adds the ledger entry. The new test file scripts/tests/objectstack-floor.test.ts has 9 tests; all passed in that final run and, at its final content, in a targeted run alongside markdown-test-inputs (34/34). It covers the card's three pins through real git over annotated fixture tags with a recorded npm list: inside a release c3→1.0.0-next.1; exactly a release commit c4→1.0.0-next.1; newer than every published release c5 (tagged, not on npm) and c6→null. End to end: the write plus the CHANGELOG entry; exit 2 writes nothing; an unreadable range exits 1 and writes nothing; --dry-run writes nothing; plus the wiring pins. Real dry run against the tree: floor 18.0.0-next.3, 35 moved, 2 kept, exit 0, 7.4 s (89 s before the commit-graph). Write mode on a scratch copy of every real manifest and CHANGELOG: only the moved ranges changed, and the entry landed under ## 17.7.0. No ablation: the role file excludes scripts.",
    "gates": "objectui has no dispatch-gates.mjs, so the local list was derived by hand from AGENTS.md and package.json; there is no --ran reconciliation. Each exit code was captured before any pipe. pnpm exec eslint --no-inline-config on the 2 new files: exit 0. pnpm check:new-line-citations exit 0 (VERDICT 0 new citation(s)), pnpm check:control-bytes exit 0, pnpm check:test-path-roots exit 0 and pnpm check:pre-install-import-graph exit 0 ran on the tree before the last two edits (a 3-line commit-graph comment and the 6-line ledger entry, neither carrying a citation or a control byte); CI's Line Citation Gate and Repo Gates rerun them on 27b5fc4. node scripts/check-changeset-presence.mjs: exit 0 (no changeset owed). node scripts/check-governed-queue-guard.mjs --test: exit 3 (GOVERNED, because of spec-range-floors.yml). The targeted battery of objectstack-floor, check-spec-range-floors, check-published-dist-tooling and ci-cd-pipeline-doc tests: 169/169. PR #13024 check-runs on 27b5fc4, read once at report time: 32 total. Completed: Changeset Claim Re-read success, Changeset Fixed Group Check success, Governed Surface Queue Guard success (the pull_request leg only warns), label success; Test (coverage) skipped, Test (coverage shard N/8) skipped, dependabot skipped. In progress: Build & E2E, Build Docs, Changeset Declaration, Line Citation Gate, Lint, Live E2E (informational), Repo Gates, Test (dist pins), Test (shard 1..16/16), Type Check. NOT MEASURED locally: the full pnpm test, pnpm type-check (turbo; it does not reach scripts/ and no workspace package changed) and pnpm lint, all of which CI runs; and the nightly spec-floor scan against the computed floors, which needs a full build and the network and runs in the Spec Range Floors workflow.",
    "mcp_calls": "0 — no MCP GitHub tool was called",
    "api_writes": "2 — both are fleet-relay dispatches, POST /repos/objectstack-ai/objectstack/dispatches (HTTP 204). Dispatch 1, pr_create, executed as POST /repos/objectstack-ai/objectui/pulls (draft, forced) plus POST /repos/objectstack-ai/objectui/issues/13024/assignees [os-warren]; read-back: 11792 bytes sent, 11792 stored, identical. Dispatch 2, this os-dev-report,, POST /repos/objectstack-ai/objectui/issues/12958/comments. Not REST: git push of the branch (empty probe, then 3 commits). Reads: unauthenticated REST GETs of the card, its comments, the ruling comment, objectui#12955, PR #13024 and its check-runs.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed — main's manifest @objectstack/* ranges and main's CHANGELOG.md never carry the computed floor or its entry, because the publish lane commits nothing (35 of 37 ranges are below today's floor); this is by design under ruling B and is in the Acceptance notes of PR #13024",
    "carrier: 承接者:无 · noted, not filed — the nightly Spec Range Floors still does a full build on nights its scan is skipped (exit 2); moving the floor step before the build would save it, and it was left after the build to mirror the publish order; this is in the Acceptance notes of PR #13024"
    ],
    "deviations": [
    "Line budget: scripts/objectstack-floor.mjs (181) plus its test (119) is 300 lines, over the ~250. The whole diff is 353+/9- across 8 files: .github/workflows/spec-range-floors.yml, content/docs/guide/ci-cd-pipeline.md, package.json, scripts/tests/ci-cd-pipeline-doc.test.ts, scripts/tests/objectstack-floor.test.ts, scripts/check-spec-range-floors.mjs, scripts/markdown-test-inputs.mjs, scripts/objectstack-floor.mjs. The doc-parity declaration and the ledger entry were forced by the existing gates.",
    "Tier H touched: .github/workflows/spec-range-floors.yml (card item 4: the nightly follows the keep decision). PR #13024 stays draft for an APPROVED review by os-zhuang or hotlong.",
    "Declared narrowing: the root pnpm exec vitest run scripts/__tests__ was run in place of the full pnpm test, and pnpm type-check:scripts in place of pnpm type-check; CI runs both full forms.",
    "The install needed pnpm run setup, which builds the 7 @objectstack packages at the pin; it ran under the lock (178 s, VERDICT command-exit 0). The first frozen install failed with ENOENT on node_modules/.cache/objectstack/client, as objectstack-pin.mjs documents.",
    "One locked targeted test call outlived the tool's 300 s timeout while it queued behind another agent's typecheck (pid 917, slot issue-24424). The harness moved it to the background, where it ended at 99 (never acquired) with the slot kept; it was re-run in the foreground. No result came from it.",
    "Commit trailers use the model-free pair (Claude-Session plus Co-authored-by: Claude), per objectui AGENTS.md and the role file, not the harness reminder's model-named trailer.",
    "No changeset: check-changeset-presence answers that none is owed (root scripts, docs, a workflow, and the private root package.json only).",
    "Cleanup: removed the worktree's node_modules, then git worktree remove (no --force; it succeeded); scratch probes deleted. No process started by this run is alive."
    ]
    }

  6. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #13024 comment 6260856786 · domain:devx seat 1 · session_01FM29ZqLTrnPNXxijioZwMp · 2026-10-19T06:13Z. Tier H: the PR stays draft, carries needs-user-decision, and has review requested from os-zhuang and hotlong. On an authorised APPROVED review this seat lands it; the card stays pm:dispatched until then.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:devx seat 1 @ objectui (#5748) · session_01FM29ZqLTrnPNXxijioZwMp · 2026-10-19T06:40Z

    reading result
    merge queue (gh-readonly-queue/main/pr-13024-* heads) none left: the entry has drained
    PR object PR #13024 merged at 2026-10-19T06:37:07Z, approved by os-zhuang (Tier H)
    origin/main at 4484a11041, by content squash commit 4484a11 (PR #13024) adds scripts/objectstack-floor.mjs (181 lines) and scripts/__tests__/objectstack-floor.test.ts; root package.json:137 changeset:publish runs node scripts/objectstack-floor.mjs first, ahead of check-published-dist-tooling.mjs, check-spec-range-floors.mjs and changeset publish; .github/workflows/spec-range-floors.yml +18

    State change: PR #13024 closed this card through Fixes #12958 (completed); pm:dispatched comes off in this act.

    Carried onward: the first live reading of the floor computation is objectui's next changeset:publish run (the release PR #11600). If it exits 2 (no @objectstack/spec release contains the pinned .objectstack-sha), that is the script refusing as designed, not a regression; the remedy is a framework release that contains the pin.


    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

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p1tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions