Repository navigation
Description
Filing gate: ① product defect with a named landing spot and a reproduction (finding class (a): a documented command sequence on an untouched main fails a required test).
reach: public entry measured once — pnpm test on a fresh clone after pnpm install && pnpm build && pnpm objectui:build ends Failed: @objectstack/client#test (3 of 652 tests), every other package green.
Reader: domain:cli seat (packages/client/src/envelope-caller-census.test.ts, SKIP_DIRS at line 166); optionally scripts/build-console.sh for where the clone lands.
Dedup: search_issues "envelope-caller-census test fails after pnpm objectui:build .cache/objectui checkout counted as call site pnpm test red" (open + closed) → 0 cards.
Filed on the maintainer's instruction in this session: 「设想你是一个新人,第一次打开 github objectstack 项目主页,了解本项目,并按照文档指引执行完整的试用流程,并对阅读文档和试用过程中遇到的问题立 issue」.
Summary
A newcomer following the docs in order — README "Hack on the framework" (pnpm install, pnpm build, pnpm dev, pnpm test) and content/docs/getting-started/examples.mdx (pnpm objectui:build to get the Console) — ends with a red pnpm test on an untouched main:
@objectstack/client:test: FAIL src/envelope-caller-census.test.ts > #13079 §3 — every call site is classified > ⭐ THE NUMBER, post-convergence: ZERO call sites still read the envelope, and none is production code
- Expected
+ Received
- []
+ [
+ {
+ "file": ".cache/objectui-a58626c88dc8/packages/data-objectstack/src/index.ts",
+ "line": 6347,
+ "method": "analytics.query",
+ "receiver": "sdk",
+ },
+ ]
…
FAIL … > records the split: 18 payload pins, 10 result-insensitive, 11 not-SDK
- 28
+ 29
Test Files 1 failed | 50 passed (51)
Tests 3 failed | 649 passed (652)
Failed: @objectstack/client#test
scripts/build-console.sh (what pnpm objectui:build runs) shallow-clones objectui into .cache/objectui-<sha>/ when there is no ../objectui sibling — the normal case on a fresh machine. The census test's walker starts at the repo root and skips only
const SKIP_DIRS = new Set([
'node_modules', 'dist', 'build', 'coverage', '.git', '.next', '.turbo', 'out',
]);so the whole objectui source tree under .cache/ is scanned as if it were this repository's code, and its one sdk.analytics.query(...) call moves the pinned count from 28 to 29 and fails three assertions. The test's own failure note is misleading in this case: it says "the delta is a real call", which is true, but the call is in another repository's checkout.
AGENTS.md already records .cache/objectui-* as a stale-artifact hazard for pnpm lint ("a full objectui checkout left by build-console.sh, linted as if it were ours") and prescribes rm -rf .cache after the console build. This card is the pnpm test half of the same hazard: nothing in the README or the examples page says to delete .cache/ before testing, and the gate that reds is a count pin whose message blames a real call site.
Reproduction
Fresh clone of main, Node v22.22.0, pnpm 10.31.0, no ../objectui checkout.
pnpm install && pnpm build # exit 0
pnpm objectui:build # clones objectui@a58626c88dc8 into .cache/, ~10 min, exit 0
pnpm test # 131 successful, 135 total; Failed: @objectstack/client#testThe three failing assertions and their diffs are the ones quoted above; every other package passed. The only counted site outside this repository's packages is the one under .cache/.
Expected
pnpm test on an untouched main passes after the documented Console build. A repo-walking pin should not read a gitignored cache directory as source.
Actual
pnpm test is red until the reader guesses rm -rf .cache, which no on-ramp document mentions.
Suggested direction
- Add
.cache(and probably.objectstack,.playwright-mcp) toSKIP_DIRSinenvelope-caller-census.test.ts;walk()is the single entry point, so it is a one-line change, and the ledger sums it compares against do not move. - Consider the same skip in the other repo-walking tests (
packages/spec/src/**/*-retirement.test.ts,packages/metadata-fs/test/watch-dot-root.test.tsalready know about.cache— a shared skip list would keep the walkers in step). - Have
scripts/build-console.shprint therm -rf .cacheadvice, or clone outside the repo root (e.g. under$TMPDIR), so the hazard stops existing instead of being documented.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 8, 2026
Path: the road — start: a contributor's first test run is green | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:cli·area:devpath·pm:queue(findingremoved). Direction: the census skips.cache/Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T05:06Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/client/src/envelope-caller-census.test.ts(SKIP_DIRS) ⇒domain:cli; rationale:packages/client*is that lane's. Read onmainec8f37c890.pnpm testgoes red after the documentedpnpm objectui:build(measured), because the objectui checkout under.cache/is counted as a call site. CI does not run that sequence..cachetoSKIP_DIRS, or walk only tracked files.cache/objectuicheckout present.Clause-②: no. No changeset (test only).objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 8
Session:
session_01RWZbGvPFcRKvUqASZtunCUAccount:
os-warren(the seat's linked user asget_meanswers it; the card's assignee)Branch:
claude/issue-22153-census-skips-cacheWorktree:
objectstack-issue-22153Domain:
domain:cliSeat:
domain:cli#1File surface, per triage
6052728411, read onorigin/main6ed0c0f3:packages/client/src/envelope-caller-census.test.ts:SKIP_DIRS(:166), or a walk over tracked files only. Test only.scripts/build-console.sh(the card lists them as options; triage's direction is this one file). ⛔ No changeset (triage: test only; the PR takesskip-changeset). (Stop on breach and explain in the report.)Container & model:
S,mode:subagent,model: default (opus).dispatch-gates --tierover the path gives no path-derived mandate.Clause-②: no
Responsibility:
platform code: @objectstack/client's envelope-caller-census test walks the repo root and skips only build and VCS directories (SKIP_DIRS :166), so a .cache/objectui checkout left by pnpm objectui:build is counted as a call site|none: the census has no pin for a gitignored cache directory|a contributor who follows the README and examples page in order (pnpm objectui:build, then pnpm test); CI does not run that sequenceThread-read: 6052728411
Serial constraints cleared: read 2026-10-08T05:15Z:
filename): none touchespackages/client/src/envelope-caller-census.test.ts.npm ci, but a pnpm-scaffolded project ships onlypnpm-lock.yaml—docker buildfails at the build stage #22150) touch nothing here.domain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-08T05:15Zobjectstack-fleet commentedon Oct 8, 2026
os-dev-report
{ "issue": 22153, "status": "done", "branch": "claude/issue-22153-census-skips-cache", "pr": "https://github.com/objectstack-ai/objectstack/pull/22196", "session": "session_01RWZbGvPFcRKvUqASZtunCU", "premise_still_valid": true, "summary": "Added `.cache` to SKIP_DIRS in packages/client/src/envelope-caller-census.test.ts. A docblock explains why: pnpm objectui:build clones objectui into .cache/objectui-SHA, and that tree contains objectui's own SDK call site. Added a section-1 pin on a temp root: a planted .cache/objectui-* checkout leaves scanCallSites deep-equal (same sites, receiver split and files scanned), and a positive control shows the same walk counts the planted site when given it directly. H1 confirmed (base 6ed0c0f3 plus a planted file: 28 → 29, 3 failed; this branch: 21 passed). H2: chose SKIP_DIRS over a git ls-files walk. It is the house shape (34 of 86 one-line skip sets already list .cache), it hides nothing tracked (0 tracked paths with a .cache segment; control: .github = 45), and it adds no git dependency to a package where no test spawns git today. H3: one file only; the other walkers are noted, not edited.", "tests": "Head 8f395597. (1) H1 repro: `pnpm --filter @objectstack/client exec vitest run --maxWorkers=2 src/envelope-caller-census.test.ts` with .cache/objectui-test/packages/x/src/index.ts planted. Base 6ed0c0f3: 'Tests 3 failed | 17 passed (20)', 'expected 29 to be 28', and the enumeration gains '.cache/objectui-test/packages/x/src/index.ts|analytics.query|sdk'. Branch 8f395597: 'Tests 21 passed (21)'. Planted file removed afterwards. (2) Ablation from the committed state via node scripts/ablation-replace.mjs, no build involved because the subject lives in the test file itself and is not resolved through dist. Anchor \"'out', '.cache',\" became \"'out', 'ABLATED-22153',\": 'anchor x1 → x0', 'blob cbf54580cb85 → c2a77abdd38a', 'ok restored: blob == HEAD (cbf54580cb85) and git diff HEAD is empty'. Clean tree: 'Tests 1 failed | 20 passed (21)', and only the new section-1 pin fails (filesScanned 1 → 2, the planted site appears). Planted file present: 'Tests 4 failed | 17 passed (21)', the new pin plus the three section-3 assertions. Direction: red, as expected. A first attempt with replacement \"'out',\" was refused before any test ran (replacement count 1 → 1) and produced no reading. (3) Closure build `turbo run build --filter=@objectstack/client^... --concurrency=2`: 32/32 successful. `pnpm --filter @objectstack/client test`: 'Test Files 51 passed (51) / Tests 653 passed (653)'. `pnpm --filter @objectstack/client typecheck`: exit 0, 'check:test-typecheck: OK ... 0 file(s) / 0 error(s)'. The census file is in the tsconfig.test.json program (tsc --listFilesOnly finds it once). The integration tier is declared to CI. (4) Gates: see `gates`. All were run after the final commit 8f395597, and the report cites that sha. (5) The pin creates a temp dir with mkdtempSync(join(tmpdir(), 'os-census-cache-')), removed in finally; 0 leftover os-census-cache-* dirs after all runs. The seat's dispatch-gates --self-test applies to this new scratch-dir site.", "mcp_calls": "0 — no MCP tool was called (reads went through gh api REST GETs: the issue, its comments, and the PR read-back)", "api_writes": "3 — each sent as one POST /repos/objectstack-ai/objectstack/dispatches to the fleet-write relay: (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft, run 37734949174; read-back: 5016 bytes sent, 5016 stored, identical); (2) assign → POST /repos/objectstack-ai/objectstack/issues/22196/assignees os-warren via label-write.mjs (run 37735015776; read-back matches: assignees os-warren, plus the bot's size/s label); (3) this os-dev-report comment → POST /repos/objectstack-ai/objectstack/issues/22153/comments via post-stamped.mjs. Separately, two git pushes of the branch (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed: scripts/build-console.sh clones objectui into the repo root (.cache/objectui-SHA), which is the source of this whole hazard class. AGENTS.md §9's stale-artefact table already lists the pnpm lint half. Cloning outside the tree, or printing the rm -rf .cache advice, would retire it. Outside this claim's file surface; no new reproduction beyond this card · dedupe words: build-console.sh clone outside repo root, objectui:build leaves .cache, .cache objectui checkout hazard", "carrier: none (承接者:无) · noted, not filed: 52 of the 86 one-line node_modules skip sets in the tree lack .cache, and most walk a subtree rather than the repo root. None has been measured against a planted checkout; inference only. The card's full pnpm test with the checkout present turned only @objectstack/client#test red, so no other test suite has a reproduced instance · dedupe words: SKIP_DIRS .cache repo walker, walker skip set objectui checkout, pnpm test red after objectui:build" ], "files_changed": [ "packages/client/src/envelope-caller-census.test.ts" ], "line_budget": "n/a: the diff touches no line-ratcheted surface (no skills/**, no governed ledger). +51/-2 in one test file; 53 changed lines against the 5000 human-merge threshold.", "gates": { "head": "8f395597", "derived": "dispatch-gates --repo objectstack-ai/objectstack --commands over the actual diff: 54 commands, set-equal to the order's list minus pnpm lint, which the order adds", "reconcile": "Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN. ✓ dispatch-gates --ran: 54 derived famil(ies) accounted for — 54 run, 0 NOT-MEASURED (a DERIVED zero — all 54 recorded an exit code and none of them is 3).", "first_pass_exit_3": [ "pnpm --filter @objectstack/spec run check:skill-examples :: exit 3 (PREREQUISITE NOT MET: client and client-react had no dist)", "pnpm check:dual-build-cjs-loads :: exit 3 (PREREQUISITE NOT MET: 35 packages had no dist)" ], "rerun_after_build": "turbo run build --filter=!@objectstack/docs --concurrency=2: 72/72 successful (71 cached). Then both gates exited 0: '262 prose examples type-check across 3 surface(s)', and dual-build-cjs-loads provenance 'this run 106/66/712/1'.", "lint": "pnpm lint (full repo, eslint . --no-inline-config) :: exit 0, no output, at 8f395597. A full run, not a narrowing.", "ran": [ "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0", "node scripts/check-changeset-no-major.mjs --self-test :: exit 0", "node scripts/check-ci-filter-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0", "node scripts/check-comment-mask-adoption.mjs :: exit 0", "node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0", "node scripts/check-comment-mask-corpus.mjs :: exit 0", "node scripts/check-dts-emitted.mjs --self-test :: exit 0", "node scripts/check-issue-citations.mjs :: exit 0", "node scripts/check-keyed-text-bounds.mjs :: exit 0", "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0", "node scripts/check-platform-object-tenancy-census.mjs :: exit 0", "node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0", "node scripts/check-plugin-teardown-shape.mjs :: exit 0", "node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0", "node scripts/check-registry-log-declared.mjs :: exit 0", "node scripts/check-registry-log-declared.mjs --self-test :: exit 0", "node scripts/check-rest-log-spy-declared.mjs :: exit 0", "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0", "node scripts/check-system-context-census.mjs :: exit 0", "node scripts/check-system-context-census.mjs --self-test :: exit 0", "node scripts/check-undeclared-dep-imports.mjs :: exit 0", "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0", "node scripts/docs-audit/check-affected-docs.mjs :: exit 0", "node scripts/docs-audit/check-drift-comment.mjs :: exit 0", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0", "pnpm --filter @objectstack/spec run check:skill-examples :: exit 0", "pnpm check:changeset-gate-self-tests :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:doc-authoring :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:dts-closure :: exit 0", "pnpm check:dual-build-cjs-loads :: exit 0", "pnpm check:engine-double-contract :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:issue-citations :: exit 0", "pnpm check:lean-entry-closure :: exit 0", "pnpm check:logger-receiver-detach :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:objectql-double-limit :: exit 0", "pnpm check:org-identifier :: exit 0", "pnpm check:page-declaration-shape :: exit 0", "pnpm check:published-files :: exit 0", "pnpm check:query-options-erasure :: exit 0", "pnpm check:refd-timer-probe :: exit 0", "pnpm check:slot-lookup :: exit 0", "pnpm check:sourcemap-no-sources-content :: exit 0", "pnpm check:test-source-alias :: exit 0", "pnpm check:tier-file-adoption :: exit 0", "pnpm check:type-check-coverage :: exit 0", "pnpm check:type-check-debt :: exit 0", "pnpm check:watch-hint-literal :: exit 0", "pnpm check:where-matcher :: exit 0", "pnpm lint :: exit 0" ] }, "deviations": [ "First ablation attempt was a refused no-op: ablation-replace exited before any test because the replacement \"'out',\" is a substring of the anchor (count 1 → 1). Redone with the unique marker 'ABLATED-22153'.", "Two gates first exited 3 (PREREQUISITE NOT MET). After a full non-docs build they re-ran and exited 0; ran.list records the re-run codes.", "origin/main moved 6 commits after the branch point (6ed0c0f3 → 13aea189); not merged in. None of them touches packages/client, and their code delta has 0 census-matched spellings (control: 'import' matches 77 times). Under AGENTS.md §10's scoped rule no rerun is owed; CI measures the merge ref.", "Report shape: os-dev.md's template plus the four fields the order names (gates, line_budget, deviations, files_changed).", "Attribution: commits carry the model-free trailer pair the order and AGENTS.md require, and the PR body ends with AGENTS.md's session-URL footer. The harness's own attribution reminder, which proposed other forms, was not used.", "The worktree is removed after this comment posts (os-dev cleanup step)." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
ACCEPT — PR #22196 at
8f395597, pending CI and the seat's self-testdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· read on GitHub 2026-10-08T06:01ZChecked on GitHub and in the diff, not from the report:
main;Fixes #22153, line 2 isClause-②: no;os-warren;SKIP_DIRSinpackages/client/src/envelope-caller-census.test.tsgains'.cache', with a docblock saying why. That is triage's first direction..cache/is gitignored (.gitignore:44onorigin/main);origin/mainhas a.cache/segment (0).[#22153] never enters .cache/) runs on a temp root, not the repo's own.cache/..cache/objectui-<sha>/checkout leavesscanCallSitesdeep-equal.6ed0c0f3with a planted file: 28 → 29, 3 failed. With this branch, 21 passed.SKIP_DIRSis the house shape, it hides nothing tracked, and it adds no git dependency.build-console.shclones to, and other walkers' skip sets) are inference without a reproduction, kept as notes with no carrier.Changeset: none, and the seat applies
skip-changesetin this stroke. A test file publishes nothing; triage said "No changeset (test only)".Evidence (the dev's, at
8f395597):@objectstack/clienttests: 51 files and 653 tests;dispatch-gates --ran: 54 of 54;pnpm lintexits 0.The seat's own: the pin adds a
mkdtempSyncsite (standing lesson 1).node scripts/pm/dispatch-gates.mjs --self-testat8f395597is running and is read before landing.CI on
8f395597, read 2026-10-08T06:01Z: 17 success · 3 skipped · 10 in progress · 1 failure (Check Changeset, no changeset; the label answers it). ⛔ Not green.Clause-②: no, test only: no contract review is owed. Landing follows CI green.objectstack-fleet commentedon Oct 8, 2026
Landed: PR #22196 →
b8feb55091, a single-parent queue squashdomain:cliseat ·session_01RWZbGvPFcRKvUqASZtunCU· 2026-10-08T06:58Zb8feb55091has one parent.origin/main; the pre-merge head8f395597is not.Fixes #22153closed this card as completed.origin/main:SKIP_DIRSinpackages/client/src/envelope-caller-census.test.tscarries'.cache'(:179);[#22153] never enters .cache/plants its checkout under a temp root (:691).6053468587at8f395597, in one round.Clause-②: no, test only,skip-changeset; no contract review was owed. CI on the head was green (34 runs) before the PR was armed, and the seat'sdispatch-gates --self-testpassed (1976 cases) for the new temp-directory site..cache/. That is wherepnpm objectui:buildshallow-clones the objectui source when there is no../objectuisibling. A contributor who built the console that way gets a green census, not a count off by objectui's own call site.build-console.shclones to, and other walkers' skip sets) are inference without a reproduction. No card is filed for them.test(client): the envelope caller census never enters `.cache/` (obje…