You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Reviewed prefer-actions-exec-over-child-process, the newest rule in eslint-factory's import list (58 rules total, up from 12 at the last run on 2026-07-08 — a 46-day gap in this workflow's cadence). Filed 2 grounded issues; both quality-checked against the live actions/setup/js corpus rather than filed on suspicion alone.
Key metrics
Rules registered: 58 (was 12 last run) — 45 still unreviewed.
Issues filed today: 2 / 3 cap (quality over cap).
Rule reviewed:prefer-actions-exec-over-child-process (flags child_process.exec/execSync/execFile/execFileSync in github-script-marked modules, suggesting @actions/exec instead).
Grounding: live corpus grep + cross-reference of shim.cjs / setup_globals.cjs to check which globals are actually available at runtime.
Issues filed
False positive — dual-mode shim.cjs scripts. The rule's only scoping check is a /// <reference types="@actions/github-script" /> comment. But ~38 non-test .cjs files also require("./shim.cjs") so they can run either as a require()'d github-script module (where exec truly is a global) or as a standalone Node process such as inside the safe-outputs/mcp-scripts MCP servers (where shim.cjs only stubs core/context — never exec). For those files, child_process.execFileSync is the only correct choice; switching to @actions/exec would break the standalone path.
Grounded at build_checkout_manifest.cjs:52/61 and merge_remote_agent_github_folder.cjs:194-215 (both carry the marker + shim.cjs, both call execFileSync for git/gh).
Latent false negative — retainsCallResult too broad. The "handle retained for streaming" exemption for exec()/execFile() fires for any non-bare-statement parent (await, void, logical/conditional/sequence expressions), not just genuine retention shapes (assignment, return, member-chain). await exec(cmd, cb) — a plausible copy-paste artifact from @actions/exec's real async exec() — would silently escape the rule. No live occurrence found (0 matches for await exec(...) etc. in the corpus), so this is a latent gap, cheap to close before it hides a real bug.
Grounding detail
eslint.config.cjs registers gh-aw-custom/prefer-actions-exec-over-child-process as "warn" for all non-test .cjs files — no per-file excludes exist for the shim.cjs dual-mode population, so both grounded false positives above are live warnings today.
Confirmed true negative: git_helpers.cjs:21 (execSync, marker present, noshim.cjs require) is correctly flaggable — this is a real migration candidate, not a rule bug, and cleanly demonstrates the rule works as designed outside the dual-mode blind spot.
Repo clone is shallow (.git/shallow present) — git log/blame all report the same date for every rule file, so recency was determined from eslint-factory/src/index.ts's import-list append order instead.
Prior open issues from before the 46-day gap (#43948 + sibling, #43486 + sibling, #43326, #42915, #42682/#42680, #42190/#42189/#42188, and the two filed 2026-07-08 for require-fs-sync-try-catch) were not re-verified this run — flagged in memory to re-check via gh api before citing in a future report, since they may already be closed or superseded.
Next actions
Continue the newest-rule-first cadence: 45 rules remain unreviewed (no-throw-plain-object, no-github-request-interpolated-route, require-mkdirsync-try-catch, no-child-process-interpolated-command, no-empty-catch-block, and 40 more — full list in repo-memory state.json). Given the size of the backlog, this will take many runs; not attempting to clear it in one sitting.
Once the shim.cjs fix lands, re-verify build_checkout_manifest.cjs:52/61 and merge_remote_agent_github_folder.cjs:194-215 are silenced.
Re-verify stale prior-run issue numbers before citing them again.
Strategy, findings, and history persisted to repo-memory (memory/eslint-refiner branch) for continuity.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Reviewed
prefer-actions-exec-over-child-process, the newest rule ineslint-factory's import list (58 rules total, up from 12 at the last run on 2026-07-08 — a 46-day gap in this workflow's cadence). Filed 2 grounded issues; both quality-checked against the liveactions/setup/jscorpus rather than filed on suspicion alone.Key metrics
prefer-actions-exec-over-child-process(flagschild_process.exec/execSync/execFile/execFileSyncingithub-script-marked modules, suggesting@actions/execinstead).shim.cjs/setup_globals.cjsto check which globals are actually available at runtime.Issues filed
shim.cjsscripts. The rule's only scoping check is a/// <reference types="@actions/github-script" />comment. But ~38 non-test.cjsfiles alsorequire("./shim.cjs")so they can run either as arequire()'d github-script module (whereexectruly is a global) or as a standalone Node process such as inside the safe-outputs/mcp-scripts MCP servers (whereshim.cjsonly stubscore/context— neverexec). For those files,child_process.execFileSyncis the only correct choice; switching to@actions/execwould break the standalone path.Grounded at
build_checkout_manifest.cjs:52/61andmerge_remote_agent_github_folder.cjs:194-215(both carry the marker +shim.cjs, both callexecFileSyncfor git/gh).retainsCallResulttoo broad. The "handle retained for streaming" exemption forexec()/execFile()fires for any non-bare-statement parent (await,void, logical/conditional/sequence expressions), not just genuine retention shapes (assignment, return, member-chain).await exec(cmd, cb)— a plausible copy-paste artifact from@actions/exec's real asyncexec()— would silently escape the rule. No live occurrence found (0 matches forawait exec(...)etc. in the corpus), so this is a latent gap, cheap to close before it hides a real bug.Grounding detail
eslint.config.cjsregistersgh-aw-custom/prefer-actions-exec-over-child-processas"warn"for all non-test.cjsfiles — no per-file excludes exist for theshim.cjsdual-mode population, so both grounded false positives above are live warnings today.git_helpers.cjs:21(execSync, marker present, noshim.cjsrequire) is correctly flaggable — this is a real migration candidate, not a rule bug, and cleanly demonstrates the rule works as designed outside the dual-mode blind spot..git/shallowpresent) —git log/blameall report the same date for every rule file, so recency was determined fromeslint-factory/src/index.ts's import-list append order instead.#43948+ sibling,#43486+ sibling,#43326,#42915,#42682/#42680,#42190/#42189/#42188, and the two filed 2026-07-08 forrequire-fs-sync-try-catch) were not re-verified this run — flagged in memory to re-check viagh apibefore citing in a future report, since they may already be closed or superseded.Next actions
no-throw-plain-object,no-github-request-interpolated-route,require-mkdirsync-try-catch,no-child-process-interpolated-command,no-empty-catch-block, and 40 more — full list in repo-memorystate.json). Given the size of the backlog, this will take many runs; not attempting to clear it in one sitting.shim.cjsfix lands, re-verifybuild_checkout_manifest.cjs:52/61andmerge_remote_agent_github_folder.cjs:194-215are silenced.memory/eslint-refinerbranch) for continuity.All reactions