Repository navigation
test budget (domain:services): 18 test file(s) over 10 s of wall in the hourly full battery (Part of #23151) #23184
Description
Filing gate ③, a maintainer-ruled duty: #22949 ruling E item 3 (6125775640) and #22998's test-budget rule, "a test file over 10 s of wall is a card for the owning lane". This is one lane's share of #23151, which asks triage to split its reading per owning lane.
Filed by the triage seat (seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim. Part of #23151.
Reader who acts: the domain:services seat. The packages below are this lane's in the pm-dispatch domain table.
The reading
From #23151, which takes it from the refresh run 38340176409 (measure-test-shard-timings --diff) over 20 hourly full-battery runs. Each row gives the file's slowest executed run in that window. Re-check: the next refresh PR's own list.
| package | files | slowest | file → seconds (run) |
|---|---|---|---|
@objectstack/plugin-auth |
10 | 48.7 s | src/platform-admin-standing.consolidation.test.ts 48.7 s (38314183560)src/scim-deactivation-reconcile-user.test.ts 35.3 s (38267594064)src/two-factor-rotated-token-echo.test.ts 31.3 s (38314183560)src/two-factor-reenrollment-verified-reset.test.ts 14.1 s (38267594064)src/admin-impersonate-endpoint.test.ts 11.9 s (38217670691)src/implicit-account-linking.test.ts 11.7 s (38267594064)src/org-create-posture-gate.test.ts 11.6 s (38314183560)src/last-admin-guard.test.ts 10.9 s (38222448090)src/session-grants-resolved-once.test.ts 10.8 s (38202645321)src/dev-admin-seed-credential-gate.test.ts 10.3 s (38314183560) |
@objectstack/plugin-sharing |
2 | 38.2 s | src/share-link-password.test.ts 38.2 s (38294929860)src/share-link-password-webcontainer.test.ts 10.9 s (38202645321) |
@objectstack/plugin-security |
2 | 37.7 s | src/explain-enforce-parity.test.ts 37.7 s (38332198724)src/position-write-through.test.ts 26.5 s (38267594064) |
@objectstack/service-datasource |
2 | 17.6 s | src/__tests__/datasource-pool-support.test.ts 17.6 s (38294929860)src/__tests__/default-datasource-driver-factory.test.ts 10.6 s (38217670691) |
@objectstack/organizations |
2 | 15.9 s | src/storage-upload-organization-change.wall.test.ts 15.9 s (38222448090)src/storage-upload-door-ownership.wall.test.ts 15.2 s (38222448090) |
What done looks like
- Each file named above runs under 10 s of wall. The fix is to the test, or to what it waits on.
- ⛔ No deletion without a named duplicate (skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998). ⛔ No timeout raise. ⛔ No move to a slower or skipped project to hide it.
- Pin: the next refresh PR's list no longer names the file.
- One PR per file or one per package, whichever the seat measures smaller. Each PR says which rows it closes.
Grade (triage)
tooling · priority:p3 · domain:services · area:devpath, into pm:queue. It is maintainer-directed (#22949 ruling E), so the product-only queue rule's exemption applies.
Activity
objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 9 · 2026-10-13T09:47Z
Session:
session_01FzQy26KznSa5j2gnf3AzsEAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23184-test-budget-plugin-sharingWorktree:
objectstack-issue-23184Domain:
domain:servicesSeat:
domain:services#2(seat post #21118)File surface: the
@objectstack/plugin-sharingslice of this card only. That ispackages/plugins/plugin-sharing/src/share-link-password.test.tsandshare-link-password-webcontainer.test.ts, plus what those tests wait on if the cause is in a test-only seam ofshare-link-password.ts. No changeset if the diff is tests-only (skip-changesetper the role file); otherwise one.changeset/23184-*.md(stop on breach; explain in the report)Container & model:
S-M (two slow test files, one package; measure first),mode:subagent,model: default — dispatch-gates --tier --repo objectstack-ai/objectstack: "no path-derived mandate … The tier stays the PM's per-card judgment call"Clause-②: no — test wall time only; no published schema, behaviour or export moves.
Responsibility: n/a — not a defect card (a maintainer-directed test-budget duty, #22949 ruling E item 3)
Thread-read: none
Serial constraints cleared: none of the open PRs touches these files, and no
pm:dispatchedclaim declares them. PR #23200 (08b38cb9d8) landedshare-link-routes.tstoday, a different file. This is a partial landing: the PR carriesRefs #23184 (plugin-sharing rows), and the card returns topm:queuefor the other packages' rows when it merges.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23184,
"status": "done",
"branch": "claude/issue-23184-test-budget-plugin-sharing",
"pr": "#23243",
"session": "session_01FzQy26KznSa5j2gnf3AzsE — this run shares the dispatching PM session (mode:subagent); identity is the branch",
"premise_still_valid": true,
"summary": "Both @objectstack/plugin-sharing rows of #23184 are answered by draft PR #23243 (Refs, not Fixes: partial landing, the card keeps its other packages' rows). The diff is tests-only and changes no production file, option or export, so Clause-② stays no. H1 confirmed by a per-case probe: the main file ran 96 native scrypt derivations at production parameters (N=16384, r=16) across 44 cases, most of them repeats or throwaway fixture mints. H2: the injectable hasher pair exists, but injecting it disables the pinned legacy re-hash path, so it was not used. H3: the WebContainer file waits on no timer or boot, only 9 pure-JS plus 9 native derivations. Fix, main file: a per-file node:crypto.scrypt memo keyed by every input (scrypt is pure, so hits are byte-identical, and in-flight requests are deduped); one real shared hash per password, seeded onto links for the cases whose subject is not minting; the legacy cases' placeholder mint dropped; all suites describe.concurrent, with engine teardown moved from afterEach to afterAll. A probe showed the schema-editing case edits only its own engine's copy. WebContainer file: a separate memo per implementation (never shared, so cross-implementation checks stay real derivations), and PASSWORD's two hashes minted once in beforeAll with one added guard assertion. Results, vitest per-file reading, median of 3, same command, under the lock: main 11.90 s to 1.18 s; WebContainer 2.84 s to 2.04 s. At the worst CI/local ratio across five recent hourly captures (3.5x and 3.7x), that projects to about 4.1 s and 7.5 s in the hourly battery. Every case name and every expect line is unchanged; budgets were neither raised nor lowered.",
"tests": "Wall time (vitest JSON file endTime-startTime = the module-line duration), command
pnpm exec vitest run --maxWorkers=2 FILE --reporter=verbose --reporter=jsonper file alone in packages/plugins/plugin-sharing, under os-verify-lock slot issue-23184, 3 runs each, on a shared box: BEFORE @4cc3ff9dc6: share-link-password.test.ts 11224/12522/11904 ms (median 11904); share-link-password-webcontainer.test.ts 3035/2841/2739 (median 2841). AFTER @055d9304cc (final head): 1176/1110/1212 (median 1176); 2037/2172/1944 (median 2037). CI captures (test-core-timings) from hourly runs 38294929860, 38354632561, 38361439350, 38366978022, 38373927133: main 38.2/34.0/41.5/37.9/38.1 s, WebContainer 9.2/7.0/8.5/9.8/10.5 s. Assertion count: sorted case fullName+status, before run1 vs each of the 6 final runs, identical (44/44 and 4/4 passed). A sorted diff of every expect line, base vs head, changes only the vitest import line plus 1 added line (WebContainer beforeAll guardexpect(nodeScrypt).toHaveBeenCalledTimes(1)). expect( count: main 78 to 78, WebContainer 20 to 21. Probes (temporary, deleted, never committed): per-case derivation counts before (96 total); schema identity (engine A edit not seen by engine B: same-object false, b-sees-mutation false); WebContainer per-path real/memo counts after (beforeAll 1/0, c1 1/0, c2 2/0, c3 3/1, c4 0/0, both paths). Concurrency experiment (reverted, restore proven bygit diff HEADempty and hash-object == HEAD blob 8942e85855): 3.30 s serial to 1.51 s concurrent, 44/44. Typecheck:pnpm --filter @objectstack/plugin-sharing run typecheckVERDICT command-exit 0. check:test-typecheck OK, both files are in tsconfig.test.json via --listFilesOnly, debt ledger unchanged. Package:vitest run --maxWorkers=2over the whole package on the merged tree (closure rebuilt): Test Files 42 passed (42), Tests 1025 passed (1025), VERDICT command-exit 0. ESLint narrowed to the 2 changed files (--no-inline-config --format json): 2 files, 0 errors, 0 warnings. Population = this diff; neither file is ignored. eslint.config.mjs has no parserOptions.project or typed rules, so untouched files cannot move. Full pnpm lint is CI's. No ablation owed (speed-only change, per dispatch).","gates": "Derived via
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths: change set = 2 paths vs merge base 01a3421, 54 commands, identical to the PM lead gates.txt. Final sweep at 055d930: 54/54 exit 0, each run separately with exit captured before any pipe. Reconciliationdispatch-gates --ran(record spelledcmd :: exit N): 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN, a DERIVED zero. A first sweep had check:dual-build-cjs-loads and check:i18n at exit 3 PREREQUISITE NOT MET (workspace not built). After a fullturbo run build(75/75, VERDICT command-exit 0) both passed: dual-build 108 entry points/67 packages load; i18n OK, 10 packages in sync. Not run locally (CI-owned, outside the 54): path-scheduled Test Core / Build Core / dogfood / Temporal jobs, type-check lanes, artifact-roster families. PR CI at report time: 23 check runs completed with 0 failures, 18 in_progress (not awaited, per role file).","line_budget": "n/a — no skills/** or line-ratcheted ledger touched. Diff: +239/-46 across 2 test files (webcontainer +85/-13, main +154/-33).",
"files_changed": [
"packages/plugins/plugin-sharing/src/share-link-password.test.ts",
"packages/plugins/plugin-sharing/src/share-link-password-webcontainer.test.ts"
],
"deviations": [
"The first push was refused by the pre-push hook: the commit body carried a
Refs #23184card trailer. I amended that still-unpushed commit and pushed; no pushed history was rewritten.","Commit trailers use the model-free pair from AGENTS.md (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line. The PR footer uses the AGENTS.md session-URL form, not the harness's emoji form.",
"Route beyond the PM's suggested route (allowed: suggested-route section): besides the shared precomputed fixture hash, I added a per-file scrypt memo and describe.concurrent in the main file. Fixture plus memo alone measured 3.30 s locally, which projects to about 11.5 s at the worst observed CI ratio, so it was not enough.",
"The first gate sweep straddled a comment-only commit (055d930). The whole 54-command sweep was rerun at that final head, and that rerun is the one reported.",
"A gate-runner relaunch first failed on a bad sed rewrite of its output directory (nothing ran). I fixed it and relaunched. I once used
pgrep -fas an existence check only; nothing was waited on or killed by name."],
"mcp_calls": "0 — no MCP GitHub tool was called (reads used gh api REST; writes used scripts/pm tools)",
"api_writes": "3 relay strokes from this container: POST /repos/objectstack-ai/objectstack/dispatches ×3, each executed by fleet-write.yml as objectstack-fleet[bot]. (1) pr_create, i.e. POST /repos/objectstack-ai/objectstack/pulls (draft #23243) + POST /repos//issues/23243/assignees [zhuangjianguo]. (2) labels_add via scripts/pm/label-write.mjs, i.e. POST /repos//issues/23243/labels [skip-changeset]. (3) this os-dev-report comment via scripts/pm/post-stamped.mjs, i.e. POST /repos//issues/23184/comments. Plus 5 git pushes (branch probe, 3 WIP commits plus the merge of origin/main, the final comment commit); git push is not a REST write. No card assignee or label write, and no PATCH of the PR body.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed — the main file spends about 18 s in vitest import/transform (import 17.7-19.2 s, transform 14.5-15.8 s, before and after; cause not measured). That is outside the per-file reading the 10 s budget grades. Observation only: no defect class (a/b/c) applies."
],
"worktree_cleanup": "node_modules removed and worktree ../objectstack-issue-23184 removed after this report was posted; branch fully pushed at 055d930."
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat ACCEPT: PR #23243 at
055d9304cc· a partial landing (Refs, theplugin-sharingrows)domain:servicesseat 2 ·session_01FzQy26KznSa5j2gnf3AzsE· 2026-10-13T11:47Z, under claim6142856868. Checked on GitHub and onorigin/main, not from the dev's report.Checklist
main. Line 1 isRefs #23184 (plugin-sharing rows), a partial landing with no closing keyword. Line 2 isClause-②: no — test wall time only …. It carries theskip-changesetlabel for a tests-only diff.share-link-password.test.tsandshare-link-password-webcontainer.test.ts. No production file, option or export moves. Not governed, under the 3000-line threshold.node:crypto.scrypt, keyed by every input. scrypt is pure, so a hit is byte-identical, and in-flight requests are deduplicated.describe.concurrent, with engine teardown moved toafterAll. A probe showed each case's schema edit stays on its own engine.expectline changes only the vitest import and adds one guard assertion;expect(counts go from 78 to 78 and from 20 to 21;plugin-sharing1025 of 1025 on the merged tree; typecheck andcheck:test-typecheckOK; all 54 derived gate families exit 0.055d9304cc(latest run per name): 40 names, 31 success, 9 skipped, 0 red; mergeableclean.mcp_calls0. The dev'spgrep -fwas an existence check only; nothing was waited on or killed by name. Recorded.Out-of-scope findings: about 18 s of vitest import/transform in the main file, outside the per-file reading the budget grades:
Acceptance notes. No defect class applies.What remains on #23184: the other packages' rows:
plugin-auth(10 files),plugin-security(2),service-datasource(2) andorganizations(2). After this merges, the card returns topm:queuewith aRelease:line, and the next slice is claimed from there.Landing:
pr_ready+automerge_enablethrough the relay. This seat follows it to MERGED.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Landed (partial) and Release ·
domain:servicesseat 2 ·session_01FzQy26KznSa5j2gnf3AzsE· 2026-10-13T12:15Z.Landed: PR #23243 (
Refs #23184 (plugin-sharing rows)) merged through the merge queue at 2026-10-13T12:14Z as4f5679c261, and that commit is onorigin/main. ACCEPT6144852121.plugin-sharingrows are answered.share-link-password.test.tsdropped from 11.90 s to 1.18 s, andshare-link-password-webcontainer.test.tsfrom 2.84 s to 2.04 s, each a median of 3 local runs. That projects to about 4.1 s and 7.5 s in the hourly battery. The pin is the next refresh PR's list. The diff is tests-only, and every case and everyexpectline is unchanged except for one added guard.added_to_merge_queueat 2026-10-13T11:50Z. The PR had no closing keyword, and this card stays open as intended.Release:
session_01FzQy26KznSa5j2gnf3AzsE(domain:servicesseat 2) releases claim6142856868· reason: a partial landing, one package per PR · destination:pm:queue. The remaining rows stay in this lane:plugin-auth(10 files),plugin-security(2),service-datasource(2) andorganizations(2). The branchclaude/issue-23184-test-budget-plugin-sharingis fully landed, so the next slice starts frommainunder a new claim.The technique measured here may carry to other slices: a per-file memo of the pure
node:crypto.scrypt, plus one shared fixture hash per password. It cuts repeated production-parameter derivations without weakening any assertion. Whether each slice's slowness has the same cause is that slice's measurement.Generated by Claude Code
36 remaining items
objectstack-fleet commentedon Oct 15, 2026
ACCEPT → PR #23721 comment 6201621924 ·
domain:servicesseat 1 ·session_017WLmd5in9RXu7AjyHR8fKQ· 2026-10-15T20:28Z. A partial landing (Refs); landing waits on every check green.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Landed (partial) and Release ·
domain:servicesseat 1 (#6021) ·os-bill·session_017WLmd5in9RXu7AjyHR8fKQ· 2026-10-15T20:56Z.Landed: PR #23721 (
Refs #23184 (organizations rows: storage-upload-organization-change, storage-upload-door-ownership)) merged through the merge queue asf40d877f81, and that commit is onorigin/main. Timeline:added_to_merge_queue2026-10-15T20:37Z →merged2026-10-15T20:55Z. ACCEPT6201621924.organizationsrows are answered. As interleaved medians of 3 on the vitest module line,storage-upload-organization-changewent from 4.17 s to 2.21 s, andstorage-upload-door-ownershipfrom 3.84 s to 1.93 s. At the card's own ratios that projects to about 8.4 s and 7.6 s in CI. The pin is the next refresh PR's list.beforeAll:bootStack's lazyimport()of the datasource driver and better-auth, plus sql.js's WASM compile. The fix is a test-only helper,src/__tests__/upload-wall-warm-up.testkit.ts. It runs one throwaway boot of the same composition at module scope and restores the whole environment afterwards. This follows AGENTS.md: "Clocked windows measure behaviour, never loading". Each file's ownbeforeAllstill boots inside the clock.it,describe,expect,beforeAllandafterAllline is unchanged. vitest's whole-file Duration is about the same, and the PR says so.beforeAll, vitest's JSON span reads below the module line CI captures. Read the module line.Release:
session_017WLmd5in9RXu7AjyHR8fKQ(domain:servicesseat 1) releases claim6200389019· reason: a partial landing, one slice per PR · destination:pm:queue. The assignee is cleared in this act. The branch is fully landed: the squash commit's three files are byte-identical to head56e42d33bf.The remaining rows stay in this lane:
plugin-security, two rows:explain-enforce-parityandposition-write-through. They test the C2/C3 epic's declared territory, so declare to the epic first.plugin-auth, three rows:org-create-posture-gate,implicit-account-linkinganddev-admin-seed-credential-gate. Seat 2's answer A stands.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 3 · 2026-10-15T22:43Z
Session:
session_017WLmd5in9RXu7AjyHR8fKQAccount:
os-bill(the seat's linked user asGET /useranswers it; the card's assignee from this act)Branch:
claude/issue-23184-test-budget-plugin-securityWorktree:
objectstack-issue-23184-secDomain:
domain:servicesSeat:
domain:services#1(seat post #6021)File surface: the
@objectstack/plugin-securityslice of this card only. That ispackages/plugins/plugin-security/src/explain-enforce-parity.test.ts(37.7 s in the card's reading), plus a shared test-only helper underpackages/plugins/plugin-security/if one cause serves it. No production file. No changeset if the diff is tests-only (skip-changeset). The card's otherplugin-securityrow,position-write-through.test.ts, was deleted with the write-through it tested by C3 stage 7b (#23302,5c9bfb0d3f), so it needs no change: the next refresh PR's list should not name it. Stop on breach; explain in the report.Container & model:
S-M (one slow security parity test, one package; measure first),mode:subagent,model: default tier(dispatch-gates --tier --repo objectstack-ai/objectstack: "no path-derived mandate").Clause-②: no (test wall time only; no published schema, behaviour or export moves)
Responsibility: n/a (a maintainer-directed test-budget duty, #22949 ruling E item 3, not a defect card)
Thread-read: 6202120788
Serial constraints cleared: no open PR changes a
plugin-securitysource or test file (all 10 open PRs' file lists read at this write; the release PR #23481 touches only itsCHANGELOG.mdandpackage.json), and nopm:dispatchedclaim declares this file. The file tests the C2/C3 epic's declared territory (explain-engine), so this seat declares to #15194 in the same round. The epic seat stood down at6186498514holding no claim. This is a partial landing: the PR carriesRefs #23184 (…), not a closing keyword. This seat's p3 slot is free: #23604 landed as534ca13eb5.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
os-dev-report
{
"issue": 23184,
"status": "done",
"branch": "claude/issue-23184-test-budget-plugin-security",
"pr": "#23748",
"session": "session_017WLmd5in9RXu7AjyHR8fKQ — this run shares the dispatching PM session (mode:subagent); identity is the branch named in claim 6203811714",
"premise_still_valid": true,
"summary": "Draft PR #23748 (Refs only, a partial landing; Clause-② no; skip-changeset) answers both @objectstack/plugin-security rows. The diff is tests-only: one file, explain-enforce-parity.test.ts, +62/-8, and no production or plugin-security source file. Cause, measured by a base probe: 60 of the 98 rows booted their own principal rig (about 84 ms each: syncSchemas 2.5 s, seed inserts 1.8 s and the admin authz context 0.5 s over 60 boots). Also, on Node 22, every torn-down rig left its AsyncLocalStorage instances (ObjectQL holds 3, SecurityPlugin 1, and neither destroy() disables them) on the process-wide async_hooks list that each later promise creation walks, which was about half the remaining wall. Fix: the principal rows, all read-only, share one rig per posture source (4 boots instead of 60, torn down in one afterAll), and every rig teardown disables the storages its engine and plugin own. The RLS and sharing rows can write, so they still boot their own rig. Interleaved medians of 3 at final head db5121f (module line): 7.37 s to 1.73 s, projecting to about 8.8 s at the card's 37.7 s reading (8.4 s against the idle-box base). The position-write-through row is answered by deletion: its test file left main in 150da61 (#22962), not in 5c9bfb0 (#23302), which deleted the module it tested; both are ancestors of origin/main.",
"tests": "Wall = vitest default-reporter module line (hooks plus cases, the number test-core.log carries). Command:
pnpm exec vitest run --maxWorkers=2 FILE --reporter=default --reporter=jsonin packages/plugins/plugin-security, under os-verify-lock slot issue-23184-sec, 4-vCPU box. BEFORE standalone @534ca13eb5 (idle, load 0.5-0.8), ms: 7790/7967/7374. AFTER standalone @5cad7b98dd: 1833/1760/1629. Interleaved @5cad7b98dd (load 1.1-1.6): base 7653/7237/7197, head 1792/1682/1673. FINAL interleaved @db5121f2d6 (load 1.7-2.3, other agents' worktrees active; base file under a temporary name, unchanged on main between 534ca13 and 3b46855, git diff --quiet exit 0): base 7373/7317/7620 (median 7373), head 1922/1729/1650 (median 1729), ratio 0.23. Whole-file Duration fell from 25.1-26.8 s to 19.4-20.6 s, so nothing moved into collection. Mechanisms alone (temporary copies, deleted): storages released only 3572/4054; shared rig only 2350/2522; both 1609/1724. Base probe (temporary, deleted), per principal boot median: syncSchemas 38.5 ms, inserts 28.3, enforced(admin) 7.9; principal case wall 6745 ms over 60 cases, rls 375 over 33, sharing 67 over 5. CPU profile of the shared-rig prototype: top self frame _propagate in node:internal/async_local_storage/async_hooks (526 ms). Static lines vs base: it( 1/1, describe( 1/1, expect( 19/19, byte-identical in order (cmp exit 0); hooks 0 to 1 (the shared rigs' afterAll). Runtime assertions per case via expect.getState().assertionCalls in temporary instrumented base and head copies (deleted): identical per case in order, 335 over 98, no zero-assertion case, all pass. Isolation probe over head (temporary, deleted), all 60 principal rows: shared rig raw SQLite state (11 tables, 21 rows, rowid order) byte-equal before and after the row 60/60; equal to a fresh rig's (suffix and timestamps normalised) 60/60; fresh rig unchanged by the row 60/60; faces (explain answer, enforcement answer, explained readFilter applied as a system read) equal to a fresh rig's 60/60. Leak mutation via scripts/ablation-replace.mjs at HEAD 5cad7b9 (the removed user's sets face writes a sys_member row into the shared rig): 15 rows red, 13 of them later rows of the same rig, vitest exit 1; restore proven (blob 378d595c80 == HEAD, git diff HEAD empty, marker count 0). Shuffle: --sequence.shuffle.tests seeds 11/2026/23184, 98/98 passed each. Package @db5121f2d6 (closure rebuilt after the merge):pnpm --filter @objectstack/plugin-security run typecheckVERDICT command-exit 0, check:test-typecheck OK (0 files in the debt ledger), tsc -p tsconfig.test.json --listFilesOnly lists the file;pnpm --filter @objectstack/plugin-security exec vitest run --maxWorkers=2Test Files 186 passed (186), Tests 3714 passed, 45 skipped (other files), VERDICT command-exit 0. eslint --no-inline-config on the file exit 0. Control-byte self-scan of the file and the PR body: 0 hits. Published surface: files[] = dist/README.md/CHANGELOG.md; markers releaseAsyncContexts/sharedPrincipalRig 0 files in dist, positive control SecurityPlugin 4. No ablation owed: no tested behaviour changed and no case asserts timing; the interleaved base leg is the revert, measured.","gates": "Derived
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) at db5121f: 1 path vs merge base 3b46855, 54 commands, command lines identical to the PM lead gates-23184-sec.txt (diff exit 0). Ran all 54 separately at db5121f, exit captured before any pipe, recordedcmd :: exit N: 52 exit 0 on the first pass; pnpm check:dual-build-cjs-loads and pnpm check:i18n exit 3 (PREREQUISITE NOT MET, workspace unbuilt), then both exit 0 afterturbo run build --filter=!@objectstack/docs(75/75 tasks, 74 cached, VERDICT command-exit 0).dispatch-gates --ran: 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero), exit 0. No gate output names the changed file. Local-only families (check:dev-prereqs scan, check:skill-frame-freshness) not owed: no packages/spec build or frame file touched. UNRECOGNISED lines, verbatim:UNRECOGNISED [engine-double-contract]: 22 construct(s) in packages, examples declare a scanned verb (delete, update, findOne) alongside engine siblings, and this gate could not read the implementation -- so they are in NEITHER the pinned population nor the ledger. 225 further construct(s) are SCOPED OUT by a stated criterion and are not counted here. This is a verdict, not a finding: it never fails a run (#9747, ruling of 2026-08-18).Not run locally (CI-owned): Test Core / Build Core / dogfood / Temporal jobs, type-check lanes, artifact-roster and wide-population families, full pnpm lint. PR CI at report time on db5121f: 37 check runs, 12 success, 6 skipped, 19 in_progress, 0 failures (not awaited, per role file); success includes Governed Surface Queue Guard, Lint · PM dispatch-gates, Dogfood Regression Gate, Part-of PR must not also close its card, The card this PR closes must claim this branch, No other open PR may claim the same single-writer path.","line_budget": "n/a — no skills/** or line-ratcheted ledger touched. Diff vs main 3b46855: +62/-8 across 1 test file.",
"files_changed": [
"packages/plugins/plugin-security/src/explain-enforce-parity.test.ts"
],
"deviations": [
"Claim correction: claim 6203811714 says C3 stage 7b (#23302, 5c9bfb0) deleted position-write-through.test.ts. That commit deleted the module position-write-through.ts; the test file left main one commit earlier in the series, in 150da61 (#22962). The PR body names both. No change is owed for that row.",
"PM suggested route: a mutation that reddens a case when the speed-up is reverted does not apply as stated. Reverting a speed-only mechanism reddens nothing, and the interleaved base leg is that revert, measured. Instead, a leak-sensitivity mutation showed that a write through the shared rig reddens later rows (15 red, 13 of them later rows).",
"One afterAll hook line was added (the shared rigs' teardown). The it(, describe( and expect( lines are byte-identical to base.",
"Two locked batches were sequenced with ';' (the 3-run standalone base loop and the shuffle loop; VERDICT batch-last-exit). Each part's result was read from its own log, and all passed. The shuffle loop also exited on the first failure (|| exit 1).",
"The 54-command gate sweep ran under nohup with its PID recorded (12487, the backgrounded subshell I started) and was waited on with bounded
timeout 540 tail --pidcalls. Nothing was killed, and nothing was waited on by name. The run record's two exit-3 lines were replaced by their post-build exit 0 before --ran; both readings are reported.","origin/main was merged once before the PR opened (db5121f; it moved metadata-protocol, which this package aliases to source, and spec). The closure was rebuilt, and the final wall pair, typecheck, package run and 54-gate union were all taken at that head.",
"Temporary probe files (zz-*.test.ts: phase timers, shared-rig prototype, CPU profile, ALS-release copies, isolation probe, instrumented assertion-count copies, base copies) were written into packages/plugins/plugin-security/src during measurement and deleted. None was committed: the tree was clean before the PR, with 1 file in the diff.",
"Hourly-battery CI maxima NOT MEASURED, reason: the timing artifact (run 38814162165, test-core-timing-table) redirects to productionresultssa10.blob.core.windows.net, which this container's egress refuses, and the run page answers 403. Projections use the card's own reading.",
"Commit trailers use the model-free pair from AGENTS.md (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line. The PR footer uses the AGENTS.md session-URL form, not the harness's emoji form.",
"Cleanup order: the worktree's node_modules were removed before this report was posted. The worktree itself is removed right after it posts (git worktree remove, no --force), because the write tool runs from it. The branch is fully pushed at db5121f."
],
"mcp_calls": "0 — no MCP GitHub tool was called (reads used single-card REST reads; writes used scripts/pm tools)",
"api_writes": "3 relay strokes from this container, each POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create via scripts/pm/fleet-write/dispatch.mjs = POST /repos/objectstack-ai/objectstack/pulls (draft #23748) + POST /repos//issues/23748/assignees [os-bill], run 38825887726, body read back identical (8870 bytes); (2) labels_add via scripts/pm/label-write.mjs = POST /repos//issues/23748/labels [skip-changeset], run 38825991927, read back size/s + tests + skip-changeset, assignee os-bill; (3) this os-dev-report comment via scripts/pm/post-stamped.mjs = POST /repos//issues/23184/comments. Plus 3 git pushes (empty-branch probe, 5cad7b9, merge db5121f); git push is not a REST write. No card assignee or label write, no PATCH of the PR body.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed — ObjectQL.destroy() and SecurityPlugin.destroy() leave their AsyncLocalStorage instances (engine txStore/cascadeDeleteSets/cascadeIssuedDeletes, plugin engineOperationScope) enabled. On Node 22 each stays on the process-wide async_hooks list that every later promise creation walks: about half this file's wall (7.8 s to 3.6-4.1 s with the release alone), and any suite that builds many engines in one process pays the same. No class applies: a production process builds one engine, and no public door was measured giving a wrong answer. If destroy() disables them, the test's releaseAsyncContexts becomes a no-op. Dedupe words: AsyncLocalStorage disable destroy; async_hooks _propagate; engine teardown storage leak; engineOperationScope.",
"carrier: 承接者:无 · noted in PR Acceptance notes, not filed — the file spends about 17-19 s in vitest import/transform on this box, before and after; collection, outside the per-file reading the budget grades. Observation only: no class applies.",
"carrier: 承接者:无 · noted, not filed — per-file CI timing captures are unreachable from a cloud container (blob-storage egress refused), as the previous slices recorded. An environment fact, not a repo defect; no class applies."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
ACCEPT → PR #23748 comment 6204766686 ·⚠️ Correction to this seat's claim
domain:servicesseat 1 ·session_017WLmd5in9RXu7AjyHR8fKQ· 2026-10-15T23:55Z. A partial landing (Refs); landing waits on every check green.6203811714:position-write-through.test.tsleftmainin150da61aa5(#22962). #23302 (5c9bfb0d3f) deleted the module it tested.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed (partial) and Release ·
domain:servicesseat 1 (#6021) ·os-bill·session_017WLmd5in9RXu7AjyHR8fKQ· 2026-10-16T00:40Z.Landed: PR #23748 (
Refs #23184 (plugin-security rows: explain-enforce-parity, position-write-through)) merged through the merge queue asc6c84d3175, and that commit is onorigin/main. Timeline:added_to_merge_queue2026-10-16T00:15Z →merged2026-10-16T00:40Z. ACCEPT6204766686.plugin-securityrows are answered.explain-enforce-paritywent from 7.37 s to 1.73 s, as interleaved medians of 3 on the vitest module line. At the card's 37.7 s reading that projects to about 8.8 s. The pin is the next refresh PR's list.position-write-through.test.tsis answered by deletion: it leftmainin150da61aa5(test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962), and refactor(plugin-security): delete the position write-through and the row-only position backfill (C3 stage 7b) #23302 (5c9bfb0d3f) deleted the module it tested.AsyncLocalStorageinstances every torn-down rig left enabled.it,describeandexpectline is unchanged. The file is byte-identical onmainto headdb5121f2d6.Release:
session_017WLmd5in9RXu7AjyHR8fKQ(domain:servicesseat 1) releases claim6203811714· reason: a partial landing, one slice per PR · destination:pm:queue. The assignee is cleared in this act. The branch is fully landed.The remaining rows stay in this lane:
plugin-auth, three rows:org-create-posture-gate,implicit-account-linkinganddev-admin-seed-credential-gate. Seat 2's answer A stands: the next refresh judges them.Generated by Claude Code