[eslint-refiner] ESLint Refiner - Daily Report (2026-08-03) #49915
Closed
Replies: 1 comment
|
This discussion was automatically closed because it expired on 2026-08-04T06:29:39.146Z.
|
0 replies
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.
ESLint Refiner — Daily Report (2026-08-03)
Custom rule factory (
eslint-factory/**, targetingactions/setup/js/**) grew significantly since the last run and had a large review backlog. This run caught up on the highest-risk unreviewed rules and filed 2 refinement issues.Key metrics
What changed since last run
A 26-day gap opened between runs. In that time the factory grew from 12 to 37 rules — 25 new rules shipped, only 3 of which got reviewed today. Rather than continue the old "pick the single newest rule" cadence against a 22-rule backlog, this run prioritized by risk class: the three command/route-construction rules that guard against shell and GitHub-API injection.
Findings
no-exec-interpolated-command — reviewed, no issue (rule is correct)
Matches
exec.exec()/exec.getExecOutput()on the github-script-injectedexecglobal only. Verified this is sufficient: no call site inactions/setup/jsimports@actions/execdirectly, and all ~150 liveexec.exec/getExecOutputcall sites already pass a static"git"/"gh"/prefix-var command with arguments in the array parameter. No false negative or false positive found.no-child-process-interpolated-command — 1 issue filed
Scope resolution (require-destructuring, import specifiers, member-binding aliases) is solid — confirmed it correctly resolves
const { spawn, execSync } = require("child_process")instart_mcp_gateway.cjsand would flag the interpolatedexecSynctemplate literals at lines 741/876/949 (a target-code concern, out of scope for a rule-refinement issue).Gap: for
spawn/spawnSync/execFile/execFileSync, the rule only treatsshell: true/shell: "<string>"literal values as shell-enabled. A computed value —shell: process.platform === 'win32'(a standard cross-platform idiom) — silently resolves to "not shell," unlike the adjacentSpreadElementbranch which is already conservative. No live occurrence today (grep confirms zeroshell:usages in the corpus), but the first computed-shellspawn/execFilecall added with an interpolated command would pass review unflagged. Filed with acceptance criteria to treat non-literalshellvalues conservatively, matching theSpreadElementhandling already in the same function.no-github-request-interpolated-route — 1 issue filed
The rule only inspects the route argument to
<client>.request()directly — it never resolves anIdentifierargument back to its initializer, unlike its sibling command rules (no-exec-interpolated-command,no-child-process-interpolated-command), which both callresolveWriteOnceInitializerChainfor exactly this reason.Grounded via
create_project.cjs:230/update_project.cjs:919, which already use theconst route = <ternary>; client.request(route, ...)idiom (today fully static — a correct true negative). That proves the identifier-bound route shape is a normal pattern in this codebase, and the rule's ownopaqueWholeRouteremediation text ("pass a typed route string from the caller") actively steers developers toward exactly the shape the rule can't see through. Filed to bring scope-resolution parity with the sibling command rules.Strategy notes
state.json) now tracks two explicit lists —rulesReviewedEverandrulesNeverReviewed— so future runs can resume the backlog sweep without re-deriving rule history. (The repo is a shallow clone, sogit logcan no longer establish "which rule shipped most recently" — everything attributes to one squash commit.)require-fetch-timeout/require-fetch-try-catch(network hang/SSRF-adjacent) andrequire-escaped-regexp-interpolation(ReDoS-adjacent) look like the next highest-value targets, followed by the 5-ruleno-core-error-then-*/no-setfailed-then-exit-zero/require-return-after-core-setfailedcontrol-flow family.[eslint-monster]also files issues touchingactions/setup/jslint findings, but it targets fixing production call sites for already-shipped rules rather than refining rule logic — checked for overlap with today's findings, none found.memory/eslint-refinerrepo-memory (state.json,history.jsonl).References:
All reactions