Repository navigation
Topic: objectui's turbo cache never replays for Lint and shadows itself across jobs — //#lint:root couples every package's lint hash to every tracked file (the objectui#12222 disease), and four jobs restore the bare turbo-<os>- key #12276
Description
Topic card, filed by the director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB) under the maintainer's words 「立卡你决定,不需要我同意」 and 「后续能否你负责分析和立卡,具体的开发任务交给车道经理」 (2026-10-12): the seat files, the domain:devx lane manager claims, dispatches and lands. ⛔ Not a claim. Filing gate ①: a measured defect with named landing points, from objectui#12222's dev report and ACCEPT (6126154639), carried there as "a card for the lane once this lands".
Protects: the Lint required context's wall on every pull request and queue build, and the turbo cache the type-check job now prunes and keys per job (objectui#12222): a cache that never replays costs a full lint each run; a bare restore key restores another job's multi-GB cache.
What is measured (objectui#12222's dev, on main before 1ce8db8d; re-measure on today's main first)
//#lint:roothas the default inputs (turbo.json:"//#lint:root": { "outputs": [], "cache": false }, noinputs), so this root task hashes every tracked file (about 8,600), and every package'slinttaskdependsOnit ("lint": { "dependsOn": ["//#lint:root"], "inputs": ["$TURBO_DEFAULT$", "$TURBO_ROOT$/eslint.config.js", "$TURBO_ROOT$/eslint-rules/*.js"] }). Measured: one untrackeddocs/file moves 46 of 46 lint hashes, so theLintjob's restored cache replays nothing, ever. The same coupling on//#type-check:e2ewas fixed in objectui#12222 (PR ci(type-check): the turbo cache replays unchanged packages, and pull-request and queue runs type-check only what the change affects (objectui#12222) #12251) by giving the root task its owninputs:"//#type-check:e2e": { "inputs": ["e2e/**", "playwright*.config.ts", "tsconfig.e2e.json"] }.lint:rootiseslint . --ignore-pattern 'packages/*/**' --ignore-pattern 'examples/*/**' --ignore-pattern 'apps/*/**' --ignore-pattern 'docs/**': its inputs are the root-level sources andeslint.config.js/eslint-rules/*.js, not the packages.- Four jobs restore the bare
turbo-${{ runner.os }}-key (actions/cacherestore-keys):lint.ymlline 333 (keyturbo-<os>-<sha>, fallback bare),ci.ymlline 2454 (the docs job:turbo-<os>-docs-then bare),changeset-release.ymlline 719,performance-budget.ymlline 236. objectui#12222 measured the shape on thetype-checkjob before it moved toturbo-<os>-type-check-<sha>with a per-job prefix only: the bare fallback matched another job's 2 GB cache on the PR's own ref, 321 of 401 entries unused, and by the fourth run nothing could be restored. The three bare-key jobs save and restore each other's caches; the docs job's second fallback does the same.
What to build (one PR, or two if the lane prefers; the type-check job's shape is the template)
turbo.json://#lint:rootgets its owninputs(the fileslint:rootlints: the root sources outsidepackages/,examples/,apps/,docs/, pluseslint.config.jsandeslint-rules/*.js; derive the list from the script's ignore patterns and prove it with the same probe objectui#12222 used: an untrackeddocs/file must move 0 of 46 lint hashes after, 46 before).- The four
actions/cachesteps: a per-job key prefix (turbo-<os>-lint-,-docs-,-release-,-perf-) and no bare fallback; save only onpush/scheduleif the job follows thetype-checkjob's two-speed shape (objectui#12222: PR runs restore, never save), and prune to what the run used (scripts/report-turbo-cache.mjs --pruneexists). TheReport what the turbo cache replayedstep from ci: Type Check runs 476 s median on every PR and merge group although its turbo cache is restored — measure the cache hit rate, fix the miss, and type-check affected packages only on PR and merge-queue runs (two-speed CI, objectstack#22998) #12222 tells the before/after. - The pins that read these workflows (
ci-cd-pipeline-doc.test.ts,turbo-test-inputs, the cache-key pins ci: Type Check runs 476 s median on every PR and merge group although its turbo cache is restored — measure the cache hit rate, fix the miss, and type-check affected packages only on PR and merge-queue runs (two-speed CI, objectstack#22998) #12222 added) follow.
Acceptance
- On
mainafter landing: the first threepull_requestruns'Lintjobs replay their lint tasks from the cache (the report step's notice: hits ≥ 40 of 46 on a one-package change) and the job's wall against the before median (read it first: theLintjob'sRun linterstep over the last 20 PR runs); no job restores another job's cache (the restored key's prefix is the job's own in the notice). - ⛔
lintitself, eslint's config and rules, and every other job untouched.
Related: objectui#12222 · PR #12251 (merge 1ce8db8d; ACCEPT 6126154639; landing 6126541762) · objectui#12272 (the other #12251 follow-up, in flight) · turbo.json · lint.yml · ci.yml (the docs job) · changeset-release.yml · performance-budget.yml.
Activity
objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round R85 ·
domain:devx@ objectui seat 1, on the card's routing (the director seat files, the lane manager claims, dispatches and lands; the maintainer's words 「后续能否你负责分析和立卡,具体的开发任务交给车道经理」) · 2026-10-13T01:10ZSession:
session_011oKFDZMRoPGDbStvxQa172Account:
os-justinBranch:
claude/issue-12276-lint-turbo-cacheWorktree:
objectui-issue-12276Domain:
domain:devxSeat:
domain:devx#1File surface:
turbo.json(the//#lint:rootentry only), the turboactions/cachesteps of.github/workflows/lint.yml(theLintjob),.github/workflows/ci.yml(the docs job only),.github/workflows/changeset-release.ymland.github/workflows/performance-budget.yml, the pins inscripts/__tests__/that read those steps or that entry, andcontent/docs/guide/ci-cd-pipeline.mdonly where it states these keys; ⛔ not thelinttask, eslint's config or rules, ⛔ no other job or step (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(the default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiover the five paths: no path-derived mandate). Governed by the maintainer's ruling 「两仓加治理行」 on.github/workflows/**(objectui#12255 lands the row): the seat treats the PR as Tier H, draft until aGOVERNED_APPROVERSmember approves.Clause-②: no
Responsibility:
n/a — not a defect cardThread-read: none
Serial constraints cleared: objectui#12278 (this round, this seat) edits two comments in
changeset-release.yml(lines 736 and 1220 on74964ad6); this card's bare-key restore there is at line 719 and its save at 1452: region-disjoint, ordinary concurrency, the later lander mergesmain. objectui#12255 (this round) edits no workflow file. No other open PR touches these files (4 open PRs read). Same-day churn:ci.ymltook objectui#12277 (48fb558d) and objectui#12262 (a1a917a0) after this card was filed, so the card's line numbers have moved.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 12276,
"status": "done",
"branch": "claude/issue-12276-lint-turbo-cache",
"pr": "#12290",
"session": "session_011oKFDZMRoPGDbStvxQa172 — the dispatching seat's session (this run is its subagent)",
"premise_still_valid": true,
"summary": "Measured, then changed. H1 re-measured on 74964ad:
//#lint:roothashed 8652 inputs and one untracked docs/ file moved 46/46 package lint hashes. turbo.json now gives it inputs = the ESLint-linted extensions (**/*.js|cjs|mjs|ts|tsx) minus the lint:root script's four --ignore-pattern trees, plus!**/node_modules/**: under explicit inputs turbo 2.10.9 also hashes git-ignored files (first draft: 64008 inputs, 63598 under the root node_modules). After the change it has 410 inputs: ESLint's own 407 (--format json), public/mockServiceWorker.js, and the root package.json/turbo.json that turbo adds on its own. Probes: untracked docs/, .changeset/ and content/ files move 0/46; a file in one package moves 1/46; a root scripts/ or e2e/ file, eslint.config.js or the root package.json moves 46/46. A real run (turbo run lint --filter=@object-ui/types, TURBO_RUN_SUMMARY) replays the package lint warm and still replays with an untracked docs/ file. The four bare-fallback caches (Lint, Build Docs, Changeset Release, Bundle Analysis) now copy the type-check shape: a per-job prefix (lint/docs/release/perf) as the only restore key; PR and queue runs never save; the saving runs prune viareport-turbo-cache.mjs --prune; every run posts theTurbo cachenotice with the restored key. H5 falsified: 14/20 main push Lint runs and 16/20 Bundle Analysis runs succeeded, so a push-only save warms the cache and no schedule was added. Before reading for the PR body:Run lintermedian 276.5 s over the 20 newest PR runs. New pins: the//#lint:rootinputs against ESLint's own walk, and the five turbo caches as one population. Seven ablations, all red, all restored.","tests": "All at the head 741484a:
pnpm exec vitest run --maxWorkers=2 --shard=1/2 scripts/__tests__exit 0 (Test Files 93 passed | 1 skipped (94); Tests 3228 passed | 1 skipped);--shard=2/2exit 0 (Test Files 94 passed | 1 skipped (95); Tests 2403 passed | 1 skipped). An earlier unsharded run at 146ae93 was red: render-budget-comment.test.ts had 3 failures (the perf trigger closure, the !cancelled() count, the env contract). 741484a resolves them, and the shards above are the re-run. Ablations go through objectstack scripts/ablation-replace.mjs in WRAP mode; each mutation is proven by the anchor count and a blob change, each restore by blob == HEAD and an emptygit diff HEAD. A1: inputs key renamed, 3 red in turbo-lint-inputs.test.ts. A2c: node_modules exclusion renamed, 1 red. A3b: bare restore key re-added in lint.yml, 1 red. A4b: perf save loses its push clause, 1 red. A5b: docs Build Site loses TURBO_RUN_SUMMARY, 1 red. A6: release key back to the shared turbo-OS-SHA, 1 red. A7: perf prefix nested under lint-, 1 red. The first attempts at A2-A5 were refused by the tool (the replacement was a substring of the anchor, or the anchor was ambiguous), so nothing was measured; they were re-run with valid anchors. No build or dist step is involved: the pins read source files directly.","mcp_calls": "0 — no MCP tool called",
"api_writes": "2 relay strokes (fleet-write, objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12290/assignees [os-justin], read back identical 14086/14086 bytes; (2) this os-dev-report = POST /repos//issues/12276/comments. Each stroke went through POST /repos/objectstack-ai/objectstack/dispatches. git push of the branch is not a REST write. Zero label writes: the labels on #12290 (documentation, configuration, ci/cd, tests) come from labeler.yml.",
"gates": [
{
"command": "pnpm exec vitest run --maxWorkers=2 --shard=1/2 scripts/tests",
"exit": 0,
"verdict": "Test Files 93 passed | 1 skipped (94); Tests 3228 passed | 1 skipped (3229); os-verify-lock VERDICT command-exit 0",
"head": "741484ae"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 --shard=2/2 scripts/tests",
"exit": 0,
"verdict": "Test Files 94 passed | 1 skipped (95); Tests 2403 passed | 1 skipped (2404); os-verify-lock VERDICT command-exit 0",
"head": "741484ae"
},
{
"command": "pnpm type-check:scripts",
"exit": 0,
"verdict": "os-verify-lock: VERDICT command-exit 0 (tsc --listFilesOnly lists all four changed test files)",
"head": "741484ae"
},
{
"command": "pnpm exec eslint scripts/tests/turbo-lint-inputs.test.ts scripts/tests/report-turbo-cache.test.ts scripts/tests/turbo-task-guard-coverage.test.ts scripts/tests/render-budget-comment.test.ts",
"exit": 0,
"verdict": "(no output)",
"head": "741484ae"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 8568 tracked text file(s); skipped 85 binary).",
"head": "741484ae"
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0",
"head": "741484ae"
},
{
"command": "pnpm check:action-ref-convention",
"exit": 0,
"verdict": "check-action-ref-convention: 109 action reference(s) in 29 workflow file(s), 13 distinct; 0 off-convention and undeclared, 0 stale exception(s)",
"head": "741484ae"
},
{
"command": "node scripts/check-pre-install-import-graph.mjs --self-test",
"exit": 0,
"verdict": "check-pre-install-import-graph self-test: 16 cases pass",
"head": "741484ae"
},
{
"command": "node scripts/check-pre-install-import-graph.mjs",
"exit": 0,
"verdict": "OK — 39 pre-install step(s) in 19 job(s) run 34 scripts/ gate(s); 40 module(s) walked, every non-relative leaf a node builtin.",
"head": "741484ae"
},
{
"command": "node scripts/check-shell-escape-residue.mjs",
"exit": 0,
"verdict": "check-shell-escape-residue: OK (5/5 root(s) resolved ...)",
"head": "741484ae"
},
{
"command": "node scripts/check-doc-links.mjs",
"exit": 0,
"verdict": "Links are valid across 17 scan roots.",
"head": "741484ae"
},
{
"command": "node scripts/check-doc-fence-languages.mjs --self-test",
"exit": 0,
"verdict": "check-doc-fence-languages self-test: 26 cases pass",
"head": "741484ae"
},
{
"command": "node scripts/check-doc-fence-languages.mjs",
"exit": 0,
"verdict": "check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 2 declared file(s)",
"head": "741484ae"
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "No source or published contract of a released package changed in this range, so no changeset is owed.",
"head": "741484ae"
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a
majorbump.","head": "741484ae"
},
{
"command": "node scripts/check-governed-queue-guard.mjs --test (the 11 changed paths)",
"exit": 0,
"verdict": "NOT GOVERNED — 11 path(s) checked against 5 governed surface(s); none matched. (objectui#12255 lands the workflow row in parallel; the seat treats this PR as Tier H, and the body carries the maintainer quick-read section.)",
"head": "741484ae"
},
{
"command": "NOT MEASURED locally: repo-wide pnpm lint, the build-dependent repo-gates (doc snippet/example/JSON fence types, skill examples), and the workflows themselves",
"exit": null,
"verdict": "CI-owned. This diff adds no fenced block. The PR exercises Lint, Build Docs (turbo.json and ci.yml are in its pathspec) and Bundle Analysis (its own file). The release job runs only on main.",
"head": "741484ae"
}
],
"line_budget": "n/a (none named in the dispatch)",
"deviations": [
"File surface beyond the claim's literal list; each item is forced by the card's prune/report ask or by a pin. (a)
env: TURBO_RUN_SUMMARYon the four turbo-running steps (Run linter, Build Site, and the two Build packages steps): the prune and the report read the run summary. (b) NewReport what the turbo cache replayedandPrune the turbo cache to what this run usedsteps in each of the four jobs. (c) performance-budget.ymlpaths:(push and pull_request) gainscripts/report-turbo-cache.mjs: render-budget-comment.test.ts pins that every script the job runs is in its trigger closure. (d) render-budget-comment.test.ts is edited (it was not on H6's list): !cancelled() count 3 to 4, env scan scoped to the render step, closure entry added. (e) ci-cd-pipeline.md names the report script in the docs row and the Lint, Performance Budget and Changeset Release sections, not only where keys are stated: ci-cd-pipeline-doc.test.ts pairs every first-party command a job runs with its doc section. (f) changeset-release.yml: the save step's derivation comment had a premise the change falsifies (the shared key), so it was rewritten. The two comment lines objectui#12278 edits were not touched.","H5 falsified (push runs mostly complete), so no
scheduletrigger was added to lint.yml or performance-budget.yml; they save onpushonly.","Each new bookkeeping step carries
timeout-minutes: 1, derived from the measured 87 ms run of the report script. The template's 2 was not inherited (objectui#7048 fences inheriting a number). Bookkeeping stays within half of each job's ceiling: 7/25, 7/15, 7/40, 7/25.","The shared shallow clone was deepened by 150 commits (
git fetch --deepen=150 origin main, a shared .git/shallow) for the 200-merge census.","turbo in a linked worktree writes its cache under the MAIN checkout's
.turbo/cache: the replay probe left 3 files (one entry, hash cca15f79830bd54e) in /home/user/objectui/.turbo/cache, a git-ignored path. Those 3 files, which were the directory's entire contents, and the then-empty .turbo/ dirs were removed afterwards.","Commit trailers are model-free (Claude-Session + Co-authored-by: Claude), per objectui AGENTS.md. The harness reminder asked for a model-named Co-Authored-By; AGENTS.md takes precedence."
],
"files_changed": [
".changeset/12276-lint-turbo-cache.md",
".github/workflows/changeset-release.yml",
".github/workflows/ci.yml",
".github/workflows/lint.yml",
".github/workflows/performance-budget.yml",
"content/docs/guide/ci-cd-pipeline.md",
"scripts/tests/render-budget-comment.test.ts",
"scripts/tests/report-turbo-cache.test.ts",
"scripts/tests/turbo-lint-inputs.test.ts",
"scripts/tests/turbo-task-guard-coverage.test.ts",
"turbo.json"
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed · Root package.json / turbo.json and every lint:root-linted file still move all 46 package lint hashes: turbo adds the two manifests to every root task's inputs, and
lintdependsOn//#lint:root. In the last 200 merges up to 74964ad, 28 touched one of these. Decoupling needs thelinttask's dependsOn changed, which the card fences off. Recorded in the PR's Acceptance notes. · dedupe words: lint dependsOn lint:root, root task inputs package.json, turbo hash fold","carrier: none (承接者:无) · noted, not filed · Under explicit
inputs, turbo 2.10.9 hashes git-ignored files; measured with a git-ignored dist/ probe file and node_modules.//#type-check:e2e'se2e/**therefore hashes git-ignored files under e2e/ on a local tree. CI checks out fresh, so no public door shows a wrong answer, and there is no reach. · dedupe words: turbo inputs gitignored, explicit inputs node_modules, type-check:e2e inputs","carrier: the next edit of scripts/report-turbo-cache.mjs · noted, not filed · The script header still names only ci.yml's type-check use (TURBO_RUN_SUMMARY on
Run type-check, prune on the full battery). That is still true but now incomplete: five jobs use the script. · dedupe words: report-turbo-cache header, turbo run summary users","carrier: none (承接者:无) · noted, not filed · Lint push runs replay without TURBO_FORCE, unlike the type-check full battery; they rely on the derived inputs guard. Considered and not changed (not asked by the card). · dedupe words: lint TURBO_FORCE push, lint full battery"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
ACCEPT — PR objectui#12290 at head
741484ae· 2026-10-13T02:18Z ·domain:devx@ objectui seat 1,session_011oKFDZMRoPGDbStvxQa172.Implemented-by:
os-devsubagent of this session (report6136521542, branchclaude/issue-12276-lint-turbo-cache)Reviewed-by: the claiming seat,
session_011oKFDZMRoPGDbStvxQa172(os-justin)Checklist (read on GitHub, not from the report):
main, body line 1Fixes #12276, a line-startClause-②: no; a scan of the whole body finds no other closing keyword.turbo.json://#lint:rootgainsinputscovering the five linted extensions minus thelint:rootscript's four ignore trees and**/node_modules/**. It stayscache: false. Nothing else inturbo.jsonmoves.type-checktemplate.lint.yml(lint-),ci.ymldocs (docs-),changeset-release.yml(release-) andperformance-budget.yml(perf-) each have one per-job restore prefix and no bare fallback. Pull-request and queue runs never save; the saving runs prune throughreport-turbo-cache.mjs --prunefirst. Every run posts the report notice.741484ae: 30success; the coverage legs anddependabotareskippedby design. The PR's own runs read as expected.Lint: "lint 0/46 replayed · uncached //#lint:root (410 input files) · restored nothing (cold)", cold because nomainentry exists yet under the newlint-prefix.Build Docs: restoredturbo-Linux-docs-…with "161 (2958.8 MB) not used by this run", the bloat the push-side prune removes.Bundle Analysisis cold underperf-.turbo-lint-inputs.test.tschecks the inputs against ESLint's ownlint:rootwalk. Its positive controls areeslint.config.jsand a root script reached, and a walk of more than 100 files.report-turbo-cache.test.tsholds the five turbo caches as one population. The report's seven ablations (each red, each restore proven by blob) fit the diff..changeset/12276-lint-turbo-cache.md, empty frontmatter;Changeset Declarationgreen.File surface amended (the report's deviations a–f): the claim's list grows by the
TURBO_RUN_SUMMARYenv on the four turbo-running steps of those jobs, and the new report and prune steps in each of the four jobs. It also addsscripts/report-turbo-cache.mjstoperformance-budget.yml'spaths:(required byrender-budget-comment.test.ts's trigger-closure pin), the edit torender-budget-comment.test.tsitself, theci-cd-pipeline.mdsections thatci-cd-pipeline-doc.test.tspairs with each job's commands, and the rewritten derivation comment on the release save step. Each item is forced by the card's own report-and-prune ask or by a pin that reads it. The twochangeset-release.ymlcomment lines objectui#12278 edited (now merged as15701796) are untouched.H5 falsified, accepted: 14 of the 20 newest
mainpushLintruns and 16 of 20Bundle Analysisruns succeeded. A push-only save warms the cache, so noschedulewas added.Governed: the central register (
check-governed-merges.mjs --pr) answers NOT governed, because its workflow row waits on objectstack#23048. objectui's own guard governs.github/workflows/**once PR objectui#12289 (in the merge queue now) lands. The seat applies the stricter reading, the maintainer's 「两仓加治理行」: Tier H. The PR stays a draft withneeds-user-decision, and a review is requested from bothGOVERNED_APPROVERS.Out-of-scope readings (4): each is
Acceptance notes, none is filed. (1) Rootpackage.json/turbo.jsonand everylint:root-linted file still move all 46 hashes, because of thedependsOncoupling the card fences off: 28 of the last 200 merges touched one. (2) Under explicitinputs, turbo hashes git-ignored files locally; CI checks out fresh, so there is no reach. (3) Thereport-turbo-cache.mjsheader is incomplete; carrier: its next edit. (4) Lint push runs skipTURBO_FORCE.After landing (the seat's, owed): the card's acceptance on
main. The first threepull_requestLintruns after the firstmainpush save must replay at least 40 of 46 lint tasks on a one-package change. TheirRun linterwall goes against the before median of 276.5 s (the PR body). No job's notice may name another job's prefix.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Landed · 2026-10-13T02:46Z ·
domain:devx@ objectui seat 1,session_011oKFDZMRoPGDbStvxQa172.PR objectui#12290 merged through the queue as
9d313ebeonmain(GitHub'smerged_at: 2026-10-13T02:46:13Z). The authorised approval, ready and auto-merge were the maintainer's own hand (os-zhuang). This is the first workflow PR to pass the queue guard after PR objectui#12289 (45ae6b89) made.github/workflows/**governed.origin/main9d313ebe: inturbo.json,//#lint:rootcarries 10inputsentries and stayscache: false. There are 0 bareturbo-OS-restore keys left inlint.yml,ci.yml,changeset-release.ymlandperformance-budget.yml.lint.ymlcarries thelint-prefix (3 hits).completedthroughFixes.pm:dispatchedand the assignee are removed right after this comment.Still owed by this seat (the card's acceptance on
main, ACCEPT6136770133):mainpushLintrun after9d313ebesaves under thelint-prefix.pull_requestLintruns must then replay at least 40 of 46 lint tasks on a one-package change, according to theirTurbo cachenotice.Run linterwall goes against the 276.5 s before median.The reading is posted here when those runs exist. If it fails, it is filed as a regression against
9d313ebe.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Acceptance on
main: met · 2026-10-13T05:09Z ·domain:devx@ objectui seat 1,session_011oKFDZMRoPGDbStvxQa172. This discharges the reading owed in the landing note6137086103. Every value is read from each run's ownTurbo cachenotice (check-run annotation) and from itsRun linterstep timestamps.mainpush saves:Run linter383384764519d313ebe(the merge)383397575405d3f437aturbo-Linux-lint-9d313ebe…The first three
pull_requestLintruns after the merge (the card's acceptance), plus the fourth:Run linter38341087445turbo-Linux-lint-5d3f437a…38343895302turbo-Linux-lint-fd4872f9…38345167297turbo-Linux-lint-fd4872f9…38348110250turbo-Linux-lint-fd4872f9…inputsfix was for.Run linteris 24 / 37 / 29 s on the three acceptance runs, against the before median of 276.5 s (the PR body's reading over the 20 newest PR runs before the change).lint-prefix. The PR runs skipped prune and save, as designed.Nothing further is owed on this card.
Generated by Claude Code