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
[quality] bundle e2e suite never drives the fixed-label (/good-first-issue, /remove-help) or built-in prefixed (/lifecycle, /stage, /status, /priority) commands through dist/index.js #245
__tests__/bundle/ is the only suite that runs the committed dist/index.js (against fakeGithub.ts). Its issue_comment inventory on main @ c48bd6d drives /help, /kind, /remove-kind, /label, /remove-label and the dynamic /level, but never the other two label-command families that src/issueComment/handleIssueComment.ts dispatches:
Fixed-label commands (src/labels/fixed.ts, Prow's help plugin): /good-first-issue, /remove-help, /remove-good-first-issue. The remove set differs per command (/remove-help drops both help wanted and good first issue; /remove-good-first-issue drops only good first issue, docs/commands.md:66-68) and the labels contain spaces, so the DELETE .../labels/{name} encoding is a distinct path from every <prefix>/<value> label the suite already exercises.
Built-in prefixed commands (src/labels/prefixed.ts:27-31): /lifecycle, /stage, /status (Prow default values, exclusive: true, docs/labeling.md:100-125) and /priority (yaml allowlist, exclusive: true). The suite's only exclusive-command test is /level, whose values come from the yaml mapping form; the built-in-defaults fallback in sectionFor and the documented "a configuration file must still exist in some tier" failure are not driven end to end. Neither is a comment carrying two exclusive commands at once (/stage + /status), which is where a prefix-scoped "remove stale labels" bug would show.
Evidence:
Unit: npx vitest run --coverage on main @ c48bd6d, Node v26.10.0 — 69 files / 1447 tests, All files 99.83 | 98.35 | 100 | 99.82; src/labels/fixed.ts and src/labels/prefixed.ts at 100% lines. Unit coverage of these files is not the gap.
End to end: grep -nE "good-first-issue|remove-help|/lifecycle|/stage|/status|/priority" __tests__/bundle/bundle.test.ts matches only the /label good-first-issue allowlist test (a labels: entry, not the fixed command). The bundle child's V8 coverage is not captured in the report ([quality] the bundle e2e suite's coverage of src/ is never captured — runBundle.ts drops NODE_V8_COVERAGE and dist/ has no source map #235), so the e2e evidence here is the driven-command inventory, not a line profile; unit and e2e evidence cannot be combined at line granularity.
Recommendation
Add __tests__/bundle/labelCommands.test.ts driving dist/index.js against the fake API for:
/good-first-issue adds good first issue + help wanted in one write; fails without writing when the repository lacks one of them
/remove-help deletes both labels (case-insensitively, space-encoded) and /remove-good-first-issue deletes only good first issue; a no-op read when neither is present
/lifecycle stale with a configuration that has no lifecycle key: removes lifecycle/frozen, adds lifecycle/stale; an unknown value fails without touching the issue; /remove-lifecycle; the documented no-configuration failure
/stage beta + /status in-review in one comment each replace only their own prefix
/priority high from the .prowlabels.yaml allowlist removes priority/low first; an unlisted value fails; /remove-priority
Disjoint from every open hold-gated PR: #236 edits bundle.test.ts, #238 adds collaborationCommands.test.ts (/cc /uncc /unassign /retitle /lock /reopen), #240 adds triggerTestAndLgtmCancel.test.ts, #242 adds cronJobsInput.test.ts, #244 adds meow.test.ts; none touch a labelCommands file, src/labels/fixed.ts or the built-in prefixed commands.
Priority
Impact: medium — unit-covered, not e2e-covered (coverage-gap priority 2); these are the commands Prow users type most after /kind and /lgtm
Finding
__tests__/bundle/is the only suite that runs the committeddist/index.js(againstfakeGithub.ts). Itsissue_commentinventory onmain@ c48bd6d drives/help,/kind,/remove-kind,/label,/remove-labeland the dynamic/level, but never the other two label-command families thatsrc/issueComment/handleIssueComment.tsdispatches:src/labels/fixed.ts, Prow's help plugin):/good-first-issue,/remove-help,/remove-good-first-issue. Theremoveset differs per command (/remove-helpdrops bothhelp wantedandgood first issue;/remove-good-first-issuedrops onlygood first issue,docs/commands.md:66-68) and the labels contain spaces, so theDELETE .../labels/{name}encoding is a distinct path from every<prefix>/<value>label the suite already exercises.src/labels/prefixed.ts:27-31):/lifecycle,/stage,/status(Prow default values,exclusive: true,docs/labeling.md:100-125) and/priority(yaml allowlist,exclusive: true). The suite's only exclusive-command test is/level, whose values come from the yaml mapping form; the built-in-defaults fallback insectionForand the documented "a configuration file must still exist in some tier" failure are not driven end to end. Neither is a comment carrying two exclusive commands at once (/stage+/status), which is where a prefix-scoped "remove stale labels" bug would show.Evidence:
npx vitest run --coverageonmain@ c48bd6d, Node v26.10.0 — 69 files / 1447 tests,All files 99.83 | 98.35 | 100 | 99.82;src/labels/fixed.tsandsrc/labels/prefixed.tsat 100% lines. Unit coverage of these files is not the gap.grep -nE "good-first-issue|remove-help|/lifecycle|/stage|/status|/priority" __tests__/bundle/bundle.test.tsmatches only the/label good-first-issueallowlist test (alabels:entry, not the fixed command). The bundle child's V8 coverage is not captured in the report ([quality] the bundle e2e suite's coverage of src/ is never captured — runBundle.ts drops NODE_V8_COVERAGE and dist/ has no source map #235), so the e2e evidence here is the driven-command inventory, not a line profile; unit and e2e evidence cannot be combined at line granularity.Recommendation
Add
__tests__/bundle/labelCommands.test.tsdrivingdist/index.jsagainst the fake API for:/good-first-issueaddsgood first issue+help wantedin one write; fails without writing when the repository lacks one of them/remove-helpdeletes both labels (case-insensitively, space-encoded) and/remove-good-first-issuedeletes onlygood first issue; a no-op read when neither is present/lifecycle stalewith a configuration that has nolifecyclekey: removeslifecycle/frozen, addslifecycle/stale; an unknown value fails without touching the issue;/remove-lifecycle; the documented no-configuration failure/stage beta+/status in-reviewin one comment each replace only their own prefix/priority highfrom the.prowlabels.yamlallowlist removespriority/lowfirst; an unlisted value fails;/remove-priorityDisjoint from every open hold-gated PR: #236 edits
bundle.test.ts, #238 addscollaborationCommands.test.ts(/cc /uncc /unassign /retitle /lock /reopen), #240 addstriggerTestAndLgtmCancel.test.ts, #242 addscronJobsInput.test.ts, #244 addsmeow.test.ts; none touch alabelCommandsfile,src/labels/fixed.tsor the built-in prefixed commands.Priority
/kindand/lgtmFiled by quality agent (hold-gated mode)
🐝 Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5q9t| SHA:c48bd6d— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88