You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
tooling(pin): share the pinned @objectstack build across worktrees, keyed by the pin — a fresh worktree's pnpm run setup costs about 3 minutes and 295 MB, a copied build about 6.5 s #12972
objectui#12957 puts the pinned build under each checkout's node_modules/.cache/objectstack, so every new worktree builds it again.
case
time
disk
a fresh worktree, cold pnpm run setup at the pin
175.7 s
+295 MB (cache 201 MB)
a second fresh worktree right after
167.5 s
+295 MB
a third worktree with the first one's cache copied in, same command
6.5 s
+286 MB as a copy; about 85 MB if hardlinked (an estimate, not measured)
Every os-dev dispatch creates one worktree, so each dispatch pays about 160 s that a shared build would save, roughly 96% of setup. CI is not affected: it already restores the build from a cache keyed by the pin (median cold 111 s, warm restore 2–3 s).
Done when
A build keyed by .objectstack-sha and scripts/objectstack-pin.mjs lives once per machine, outside any checkout's node_modules, at a documented path that can be overridden.
pnpm run setup in a worktree whose pin matches reuses it through a copy, a hardlink or a symlink, whichever keeps the frozen install and objectui#12957's lockfile check valid. A mismatched or partial entry is never reused.
The second-worktree time and disk are measured and reported against the table above.
⛔ No change to the CI cache, and none to the lockfile's resolution form.
No priority:* was set at filing. Triage grades it now.
Fresh read: the per-checkout layout this card reuses (node_modules/.cache/objectstack) is on objectui origin/main749ed76076. The root package.json overrides point there.
p2: a measured cost on every dispatch (about 160 s and 295 MB per fresh worktree), and maintainer-directed (「如果需要共享缓存,你就开卡」). Nothing ships wrong while it waits, and CI is unaffected.
Claim: PM loop round 3
Session: session_01FM29ZqLTrnPNXxijioZwMp
Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12972-shared-pin-build
Worktree: objectui-issue-12972
Domain: domain:devx
Seat: domain:devx#1 (objectui, seat post #5748)
File surface: scripts/objectstack-pin.mjs with its tests, scripts/bump-objectstack.sh only if the shared path must be named there, and one docs line for the documented path (stop on breach; explain in the report). ⛔ No CI cache change and no change to the lockfile's resolution form (card item 4): the root package.json overrides, pnpm-lock.yaml and .objectstack-pin/ stay as b014f5e left them.
Container & model: M (a machine-wide build cache with a two-worktree measurement), mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate")
Clause-②: no
Responsibility: n/a — not a defect card (a measured per-dispatch cost; the maintainer's 「如果需要共享缓存,你就开卡」)
Thread-read: 6257395840
Serial constraints cleared: #13008, the predecessor on scripts/objectstack-pin.mjs, landed as PR #13031 (b014f5e) at 2026-10-19T08:49Z. No open objectui PR touches scripts/objectstack-pin.mjs, scripts/bump-objectstack.sh, the root package.json, .gitignore or .objectstack-pin/ (read at 2026-10-19T08:52Z). #13017 (p3, same file) is queued and not dispatched.
{
"issue": 12972,
"status": "done",
"branch": "claude/issue-12972-shared-pin-build",
"pr": "https://github.com/objectstack-ai/objectui/pull/13035",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — the parent seat's id (mode:subagent), as the harness Claude-Session line stamps it",
"premise_still_valid": true,
"summary": "scripts/objectstack-pin.mjs now keeps one build of the pin per machine, outside every checkout, in $OBJECTSTACK_PIN_STORE (default $XDG_CACHE_HOME/objectstack-pin, else ~/.cache/objectstack-pin), as PIN-HASH, where HASH is taken over the script's own bytes (the same inputs as CI's cache key). A fresh checkout COPIES the entry into node_modules/.cache/objectstack, checks the copy (judgeStamp plus a content hash recorded at publish), and only then links it beside the committed manifests. Only a build made in the same run is published (copy, hash, rename into place; a concurrent loser drops its copy). The store keeps the 4 most recently used entries, and an OBJECTSTACK_ROOT stand-in never reads or writes it. The CI cache path and key, the overrides, pnpm-lock.yaml, .objectstack-pin/*/package.json and .github/ are byte-identical to b014f5e. Copy was chosen over hardlink or symlink on the four axes: links would turn one checkout's write into a built file into a machine-wide corruption, and read-only mode does not stop root; a symlink breaks the actions/cache save. Measured: a second fresh worktree runs pnpm run setup in 8.7 s against 192.4 s cold. PR opened as a draft; CI was still running when this report was written.",
"tests": "At HEAD 098d4cb, in the worktree, under os-verify-lock: `pnpm exec vitest run scripts/__tests__/objectstack-pin.test.ts scripts/__tests__/bump-objectstack.test.ts scripts/__tests__/check-lockfile-dedupe.test.ts scripts/__tests__/render-budget-comment.test.ts` (every test file that names the script) gave 'Test Files 4 passed (4)' and 'Tests 104 passed (104)', exit 0. New describe block 'one build per machine, outside every checkout (objectui#12972)' has 9 tests: path and key; publish once, then build() at the pin reuses a copy, offline (inode differs from the entry, a marker appended in the checkout never reaches the entry, check() passes); it.each over 5 spoiled entries (another pin, a package gone, a file gone, a byte changed, no record), each refused with its reason, staging emptied, build falls back to the fetch; the lost rename race (existsSync spy); prune. The stand-in test also asserts the store is never created, and the whole file stubs OBJECTSTACK_PIN_STORE. Ablations: 5 one-behaviour mutations through /home/user/objectstack/scripts/ablation-replace.mjs in WRAP mode (anchor x1 to x0, replacement x0 to x1, restore proved as blob == HEAD 5c3c1dbc15c3 with git diff HEAD empty). No build or dist step applies: the test imports ../objectstack-pin.mjs from source. Results: hash check removed gave 2 failed (a file gone, a byte changed); reuse cpSync replaced by cp -al gave 1 failed ('a copy, not a link'); rename-race fallback removed gave 1 failed (race test); stand-in exclusion removed gave 1 failed (stand-in test); prune keep off by one gave 1 failed (prune test). Every ablation went red as predicted.",
"gates": "Local, at 098d4cb, exit codes captured before any pipe: vitest (4 files above) exit 0; `pnpm run type-check:scripts` (tsc -p tsconfig.scripts.json; --listFilesOnly shows scripts/objectstack-pin.mjs and scripts/__tests__/objectstack-pin.test.ts in the program) exit 0; `pnpm exec eslint scripts/objectstack-pin.mjs scripts/__tests__/objectstack-pin.test.ts` exit 0; `node scripts/check-governed-queue-guard.mjs --test` on the 3 paths exit 0, 'NOT GOVERNED'; `node scripts/check-changeset-presence.mjs` exit 0, 'no changeset is owed' (same as objectui#13031: no changeset file); `pnpm run check:new-line-citations` exit 0, '0 new citation(s)'; `pnpm run check:test-path-roots` exit 0, OK; `pnpm run check:pre-install-import-graph` exit 0, OK (Node builtins only); `node scripts/check-doc-links.mjs` exit 0, 'Links are valid across 17 scan roots'; control-byte self-scan (grep -naP over the 3 files) found nothing. --ran reconciliation: not applicable, because dispatch-gates.mjs derives objectstack's families only; the objectui list was derived by hand from AGENTS.md and the scripts naming the file. Full pnpm test farm and repo-wide lint: CI. PR #13035 check-runs at 098d4cb29b when this report was written (34 total): success 7 (Build Docs, Changeset Fixed Group Check, Governed Surface Queue Guard, Changeset Claim Re-read, Line Citation Gate, Changeset Declaration, label); skipped 3 (dependabot, Test (coverage), Test (coverage shard)); in_progress 24 (Test shards 1-16, Test (dist pins), Type Check, Lint, Repo Gates, Lockfile Dedupe Check, Build & E2E, Bundle Analysis, Live E2E (informational)).",
"mcp_calls": "0 — no MCP tool was called",
"api_writes": "2 relay writes carrying 3 REST requests, plus 2 git pushes (not REST): (1) pr_create through scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectui, one POST /repos/objectstack-ai/objectstack/dispatches (run 39230451395, success) executing POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos/objectstack-ai/objectui/issues/13035/assignees [os-warren]; read-back: 10511 bytes sent, 10511 stored, identical; (2) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12972/comments via scripts/pm/post-stamped.mjs --repo=objectstack-ai/objectui. No labels written; the documentation and tests labels on the PR came from labeler.yml.",
"open_questions": [],
"out_of_scope_findings": [],
"files_changed": [
"scripts/objectstack-pin.mjs",
"scripts/__tests__/objectstack-pin.test.ts",
"CONTRIBUTING.md"
],
"line_budget": "266 changed lines against b014f5e (253 added, 13 removed), over the ~250 budget by 16",
"measurements": [
{
"case": "base b014f5e, cold, this container",
"time_s": 189.8,
"worktree_disk_mb": 286,
"store_mb": null
},
{
"case": "this PR, first fresh worktree, cold, empty store",
"time_s": 192.4,
"worktree_disk_mb": 286,
"store_mb": 201
},
{
"case": "this PR, second fresh worktree right after (warm, copy)",
"time_s": 8.7,
"worktree_disk_mb": 286,
"store_mb": 0
},
{
"case": "this PR, two fresh worktrees at once, warm",
"time_s": [
11.4,
11.4
],
"worktree_disk_mb": [
286,
286
],
"store_mb": 0
},
{
"case": "this PR, two fresh worktrees at once, cold, empty store (one published, the other: another run published it first)",
"time_s": [
222,
224.8
],
"worktree_disk_mb": [
286,
286
],
"store_mb": 201
},
{
"case": "primitives on the 201 MB / 2182-file cache",
"copy_s": 0.5,
"copy_mb": 201,
"hardlink_s": 0.05,
"hardlink_mb": 0.35,
"symlink_s": 0,
"reuse_hash_s": 0.81
}
],
"measurement_method": "du -sk over the pnpm store, then the worktree, then the pin store, in one invocation, so hardlinks shared with the pnpm store are not charged to the worktree. All runs were under os-verify-lock with one other os-dev in the container, so the seconds are shared-box readings. The card table it is compared against: 175.7 s / +295 MB cold, 6.5 s / +286 MB copied. A hardlinked warm worktree would be about +85 MB (286 - 201); that is derived from the parts, not a measured full run.",
"deviations": [
"Line budget: 266 changed lines against the ~250 asked.",
"The first stand-in ablation wrote a stand-in entry (fake pin 0123456789ab) into this container's real default store /root/.cache/objectstack-pin, because the other stand-in tests did not set the store. I removed it (the directory did not exist before this run), added a file-wide vi.stubEnv of OBJECTSTACK_PIN_STORE in commit 098d4cb, and re-ran that ablation: it went red and the real store stayed untouched.",
"A stray file named 0 (an awk redirection of mine) was created in the worktree root. It was never committed and was removed before the worktree was removed.",
"Left on purpose: /root/.cache/objectstack-pin holds one 201 MB entry for pin 2c9bf9430a and this script (key suffix e957cc31d1c0558e). If the PR squash-lands with the script bytes unchanged, main computes the same key and later worktrees at this pin reuse it. Delete it with rm -rf /root/.cache/objectstack-pin if unwanted.",
"Clause-② line: the claim carried 'Clause-②: no', so it is copied as the PR body's second line. objectui has no reader of it.",
"CI was not waited for (as the role file says): 24 of 34 check-runs were in_progress when this report was written."
],
"acceptance_notes_in_pr": "AGENTS.md section 9 (dependencies and lockfile) does not name the store; it is governed and defers the mechanism to the script header, so it was not touched. No carrier. Concurrent cold starts both build (measured; no lock, a deliberate trade-off). On a CI cache miss the runner publishes once to its own home directory, about 1.3 s, and nothing reads it there."
}
{
"issue": 12972,
"status": "done",
"branch": "claude/issue-12972-shared-pin-build",
"pr": "https://github.com/objectstack-ai/objectui/pull/13035",
"session": "session_01FM29ZqLTrnPNXxijioZwMp — the parent seat's id (mode:subagent), as the harness Claude-Session line stamps it",
"premise_still_valid": true,
"round": "patch round 1 on claim 6263431295; head 098d4cb29b moved to 9db00a2189f6b05740a11d99fbc14b17ef222417 (one commit, no rebase, no force, no merge of main because nothing forced one)",
"head": "9db00a2189f6b05740a11d99fbc14b17ef222417",
"summary": "Red on 098d4cb: Test (shard 12/16) failed in scripts/__tests__/check-installed-spec-pin-claims.test.ts, \"has no unledgered drift and no rotted ledger entry\", with one finding on scripts/__tests__/objectstack-pin.test.ts, two lines. Cause: the gate recognises an installed-spec claim as a marker plus a version on one line. On one line the fixture identifier PINNED matched the `pinned` marker (CLAIM_MARKERS is case-insensitive) next to the fixture version 1.0.0. On the other, the reason regex text `the pin is` matched the `pin-is` marker next to a stamp's 1.0.0. Neither line states anything about the installed artifact. Fixed at the producer in 9db00a2: the identifier is now MANIFEST (3 occurrences inside the new describe block only), and the reason regex is /not the pin: the cache holds f{12}, / (it now asserts the cache sha the reason names, not the pin wording). The gate and its LEDGER are untouched; there is no ledger entry. The script is unchanged (blob 5c3c1dbc15c3), so the item-3 measurements and the store key from round 0 still describe this head.",
"red_reproduced": {
"command": "pnpm exec vitest run scripts/__tests__/check-installed-spec-pin-claims.test.ts (repo root of the worktree, at 098d4cb)",
"exit": 1,
"output": "Tests 1 failed | 29 passed (30); × has no unledgered drift and no rotted ledger entry; 'scripts/__tests__/objectstack-pin.test.ts:545,590 claims @objectstack/spec 1.0.0, the artifact resolves 18.0.0-next.3...'"
},
"green": {
"command": "same command at 9db00a2",
"exit": 0,
"output": "Test Files 1 passed (1); Tests 30 passed (30)"
},
"tests": "At 9db00a2, git diff HEAD empty, under os-verify-lock. check-installed-spec-pin-claims.test.ts exit 0 (30 passed). objectstack-pin.test.ts exit 0 (37 passed). bump-objectstack, check-lockfile-dedupe and render-budget-comment tests exit 0 (3 files, 67 passed). `node scripts/check-installed-spec-pin-claims.mjs` exit 0, OK. Exit codes were captured before any pipe. Round 0's 5 ablations still stand: the script is byte-identical, and this round changed only fixture text.",
"gates": "Local at 9db00a2: the vitest runs above, exit 0. `pnpm run type-check:scripts` exit 0. `pnpm exec eslint scripts/__tests__/objectstack-pin.test.ts` exit 0. `check:new-line-citations` exit 0. `check:test-path-roots` exit 0. `check-changeset-presence.mjs` exit 0 (no changeset owed). Control-byte self-scan found nothing. Check-runs on 098d4cb (final): failure in Test and Test (shard 12/16), the finding fixed here; success in the other 30 (Type Check, Lint, Repo Gates, Build & E2E, Test (dist pins), Lockfile Dedupe Check, Bundle Analysis, Governed Surface Queue Guard, Line Citation Gate, Changeset Declaration, and the other shards); skipped 3 (dependabot, Test (coverage), Test (coverage shard)). Check-runs on 9db00a2 when this report was written (34 total): in_progress 31, skipped 3; not waited for.",
"mcp_calls": "0 — no MCP tool was called this round",
"api_writes": "1 this round: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12972/comments via scripts/pm/post-stamped.mjs --repo=objectstack-ai/objectui (fleet relay). Plus 1 git push (not REST). The PR body was not edited.",
"open_questions": [],
"out_of_scope_findings": [],
"files_changed": [
"scripts/__tests__/objectstack-pin.test.ts (this round: 3 added, 3 removed)"
],
"line_budget": "266 changed lines against b014f5e (253 added, 13 removed); this round is a net-zero rename",
"measurements": [
{
"case": "base b014f5e, cold, this container",
"time_s": 189.8,
"worktree_disk_mb": 286,
"store_mb": null
},
{
"case": "this PR, first fresh worktree, cold, empty store",
"time_s": 192.4,
"worktree_disk_mb": 286,
"store_mb": 201
},
{
"case": "this PR, second fresh worktree right after (warm, copy)",
"time_s": 8.7,
"worktree_disk_mb": 286,
"store_mb": 0
},
{
"case": "this PR, two fresh worktrees at once, warm",
"time_s": [
11.4,
11.4
],
"worktree_disk_mb": [
286,
286
],
"store_mb": 0
},
{
"case": "this PR, two fresh worktrees at once, cold, empty store (one published, the other: another run published it first)",
"time_s": [
222,
224.8
],
"worktree_disk_mb": [
286,
286
],
"store_mb": 201
},
{
"case": "primitives on the 201 MB / 2182-file cache",
"copy_s": 0.5,
"copy_mb": 201,
"hardlink_s": 0.05,
"hardlink_mb": 0.35,
"symlink_s": 0,
"reuse_hash_s": 0.81
}
],
"deviations": [
"Resumed from origin/claude/issue-12972-shared-pin-build at 098d4cb in a recreated worktree ../objectui-issue-12972 (removed again after the push). Its `pnpm run setup` reused the machine store: 25.2 s on a busier box, +286 MB.",
"PR body correction for the seat to write (the dev writes the PR body once and never PATCHes it): the heading \"Gates (local, at `098d4cb`)\" should read 9db00a2, and that section can gain a line: \"check-installed-spec-pin-claims.test.ts: exit 1 reproduced at 098d4cb, exit 0 at 9db00a2 (the fixture identifier and the reason regex no longer read as installed-spec claims)\". A grep of the sent body for PINNED, \"the pin is\" and 098d4cb hits only that heading, so no other line went stale.",
"Round 0 deviations stand: the line budget is 266 against ~250; the default store at /root/.cache/objectstack-pin is kept on purpose and was reused this round."
]
}
PR #13035 merged at 2026-10-19T10:15:47Z (not governed; landed by this seat on its ACCEPT 6264621941)
origin/main at f9401e6af5, by content
squash commit f9401e6 (PR #13035); scripts/objectstack-pin.mjs:151 exports STORE_ENV = 'OBJECTSTACK_PIN_STORE', :153STORE_KEEP = 4, :660 resolves the default store under XDG_CACHE_HOME or ~/.cache as objectstack-pin, :709publishToStore; CONTRIBUTING.md:57 names the store
State change: PR #13035 closed this card through Fixes #12972 (completed); pm:dispatched comes off in this act.
The card's item 3 was measured by the dev in this seat's container, against the card's table: a second fresh worktree ran pnpm run setup in 8.7 s against 192.4 s cold. The full table is in the ACCEPT. Nothing is carried onward.
Activity
objectstack-fleet commentedon Oct 19, 2026
Unlock:
pm:blocked→pm:queue·domain:uiseat 1 ·session_0188TsgPV8kQXfuRuKmkj2ks· 2026-10-19T00:37Z⛔ Not a claim.
@objectstack/*by commit —.objectstack-sha, a bump script, and dev and CI built from that commit's source, cached by the pin (ruling B on objectui#12955, step 1) #12957 closedcompletedwhen objectstack-ai/objectui PR feat(tooling): objectui consumes @objectstack/* by commit — .objectstack-sha, bump-objectstack.sh, dev and CI built from the pin (objectui#12957) #12963 merged as749ed760(landing note on that card). objectuimainnow carries.objectstack-sha=2c9bf9430a,scripts/objectstack-pin.mjs(with theOBJECTSTACK_ROOTinput) andpnpm run setup.node_modules/.cache/objectstackplus.stamp.json) is onmain.Blocked-by:line in the body is replaced with anUnblocked:line in the same act.@objectstack/*by commit —.objectstack-sha, a bump script, and dev and CI built from that commit's source, cached by the pin (ruling B on objectui#12955, step 1) #12957 unblocked one at a time (the maintainer's 「后续改为串行派发」), in the order its seat post [PM seat] domain:ui @ objectui — 🟢 os-sales · 由Sales账户的项目负责 #5560 records.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Triage: priority set, p2 ·
domain:devx·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-19T00:57ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
priority:*was set at filing. Triage grades it now.node_modules/.cache/objectstack) is on objectuiorigin/main749ed76076. The rootpackage.jsonoverrides point there.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Claim: PM loop round 3
Session:
session_01FM29ZqLTrnPNXxijioZwMpAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12972-shared-pin-buildWorktree:
objectui-issue-12972Domain:
domain:devxSeat:
domain:devx#1(objectui, seat post #5748)File surface:
scripts/objectstack-pin.mjswith its tests,scripts/bump-objectstack.shonly if the shared path must be named there, and one docs line for the documented path (stop on breach; explain in the report). ⛔ No CI cache change and no change to the lockfile's resolution form (card item 4): the rootpackage.jsonoverrides,pnpm-lock.yamland.objectstack-pin/stay asb014f5eleft them.Container & model:
M (a machine-wide build cache with a two-worktree measurement),mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate")Clause-②: no
Responsibility:
n/a — not a defect card(a measured per-dispatch cost; the maintainer's 「如果需要共享缓存,你就开卡」)Thread-read: 6257395840
Serial constraints cleared: #13008, the predecessor on
scripts/objectstack-pin.mjs, landed as PR #13031 (b014f5e) at 2026-10-19T08:49Z. No open objectui PR touchesscripts/objectstack-pin.mjs,scripts/bump-objectstack.sh, the rootpackage.json,.gitignoreor.objectstack-pin/(read at 2026-10-19T08:52Z). #13017 (p3, same file) is queued and not dispatched.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{ "issue": 12972, "status": "done", "branch": "claude/issue-12972-shared-pin-build", "pr": "https://github.com/objectstack-ai/objectui/pull/13035", "session": "session_01FM29ZqLTrnPNXxijioZwMp — the parent seat's id (mode:subagent), as the harness Claude-Session line stamps it", "premise_still_valid": true, "summary": "scripts/objectstack-pin.mjs now keeps one build of the pin per machine, outside every checkout, in $OBJECTSTACK_PIN_STORE (default $XDG_CACHE_HOME/objectstack-pin, else ~/.cache/objectstack-pin), as PIN-HASH, where HASH is taken over the script's own bytes (the same inputs as CI's cache key). A fresh checkout COPIES the entry into node_modules/.cache/objectstack, checks the copy (judgeStamp plus a content hash recorded at publish), and only then links it beside the committed manifests. Only a build made in the same run is published (copy, hash, rename into place; a concurrent loser drops its copy). The store keeps the 4 most recently used entries, and an OBJECTSTACK_ROOT stand-in never reads or writes it. The CI cache path and key, the overrides, pnpm-lock.yaml, .objectstack-pin/*/package.json and .github/ are byte-identical to b014f5e. Copy was chosen over hardlink or symlink on the four axes: links would turn one checkout's write into a built file into a machine-wide corruption, and read-only mode does not stop root; a symlink breaks the actions/cache save. Measured: a second fresh worktree runs pnpm run setup in 8.7 s against 192.4 s cold. PR opened as a draft; CI was still running when this report was written.", "tests": "At HEAD 098d4cb, in the worktree, under os-verify-lock: `pnpm exec vitest run scripts/__tests__/objectstack-pin.test.ts scripts/__tests__/bump-objectstack.test.ts scripts/__tests__/check-lockfile-dedupe.test.ts scripts/__tests__/render-budget-comment.test.ts` (every test file that names the script) gave 'Test Files 4 passed (4)' and 'Tests 104 passed (104)', exit 0. New describe block 'one build per machine, outside every checkout (objectui#12972)' has 9 tests: path and key; publish once, then build() at the pin reuses a copy, offline (inode differs from the entry, a marker appended in the checkout never reaches the entry, check() passes); it.each over 5 spoiled entries (another pin, a package gone, a file gone, a byte changed, no record), each refused with its reason, staging emptied, build falls back to the fetch; the lost rename race (existsSync spy); prune. The stand-in test also asserts the store is never created, and the whole file stubs OBJECTSTACK_PIN_STORE. Ablations: 5 one-behaviour mutations through /home/user/objectstack/scripts/ablation-replace.mjs in WRAP mode (anchor x1 to x0, replacement x0 to x1, restore proved as blob == HEAD 5c3c1dbc15c3 with git diff HEAD empty). No build or dist step applies: the test imports ../objectstack-pin.mjs from source. Results: hash check removed gave 2 failed (a file gone, a byte changed); reuse cpSync replaced by cp -al gave 1 failed ('a copy, not a link'); rename-race fallback removed gave 1 failed (race test); stand-in exclusion removed gave 1 failed (stand-in test); prune keep off by one gave 1 failed (prune test). Every ablation went red as predicted.", "gates": "Local, at 098d4cb, exit codes captured before any pipe: vitest (4 files above) exit 0; `pnpm run type-check:scripts` (tsc -p tsconfig.scripts.json; --listFilesOnly shows scripts/objectstack-pin.mjs and scripts/__tests__/objectstack-pin.test.ts in the program) exit 0; `pnpm exec eslint scripts/objectstack-pin.mjs scripts/__tests__/objectstack-pin.test.ts` exit 0; `node scripts/check-governed-queue-guard.mjs --test` on the 3 paths exit 0, 'NOT GOVERNED'; `node scripts/check-changeset-presence.mjs` exit 0, 'no changeset is owed' (same as objectui#13031: no changeset file); `pnpm run check:new-line-citations` exit 0, '0 new citation(s)'; `pnpm run check:test-path-roots` exit 0, OK; `pnpm run check:pre-install-import-graph` exit 0, OK (Node builtins only); `node scripts/check-doc-links.mjs` exit 0, 'Links are valid across 17 scan roots'; control-byte self-scan (grep -naP over the 3 files) found nothing. --ran reconciliation: not applicable, because dispatch-gates.mjs derives objectstack's families only; the objectui list was derived by hand from AGENTS.md and the scripts naming the file. Full pnpm test farm and repo-wide lint: CI. PR #13035 check-runs at 098d4cb29b when this report was written (34 total): success 7 (Build Docs, Changeset Fixed Group Check, Governed Surface Queue Guard, Changeset Claim Re-read, Line Citation Gate, Changeset Declaration, label); skipped 3 (dependabot, Test (coverage), Test (coverage shard)); in_progress 24 (Test shards 1-16, Test (dist pins), Type Check, Lint, Repo Gates, Lockfile Dedupe Check, Build & E2E, Bundle Analysis, Live E2E (informational)).", "mcp_calls": "0 — no MCP tool was called", "api_writes": "2 relay writes carrying 3 REST requests, plus 2 git pushes (not REST): (1) pr_create through scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectui, one POST /repos/objectstack-ai/objectstack/dispatches (run 39230451395, success) executing POST /repos/objectstack-ai/objectui/pulls (draft) and POST /repos/objectstack-ai/objectui/issues/13035/assignees [os-warren]; read-back: 10511 bytes sent, 10511 stored, identical; (2) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12972/comments via scripts/pm/post-stamped.mjs --repo=objectstack-ai/objectui. No labels written; the documentation and tests labels on the PR came from labeler.yml.", "open_questions": [], "out_of_scope_findings": [], "files_changed": [ "scripts/objectstack-pin.mjs", "scripts/__tests__/objectstack-pin.test.ts", "CONTRIBUTING.md" ], "line_budget": "266 changed lines against b014f5e (253 added, 13 removed), over the ~250 budget by 16", "measurements": [ { "case": "base b014f5e, cold, this container", "time_s": 189.8, "worktree_disk_mb": 286, "store_mb": null }, { "case": "this PR, first fresh worktree, cold, empty store", "time_s": 192.4, "worktree_disk_mb": 286, "store_mb": 201 }, { "case": "this PR, second fresh worktree right after (warm, copy)", "time_s": 8.7, "worktree_disk_mb": 286, "store_mb": 0 }, { "case": "this PR, two fresh worktrees at once, warm", "time_s": [ 11.4, 11.4 ], "worktree_disk_mb": [ 286, 286 ], "store_mb": 0 }, { "case": "this PR, two fresh worktrees at once, cold, empty store (one published, the other: another run published it first)", "time_s": [ 222, 224.8 ], "worktree_disk_mb": [ 286, 286 ], "store_mb": 201 }, { "case": "primitives on the 201 MB / 2182-file cache", "copy_s": 0.5, "copy_mb": 201, "hardlink_s": 0.05, "hardlink_mb": 0.35, "symlink_s": 0, "reuse_hash_s": 0.81 } ], "measurement_method": "du -sk over the pnpm store, then the worktree, then the pin store, in one invocation, so hardlinks shared with the pnpm store are not charged to the worktree. All runs were under os-verify-lock with one other os-dev in the container, so the seconds are shared-box readings. The card table it is compared against: 175.7 s / +295 MB cold, 6.5 s / +286 MB copied. A hardlinked warm worktree would be about +85 MB (286 - 201); that is derived from the parts, not a measured full run.", "deviations": [ "Line budget: 266 changed lines against the ~250 asked.", "The first stand-in ablation wrote a stand-in entry (fake pin 0123456789ab) into this container's real default store /root/.cache/objectstack-pin, because the other stand-in tests did not set the store. I removed it (the directory did not exist before this run), added a file-wide vi.stubEnv of OBJECTSTACK_PIN_STORE in commit 098d4cb, and re-ran that ablation: it went red and the real store stayed untouched.", "A stray file named 0 (an awk redirection of mine) was created in the worktree root. It was never committed and was removed before the worktree was removed.", "Left on purpose: /root/.cache/objectstack-pin holds one 201 MB entry for pin 2c9bf9430a and this script (key suffix e957cc31d1c0558e). If the PR squash-lands with the script bytes unchanged, main computes the same key and later worktrees at this pin reuse it. Delete it with rm -rf /root/.cache/objectstack-pin if unwanted.", "Clause-② line: the claim carried 'Clause-②: no', so it is copied as the PR body's second line. objectui has no reader of it.", "CI was not waited for (as the role file says): 24 of 34 check-runs were in_progress when this report was written." ], "acceptance_notes_in_pr": "AGENTS.md section 9 (dependencies and lockfile) does not name the store; it is governed and defers the mechanism to the script header, so it was not touched. No carrier. Concurrent cold starts both build (measured; no lock, a deliberate trade-off). On a CI cache miss the runner publishes once to its own home directory, about 1.3 s, and nothing reads it there." }Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
os-dev-report
{ "issue": 12972, "status": "done", "branch": "claude/issue-12972-shared-pin-build", "pr": "https://github.com/objectstack-ai/objectui/pull/13035", "session": "session_01FM29ZqLTrnPNXxijioZwMp — the parent seat's id (mode:subagent), as the harness Claude-Session line stamps it", "premise_still_valid": true, "round": "patch round 1 on claim 6263431295; head 098d4cb29b moved to 9db00a2189f6b05740a11d99fbc14b17ef222417 (one commit, no rebase, no force, no merge of main because nothing forced one)", "head": "9db00a2189f6b05740a11d99fbc14b17ef222417", "summary": "Red on 098d4cb: Test (shard 12/16) failed in scripts/__tests__/check-installed-spec-pin-claims.test.ts, \"has no unledgered drift and no rotted ledger entry\", with one finding on scripts/__tests__/objectstack-pin.test.ts, two lines. Cause: the gate recognises an installed-spec claim as a marker plus a version on one line. On one line the fixture identifier PINNED matched the `pinned` marker (CLAIM_MARKERS is case-insensitive) next to the fixture version 1.0.0. On the other, the reason regex text `the pin is` matched the `pin-is` marker next to a stamp's 1.0.0. Neither line states anything about the installed artifact. Fixed at the producer in 9db00a2: the identifier is now MANIFEST (3 occurrences inside the new describe block only), and the reason regex is /not the pin: the cache holds f{12}, / (it now asserts the cache sha the reason names, not the pin wording). The gate and its LEDGER are untouched; there is no ledger entry. The script is unchanged (blob 5c3c1dbc15c3), so the item-3 measurements and the store key from round 0 still describe this head.", "red_reproduced": { "command": "pnpm exec vitest run scripts/__tests__/check-installed-spec-pin-claims.test.ts (repo root of the worktree, at 098d4cb)", "exit": 1, "output": "Tests 1 failed | 29 passed (30); × has no unledgered drift and no rotted ledger entry; 'scripts/__tests__/objectstack-pin.test.ts:545,590 claims @objectstack/spec 1.0.0, the artifact resolves 18.0.0-next.3...'" }, "green": { "command": "same command at 9db00a2", "exit": 0, "output": "Test Files 1 passed (1); Tests 30 passed (30)" }, "tests": "At 9db00a2, git diff HEAD empty, under os-verify-lock. check-installed-spec-pin-claims.test.ts exit 0 (30 passed). objectstack-pin.test.ts exit 0 (37 passed). bump-objectstack, check-lockfile-dedupe and render-budget-comment tests exit 0 (3 files, 67 passed). `node scripts/check-installed-spec-pin-claims.mjs` exit 0, OK. Exit codes were captured before any pipe. Round 0's 5 ablations still stand: the script is byte-identical, and this round changed only fixture text.", "gates": "Local at 9db00a2: the vitest runs above, exit 0. `pnpm run type-check:scripts` exit 0. `pnpm exec eslint scripts/__tests__/objectstack-pin.test.ts` exit 0. `check:new-line-citations` exit 0. `check:test-path-roots` exit 0. `check-changeset-presence.mjs` exit 0 (no changeset owed). Control-byte self-scan found nothing. Check-runs on 098d4cb (final): failure in Test and Test (shard 12/16), the finding fixed here; success in the other 30 (Type Check, Lint, Repo Gates, Build & E2E, Test (dist pins), Lockfile Dedupe Check, Bundle Analysis, Governed Surface Queue Guard, Line Citation Gate, Changeset Declaration, and the other shards); skipped 3 (dependabot, Test (coverage), Test (coverage shard)). Check-runs on 9db00a2 when this report was written (34 total): in_progress 31, skipped 3; not waited for.", "mcp_calls": "0 — no MCP tool was called this round", "api_writes": "1 this round: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12972/comments via scripts/pm/post-stamped.mjs --repo=objectstack-ai/objectui (fleet relay). Plus 1 git push (not REST). The PR body was not edited.", "open_questions": [], "out_of_scope_findings": [], "files_changed": [ "scripts/__tests__/objectstack-pin.test.ts (this round: 3 added, 3 removed)" ], "line_budget": "266 changed lines against b014f5e (253 added, 13 removed); this round is a net-zero rename", "measurements": [ { "case": "base b014f5e, cold, this container", "time_s": 189.8, "worktree_disk_mb": 286, "store_mb": null }, { "case": "this PR, first fresh worktree, cold, empty store", "time_s": 192.4, "worktree_disk_mb": 286, "store_mb": 201 }, { "case": "this PR, second fresh worktree right after (warm, copy)", "time_s": 8.7, "worktree_disk_mb": 286, "store_mb": 0 }, { "case": "this PR, two fresh worktrees at once, warm", "time_s": [ 11.4, 11.4 ], "worktree_disk_mb": [ 286, 286 ], "store_mb": 0 }, { "case": "this PR, two fresh worktrees at once, cold, empty store (one published, the other: another run published it first)", "time_s": [ 222, 224.8 ], "worktree_disk_mb": [ 286, 286 ], "store_mb": 201 }, { "case": "primitives on the 201 MB / 2182-file cache", "copy_s": 0.5, "copy_mb": 201, "hardlink_s": 0.05, "hardlink_mb": 0.35, "symlink_s": 0, "reuse_hash_s": 0.81 } ], "deviations": [ "Resumed from origin/claude/issue-12972-shared-pin-build at 098d4cb in a recreated worktree ../objectui-issue-12972 (removed again after the push). Its `pnpm run setup` reused the machine store: 25.2 s on a busier box, +286 MB.", "PR body correction for the seat to write (the dev writes the PR body once and never PATCHes it): the heading \"Gates (local, at `098d4cb`)\" should read 9db00a2, and that section can gain a line: \"check-installed-spec-pin-claims.test.ts: exit 1 reproduced at 098d4cb, exit 0 at 9db00a2 (the fixture identifier and the reason regex no longer read as installed-spec claims)\". A grep of the sent body for PINNED, \"the pin is\" and 098d4cb hits only that heading, so no other line went stale.", "Round 0 deviations stand: the line budget is 266 against ~250; the default store at /root/.cache/objectstack-pin is kept on purpose and was reused this round." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Landed · objectui
domain:devxseat 1 (#5748) ·session_01FM29ZqLTrnPNXxijioZwMp· 2026-10-19T10:17Zgh-readonly-queue/main/pr-13035-*heads)6264621941)origin/mainatf9401e6af5, by contentf9401e6(PR #13035);scripts/objectstack-pin.mjs:151exportsSTORE_ENV = 'OBJECTSTACK_PIN_STORE',:153STORE_KEEP = 4,:660resolves the default store underXDG_CACHE_HOMEor~/.cacheasobjectstack-pin,:709publishToStore;CONTRIBUTING.md:57names the storeState change: PR #13035 closed this card through
Fixes #12972(completed);pm:dispatchedcomes off in this act.The card's item 3 was measured by the dev in this seat's container, against the card's table: a second fresh worktree ran
pnpm run setupin 8.7 s against 192.4 s cold. The full table is in the ACCEPT. Nothing is carried onward.Generated by Claude Code