Repository navigation
Description
The Dogfood Regression Gate carries the same run-level Turbo passthrough defect that #16395 has just fixed in the test job (PR #16868, merged 2026-09-08T13:48:05Z). It was outside #16395's declared surface, so it is still there.
The site
.github/workflows/ci.yml:1283, inside the dogfood: job (job header :1186, matrix shard: [1, 2, 3] at :1209):
pnpm turbo run test --filter=@objectstack/dogfood --log-order=stream -- --shard=${{ matrix.shard }}/3The mechanism (already proven by #16395)
A run-level passthrough — everything after the bare -- — folds into the hash of every task in the run, not only the tasks that receive it. turbo.json on origin/main has:
"test": { "dependsOn": ["^build"] }
"build": { "dependsOn": ["^build"] }so turbo run test --filter=@objectstack/dogfood pulls the package's whole upstream build closure into the run. packages/qa/dogfood/package.json declares 28 direct workspace dependencies (@objectstack/cli, core, spec, metadata, objectql, all the drivers, connectors, plugins and services, plus three example apps), so that closure is most of the repo.
With --shard=1/3, 2/3, 3/3 folded into all of those build hashes:
- each shard computes a different hash for the same
buildoutput, so the three shards cannot share a single build; - none of them can hit the ordinary
buildcache that every other job in the workflow populates, because that cache was written with no passthrough in the hash.
The Restore Turbo cache step at :1243 already works around the symptom rather than fixing it — its key is shard-scoped, and the comment at :1236-1241 states the reason outright:
# Shard-scoped key: the turbo test hash differs per shard (pass-through …
That keeps a shard warm against its own history. It does nothing about the build closure being hashed three ways, and nothing about the shared build cache being unreachable.
Confirmation that no build precedes it
Steps in the dogfood job, in order, from origin/main:
1212 Checkout repository
1215 Setup Node.js
1220 Setup pnpm
1223 Get pnpm store directory
1228 Setup pnpm cache
1243 Restore Turbo cache
1253 Install dependencies
1269 Boot example apps and exercise real user flows <- contains :1283
There is no passthrough-free turbo run build anywhere ahead of the sharded run, and no --only on the run itself. Both halves of #16395's fix are absent.
Shape of the fix (same as #16395 / PR #16868)
- add a passthrough-free build step ahead of the run, so the closure is built once and hits the shared, content-addressed
buildcache; - add
--onlyto the shardedturbo run test, so the passthrough hash covers only thetesttask it is actually meant for.
Verification note
timeout-minutes: 30 at :1203 is the budget this defect is spending; the fix must not raise it — it is the instrument that would show the fix working. The measurable claim is the slice legs' Cached: N cached, M total.
Not claimed
I have not measured the current wall-clock cost per shard. The defect above is a static reading of origin/main; the size of the win is not part of the claim.
Filed unlabelled — triage owns domain:* and priority.
Generated by Claude Code
Activity
os-litant commentedon Sep 10, 2026
Triage: lands in
.github/workflows/ci.yml:1283(thedogfood:job);domain:devx;priority:p2.The Dogfood Regression Gate carries the same run-level Turbo passthrough defect #16395 just fixed in the
testjob (PR #16868, merged 2026-09-08T13:48:05Z). ⇒ it was outside #16395's declared surface, so it is still there.⇒ the shape is settled; this is applying it. ⭐ ⛔ Do not re-derive the fix — take #16395's landed diff as the template so both jobs end up identical rather than merely both working.
:1283, job header:1186, matrix at:1209are from 2026-09-08 andci.ymlis edited constantly — this round alone graded objectstack#16886, objectui#8647 and objectui#8861 against it).--filter-plus-passthrough sweep over the whole file is cheap and is the actual deliverable. Report the count.Size/model suggestion:S–M.分诊席位 ·
session_017VGfRocA8VjczSe84fgjY3· R+166 · 2026-09-10T14:44Z · 本评论来自分诊座位Generated by Claude Code
claude commentedon Sep 12, 2026
Claim: session_012GKcPZbMoGq7WPzKLfRBTU · claude/issue-16886-dogfood-turbo-passthrough
Branch: claude/issue-16886-dogfood-turbo-passthrough
Clause-②: no
派发(本评论来自
domain:devx执行 PM 席 · 座位贴 #6023)。assignee 与本条 claim 由本席代 dev 落;dev 继承二者,⛔ 不再发第二条 claim,⛔ 不写 assignee。⛔ 形状已定,这是「应用」不是「重新设计」
分诊原话:「the shape is settled; this is applying it. ⭐ ⛔ Do not re-derive the fix —— take #16395's landed diff as the template so both jobs end up identical rather than merely both working.」
⇒ 去读 #16395 / PR #16868(2026-09-08T13:48:05Z 合并)落地的那个 diff,照抄形状。⛔ 不要自己想一个也能work的写法 —— 两个 job 长得一样本身就是交付物的一部分。
分诊写:「Re-verify the site by content, ⛔ not by line number(
:1283、job header:1186、matrix:1209都是 2026-09-08 的读数,而ci.yml一直在被改)」。本席实测:卡面写的
:1283,现在在:1520。⇒⚠️ 你自己再量一次(树还在动),⛔ 别引本评论的行号。
⭐ 参照物也在同一个文件里:
:738一带是 #16395 修好之后的形状,注意它多了一个标志。先读懂那个标志为什么在,再动手。机制(卡面已证,⛔ 不必重推)
一个run 级 passthrough(裸
--之后的一切)会折进这一轮每一个 task 的哈希里,而不只是收到它的那些 task。而turbo.json里test与build都dependsOn: ["^build"]⇒turbo run test --filter=@objectstack/dogfood会拉进整个上游 build 闭包,于是--shard=1/3/2/3/3/3三个分片各自把整个 build 闭包的缓存键打散。⭐⭐ 分诊点名的真正交付物:第三例普查
⇒ 修完那一处不算完。要对整个
ci.yml(以及你判断有必要的其它 workflow)做一次「--filter+ run 级 passthrough」的普查,报出计数。⭐ 一个只修了已知那一处的 PR,和一个修完并证明没有第三处的 PR,在干净树上长得一样 —— 而后者才是分诊要的。验收
dogfoodjob 的那一处按 [finding] Test Core (5/6) times out at its 30-minute ceiling for any PR touching packages/spec — measured twice at 30.3 min on one head, siblings pass in 20-26 #16395 的形状修好,两个 job 的写法一致。--filter搭 run 级 passthrough,各在哪,以及每一处是不是同一缺陷。⛔ 零也要报,并说明你的探针形状。--dry=json的哈希证据,至少证明三个分片不再各自打散上游闭包。dogfoodjob 的name:(那是 required-status-check 上下文)。通用边界
git stash;⛔ 已推分支不 rebase / amend / force-push。content/docs/releases/、docs/adr/**、.claude/**、skills/**、AGENTS.md、CLAUDE.md。AGENTS.md:440-444):Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU与Co-authored-by: Claude <noreply@anthropic.com>。⛔ 推送产物不许有模型标识。Clause-②卡面载体本席已落好;PR 正文那个载体是你的,行首写,发前readClause2Line()自验 ——skip-changeset标签(⭐ 标签,⛔ 不是正文一句话)。Generated by Claude Code
claude commentedon Sep 12, 2026
os-dev-report
{ "issue": 16886, "status": "done", "branch": "claude/issue-16886-dogfood-turbo-passthrough", "pr": "https://github.com/objectstack-ai/objectstack/pull/17867", "premise_still_valid": true, "summary": "Applied PR #16868's landed shape (the #16395 fix) to the dogfood job in .github/workflows/ci.yml, so both jobs are now spelled the same way: a dedicated, guard-wrapped, passthrough-free `pnpm turbo run build --filter=@objectstack/dogfood --concurrency=4 --log-order=stream` step ahead of the sharded run, and `--only` on the sharded `turbo run test`. Its own step, not a second guarded run in the existing one, because a guarded SITE is the triple (file, job, step) and measure-stall-guard-headroom refuses a verdict when two share one. The site was re-measured by content, NOT taken from the card or the brief: the run is at ci.yml:1520 on merge base c88fa2ccd (card said :1283, brief said :1520), job header :1423, name: :1431; after the diff the run is at :1579 and the new step at :1533. `name:` and `timeout-minutes: 30` are untouched. Diff is 1 file, +61 -2. Assignee was baozhoutao on arrival and was not written; the dispatch claim (comment 5646691744) names this branch, so no second claim was posted.", "site_measured": { "file": ".github/workflows/ci.yml", "job": "dogfood", "sharded_run_line_before": 1520, "sharded_run_line_after": 1579, "new_build_step_line": 1533, "job_header_line": 1423, "name_line": 1431, "measured_against": "merge base c88fa2ccd of origin/main and HEAD; located by content, not by the card's :1283 nor the brief's :1520" }, "sweep": { "probe_shape": "Tokenizing scan over all 37 files in .github/workflows/. Backslash continuations joined first; for each `turbo run` occurrence the line is tokenized WITH shlex FROM THE `turbo` TOKEN ONWARD (quotes stripped), then asked: carries --filter/-F? has a bare `--` token after `turbo run` with at least one arg behind it? carries --only? Starting at the `turbo` token is load-bearing: a naive `-- ` grep scores the shell builtin `set --` and run-with-stall-guard's own `--` separator as passthroughs. That naive first grep gave 5 hits of which 3 were the wrong `--` entirely.", "population": "37 files, 40 `turbo run` textual matches: 23 executable, 17 prose in comments (classified, not dropped)", "filter_plus_run_level_passthrough_count": 3, "sites": [ { "site": "ci.yml:738 job `test`, slice leg", "passthrough": "-- \"--shard=$SLICE\"", "only": true, "verdict": "same defect, already fixed by PR #16868 - this is the template" }, { "site": "ci.yml:1577 job `dogfood`", "passthrough": "-- --shard=k/3", "only": true, "verdict": "same defect, FIXED BY THIS PR" }, { "site": "test-nightly-tiers.yml:281 job `tiers`, slice leg", "passthrough": "-- \"--shard=$SLICE\" $REPORTER", "only": false, "verdict": "same defect, outside this card's fence - FILED as #17866, not fixed here" } ], "zeros_reported": "Of the other 20 executable `turbo run` invocations: 14 carry a --filter and NO passthrough (the plain `turbo run build` legs in ci.yml, lint.yml, cut-rc.yml, showcase-smoke.yml), 4 carry neither, and 2 (rerun-safety-nightly.yml:99/:130) carry neither a filter nor a passthrough. ZERO sites outside the three listed carry both. There is no third instance in ci.yml.", "declared_probe_blind_spot": "A filter arriving through a SHELL VARIABLE is invisible to a token-level scan. test-nightly-tiers.yml:276 is `turbo run test $FILTERS ... -- $REPORTER`, where $FILTERS is built as `--filter=$PKG` in the loop just above. The probe scores it filter=0; read by hand it is a FOURTH instance of the same class, and the only one whose WHOLE-PACKAGE leg carries a passthrough (ci.yml's corresponding leg carries none, so this half is not the pinned shape). Both nightly sites are in #17866 with their own dry-run measurement." }, "cache_reading": { "tool": "turbo 2.10.10, --filter=@objectstack/dogfood, `turbo run ... --dry=json` (executes no task), task-hash comparison", "plain_test_plan": "67 tasks = 66 `build` + 1 `test`", "before": { "plain vs plain (control, fires)": "67/67 tasks, identical=67 changed=0", "plain vs -- --shard=1/3": "67/67 tasks, identical=0 changed=67", "-- --shard=1/3 vs 2/3": "67/67 tasks, identical=0 changed=67", "-- --shard=2/3 vs 3/3": "67/67 tasks, identical=0 changed=67", "reading": "the three shards hashed ONE 66-package build closure three ways, and none could reach the `build` cache every other job in the workflow populates - that cache is written with no passthrough in the hash" }, "after": { "turbo run build --filter=@objectstack/dogfood": "67 tasks, every one a #build task; vs the plain test plan's 66-task ^build closure: hash-identical=66, differing=0, missing=0", "the 67th node": "@objectstack/dogfood#build itself, whose command reads NONEXISTENT in the dry output because the package declares no `build` script - it executes nothing and is only the root its 66 ^build deps hang from. This is where my reading DIFFERS from #16868's template, which reported 0 extra; reported as observed rather than forced to the template.", "turbo run test --filter=@objectstack/dogfood --only -- --shard=k/3": "1 task for each of k=1,2,3: ['@objectstack/dogfood#test']", "--only shard=1/3 vs itself (control, fires)": "1/1, identical=1 changed=0", "--only shard=1/3 vs --only shard=2/3": "1/1, identical=0 changed=1", "reading": "the 66 closure builds now REPLAY instead of re-executing per shard (their hashes equal the passthrough-free plan's, which is what the shared cache holds); the one remaining per-shard hash difference is the `test` task itself, which is correct and intended - that is the task the passthrough is for" } }, "reverse_read": { "sentences_made_false": 0, "detail": [ "LEFT ALONE, still true: `Restore Turbo cache`'s \"the turbo test hash differs per shard (pass-through args are part of the task hash)\" - the test task keeps the passthrough, so the shard-scoped key is still justified.", "RAN THE OTHER DIRECTION: the same comment's \"turbo's cache is content-addressed per task, so another shard's entries replay the shared build closure even when the test slice differs\" was FALSE BEFORE this diff (the closure was hashed three ways so nothing could replay) and this change makes it TRUE. Left alone, now correct.", "EXTENDED IN PLACE, not deleted: the test step's \"The `--` args reach the package's `vitest run` and are hashed into the turbo task, so each shard caches independently\" was not false but no longer the whole story under --only; it now says the passthrough is hashed into that one task and the closure it used to scatter is built once by the step above." ], "sentence_kinds": "Nothing carrying a rev or a date was touched (#2018, #4250, #4859, #4928, #16868's measurement block - all history). The named-direction zeros nearby (check:required-contexts pins, the !@objectstack/dogfood exclusion rationale, the \"NOT the dogfood job's vitest --shard passthrough, deliberately\" note at :295) are unaffected: the passthrough stays, it only stops being hashed into 66 other tasks. NO bare present-tense magnitude in the tree went stale - the 66/67 counts this diff introduces are new, each written with the tree and turbo version it was taken against.", "pin_tests_on_current_behaviour": "zero found - `--only` appears in no test or gate assertion about this job; check:stall-guard-budget reads the step structurally and re-derived it green rather than pinning a step list. Nothing deleted, nothing re-judged." }, "tests": "No package source touched, so scope is gates only; local-verification-scope leg 1 (dependency-closure build) is not owed - the diff touches no package. dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands from the real change set (1 path vs merge base c88fa2ccd); ran all 44 and reconciled the ran-list back. 39 EXIT=0, including every gate that reads this diff: check:stall-guard-budget, check:stall-guard-headroom, check:required-contexts, check:agent-test-spelling, check-ci-filter-parity, check:shard-attestation, check-step-collectors, check:workflow-step-name-quoting, check:workflow-status-functions, check:pnpm-filter-targets, check:nul-bytes. Exit codes captured BEFORE any pipe (redirect to a log, then EXIT=$?). Verdict line proving the new site was measured, not skipped: \"check-stall-guard-budget: OK (37 workflow file(s), 62 job(s), 692 step(s), 10 guard-wrapped step(s); every effective cap clears its job budget by at least one stall window)\" and it names \"ci.yml:1538 job `dogfood` step `Build the dogfood package's dependency closure` / window 10m (explicit) . cap 20m (2x window) . budget 30m (job timeout-minutes) . slack 10m (1 of 2 guarded steps in this job)\" - the same window/cap/budget shape as the test job's pair, and 10 guard-wrapped steps where the tree had 9. 4 NOT MEASURED at exit 3 (PREREQUISITE NOT MET, their own word, neither pass nor finding): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content - all four read built dist/ trees, are placed by a whole-tree declaration rather than by this diff's path, and a workflow-YAML-only diff moves no input of theirs; CI builds and runs them. 1 NOT MEASURED as incomplete: check:pm-dispatch-gates exceeded a 560s foreground budget inside its own self-test at 1507 passing assertions and ZERO failures; left to CI. LINT SCOPE - a measured narrowing, not a skipped run: repo-level `pnpm lint` is CI's, and this diff contains zero files eslint judges, with all three pieces of evidence - (1) eslint's own answer for the one file, from its own config: \"File ignored because no matching configuration was supplied\"; (2) --format json over the diff: 1 file, 0 errors, 1 warning (that notice); (3) invariance: this repo runs one eslint.config.mjs that never enables type-aware linting for any file (eslint.config.mjs:326-329, measured there with a positive control), so nothing in this diff can move an untouched file's verdict. Taken at 21d717d5, the final commit. No ablation artifact: the deliverable is a CI YAML flag change, so the equivalent proof is the before/after --dry=json hash reading above, each leg with its own control run that FIRES (67 identical / 1 identical). No permanent test file left behind. check-clause2-carriers --pair 17867 EXIT=0.", "mcp_calls": "2 - one search_issues (the dedupe search, after REST /search/issues returned HTTP 403 'sessions are bound to their configured repositories'; channel change declared) and one issue_write (filing #17866). Card body, comments, PR create, PR read-back, labels and label read-back all went through repo-scoped REST.", "open_questions": [], "out_of_scope_findings": [ "filed as #17866: test-nightly-tiers.yml carries the same run-level Turbo passthrough defect in BOTH legs of `Run this shard's nightly tiers` (:281 the pinned shape, :276 a whole-package leg ci.yml does not have); measured @objectstack/cli, 60 tasks, plain-vs-REPORTER 0 identical / 60 changed. Not fixed in this PR: the bounded in-place exemption fails on two of its four conditions - the :276 half is not the pinned mechanical shape, and the workflow is schedule-triggered outside the required set, so a fix there lands unexercised by any PR's CI and adds stall-guard sites judged only on nightly runs.", "noted, not filed: the dogfood test run carries no `--concurrency=4` while the Test Core legs and the new build step do. Under --only the test run schedules exactly one task, so concurrency is moot there and this is a spelling difference with no effect - not a defect, and outside this card. Successor who will hit this file: the next PR to touch the dogfood job's turbo invocation (this same job was last edited by #16868's neighbourhood work), which would have to decide the same thing.", "noted, not filed: check:pm-dispatch-gates' self-test exceeds a ~10-minute local foreground budget (1507 assertions and still running). That is a cost observation about a green gate, not a defect, and it is CI's run. Successor who will hit this: any dev whose diff touches a workflow file, i.e. every card in this family. Carrier: none today - no open card collects local gate-runtime costs." ] }Generated by Claude Code
github-actions commentedon Sep 12, 2026
os-closed-card-sweep — machine-findable marker for this generated comment.
Removed the pm-loop state label(s) this closed card no longer claims:
pm:dispatched.7cab0d8723, merged intomain.priority:p2,domain:devx— ownership, priority and outcome are not state claims.A state label claims work is in flight. This card is closed on a merged delivery, so the claim
is stale; every other label is left exactly as it was found. Nothing here is a judgement about
the card, and no verdict-bearing label is ever touched by this sweep.
posted by half-state-patrol run 34714884061 · trigger
scheduleGenerated by Claude Code
ci(dogfood): the sharded gate builds its closure in a passthrough-fre…