[eslint-refiner] ESLint Refiner - 2026-09-05: @actions/exec shell-semantics & exec() scope gap (2 issues filed)
#58740
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Overview
Today's run reviewed the two newest-registered rules in
eslint-factory/src/index.ts(61 rules total, up from 12 tracked in this memory branch's last update on 2026-07-08 - a significant reconciliation was needed this run). Both reviewed rules concern@actions/execvs Node'schild_processmodule. Filed 2 non-duplicate issues; a third candidate was investigated and dropped because it turned out to already be covered by an existing open issue.Key metrics
prefer-actions-exec-over-child-process,require-getexecoutput-exitcode-check), plus 1 checked-but-skipped (no-string-fallback-for-non-string-message)index.tsIssues filed
prefer-actions-exec-over-child-process: blanket suggestion ignores shell semantics. The rule suggests migrating all ofexec/execSync/execFile/execFileSyncto@actions/execuniformly, butexec()/execSync()run their command string through a shell (pipes,||, redirection, globbing) while@actions/exec'sexec()/getExecOutput()do not by default - a literal swap silently breaks shell-syntax commands. Grounded inactions/setup/js/validate_secrets.cjs's promisifiedexec('which copilot 2>/dev/null || echo ""').require-getexecoutput-exitcode-check: scope gap onexec.exec(). The rule only inspects.getExecOutput(...)calls, missing the identicalignoreReturnCode: true+ discarded-exit-code hazard on the siblingexec()API (which returns the exit code directly as a number rather than via an object). Grounded inactions/setup/js/check_workflow_recompile_needed.cjs:277-298's bareawait exec.exec("git", [...], { ignoreReturnCode: true, ... })with the return value never captured.Why a third issue wasn't filed
no-string-fallback-for-non-string-messagewas reviewed as a candidate for a false-positive finding (deep optional-chained.messageaccess falling back toString(<root>)). Before filing, the duplicate-check against open issues surfaced #58400, which already treats the exact same live instances (dispatch_workflow.cjs,route_slash_command.cjs,safeoutputs_cli.cjs) as confirmed true positives needing only an autofix - directly contradicting the working hypothesis. Abandoned rather than file a duplicate/contradictory issue.Memory reconciliation detail
This memory branch (
memory/eslint-refiner) had not been updated since 2026-07-08 and only tracked 12 of the now-61 registered rules. Rather than trust the stale localpriorOpenIssueslist, this run usedgh api repos/github/gh-aw/issuesandgh api search/issuesdirectly as the dedupe source of truth.state.jsonhas been rewritten to drop the now-superseded per-rule finding detail from the 12-rule era and instead point at liveindex.ts+gh apias sources of truth, with a fresh list of not-yet-deep-reviewed rules for future runs to work through.Next actions
state.json.exec()scope-gap (issue 2) - both are cheap, well-scoped rule refinements reusing existing helper functions.gh api(notgh issue list --search --json, which throws a version error) for dedupe going forward.Warning
Firewall blocked 1 domain
The following domain was blocked by the firewall during workflow execution:
api.anthropic.comTo allow these domains, add them to the
network.allowedlist in your workflow frontmatter:See Network Configuration for more information.
All reactions