Repository navigation
finding(ci): Spec Main Shape Gate is red on every run since objectstack c5ad1de0 — the sparse objectstack checkout omits patches/, so pnpm install cannot open patches/tsup@8.5.1.patch #11024
Description
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: the road's merge step — every objectui pull request can land | 缺项 (the required
Spec Main Shape Gatefails before it compiles anything) | P1Triage: first grade —
bug·tooling·priority:p1·domain:ui·area:devpath·pm:queue. A wall on every objectui landing. Stop-the-bleed: addpatchesto the gate's sparse set, in one commitTriage: lands in
.github/workflows/spec-main-shape-gate.yml(git sparse-checkout set packages/spec scripts,:151on objectuiorigin/main) ⇒domain:ui. The maintainer's standing ruling on objectui#10916 (5866275396) sends this gate's red to anydomain:uiseat at once, and objectui#10987, the last such card, wasdomain:ui.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T22:52Z. ⛔ Not a claim, ⛔ not a dispatch. The standing ruling means adomain:uiseat need not have waited for this grade.Read, not assumed.
- Upstream. objectstack
origin/main'spnpm-workspace.yaml:37declarespatchedDependencies: tsup@8.5.1: patches/tsup@8.5.1.patch. It arrived with objectstack PR build: one ts.Program per DTS pass — patch tsup's bundled rollup-plugin-dts grouping (spec 4997 → 882 MB live heap) objectstack#20499 (c5ad1de027, 2026-09-28T20:19Z), which also addedpatches/tsup@8.5.1.patch. - The gate. Its cone sparse set brings in root files, so it reads the patch map, but it leaves out
patches/.pnpm install --frozen-lockfile --filter @objectstack/spec...(:177) then cannot open the file. - The gate is required. The
mainruleset's required checks includeSpec Main Shape Gate. The workflow's own header still says 「it is not REQUIRED」, which is out of date. - Runs. The last green run was merge group
36481292449at 2026-09-28T20:44Z, against objectstack beforec5ad1de0. PR objectui#11023's run36488067207failed at the install. Nothing on the objectui side changed between them.
Why p1. Every objectui pull request and merge group fails a required check, so nothing lands, including the p1 cards objectui#10872 and objectui#7611 and release PR objectui#5400. A wall carries its chain's ceiling, and the ceiling here is p1. It is the same grade as objectui#10996.
Direction.
- The stop-the-bleed commit:
git sparse-checkout set packages/spec scripts patches. At fix time, re-read objectstack's rootpnpm-workspace.yamlfor any other root-relative path the filtered install reads, and put those in the cone too. - Out of the stop-the-bleed commit: deriving the sparse set from
patchedDependencies, and correcting the header's "not required" paragraph (withdependabot-merge-gate.mjs'sNOT_A_GATEentry). Note them in the PR body. They are the follow-up, if the maintainer wants them. - ⛔ Don't ask objectstack to drop the patch. The fix belongs to the consumer, whose checkout shape broke.
⚠️ The push touches.github/workflows/**. If the claimant's token cannot push a workflow edit, or cannot enqueue it (landing-operations ③), say so on this card at once. Then it goes to the maintainer as a one-line push. ⛔ Don't wait it out.- Proof: the gate goes green on the fix PR and in its merge group, against objectstack
mainat or afterc5ad1de0.
- Upstream. objectstack
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop · stop-the-bleed under the standing ruling (objectui#10916,
5866275396)
Session:session_01DuWo5bdP9SdVebamn99GGk
Account:os-steve(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11024-spec-gate-sparse-patches
Worktree:objectui-issue-11024
Domain:domain:ui
Seat:domain:ui#1
File surface (triage grade5880183671):.github/workflows/spec-main-shape-gate.ymlonly. The sparse set becomespackages/spec scripts patches, plus any other root-relative path that objectstack's rootpnpm-workspace.yamlmakes the filtered install read, re-derived at fix time.
⛔ Out of this commit: deriving the sparse set frompatchedDependencies, and correcting the header's "not REQUIRED" paragraph anddependabot-merge-gate.mjs'sNOT_A_GATEentry. The PR body names them as the follow-up, if the maintainer wants them.
Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: opus(TIER_DEFAULT, objectstackscripts/pm/dispatch-gates.mjs:12692at81137630)
Clause-②: no
Why no: a CI workflow's checkout shape; no declared surface, published type or documented contract moves.
Thread-read: 5880183671
Concurrency: the maintainer set this seat to one card in flight. This claim is the stop-the-bleed the standing ruling sends to anydomain:uiseat at once. The one card in flight, objectui#10519 (PR objectui#10777), is idle: its contract review waits on an exhausted review tier, and objectui#10777 cannot land while this gate is red either.
Serial constraints cleared: read 2026-09-28T22:57Z at objectuiorigin/main. No open PR touches.github/workflows/spec-main-shape-gate.yml(open: objectui#11023, #10930, #10777, #10278, #5400).
Push permission (triage's⚠️ , landing-operations ③): the file sits under.github/workflows/. If the push or the enqueue is refused for want of workflow permission, this seat says so on this card at once and hands it to the maintainer as a one-line push. ⛔ No workaround.domain:uiseat #1 · claim · 2026-09-28T22:57Z
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11024,
"status": "blocked",
"branch": "claude/issue-11024-spec-gate-sparse-patches",
"pr": "#11025",
"session": "session_01DuWo5bdP9SdVebamn99GGk (subagent: the parent PM seat's id, as the fleet relay derived it from the container)",
"premise_still_valid": true,
"summary": "The card's fix is implemented, pushed and proven on CI. Commit 2dea2bc on draft PR objectui#11025 changes the one file .github/workflows/spec-main-shape-gate.yml: the sparse set is nowpackages/spec scripts patches, and the header says why each directory in the cone is needed. On the PR's own gate run (run 36496355982, job 109176735394, compiled against objectstack 397572ed5da04c14eed7b4bf934a4c353822df6c, which is after c5ad1de0), every step throughType-check objectui against itsucceeded, including the install that used to fail. BLOCKED, and not because of this card: the gate is still red. Now that it can compile again, it reports an attributed shape break from objectstack dc0759389a (objectstack PR 20503, merged 20:30:52Z, 11 minutes after c5ad1de0 had already stopped the gate from measuring).packages/types/src/__tests__/p2-spec-exports.test.tsstill writesoperator: 'eq'in twoz.input-typed fixtures, which gives 2x TS2322. Each fix is red on its own (a PR with only the test fix hits the install ENOENT; this PR alone hits the shape break), so they cannot land in separate queue entries. Only the PM can decide whether this PR is widened or paired with a new card. One in-place change, declared in the PR body: the header paragraph I was editing said the spec build calls 'two' root scripts. It now calls three, so I dropped the count (AGENTS.md commandment 9).",
"reproduction": "Replayed outside CI with the workflow's exact clone flags and sparse set, against objectstack main fb194c70e5bf01b66dde4687f60b180452f1744b (2026-09-28T21:46Z), pnpm 10.31.0. Commands:git clone --depth=1 --filter=blob:none --no-checkout --single-branch --branch main+sparse-checkout init --cone+set packages/spec scripts+ fetch/checkout --detach the sha. Thenpnpm install --frozen-lockfile --filter @objectstack/spec...gaveENOENT: no such file or directory, open '.../repro/patches/tsup@8.5.1.patch'and EXIT=254, the same failure as CI run 36488067207. The stack goes throughcreateHexHashFromFile, called by pnpm'scalcPatchHashes(opts.patchedDependencies, lockfileDir). I read that call in pnpm 10.31.0's own dist: install hashes the WHOLE patchedDependencies map before any filter applies.",
"rederived_paths": "Every root-relative path the filtered install reads, at objectstack fb194c70e5bf: (1)pnpm-workspace.yamlpatchedDependencies:tsup@8.5.1: patches/tsup@8.5.1.patch. This is the only path-bearing value, andpatchescovers it. (2)packageslists workspace globs, and the install ran with only packages/spec checked out before c5ad1de0 too. (3)overridesandonlyBuiltDependenciesare versions and names, no paths. There is nocatalog,packageExtensionsorpnpmfilekey. (4).npmrc=auto-install-peers=trueonly. (5) The root package.jsonpnpmfield =ignoredBuiltDependenciesnames only. (6) There is no.pnpmfile.cjsat the root. (7) The rootpreparescript =node scripts/setup-git-hooks.mjs, andscriptsis already in the cone. Conclusion: the conepackages/spec scripts patchescovers all of them. Control:git sparse-checkout setwith a directory that does not exist exits 0, so the cone still works if objectstack retirespatches/.",
"tests": "Fix proven locally on a fresh clone with the new cone, same sha:pnpm install --frozen-lockfile --filter @objectstack/spec...EXIT=0 (Done in 5.3s, installedtsup@8.5.1_patch_hash=d1c8d6bd...).pnpm --filter @objectstack/spec buildunder os-verify-lock:VERDICT command-exit 0 · held the lock 99s,DTS ⚡️ Build success,check-dts-emitted: @objectstack/spec - 36/36,check-dts-references ... 394/394 relative reference(s) resolved.npm pack --ignore-scriptsEXIT=0 (objectstack-spec-17.4.0.tgz). Gates on head 2dea2bc (clean tree): the workflow parses with theyamlpackage (0 errors, 0 warnings; the parsed run block holdsgit sparse-checkout set packages/spec scripts patches). This repo has no actionlint or yamllint wiring. All 81 test files under scripts/tests that read.github/workflows/(derived bygit grep -l; the set includes spec-main-shape-gate.test.ts and ci-cd-pipeline-doc.test.ts), run under os-verify-lock:Test Files 81 passed (81),Tests 3148 passed (3148),VERDICT command-exit 0.node scripts/check-control-bytes.mjs: OK. Self-scan with grep -P for control bytes: no hits.pnpm check:new-line-citations:0 new citation(s).node scripts/check-governed-queue-guard.mjs --test .github/workflows/spec-main-shape-gate.yml:NOT GOVERNED.node scripts/check-changeset-presence.mjs: exit 0,no changeset is owed. CI on head 2dea2bc, polled every 60 s until all were complete: 40 check-runs = 36 success + 3 skipped + 1 failure. The failure isSpec Main Shape Gate(run 36496355982, job 109176735394, objectstack 397572ed5da0). Steps 8-12 (build spec, pack, install objectui, inject, type-check) all succeeded. Step 13Reportexited 1 on an ATTRIBUTED shape break: 2x TS2322Type '\"eq\"' is not assignable to type '\"in\" | ... | \"is_not_empty\"'in packages/types/src/tests/p2-spec-exports.test.ts, plus@object-ui/typespnpm run type-check exited (2). With--continue, that is the full diagnostic set. Local inject and type-check: not run (the CI run is the reading). Ablation/reverse verification: not applicable (workflow checkout shape; the reproduction before and after is the two-leg proof).",
"gate_run": { "run_id": 36496355982, "job_id": 109176735394, "conclusion": "failure (attributed shape break, not the install ENOENT)", "objectstack_sha_compiled": "397572ed5da04c14eed7b4bf934a4c353822df6c", "install_and_build_steps": "success" },
"mcp_calls": "0",
"api_writes": "2 — (1) POST /repos/objectstack-ai/objectstack/dispatches carrying pr_create (relay run 36496321840, success; it landed as POST /repos/objectstack-ai/objectui/pulls = PR 11025, draft, body read back byte-identical, 5830 bytes); (2) this os-dev-report comment via post-stamped. Also 2 git pushes (empty branch probe + commit 2dea2bc), which are not REST writes. The label-write (PR assignee) never ran: denied by the classifier, see deviations.",
"deviations": [
"PR assignee NOT set. Command:node /home/user/objectstack/scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11025 --assign os-steve. Refused before execution, so there is no exit code. The refusal, verbatim:Permission for this action was denied by the Claude Code auto mode classifier. Reason: [External System Writes].Per the brief, not retried and not worked around. PR 11025 readsassignees: [].",
"The brief's proof (gate green on this PR's own run) is NOT met. The install ENOENT is gone. The remaining red is a second, separate, attributed shape break (see out_of_scope_findings). I did not widen the commit."
],
"open_questions": [
{
"question": "How should the second red (objectstack PR 20503 typed ViewFilterRule.operator's input as canonical, and objectui's p2-spec-exports.test.ts still typesoperator: 'eq'twice) land, given that neither fix can go green alone?",
"options": [
"A: widen PR 11025 with a second commit in a second file: change bothz.inputfixtures in packages/types/src/tests/p2-spec-exports.test.ts to author the canonical'equals', and rewrite the stale comment that says 'eq' is valid input. One merge-queue entry, green gate. Costs the one-file scope the claim declared, so the claim's file surface has to be amended.",
"B: file a separate stop-the-bleed card for the test, and land both through one combined PR or with maintainer help. Keeps scopes clean but, per the merge queue measured here, neither PR can pass its own queue entry, so it costs a maintainer action or a combined PR anyway.",
"C: ask objectstack to revert PR 20503. Rejected: it is a deliberate!narrowing with an ADR-0087 migration entry, and the gate header says the consumer answers by adapting."
],
"recommendation": "A, because the mutual red makes B a combined PR in all but name. The test change is mechanical: author the canonical value the spec now types, and the runtime fold of stored aliases is untouched per objectstack PR 20503. The gate on the widened head is the proof."
}
],
"out_of_scope_findings": [
"class: a · reach: public door, the REQUIREDSpec Main Shape Gateon every objectui PR and merge group, red with an attributed verdict (run 36496355982 job 109176735394, compiled against objectstack 397572ed5da0) · evidence: objectstack dc0759389a (feat(spec)!: type ViewFilterRule.operator's input as the canonical ViewFilterOperator, objectstack PR 20503 for objectstack issue 20450, merged 2026-09-28T20:30:52Z) narrowed the TYPED input of the operator. The runtime fold is unchanged. objectui packages/types/src/tests/p2-spec-exports.test.ts typesoperator: 'eq'in the 'should validate a full ViewTab' fixture (z.input of ViewTabZod) and the 'should validate a ViewFilterRule' fixture (z.input of ViewFilterRuleZod), which gives 2x TS2322. The objectstack PR landed inside the gate's blind window (red on install since c5ad1de0 at 20:19:57Z), so it was never measured. Coupled with objectui#11024: each fix alone stays red · dedupe words: Spec Main Shape Gate TS2322 eq ViewFilterRule operator z.input · p2-spec-exports.test.ts operator 'eq' equals · objectstack 20503 ViewFilterOperator input canonical · shape break 397572ed5da0",
"carrier: the maintainer, via the triage grade's named follow-up · noted, not filed: derive the sparse cone from objectstack'spatchedDependenciesso a patch declared outsidepatches/cannot break the gate again. The PR body lists it under Acceptance notes.",
"carrier: the maintainer, via the triage grade's named follow-up · noted, not filed: the workflow header's 'REQUIRABLE, and it is not REQUIRED' paragraph andscripts/dependabot-merge-gate.mjs'sNOT_A_GATEentry are stale now that the ruleset requires the context. The PR body lists this too."
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim amendment: the same stop-the-bleed, widened to the gate's second red ·
domain:uiseat #1 · 2026-09-28T23:25Zsession_01DuWo5bdP9SdVebamn99GGk(os-steve). This amends claim5880232524. Same branch and PR objectui#11025.Why. Dev report
5880554679measured it on PR objectui#11025's own gate run (run36496355982, compiled against objectstack397572ed5da0):- The sparse-set fix works: the install, the spec build, the pack and the objectui install all succeed.
- Now that the gate can compile again, it reports an attributed shape break. objectstack
dc0759389a(objectstack PR 20503, merged 2026-09-28T20:30Z, eleven minutes afterc5ad1de0blinded the gate) typesViewFilterRule.operator's input as the canonicalViewFilterOperator. packages/types/src/__tests__/p2-spec-exports.test.tsstill typesoperator: 'eq'in twoz.inputfixtures, which gives 2 × TS2322.- Each fix alone stays red: the test fix alone hits the install ENOENT, and the workflow fix alone hits the shape break. Neither can pass its own merge-queue entry.
By landing-operations' main-red convention ②, one failing check anchors one card, so the second cause belongs on this card, not on a new one.
Amended file surface:
.github/workflows/spec-main-shape-gate.yml: unchanged, commit2dea2bce7.- Added:
packages/types/src/__tests__/p2-spec-exports.test.ts, as a second commit. The twoz.inputfixtures author the canonical'equals', and the comment that calls'eq'a valid input is rewritten to what objectstack PR 20503 made true. The runtime fold of stored aliases is untouched upstream, so ⛔ no runtime or source file moves.
⛔ Not ask objectstack to revert PR 20503: it is a deliberate
!narrowing with an ADR-0087 migration entry, and the gate's own header says the consumer adapts.Clause-②: no
Why no: one CI workflow's checkout shape and two test fixtures; no published type, schema or documented contract of objectui moves.Proof unchanged:
Spec Main Shape Gategreen on PR objectui#11025's own run, then in its merge group.domain:uiseat #1 · claim amendment · 2026-09-28T23:25Z
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11024,
"status": "done",
"branch": "claude/issue-11024-spec-gate-sparse-patches",
"pr": "#11025",
"session": "session_01DuWo5bdP9SdVebamn99GGk (subagent: the parent PM seat's id)",
"premise_still_valid": true,
"summary": "Under the seat's ruling A and claim amendment 5880586933, PR objectui#11025 now carries two commits, pushed fast-forward from 2dea2bc to 41479ac. (1) 2dea2bc, unchanged: the gate's sparse cone gainspatches. (2) 41479ac: the twoz.inputfixtures in packages/types/src/tests/p2-spec-exports.test.ts (ViewTab, ViewFilterRule) author the canonical 'equals', and the comment that called 'eq' a valid input now says what objectstack dc0759389a (objectstack#20503) made true. Only the TYPED input narrowed. The upstream runtime still folds a stored or plain-JS 'eq' onto equals, and objectstack pins that in view-filter-operator-input-typed.test.ts. I read that pin at 397572ed5da0: its 'folds an alias the type refuses to the canonical id' case. PROOF MET:Spec Main Shape Gateis green on this PR's own run 36498521701 (job 109183620840), every step including Report. All 43 check-runs on 41479ac completed: 40 success, 3 skipped, 0 failure. One deviation from the brief's literal text, declared rather than silent: the second commit also adds an empty-frontmatter.changeset/11024-spec-gate-canonical-operator-fixtures.md, because the REQUIREDChangeset Declarationcontext owes one for any file under a released package's src/ (see deviations). Context for the seat: objectstack#20503's own consumer probe of objectui reported 0 errors because it compiled sources, not this test layer.",
"tests": "On head 41479ac (clean tree):pnpm --filter @object-ui/types type-checkexit 0, under os-verify-lock. The script istsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json, andtsc -p tsconfig.test.json --listFilesnames p2-spec-exports.test.ts once. Caveat: it compiled against the installed published @objectstack/spec 17.4.0, where both spellings compile, so the gate is the reading against main.vitest run packages/types/src/__tests__/p2-spec-exports.test.ts:Test Files 1 passed (1),Tests 20 passed (20).vitest run packages/types/:Test Files 276 passed (276),Tests 6380 passed (6380); os-verify-lockVERDICT command-exit 0.git grep -l p2-spec-exportsfinds no scripts/tests gate that reads the file by name (hits: the new changeset and packages/types/CHANGELOG.md only). Because a changeset was added, I ran every scripts/tests file that reads.changeset:Test Files 24 passed (24),Tests 914 passed (914),VERDICT command-exit 0. Other checks:node scripts/check-control-bytes.mjsOK;pnpm check:new-line-citations0 new citation(s);node scripts/check-changeset-presence.mjsexit 0 (it was exit 1 before the changeset);pnpm changeset:checkexit 0 (fixed group + no major);pnpm check:changeset-claimsexit 0;pnpm check:pending-changeset-literalsexit 0;check-governed-queue-guard --teston all 3 pathsNOT GOVERNED; grep -P control-byte self-scan no hits. From the earlier round on 2dea2bc: the local reproduction (ENOENT exit 254), the fixed install and spec build (VERDICT command-exit 0), the YAML parse, and 81 workflow-reading test files / 3148 tests passed. CI on 41479ac, polled every 60 s to completion: 43 check-runs = 40 success + 3 skipped.Spec Main Shape Gatesuccess, run 36498521701, job 109183620840, steps 1-13 all success, annotations = 1 runner-image notice.Changeset Declarationsuccess (job 109183620902).",
"gate_run": {
"run_id": 36498521701,
"job_id": 109183620840,
"head": "41479ac63df0c80a0a42897b0ebfc5704da10d19",
"conclusion": "success",
"objectstack_sha_compiled": "fb386074f57b234c98c40938aae7a0486ad50e8b (DERIVED, not read from the run log: the log redirect host productionresultssa*.blob.core.windows.net is refused by this container's egress proxy with a 403 on CONNECT, so I did not retry. fb386074f57b is objectstack main's tip now; its push-triggered runs were created 2026-09-28T23:25:14Z; the gate's Resolve step ran 23:32:25Z. So main was fb386074f57b at resolve time. It is after c5ad1de0 and after dc0759389a.)"
},
"claim_check": "Amendment 5880586933 names the branch by reference, not by literal name: 'Same branch and PR objectui#11025'. PR 11025's head is claude/issue-11024-spec-gate-sparse-patches, and origin's ref read 2dea2bc before this round, as the seat said. Its file surface lists the workflow and the test file. It does not list the changeset (see deviations).",
"pr_body_replacement": "Fixes #11024\nClause-②: no\n\nThe requiredSpec Main Shape Gatehas failed on every objectui pull request and merge group since objectstackc5ad1de0, for two reasons. This PR fixes both. Neither fix can pass the gate alone, so they land together.\n\n1. The gate could not install (commit2dea2bce7). objectstackc5ad1de0declaredpatchedDependenciesin its rootpnpm-workspace.yaml, and the patch file lives underpatches/. The gate's cone sparse checkout (packages/spec scripts) brings in root files, so it reads the patch map, but it leaves thepatches/directory out.pnpm install --frozen-lockfile --filter @objectstack/spec...then cannot open the patch file and exits 254 before anything compiles.\n2. Once it could install, it reported a real shape break (commit41479ac63). objectstackdc0759389a(objectstack#20503) typed a view filter rule's inputoperatoras the canonicalViewFilterOperator. It merged eleven minutes afterc5ad1de0, while the gate was already unable to measure.packages/types/src/__tests__/p2-spec-exports.test.tsstill typedoperator: 'eq'in twoz.inputfixtures, which gave 2x TS2322.\n\n## What changed\n\nCommit2dea2bce7changes.github/workflows/spec-main-shape-gate.yml:\n\n- The sparse set becomesgit sparse-checkout set packages/spec scripts patches.\n- The header's fetch-shape paragraph now says why each directory in the cone is there. The same edit drops that paragraph's out-of-date count of how many root scripts the spec build calls (it now calls three). AGENTS.md commandment 9 says a comment should not carry a derived count, so the sentence no longer states one.\n\nCommit41479ac63changespackages/types/src/__tests__/p2-spec-exports.test.tsand adds a changeset:\n\n- TheViewTabandViewFilterRulez.inputfixtures now author the canonical'equals'instead of'eq'.\n- The comment that called'eq'a valid input now says what objectstack#20503 made true. Only the TYPED input narrowed. The upstream runtime still folds a stored or plain-JS'eq'ontoequalsat parse time, and objectstack pins that fold in its ownview-filter-operator-input-typed.test.ts, not this file.\n-.changeset/11024-spec-gate-canonical-operator-fixtures.mdhas an EMPTY frontmatter, which declares that nothing is released. The test file sits under@object-ui/types'src/, so the requiredChangeset Declarationcontext owes a declaration. Without one,node scripts/check-changeset-presence.mjsexits 1 on this head.\n\nNo runtime, source or published type of objectui moves.\n\n## Measured before the change (replayed outside CI)\n\nSame clone flags and sparse set as the workflow, against objectstackmain=fb194c70e5bf(2026-09-28T21:46Z, afterc5ad1de0), pnpm 10.31.0:\n\n\ngit clone --depth=1 --filter=blob:none --no-checkout --single-branch --branch main https://github.com/objectstack-ai/objectstack repro\ngit sparse-checkout init --cone\ngit sparse-checkout set packages/spec scripts\ngit fetch --depth=1 origin fb194c70e5bf01b66dde4687f60b180452f1744b\ngit checkout --detach fb194c70e5bf01b66dde4687f60b180452f1744b\npnpm install --frozen-lockfile --filter @objectstack/spec...\n=> ENOENT: no such file or directory, open '.../repro/patches/tsup@8.5.1.patch' exit 254\n\n\nThis matches the CI failure on PR objectui#11023 (run 36488067207).\n\n## Which root paths the filtered install reads (re-derived at fix time)\n\nThese are the path-bearing settings pnpm reads from objectstack's root, atfb194c70e5bf:\n\n-pnpm-workspace.yaml\n -patchedDependencies:tsup@8.5.1: patches/tsup@8.5.1.patch. This is the only root-relative path in the file, andpatchescovers it.\n -packageslists workspace globs. The filtered install already ran with onlypackages/specchecked out beforec5ad1de0.\n -overridesandonlyBuiltDependenciescontain versions and names only, no paths.\n - The file has nocatalog,packageExtensionsorpnpmfilekey.\n-.npmrcholds onlyauto-install-peers=true, which is not a path.\n- The rootpackage.jsonpnpmfield holds onlyignoredBuiltDependencies, which lists names.\n- There is no.pnpmfile.cjsat the root.\n- The rootpreparescript isnode scripts/setup-git-hooks.mjs, andscriptsis already in the cone.\n\nWhy the filter does not help: pnpm 10.31.0's install callscalcPatchHashes(opts.patchedDependencies, lockfileDir)on the whole map before any filtering, so it hashes every patch file the map names.\n\ngit sparse-checkout setexits 0 when a named directory does not exist. A control run with a made-up directory name confirmed this. So if objectstack retires the patch and deletespatches/, this cone still works.\n\n## Measured after the change\n\nFor the workflow commit, on a fresh clone with the new sparse set at the same sha:\n\n-pnpm install --frozen-lockfile --filter @objectstack/spec...exited 0 and installed the patched tsup.\n-pnpm --filter @objectstack/spec buildexited 0 (VERDICT command-exit 0under the container's verify lock).\n-npm pack --ignore-scriptsexited 0.\n\nOn this PR's first head (2dea2bce7), gate run 36496355982 compiled against objectstack397572ed5da0. Every step through the type-check succeeded. TheReportstep then failed on the attributed shape break above, and only that: 2x TS2322 inp2-spec-exports.test.ts, the full set under--continue.\n\nFor the fixture commit, on head41479ac63:\n\n-pnpm --filter @object-ui/types type-checkexited 0. It includestsc -p tsconfig.test.json, whose--listFilesnamesp2-spec-exports.test.ts.\n- Caveat: that run compiled against the installed published@objectstack/spec17.4.0, where both spellings compile. The gate is the reading against objectstackmain.\n-vitest run packages/types/src/__tests__/p2-spec-exports.test.ts:Tests 20 passed (20).\n-vitest run packages/types/:Test Files 276 passed (276),Tests 6380 passed (6380).\n\nThe proof:Spec Main Shape Gateis green on this head (41479ac63). Run 36498521701, job 109183620840, 23:32Z to 23:43Z. Every step succeeded: the install, the spec build, the pack, the inject, the type-check, andReport. The only annotation is a runner-image notice.\n\nThe run compiled against objectstackfb386074f57b, which is after bothc5ad1de0anddc0759389a. That sha is derived, not read from the run log: the log host is refused by this container's egress proxy. The derivation:fb386074f57bwas on objectstackmainby 23:25:14Z, since its push-triggered runs were created then. The resolve step ran at 23:32:25Z. Andfb386074f57bis stillmain's tip.\n\nAll 43 check-runs on this head completed: 40 success, 3 skipped, 0 failure.Changeset Declarationis green.\n\n## Checks run locally\n\nOn head2dea2bce7(workflow commit):\n\n- The workflow parses as YAML with theyamlpackage: 0 errors, 0 warnings. This repository has no actionlint or yamllint wiring.\n- I ran every test file underscripts/__tests__/that reads.github/workflows/:Test Files 81 passed (81),Tests 3148 passed (3148).\n\nOn head41479ac63:\n\n-git grepfinds noscripts/__tests__gate that readsp2-spec-exports.test.tsby name. I ran everyscripts/__tests__file that reads.changeset:Test Files 24 passed (24),Tests 914 passed (914).\n-node scripts/check-control-bytes.mjs: OK.\n-pnpm check:new-line-citations:0 new citation(s).\n-node scripts/check-changeset-presence.mjs: exit 0, one changeset with an empty frontmatter.\n-pnpm changeset:check,pnpm check:changeset-claimsandpnpm check:pending-changeset-literals: all exit 0.\n-node scripts/check-governed-queue-guard.mjs --teston all three paths:NOT GOVERNED.\n\n## Acceptance notes and follow-ups (deliberately out of this PR)\n\nPer the triage grade, these are listed here as the follow-up, if the maintainer wants them:\n\n- Derive the cone frompatchedDependencies. The workflow would read objectstack's rootpnpm-workspace.yamland add each patch file's directory to the cone. A patch declared outsidepatches/would then not break the gate again. For now the header says in plain words that nothing derives the cone from that map.\n- The header's "REQUIRABLE, and it is not REQUIRED" paragraph is out of date. Themainruleset now requiresSpec Main Shape Gate(the triage grade on the card measured this).scripts/dependabot-merge-gate.mjsstill lists the context inNOT_A_GATE. Both are left unchanged here.\n\n---\n\n_Generated by Claude Code_\n",
"mcp_calls": "0",
"api_writes": "3 across both rounds, all through the fleet relay (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, which became POST /repos/objectstack-ai/objectui/pulls = PR 11025; (2) os-dev-report comment 5880554679; (3) this round's os-dev-report comment on objectui#11024. Git pushes, which are not REST writes: empty-branch probe, 2dea2bc, 41479ac (fast-forward). The PR-assignee label-write was not retried, per the seat. I did not edit the PR body: the seat patches it with pr_body_replacement.",
"deviations": [
"The second commit touches TWO paths, not one: packages/types/src/tests/p2-spec-exports.test.ts plus a new EMPTY-frontmatter .changeset/11024-spec-gate-canonical-operator-fixtures.md. Why: with the test file alone,node scripts/check-changeset-presence.mjsexits 1 with1 source file(s) of 1 released package(s) changed, and this change adds no changeset: @object-ui/types packages/types/src/__tests__/p2-spec-exports.test.ts, and that script backsChangeset Declaration, which scripts/dependabot-merge-gate.mjs lists in REQUIRED_CONTEXTS. Both AGENTS.md (a test-only change declares an empty frontmatter) and the role file's changeset rule, which prevails over the dispatch text on conflict, require the declaration. Without it the PR could not land. Flagged here, not chosen silently. The claim's file surface would need the changeset path added.",
"To keep ONE second commit, I amended the local, never-pushed commit ac4fd8777 (test file only) into 41479ac (test file + changeset) before the first push of this round. No pushed history was rewritten; the push was a fast-forward from 2dea2bc.",
"The objectstack sha the green gate compiled is derived, not read (see gate_run): the Actions log host is refused by the egress proxy (403 CONNECT). Per the proxy README I did not retry or route around it.",
"Carried over, not retried: the PR-assignee label-write refused earlier by the classifier (Permission for this action was denied by the Claude Code auto mode classifier. Reason: [External System Writes].). PR 11025 still readsassignees: []."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: the maintainer, via the triage grade's named follow-up · noted, not filed: derive the sparse cone from objectstack'spatchedDependenciesso a patch declared outsidepatches/cannot break the gate again. It is listed in the PR body's Acceptance notes.",
"carrier: the maintainer, via the triage grade's named follow-up · noted, not filed: the workflow header's 'REQUIRABLE, and it is not REQUIRED' paragraph and scripts/dependabot-merge-gate.mjs's NOT_A_GATE entry are stale now that the ruleset requires the context. It is listed in the PR body."
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT — PR objectui#11025 (
Fixes #11024, the stop-the-bleed) ·domain:uiseat #1 · 2026-09-28T23:50Zsession_01DuWo5bdP9SdVebamn99GGk(os-steve), the claiming seat under the standing ruling (objectui#10916,5866275396). Checked against GitHub, objectstackorigin/mainand the PR head, ⛔ not against the reports.Checklist
-
Shape. Draft →
main. The body opensFixes #11024, thenClause-②: noat line start. The seat patched the body from dev report5880884345'spr_body_replacement, rewording one=>in a code block. -
Scope. 3 files, +28 / −9, in two commits:
2dea2bce7addspatchesto.github/workflows/spec-main-shape-gate.yml's sparse cone. The header now says why each directory is in the cone, and drops a stale count.41479ac63changes the twoz.inputfixtures inpackages/types/src/__tests__/p2-spec-exports.test.tsto author'equals', and adds an EMPTY-frontmatter.changeset/11024-spec-gate-canonical-operator-fixtures.md.
The changeset is outside amendment
5880586933's listed surface. It is accepted:Changeset Declarationis required and owes a declaration for any file underpackages/types/src/, and an empty frontmatter releases nothing. -
Governed-surface predicate. 3 paths:
NOT governed. -
The proof.
Spec Main Shape Gateis green on head41479ac63: run36498521701, every step throughReport, compiled against objectstackmainafter bothc5ad1de0anddc0759389a. All 43 check-runs: 40 success, 3 skipped, 0 failure.Changeset Declarationis green. -
Both causes, measured.
- The install ENOENT was reproduced outside CI with the workflow's exact clone flags, and fixed by the cone.
- The attributed shape break (2 × TS2322) was read on the first head's own gate run
36496355982, and fixed by the fixtures. - Neither commit is green alone, so they land together (main-red convention ②: one failing check, one card).
-
Changeset prose, verified by the seat. Both sentences are true against objectstack
main: objectstack's.changeset/20450-view-filter-operator-input-typed.mdsays the runtime still foldseqand the other legacy spellings.packages/spec/src/ui/view-filter-operator-input-typed.test.tsexists and pins the fold. -
Commits. Two, trailers model-free.
No contract review is held for this landing. It is a stop-the-bleed on the lane's required gate, which is the case the maintainer answered on the previous one (objectui#10916) with 「晋级修复为什么还需要契约复审,赶紧合并」. It is not governed, and the only prose is the changeset, which the seat verified line by line above.
Not done here, recorded:
- The PR assignee is unset. The dev's
label-write --assign os-steveon PR objectui#11025 was refused by the auto-mode classifier ("External System Writes"). Per the permission rule, the seat does not re-run a write a subagent was refused; it was reported to the maintainer. - The follow-ups triage named stay out of this PR, listed in its body:
- deriving the cone from
patchedDependencies; - the header's stale "not REQUIRED" paragraph and
dependabot-merge-gate.mjs'sNOT_A_GATEentry.
- deriving the cone from
Landing: not governed, required checks green, the gate green on its own run ⇒
pr_readythenautomerge_enablethrough the relay, in this act. The proof completes in the merge group. At the merge the card closes byFixes; the seat verifies by content, stripspm:dispatchedand the assignee, and re-queues nothing: every open objectui PR can land again.domain:uiseat #1 · ACCEPT · 2026-09-28T23:50Z
Generated by Claude Code
-
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsLanded and verified ⇒ the gate is green again ·
domain:uiseat #1 · 2026-09-29T00:06Zsession_01DuWo5bdP9SdVebamn99GGk(os-steve). PR objectui#11025 (Fixes #11024) merged through the queue as12a6688cb. The card closedcompletedbyFixes.- Verified by content on
origin/main. The squash commit's patch-id equals the PR head41479ac63's diff against its merge base, and its only co-author trailer is the model-freeClaude. - The proof, complete.
Spec Main Shape Gateis green on the PR's own run36498521701and in its merge group (gh-readonly-queue/main/pr-11025-…,success), against objectstackmainafter bothc5ad1de0anddc0759389a.
Close-out.
pm:dispatchedand the assignee come off in this act (Fixesauto-close strips neither). Claim5880232524and amendment5880586933are spent.What this unblocks. Every objectui PR and merge group can pass the required gate again, including release PR objectui#5400.
- A PR whose last gate run was red for this reason needs a new run to go green: a push, or a
mainmerge when its base lacks12a6688cb. - ⛔ A re-run alone does not help, because it reuses the old merge commit.
The follow-ups triage named, left to the maintainer's choice (listed in PR objectui#11025's body):
- deriving the sparse cone from objectstack's
patchedDependencies; - the workflow header's stale "not REQUIRED" paragraph and
dependabot-merge-gate.mjs'sNOT_A_GATEentry.
domain:uiseat #1 · landed · 2026-09-29T00:06Z
Generated by Claude Code
- Verified by content on
- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ① a required check red on a tree no objectui PR broke. It has a named site and a measured cause.
Reach: measured.
Spec Main Shape Gate(run 36488067207, job 109149732486, 2026-09-28T21:44Z) failed inBuild @objectstack/spec from objectstack mainwith exit 254.reportstep then exits 2 with "the captured typecheck log … does not exist".mainafresh, so every pull request, and every merge group, meets the same failure.Filed by the
domain:spec @ objectuiseat (sessionsession_012UwY3ahMixEFkfTUxMVkYm). ⛔ Not graded here.Standing rule (the maintainer's ruling recorded on objectui#10916, comment
5866275396): when this gate is red onmainor in the merge queue, anydomain:uiseat claims the repair at once as a stop-the-bleed, without waiting for triage's grade.The failure
It was compiling against objectstack
9e9bb4641704(2026-09-28T21:03Z).Cause, measured
c5ad1de0, merged 2026-09-28T20:19:57Z) added the root filepatches/tsup@8.5.1.patch. It also added this to its rootpnpm-workspace.yaml:.github/workflows/spec-main-shape-gate.ymlclones objectstack blobless with a cone sparse checkout:git sparse-checkout set packages/spec scripts. Cone mode brings in root files, includingpnpm-workspace.yamlwith its newpatchedDependenciesentry, but not thepatches/directory. Sopnpm install --frozen-lockfile --filter @objectstack/spec...reads the patch map and cannot open the file.4a1df19656bf(20:06:57Z), beforec5ad1de0. Nothing about objectui changed between that green run and this red one.Direction (for the claiming seat)
patchesto the gate's sparse set, i.e.git sparse-checkout set packages/spec scripts patches. Re-derive the list from objectstack's rootpnpm-workspace.yamlat fix time, since any other root-relative path the install reads must be in the cone too.patchedDependencies, so the next upstream patch does not break it again..github/workflows/. A push that edits a workflow needs a token with workflow permission (landing-operations: "PR touches.github/workflows/**and the token lacks workflows permission").patches/dir for a filtered spec install) is objectstack's own call and is not proposed here.Dedupe
tabskey, andp1-spec-alignment.test.tsstill authorstabs#10987, Spec Main Shape Gate red on every PR head:plugin-designerNavigationDesigner has nodocentry after objectstack#19789 added thedocnavigation type #10287, Spec Main Shape Gate is red against objectstack main f7a3495: three objectui tests that type a helper withReturnType<typeof ObjectSchema.safeParse>no longer acceptObjectSchema.safeParse(...)(TS2345) #10229, [ruling C] compile objectui against @objectstack/spec@main as the shape gate — required, replacing the reverted declaration-text snapshot (objectstack PR #18971) #9860) are all closed and carry other causes: type errors against new spec shapes, and the gate's origin.patches/.Dedupe words: Spec Main Shape Gate ENOENT patches tsup@8.5.1.patch · sparse-checkout packages/spec scripts · patchedDependencies objectstack pnpm-workspace · exit 254 before compile