Skip to content

deps(plugin-detail): raise @object-ui/plugin-detail's @objectstack/spec floor from ^18.0.0-next.1 to ^18.0.0-next.3, the first release that exports the SelectOptionKind its published types reference #12946

Closed

Description

@objectstack-fleet

Filing gate ①, a measured defect with reach. Out-of-scope finding in os-dev's report on objectui#12943 (6247257897), re-measured by domain:ui seat 1. ⛔ Not a claim.

Reader who acts: domain:ui seat 1. It claims and dispatches this card in the same act.

Measured

  • At objectui main 32b492b6, packages/plugin-detail/package.json declares "@objectstack/spec": "^18.0.0-next.1".
  • PR fix(plugin-detail): record path takes a stage terminal from its option's declared kind #12922 (8392f74a, objectui#12907) made packages/plugin-detail/src/synth/buildDefaultPageSchema.ts import the type SelectOptionKind from @objectstack/spec/data. It touched no package.json. The published dist/synth/buildDefaultPageSchema.d.ts carries that reference.
  • SelectOptionKind is first exported by @objectstack/spec 18.0.0-next.3, and is absent from the next.2 tarball. So the declared floor admits specs that the published types cannot compile against.
  • The gate catches it: the nightly Spec Range Floors on main went red at c4dd7078 (run 39096968879, 2026-10-18), after green on 2026-10-17. Its only finding is floor-too-low on @object-ui/plugin-detail.
  • changeset:publish runs check-spec-range-floors.mjs before changeset publish, so the next objectui release is refused until this floor moves.
  • The dev's control: with app-shell's base manifest, the finding is identical. Probe: raising only plugin-detail's floor to ^18.0.0-next.3 gives exit 0. objectui main's lockfile already resolves 18.0.0-next.3, so resolution does not move.

Done when

  • packages/plugin-detail/package.json declares "@objectstack/spec": "^18.0.0-next.3".
  • pnpm-lock.yaml's importer specifier is regenerated with pnpm, never by hand, and its resolution stays 18.0.0-next.3.
  • After a ./packages/* build, check:spec-floors exits 0. check:installed-pin-claims and check:lockfile-integrity are green.
  • One changeset for @object-ui/plugin-detail says the floor and why.
  • ⛔ No other package's floor moves. objectui#12943 moves app-shell's.

Correction to objectui#12943: that card's last Done-when line reads "no other published artifact reads a next.3-only key". The line is false as of 32b492b6. This card is the correction. The seat wrote that line, and the seat corrects it.

Dedupe: a REST read of this repository's 100 most recently updated issues (state=all, since=2026-10-16; controls objectui#12943 and #12922 found), grepped for SelectOptionKind, spec-range-floors, spec-floors, floor-too-low and Spec Range Floors. Every hit is the app-shell floor work (objectui#12943, PR #12945) or PR #12922 itself. None is a floor raise for plugin-detail.


Generated by Claude Code

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    on Oct 18, 2026
  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · seat-filed correction to the seat's own objectui#12943 card (provenance: os-dev's out-of-scope finding in report 6247257897; the maintainer's 「下限提到 next.3」 is the directive both floors serve)
    Session: session_0188TsgPV8kQXfuRuKmkj2ks
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12946-plugin-detail-spec-floor
    Worktree: objectui-issue-12946
    Domain: domain:ui
    Seat: domain:ui#1
    File surface:

    • packages/plugin-detail/package.json (the @objectstack/spec range only);
    • pnpm-lock.yaml (the plugin-detail importer's specifier, regenerated by pnpm);
    • one .changeset/12946-plugin-detail-spec-floor.md.

    Stop on breach; explain in the report.
    Container & model: S, mode:subagent, model: sonnet (floor tier: mechanical, judged by check:spec-floors after a build, check:installed-pin-claims and check:lockfile-integrity)
    Clause-②: no
    Clause-② reason: the dependency range narrows to what the published types already reference; no export, prop, key or schema moves.
    Responsibility: n/a — a floor PR #12922 did not raise, caught by the nightly gate as designed
    Thread-read: none
    Serial constraints cleared: read at objectui main 32b492b6.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12946,
    "status": "done",
    "branch": "claude/issue-12946-plugin-detail-spec-floor",
    "pr": "#12948",
    "session": "session_0188TsgPV8kQXfuRuKmkj2ks",
    "premise_still_valid": true,
    "summary": "Raised @object-ui/plugin-detail's @objectstack/spec floor from ^18.0.0-next.1 to ^18.0.0-next.3: one manifest line, the importer specifier line regenerated by pnpm (the lockfile diff is that single line; the resolution stays 18.0.0-next.3(ai@7.0.65(zod@4.6.7)) and no other entry moved), and one patch changeset (.changeset/12946-plugin-detail-spec-floor.md) stating the floor and why (published dist/synth/buildDefaultPageSchema.d.ts references SelectOptionKind from @objectstack/spec/data, first exported by next.3). Premise verified on origin/main 32b492b: the built plugin-detail dist carries the reference, and check:spec-floors is exit 1 with that one finding before the edit and exit 0 after it. Zone 2 answers. (1) Confirmed: pnpm changed only the plugin-detail importer's specifier line; 1774 resolutions on both sides; no other package's entry moved. (2) Re-measured on my head: before the edit exactly one floor-too-low finding (plugin-detail), after the edit none; no other floor-too-low appeared. (3) plugin-detail declares in dependencies: @object-ui/i18n workspace:, @objectstack/spec, lucide-react ^1.43.0; its peerDependencies and devDependencies name only workspace @object-ui/ packages, react/router peers and tooling. @objectstack/spec is its only @objectstack/* range, so nothing else needs to move with it. (4) Grep for 18.0.0-next.1 across scripts/, packages/plugin-detail/, docs/, content/, .github/ and .changeset/: MOVED: packages/plugin-detail/package.json only. LEFT, with reason: scripts/tests/check-spec-range-floors.test.ts and check-changeset-no-major.test.ts (literal fixture and example ranges; the two lines that name @object-ui/plugin-detail build a fake manifest in the test, they do not read the real one); scripts/check-spec-range-floors.mjs, check-changeset-no-major.mjs, check-eager-closure-budget.mjs and scripts/tests/check-lockfile-integrity.test.ts (example ranges and history in header comments); content/docs/guide/ci-cd-pipeline.md (names the manifest and quotes no range literal on purpose); docs/ and .github/ (no hit); the dated changesets under .changeset/ (records, excluded by check:installed-pin-claims by path); other packages' and apps' own manifests (the card says no other floor moves); source and test comments of the form 'since next.1 ... changed' (history, not assertions). No pin asserts plugin-detail's declared floor, so nothing else needed to move with it.",
    "tests": "No source or test file changes (one manifest range, one lockfile specifier line, one changeset), so no unit suite is owed on this diff and no tested behaviour changed: ablation not applicable. Evidence run on the final head 5ffc1a6 with the build from origin/main 32b492b (sources identical): (a) pnpm exec turbo run build --filter=./packages/* --concurrency=2 under os-verify-lock.sh, NODE_OPTIONS=--max-old-space-size=4096: VERDICT command-exit 0, 39 of 39 tasks successful, 38 of them restored from the turbo cache (the dist the floor gate read is the cached output of identical inputs; positive control: grep of packages/plugin-detail/dist/synth/buildDefaultPageSchema.d.ts shows the SelectOptionKind import from @objectstack/spec/data). (b) Ten script suites that read manifests, the lockfile or the floor gate, run from the repo root as vitest run --maxWorkers=2 with file paths (no bare --), under the lock: Test Files 10 passed (10), Tests 319 passed (319), VERDICT command-exit 0; the files are check-spec-range-floors, check-installed-spec-pin-claims, check-lockfile-integrity, check-lockfile-dedupe, check-changeset-no-major, ci-cd-pipeline-doc, workspace-peer-dependency-edges, check-phantom-dependencies, doc-version-claims and spec-symbol-ledger-plugin-detail-7265. (c) pnpm install --frozen-lockfile on the final head: exit 0, 'Lockfile is up to date'. Absence control for 'next.1 and next.2 lack SelectOptionKind': grep over the fetched next.1 and next.2 tarballs finds 0 files; the same grep for ServiceObject finds it in the next.2 tarball; the installed next.3 carries SelectOptionKind in dist/data/index.d.ts. plugin-detail's own typecheck and unit tests were not run: no source, type or resolution moved, so they are CI's.",
    "gates": "Local subset, hand-derived (objectui has no scripts/pm, so there is no dispatch-gates.mjs derivation and no --ran reconciliation; the list is the brief's plus manifest, lockfile and changeset readers). Exit codes captured via redirect before any pipe. On the final head 5ffc1a6: pnpm check:spec-floors 0 ('Every consumer-facing @objectstack/spec floor carries the symbols its package's artifact references', 22 of 39 published packages inspected, 552 pairs judged), the same with -- --cross-check 0 (65 entry points, import and require halves agree), BEFORE the edit it was 1 (single finding, plugin-detail floor-too-low on SelectOptionKind); check:installed-pin-claims 0 (OK); check:lockfile-integrity 0 (VERDICT clean, 1774 resolutions on both sides); check:lockfile-dedupe 0 (VERDICT deduped); node scripts/check-changeset-presence.mjs 0 (no changeset owed by its criterion; one added anyway as the card asks); pnpm changeset:check 0; pnpm check:changeset-claims 0 (1 changeset read at the committed head; the run before the commit read none and measured nothing, so it was re-run). Neighbours, all 0: check:phantom-deps, check:unused-deps, check:control-bytes, check:pending-changeset-literals, check:pre-install-import-graph, check:side-effects-array, check:published-tsconfig-exclude; node scripts/check-governed-queue-guard.mjs --test over the three paths: NOT GOVERNED; manual control-byte grep over the changeset and manifest: none. CI (cited, not re-run): PR 12948 head 5ffc1a6 check-runs read with per_page=100 at report time, 37 total: 13 completed/success (Build & E2E, Changeset Fixed Group Check, Test (dist pins), Changeset Overwrite Report, Changeset Declaration, label, Lockfile Dedupe Check, Governed Surface Queue Guard, Lockfile Integrity Check, Changeset Claim Re-read, Changeset Bump Policy, Live E2E (informational), Line Citation Gate); 3 completed/skipped (dependabot, Test (coverage), Test (coverage shard)); 21 in_progress, including Test shards 1-16 of 16, Type Check and Build Docs. in_progress is the honest value; no test:repo run locally (CI's Test Core owns it, and the diff touches no repo-project test or derived list). Spec Range Floors is nightly and publish-path only (no pull_request trigger by design), so no PR check-run exists for it; the local exit 0 above is the evidence.",
    "mcp_calls": "0 (no MCP GitHub tool was called; one ToolSearch loaded the issue_read schema and I used gh api GET reads instead)",
    "api_writes": "2 relay actions through scripts/pm/fleet-write via with-fleet.sh --via dispatch, executed as objectstack-fleet[bot]: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft true) + POST /repos//issues/12948/assignees [sunhaolin]; read-back 4937 bytes sent and 4937 stored, identical, assignee sunhaolin as the pull lists it; (2) comment = POST /repos//issues/12946/comments (this report). No label writes: the two labels on the PR (dependencies, plugin) came from the repo path labeler. Also 2 git pushes (the empty-branch probe, exit 0, then 5ffc1a6). The claim, the card assignee and the card labels were not touched. All other GitHub calls were GET reads.",
    "deviations": "1. PR body wording, to be corrected by the seat (the body is write-once for me): Acceptance note 3 says the pending 18.0.0-next.3 changeset sentence 'was false for this package'. That overstates it. The sentence 'Every package keeps its @objectstack/* range ..., which already admits it' was literally true when written (the old range does admit next.3); what it implied, that no floor needs to move, was false for plugin-detail, and after this PR 'keeps its range' is false for this package. Suggested replacement for that sentence: 'The pending changeset for the 18.0.0-next.3 bump says every package keeps its range; this PR makes @object-ui/plugin-detail the exception, and the new changeset says so. The older changeset is not edited here (outside this card's file surface).' The shipped changeset text itself is accurate ('the exception to the note that every package keeps its range'). 2. Commit trailers are the model-free pair (Co-Authored-By: Claude with noreply@anthropic.com, plus Claude-Session) per this agent's rule, not the model-named line the harness reminder asks for; the harness did not rewrite the commit. 3. 38 of 39 build tasks were turbo cache restores, so the dist the floor gate read was not freshly compiled in this container; the positive control above shows it carries the reference under test. 4. PR 12948 reads mergeable_state behind: main advanced one commit (fb501bc, a core action fix) that touches neither the lockfile nor the plugin-detail manifest; I did not merge main (no conflict, no red caused by main). 5. Cleanup done: the worktree node_modules removed and git worktree remove run without --force (exit 0); no background process or lock held; scratch files stay under the per-issue scratchpad directory.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none, noted not filed · scripts/check-changeset-presence.mjs owes no changeset for a move of a package's dependencies range (its criterion counts eight manifest fields, and dependencies is not one), although a floor is a published claim and this card needed one. By design per AGENTS.md section 9, an observation only; the floor itself is held by the nightly and publish-path gate, which is why the card's defect surfaced a day after PR 12922 landed."
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · amended (file surface, from the dev's report 6247447661 on this card)
    Session: session_0188TsgPV8kQXfuRuKmkj2ks
    Account: sunhaolin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12946-plugin-detail-spec-floor
    Worktree: objectui-issue-12946
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: the first claim's 6247328305, plus one sentence:

    Stop on breach; explain in the report.
    Container & model: unchanged from 6247328305 (S, mode:subagent, model: sonnet)
    Clause-②: no
    Clause-② reason: unchanged; the edit is release-note text, and no range, key or schema moves beyond the first claim's.
    Responsibility: unchanged from 6247328305
    Thread-read: 6247447661
    Serial constraints cleared: no other open objectui PR names .changeset/12873-spec-next-3.md. The open PRs are this card's #12948, the seat's #12945 (queued), three bot PRs, and Version Packages #11600, which consumes pending changesets only when a maintainer merges it.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12946,
    "status": "done",
    "report_kind": "delta on comment 6247447661, under the amended claim 6247473209 (confirmed the newest Claim: on the card; same branch)",
    "branch": "claude/issue-12946-plugin-detail-spec-floor",
    "pr": "#12948",
    "session": "session_0188TsgPV8kQXfuRuKmkj2ks",
    "premise_still_valid": true,
    "summary": "Commit 284c09e (pushed; PR head is now 284c09e) rewrites ONLY the range sentence in .changeset/12873-spec-next-3.md (1 line changed; front matter, the sentence before it and every other line untouched) and aligns the exception sentence of .changeset/12946-plugin-detail-spec-floor.md. The sentence now reads: 'Every package keeps its @objectstack/* range (^18.0.0-next.1, or ^18.0.0-next.2 for @object-ui/types and @object-ui/components), which already admits it, except @object-ui/app-shell (objectui#12943) and @object-ui/plugin-detail (objectui#12946), which declare ^18.0.0-next.3.' @object-ui/types stays at ^18.0.0-next.2 and both exceptions are named with their card numbers. My changeset now says it is one of the two exceptions the note names (the other is app-shell, objectui#12943), and its last clause reads 'this change moves no other package's range' (it read 'no other package's range moves', which beside PR 12945 would not print true in the same release). The PR body was edited once through the relay (issue_patch on 12948, 6337 bytes sent and stored identical, tail read back, footer intact): Acceptance note 3 is replaced by a note saying what this commit changed; three nearby lines that would otherwise have gone stale were changed in the same edit (see deviations). No package manifest or lockfile line moved in this commit.",
    "tests": "Changeset text only; no source, test, manifest or lockfile change, so no suite is owed and no tested behaviour changed (ablation not applicable). Control-byte grep over both changesets: none. Measured fact the new sentence rests on, read from every packages/ and apps/ manifest at 5ffc1a6 (the commit before this one): @objectstack/* ranges declared are ^18.0.0-next.1 in 22 dependencies entries, 12 devDependencies entries and 1 peerDependencies entry (plugin-list); ^18.0.0-next.2 in 3 dependencies entries (app-shell, components, types); ^18.0.0-next.3 in 1 (plugin-detail). Once PR 12945 lands app-shell joins plugin-detail at next.3, which is the state the sentence describes.",
    "gates": "On head 284c09e, exit codes captured via redirect: node scripts/check-changeset-claims.mjs 0 and pnpm check:changeset-claims 0 (2 changeset bodies read, 2 declaring a package, no finding); pnpm changeset:check 0 (fixed group, no-major); node scripts/check-changeset-presence.mjs 0 (4 files changed vs merge-base 32b492b, 1 changeset added, no changeset owed by its criterion); node scripts/check-changeset-overwrite.mjs 0 (report-only); node scripts/check-governed-queue-guard.mjs --test over the four paths: NOT GOVERNED. What the Changeset Overwrite Report says about editing a pending changeset: it is report-only and does not fail the build. It lists .changeset/12873-spec-next-3.md as 'M, a changeset this change did not add', prints 'declared at base' and 'declares now' (the same nine packages, all minor, so no declaration was lost), and states that a changeset is append-only by nature and that touching one it did not add is usually one of three things: a filename collision that overwrites someone else's declaration (the case to restore the file for), a deliberate correction such as prose that no longer matches the change (legitimate), or a superseding replacement added in the same change (legitimate). This edit is the second case. CI on 284c09e, 37 check-runs read with per_page=100: Changeset Overwrite Report completed/success, Changeset Declaration success, Changeset Claim Re-read success, Changeset Bump Policy success, Lockfile Integrity Check success, Lockfile Dedupe Check success, Governed Surface Queue Guard success, Line Citation Gate success, label success, Live E2E (informational) success; 3 skipped (dependabot, Test (coverage), Test (coverage shard)); 22 in_progress and 2 queued (Test shards, Type Check, Build & E2E, Build Docs and the rest). in_progress and queued are the honest values. The floor, lockfile and install readings in comment 6247447661 stand from 5ffc1a6: this commit touches neither the manifest nor the lockfile. I did not merge main: no gate needed it (all exit 0), the merge-base is still 32b492b, and PR 12948 reads mergeable_state behind only by fb501bc, a core action fix that touches neither file this PR changes.",
    "mcp_calls": "0 (no MCP GitHub tool was called)",
    "api_writes": "This follow-up: 3. (1) git push of 284c09e to the claimed branch (exit 0); (2) relay issue_patch = PATCH /repos//issues/12948, the PR body, the one body edit allowed (6337 bytes sent and stored identical); (3) relay comment = POST /repos//issues/12946/comments (this delta). Cumulative on the card: 4 relay actions (pr_create with its assignee leg, comment 6247447661, issue_patch, this comment) and 3 git pushes. No label writes, no assignee changes on the card, no second claim. All other GitHub calls were GET reads.",
    "deviations": "1. The new sentence lists @object-ui/components beside @object-ui/types as declaring ^18.0.0-next.2, which the seat's wording did not. Measured: components declares ^18.0.0-next.2 in its dependencies (the old parenthesis named only types and app-shell, so it omitted components); without it the sentence would not read true in the released CHANGELOG, which was the stated requirement. If the seat wants the literal wording, the change is to delete 'and @object-ui/components' in that one sentence. 2. Beyond replacing Acceptance note 3, the single body edit also changed: the opening paragraph (now says there is also a one-sentence edit to a pending changeset), one added Measured bullet for commit 284c09e and its gate readings, 'three paths' to 'four paths the PR touches' in the governed note, and one prose line carrying the session URL as a backticked span ahead of the footer, so the session reference survives a PATCH. These would otherwise have stated three paths, one changeset and no follow-up. This also settles deviation 1 of comment 6247447661 (the overstated 'was false for this package' wording is gone). 3. Own changeset: besides aligning the exception sentence, the clause 'no other package's range moves' became 'this change moves no other package's range', for the same CHANGELOG-truth reason (PR 12945 moves app-shell's in the same release). 4. The worktree had been removed at the end of the first round; for this follow-up I re-attached one to the existing local branch at 5ffc1a6 (no node_modules install was needed: every gate run is plain node or a pnpm script that reads no dependency). It was removed again before this comment was posted (git worktree remove without --force, exit 0; clean tree, branch pushed at 284c09e; no background process or lock held).",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: seat domain:ui#1, PR 12945 (queued, not mine to edit), noted not filed · .changeset/12943-app-shell-spec-floor.md ends 'No other package's @objectstack/* range moves.' That is true of PR 12945 alone; in the released CHANGELOG, beside plugin-detail's floor raise from this PR, it reads inexact. Suggested wording if the seat edits it: 'This change moves no other package's range.' An observation on dated release-note prose, not one of the three filing classes."
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #12948 comment 6247629935 · review at TIER_DEFAULT (no contract face, Clause-②: no) · head 284c09e · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-18T08:27Z

    The PR goes to ready and auto-merge through objectui's merge queue; the landing note follows on MERGED.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-18T08:42Z

    PR #12948 merged through objectui's merge queue as 03f1d65289. Its one parent is 44cb469d, and the merge is an ancestor of origin/main.

    probe parent 44cb469 merge 03f1d65
    changed lines, merge vs PR diff (merge-base 32b492b → reviewed head 284c09e) — identical (4 files, +16 / −3)
    @objectstack/spec in packages/plugin-detail/package.json ^18.0.0-next.1 ^18.0.0-next.3
    the pending 18.0.0-next.3 note names app-shell and plugin-detail as exceptions 0 1
    a model name in the merge commit's message — 0

    State change:

    • Fixes #12946 closed this card completed, and this act removes pm:dispatched.
    • @object-ui/plugin-detail's floor now carries the SelectOptionKind its published types reference. The dev measured check:spec-floors at exit 0 with no finding on the head. The next nightly Spec Range Floors on main, red since c4dd7078, is the confirmation in CI, and changeset:publish no longer meets this finding.
    • The pending 18.0.0-next.3 changeset now reads true beside both floor raises: app-shell (objectui#12943, 641dad4) and plugin-detail (this card).

    Records:

    • the claim 6247328305, amended 6247473209;
    • the dev's report 6247447661 and delta 6247513147;
    • the ACCEPT 6247629935 (TIER_DEFAULT, no contract face).

    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:recordsBusiness objects, records, the views that show data, usable forms, searchdependenciesdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions