Finding
The bundle end-to-end suite (__tests__/bundle/bundle.test.ts, which spawns the committed dist/index.js against a fake GitHub API) never drives two issue_comment paths that the unit suite covers in isolation:
/test (src/issueComment/trigger.ts test(), lines 70-102): the run table for /test and /test ?, /test all, /test <name> / /test <file> matching (matchesWorkflow), the "no completed run matches" comment, the 409 "already being re-run" fallback in rerunEach, the 403 actions: write refusal, the non-member refusal in prepare, and the "only applies to pull requests" comment. The trigger commands describe block drives only /retest and /ok-to-test.
- lgtm cancel (
src/labels/lgtm.ts cancelLgtm(), lines 79-110, and unbindLgtm in src/plugins/lgtmBinding.ts:87): /lgtm cancel and its alias /remove-lgtm — the label removal, the prow/lgtm status reset to pending that voids the binding, the author-may-cancel path with no membership read, the no-label no-op, and the non-reviewer refusal. The only cancel the bundle suite drives is /approve cancel.
Evidence (main @ c48bd6d)
Priority follows the coverage-evidence rule for "unit-covered, not e2e-covered": medium.
Recommendation
Add __tests__/bundle/triggerTestAndLgtmCancel.test.ts — a new file only, reusing fakeGithub.ts and runBundle.ts — with one describe per path:
/test: no argument and ? → run table (current workflow filtered out by GITHUB_WORKFLOW); all → POST actions/runs/{1,2}/rerun + rocket, in-progress runs untouched; LINT (name, case-insensitive) and ci (file stem) → one re-run each; e2e (in progress only) → "No completed … matches" comment; 409 on every re-run → "already being re-run" comment, no rocket; 403 → grant \actions: write`comment, exit 1; non-member commenter →Cannot /test because …`, exit 1, no runs read; on a plain issue → "only applies to pull requests", zero reads.
- lgtm cancel:
/lgtm cancel by a reviewer → GET issues/1, DELETE issues/1/labels/lgtm, configuration reads, POST statuses/headsha {state: pending, context: prow/lgtm, description: 'lgtm cancelled by Codertocat'}, then tide's sweep skips the pr; /remove-lgtm by the author → same without any membership read; label absent → no DELETE, no status; non-reviewer non-author → refused, nothing removed.
Disjoint from every open hold-gated PR: #236 edits one line of bundle.test.ts, #238 adds collaborationCommands.test.ts (/cc /uncc /unassign /retitle /lock /reopen); none of #217, #219, #221, #223, #225, #227, #229, #230, #232, #234 touch __tests__/bundle/.
Priority
- Impact: medium —
/test is the only trigger command with no e2e case, and lgtm cancel is the path that voids a merge-gating binding
- Effort: low
Filed 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
Finding
The bundle end-to-end suite (
__tests__/bundle/bundle.test.ts, which spawns the committeddist/index.jsagainst a fake GitHub API) never drives twoissue_commentpaths that the unit suite covers in isolation:/test(src/issueComment/trigger.tstest(), lines 70-102): the run table for/testand/test ?,/test all,/test <name>//test <file>matching (matchesWorkflow), the "no completed run matches" comment, the 409 "already being re-run" fallback inrerunEach, the 403actions: writerefusal, the non-member refusal inprepare, and the "only applies to pull requests" comment. Thetrigger commandsdescribe block drives only/retestand/ok-to-test.src/labels/lgtm.tscancelLgtm(), lines 79-110, andunbindLgtminsrc/plugins/lgtmBinding.ts:87):/lgtm canceland its alias/remove-lgtm— the label removal, theprow/lgtmstatus reset topendingthat voids the binding, the author-may-cancel path with no membership read, the no-label no-op, and the non-reviewer refusal. The onlycancelthe bundle suite drives is/approve cancel.Evidence (main @ c48bd6d)
npm run test:coverage→src/issueComment/trigger.ts100% statements / 98.96% branches (the single residual branch, line 323, is claimed by test: cover the residual branch fallbacks of meow, trigger and tide #225);src/labels/lgtm.ts100% / 96% (line 68, claimed by test: cover the non-Error rejection and empty-config fallbacks of labelSync, lgtm, mergeQueue and issueComment/approve #223). Both paths are unit-covered.npx vitest run __tests__/bundle→ 1 file / 88 tests.grep -c '/test\b' __tests__/bundle/bundle.test.ts→ 0;grep -n 'cancel\|remove-lgtm' __tests__/bundle/bundle.test.ts→ only the/approve cancelcase (line 618). Neither path is exercised throughdist/index.js.dist/index.jsin a child process and its coverage ofsrc/is not collected or combined with the unit profile ([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, PR test(bundle): opt the node --check spawn out of NODE_V8_COVERAGE so the suite survives coverage.autoAttachSubprocess #236 pending), so the e2e evidence here is the suite's test inventory, not a merged line profile.Priority follows the coverage-evidence rule for "unit-covered, not e2e-covered": medium.
Recommendation
Add
__tests__/bundle/triggerTestAndLgtmCancel.test.ts— a new file only, reusingfakeGithub.tsandrunBundle.ts— with onedescribeper path:/test: no argument and?→ run table (current workflow filtered out byGITHUB_WORKFLOW);all→POST actions/runs/{1,2}/rerun+ rocket, in-progress runs untouched;LINT(name, case-insensitive) andci(file stem) → one re-run each;e2e(in progress only) → "No completed … matches" comment; 409 on every re-run → "already being re-run" comment, no rocket; 403 →grant \actions: write`comment, exit 1; non-member commenter →Cannot /test because …`, exit 1, no runs read; on a plain issue → "only applies to pull requests", zero reads./lgtm cancelby a reviewer →GET issues/1,DELETE issues/1/labels/lgtm, configuration reads,POST statuses/headsha{state: pending, context: prow/lgtm, description: 'lgtm cancelled by Codertocat'}, then tide's sweep skips the pr;/remove-lgtmby the author → same without any membership read; label absent → no DELETE, no status; non-reviewer non-author → refused, nothing removed.Disjoint from every open hold-gated PR: #236 edits one line of
bundle.test.ts, #238 addscollaborationCommands.test.ts(/cc /uncc /unassign /retitle /lock /reopen); none of #217, #219, #221, #223, #225, #227, #229, #230, #232, #234 touch__tests__/bundle/.Priority
/testis the only trigger command with no e2e case, and lgtm cancel is the path that voids a merge-gating bindingFiled 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