[GH-ISSUE #3510] fix(ci): include authored GitHub modules in static checker cache inputs #1307

Closed
opened 2026-10-16 21:04:02 +00:00 by bsakaguchi · 3 comments
Owner

Originally created by @N0zoM1z0 on GitHub (Oct 14, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/3510

Originally assigned to: @N0zoM1z0 on GitHub.

Problem

Static checker cache inputs omit authored modules under .github/. Main now contains .github/actions/publish-mcp/registry-state.mjs and its .d.mts declaration, introduced by release-recovery commit 790657dc0. Oxlint scans both files, but the explicit lint and lint:built input inventories in turbo.json do not include them.

This is a real invalidation boundary omission. The existing repository inventory guard correctly blocks CI; removing that assertion would hide the problem. A passing cached lint result can otherwise be reused after one of these checker inputs changes.

Executed baseline and reproduction

  • Repository: morluto/rea; main eab789aed74acd6ef7c15d509e0f3de350be2733.
  • Linux, Node 24.18.0, npm 11.16.0, Turbo 2.11.7, Vitest 5.0.3.
  • Hosted CI 38570471404, failed shard: tests/boundary/filesystem/staticCheckReports.test.ts fails covers the lint inventory and root tool configs in resolved cache inputs.
  • Local reproduction: npm run test:focused -- tests/boundary/filesystem/staticCheckReports.test.ts — 1 failed, 7 passed, 2.34 s, exit 1.

Observed assertion:

lint omits actual checker inputs:
.github/actions/publish-mcp/registry-state.d.mts
.github/actions/publish-mcp/registry-state.mjs

The guard runs the actual oxlint --debug=files inventory and compares it with actual Turbo dry-run resolved inputs; this is not an assertion against an invented file list. Expected: every file consumed by the selected checker participates in its cache key.

Scope and attribution

The triggering files were added by subsequent release-recovery work. This is separate from #3281's completed mutation-feedback/report changes. Latest-main CI is not being described as passing. No product-runtime defect or published-package failure is claimed from this cache finding.

Imported .github declarations may also affect TypeScript; imported module contents may affect Knip. Those are hypotheses pending actual checker/cache controls, not established findings yet. The investigation will follow these consumers before deciding the complete fix scope.

Proposed correction and verification

  • Extend each affected task's own input ownership to authored GitHub modules and relevant package/type boundaries. Preserve existing generated-file exclusions and cache reuse for unrelated Markdown/YAML.
  • Preserve the existing whole-inventory guard.
  • Use isolated local cache directories: establish a healthy cold/warm pass, inject an actual checker error only under .github, demonstrate baseline stale reuse versus a forced checker failure, then prove the corrected key misses and reports the error. Restore every injected change.
  • Extend existing regression coverage where it exercises distinct missing invalidation; avoid blanket cache disabling, global invalidation, weaker assertions, or duplicate implementation-shape tests.
  • Retest checker/report/cache families and current-head CI. Report elapsed/CPU/memory for measured experiments, with cache state and limits explicit.

No corrective source/config changes have been committed at issue creation.

Originally created by @N0zoM1z0 on GitHub (Oct 14, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/3510 Originally assigned to: @N0zoM1z0 on GitHub. ## Problem Static checker cache inputs omit authored modules under `.github/`. Main now contains `.github/actions/publish-mcp/registry-state.mjs` and its `.d.mts` declaration, introduced by release-recovery commit `790657dc0`. Oxlint scans both files, but the explicit `lint` and `lint:built` input inventories in `turbo.json` do not include them. This is a real invalidation boundary omission. The existing repository inventory guard correctly blocks CI; removing that assertion would hide the problem. A passing cached lint result can otherwise be reused after one of these checker inputs changes. ## Executed baseline and reproduction - Repository: `morluto/rea`; main `eab789aed74acd6ef7c15d509e0f3de350be2733`. - Linux, Node 24.18.0, npm 11.16.0, Turbo 2.11.7, Vitest 5.0.3. - Hosted CI [38570471404, failed shard](https://github.com/morluto/rea/actions/runs/38570471404): `tests/boundary/filesystem/staticCheckReports.test.ts` fails `covers the lint inventory and root tool configs in resolved cache inputs`. - Local reproduction: `npm run test:focused -- tests/boundary/filesystem/staticCheckReports.test.ts` — **1 failed, 7 passed**, 2.34 s, exit 1. Observed assertion: ```text lint omits actual checker inputs: .github/actions/publish-mcp/registry-state.d.mts .github/actions/publish-mcp/registry-state.mjs ``` The guard runs the actual `oxlint --debug=files` inventory and compares it with actual Turbo dry-run resolved inputs; this is not an assertion against an invented file list. Expected: every file consumed by the selected checker participates in its cache key. ## Scope and attribution The triggering files were added by subsequent release-recovery work. This is separate from #3281's completed mutation-feedback/report changes. Latest-main CI is **not** being described as passing. No product-runtime defect or published-package failure is claimed from this cache finding. Imported `.github` declarations may also affect TypeScript; imported module contents may affect Knip. Those are **hypotheses pending actual checker/cache controls**, not established findings yet. The investigation will follow these consumers before deciding the complete fix scope. ## Proposed correction and verification - Extend each affected task's own input ownership to authored GitHub modules and relevant package/type boundaries. Preserve existing generated-file exclusions and cache reuse for unrelated Markdown/YAML. - Preserve the existing whole-inventory guard. - Use isolated local cache directories: establish a healthy cold/warm pass, inject an actual checker error only under `.github`, demonstrate baseline stale reuse versus a forced checker failure, then prove the corrected key misses and reports the error. Restore every injected change. - Extend existing regression coverage where it exercises distinct missing invalidation; avoid blanket cache disabling, global invalidation, weaker assertions, or duplicate implementation-shape tests. - Retest checker/report/cache families and current-head CI. Report elapsed/CPU/memory for measured experiments, with cache state and limits explicit. No corrective source/config changes have been committed at issue creation.
Author
Owner

@N0zoM1z0 commented on GitHub (Oct 14, 2026):

Confirmed consumers and current follow-up

Upstream c0aa2e32b fixed the original .github/actions code omission in all four checker tasks. This follow-up retains that fix and addresses remaining producer inputs on main 6060de329de9f3636f63e24a2419847fd9d3f889:

  1. TypeScript follows imported GitHub declarations through package scopes. An added/changed .github/**/package.json can change module interpretation and diagnostics. Its actual --listFilesOnly inventory consumes registry-state.d.mts, not the JS implementation; the follow-up therefore keeps typed sources and package scopes without invalidating typechecking for JS-only body edits.
  2. Knip's installed GitHub Actions plugin reads .github/workflows/*.{yml,yaml} and .github/**/action.{yml,yaml} to discover reachable modules. Changing either entrypoint manifest can change unlisted dependencies without changing any previously hashed code. Package scopes also participate in resolution.

Actual failures and controls

  • On the original eab789aed baseline, isolated real repository caches for lint, TypeScript and Knip each reused success after a relevant module/declaration fault. A write-only local-cache execution (no cache reads or remote activity) rejected each fault with its expected parser / TS2345 / unlisted-dependency diagnostic.
  • On current parent 6060de329, the five added compiler/Knip regression cases yield 3 failed / 2 passed without the follow-up: package scope plus both entrypoint manifests fail; source/declaration cases already covered by upstream pass.
  • Independently omitting Knip module ownership makes both manifest scenarios fail after a previously reachable healthy module changes dependencies. Omitting manifest ownership also fails both scenarios. These are actual checker/cache flows, not glob-shape assertions.
  • Final affected families: 2 files / 23 tests pass (64.04 s on the shared host). A broader integration also passed CI selection, registry/release recovery and the real installed-tarball MCP canary. check:ci, 1,398-source architecture guards and normal commit/pre-push checks pass.
  • Existing whole lint inventory and cross-checkout report-restoration coverage are retained unchanged. The extra lint scenario initially added during investigation was removed as redundant. Unrelated notes/YAML still reuse caches; runtime compilation stays cached for imported GitHub test-only changes.

Current real repository three-checker probe under the corrected input configuration:

Task Healthy warm cache Warm wall Relevant key changes Fault run exit Intended forced diagnostic
lint Cached: 1 cached, 1 total 0.416 s True 1 True
typecheck Cached: 1 cached, 1 total 0.418 s True 1 True
knip Cached: 3 cached, 3 total 0.417 s True 1 True

The complete experiment includes cold runs, warm runs, deliberately invalid states and uncached controls: 75.87 s wall / 276.20 s user / 33.84 s system CPU / 4,194.60 MiB sampled summed process-family RSS. Sampling is 200 ms; shared pages can be counted twice and short-lived/detached peaks can be missed. This is not normal healthy CI latency, an equivalent-workload speedup comparison, or an agent-token measurement. Every injected file was restored. CLI-usage-error and disabled-lint-rule probes were explicitly discarded, not counted as checker detections.

Implementation head: c892fb223028628cde4b302a30c013936b757e32, two files only. Anonymous author/committer and requested Kaoru co-author trailer retained. Hosted current-head CI/review is being started; no passing result is claimed yet.

<!-- gh-comment-id:6170429639 --> @N0zoM1z0 commented on GitHub (Oct 14, 2026): ## Confirmed consumers and current follow-up Upstream `c0aa2e32b` fixed the original `.github/actions` code omission in all four checker tasks. This follow-up retains that fix and addresses remaining producer inputs on main `6060de329de9f3636f63e24a2419847fd9d3f889`: 1. TypeScript follows imported GitHub declarations through package scopes. An added/changed `.github/**/package.json` can change module interpretation and diagnostics. Its actual `--listFilesOnly` inventory consumes `registry-state.d.mts`, not the JS implementation; the follow-up therefore keeps typed sources and package scopes without invalidating typechecking for JS-only body edits. 2. Knip's installed GitHub Actions plugin reads `.github/workflows/*.{yml,yaml}` and `.github/**/action.{yml,yaml}` to discover reachable modules. Changing either entrypoint manifest can change unlisted dependencies without changing any previously hashed code. Package scopes also participate in resolution. ## Actual failures and controls - On the original `eab789aed` baseline, isolated real repository caches for **lint, TypeScript and Knip** each reused success after a relevant module/declaration fault. A write-only local-cache execution (no cache reads or remote activity) rejected each fault with its expected parser / TS2345 / unlisted-dependency diagnostic. - On current parent `6060de329`, the five added compiler/Knip regression cases yield **3 failed / 2 passed** without the follow-up: package scope plus both entrypoint manifests fail; source/declaration cases already covered by upstream pass. - Independently omitting Knip module ownership makes both manifest scenarios fail after a previously reachable healthy module changes dependencies. Omitting manifest ownership also fails both scenarios. These are actual checker/cache flows, not glob-shape assertions. - Final affected families: **2 files / 23 tests pass** (64.04 s on the shared host). A broader integration also passed CI selection, registry/release recovery and the real installed-tarball MCP canary. `check:ci`, 1,398-source architecture guards and normal commit/pre-push checks pass. - Existing whole lint inventory and cross-checkout report-restoration coverage are retained unchanged. The extra lint scenario initially added during investigation was removed as redundant. Unrelated notes/YAML still reuse caches; runtime compilation stays cached for imported GitHub test-only changes. Current real repository three-checker probe under the corrected input configuration: | Task | Healthy warm cache | Warm wall | Relevant key changes | Fault run exit | Intended forced diagnostic | | --- | --- | ---: | --- | ---: | --- | | lint | Cached: 1 cached, 1 total | 0.416 s | True | 1 | True | | typecheck | Cached: 1 cached, 1 total | 0.418 s | True | 1 | True | | knip | Cached: 3 cached, 3 total | 0.417 s | True | 1 | True | The complete experiment includes cold runs, warm runs, deliberately invalid states and uncached controls: **75.87 s wall / 276.20 s user / 33.84 s system CPU / 4,194.60 MiB sampled summed process-family RSS**. Sampling is 200 ms; shared pages can be counted twice and short-lived/detached peaks can be missed. This is not normal healthy CI latency, an equivalent-workload speedup comparison, or an agent-token measurement. Every injected file was restored. CLI-usage-error and disabled-lint-rule probes were explicitly discarded, not counted as checker detections. Implementation head: `c892fb223028628cde4b302a30c013936b757e32`, two files only. Anonymous author/committer and requested Kaoru co-author trailer retained. Hosted current-head CI/review is being started; no passing result is claimed yet.
Author
Owner

@N0zoM1z0 commented on GitHub (Oct 14, 2026):

Current exact head c892fb223028628cde4b302a30c013936b757e32 has completed hosted code validation: CI run 38578694538, 35 jobs successful. Downloaded merged artifact 11903757172 parses to 1,281 unique files / 14,599 passed / 125 skipped / zero failed / no duplicates. Exact-head Greptile source review is 5/5 with no inline findings; it did not run tests itself.

The candidate merge tree currently matches the qualified PR tree. The PR is ready (not draft) as requested. Initial human ownership/diff/evidence/readiness declarations for this separate change are still pending; they have not been inferred from the earlier #3281 confirmation or fabricated. This issue remains open until an actual merge.

<!-- gh-comment-id:6171017190 --> @N0zoM1z0 commented on GitHub (Oct 14, 2026): Current exact head `c892fb223028628cde4b302a30c013936b757e32` has completed hosted code validation: [CI run 38578694538](https://github.com/morluto/rea/actions/runs/38578694538), **35 jobs successful**. Downloaded merged artifact `11903757172` parses to **1,281 unique files / 14,599 passed / 125 skipped / zero failed / no duplicates**. Exact-head Greptile source review is 5/5 with no inline findings; it did not run tests itself. The candidate merge tree currently matches the qualified PR tree. The PR is ready (not draft) as requested. Initial human ownership/diff/evidence/readiness declarations for this separate change are still pending; they have not been inferred from the earlier #3281 confirmation or fabricated. This issue remains open until an actual merge.
Author
Owner

@N0zoM1z0 commented on GitHub (Oct 14, 2026):

Merged as eb44921c4c3682e33c78508285629926e8ef241e in #3522 after all 35 current-head CI jobs passed, exact-head Greptile review scored 5/5 with no inline findings, and the human owner's actual initial declarations passed readiness validation.

Downloaded and parsed current-head test artifact 11905109208: 1,284 unique test files, 14,650 passed, 125 explicitly skipped, zero failures and no duplicate files. Current-head CI: https://github.com/morluto/rea/actions/runs/38585311071 . Latest main integration also passed the 35-test cache/report/evaluation check and all eight static tasks plus architecture guards; the preceding Ghidra integration passed 165 tests with two explicit skips.

Post-merge verification: actual parent ca1b2f8608c52ed721d3576ba5eeb1d66717b08c; actual tree 94968171e2ad7fc22b129c5245c1daac90202dac exactly equals the qualified PR tree. Verified the anonymous author email and requested Kaoru co-author trailer in the actual squash commit. The change is limited to turbo.json and the real cache regression fixture: stale success is rejected while healthy warm-cache reuse is retained. No runtime changes, live-test caching, global invalidation or weakened test oracles. No CI-wide speedup is claimed from the cold/warm/error experiment.

<!-- gh-comment-id:6171678229 --> @N0zoM1z0 commented on GitHub (Oct 14, 2026): Merged as `eb44921c4c3682e33c78508285629926e8ef241e` in #3522 after all 35 current-head CI jobs passed, exact-head Greptile review scored 5/5 with no inline findings, and the human owner's actual initial declarations passed readiness validation. Downloaded and parsed current-head test artifact `11905109208`: 1,284 unique test files, 14,650 passed, 125 explicitly skipped, zero failures and no duplicate files. Current-head CI: https://github.com/morluto/rea/actions/runs/38585311071 . Latest main integration also passed the 35-test cache/report/evaluation check and all eight static tasks plus architecture guards; the preceding Ghidra integration passed 165 tests with two explicit skips. Post-merge verification: actual parent `ca1b2f8608c52ed721d3576ba5eeb1d66717b08c`; actual tree `94968171e2ad7fc22b129c5245c1daac90202dac` exactly equals the qualified PR tree. Verified the anonymous author email and requested Kaoru co-author trailer in the actual squash commit. The change is limited to `turbo.json` and the real cache regression fixture: stale success is rejected while healthy warm-cache reuse is retained. No runtime changes, live-test caching, global invalidation or weakened test oracles. No CI-wide speedup is claimed from the cold/warm/error experiment.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#1307
No description provided.