Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[quality] Pin the ten behavioural Stryker survivors in sweep's delayed-reviewer guards, meow's image validation, the tilde-fence opener and /approve cancel

Aperta
#592 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 2 giorni

@hivecommons-hive ci sta già lavorando.

Dal 26/10/2026.

  • #593 di @hivecommons-hive — aperta

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
25/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
github-actions, typescript
Ambito
backend, testing

Direzione di ricerca

Read the four proposed files under tests: sweepDelayGuards.test.ts, meowImageEdges.test.ts, commandTildeFence.test.ts, and approveCancelAuthor.test.ts, then inspect the named source paths in src/ to match the existing test fixtures. Run the targeted Vitest cases and confirm each catches its listed surviving mutation. The issue links open pull request #593, so check its status and existing coverage before taking this work on.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

agent/quality needs-kind stage/040-covered-by-pr testing

Finding

A Stryker probe (the repository's stryker.config.mjs harness) over the fifteen modules no earlier probe had run through Stryker in full — src/pullReq/handlePullReq.ts, src/pullReq/handleCheckSuite.ts, src/pullReq/handlePullReqReview.ts, src/pullReq/onPrLgtm.ts, src/issues/handleIssues.ts, src/issueComment/handleIssueComment.ts, src/issueComment/meow.ts, src/issueComment/approve.ts, src/cronJobs/handleCronJob.ts, src/cronJobs/labelSync.ts, src/cronJobs/lgtm.ts, src/cronJobs/sweep.ts, src/utils/command.ts, src/utils/pulls.ts, src/run.ts — at main @ 9acb046 produced 1189 mutants: 1015 killed, 61 timed out, 113 survived (score 90.50%, 61m41s at concurrency 12).

Line coverage cannot see any of them. Both suites were run locally against the same revision: npm run test:coverage (195 files, 2483 tests) reports 100% statements / 99.76% branches / 100% lines, and npm run test:coverage:e2e (90 files, 542 tests) reports 100% statements / 99.82% branches / 100% lines; none of the four files below has a zero-hit line in either run.

Reading the 113 and applying each candidate by hand at its exact span, ten change an observable effect. The rest are debug/info strings, getInput(..., { required: true }) folds, ?. chains on fields a real event always carries, or equivalents (notes at the end).

mutant what the surviving mutant changes why no test notices
sweep.ts:247 event.event === 'ready_for_review' && event.created_at !== undefined → true (also the && → ||, each operand → true, and dropping the .filter at :246) lastReadyForReview takes the latest of every timeline event, so a label or comment after the due window pushes a former draft out of it and it never gets reviewers every timeline fixture contains only ready_for_review events
sweep.ts:204 settings.ignore_drafts && pr.draft === true → false a draft is timed through a timeline read (and a reviews read) before blunderbuss's own draft guard finally skips it the one delayed-draft case asserts only that nothing was requested
sweep.ts:235 { explicit: false, … } → { explicit: true, … } the delayed path bypasses blunderbuss.ignore_authors ignore_authors is only tested on the fresh path
meow.ts:154 image.hostname === 's3.us-west-2.amazonaws.com' → true any host serving a path under /cdn2.thecatapi.com/ is rendered as an image — the allow-list the comment above it promises the "unexpected host" cases use foreign hosts with foreign paths
meow.ts:136 / :137 image.username !== '' / image.password !== '' → false a url with only a username, or only a password, is rendered the credentials case carries both
meow.ts:123 url.length > 4096 → >= 4096 a 4096-character url is refused the long-url case uses 5000
command.ts:133 char === ''→true` a ~~~ fence whose info string contains a backtick does not open a code block, so a command inside it runs only the backtick-fence form of that rule is tested
approve.ts:167 e.user?.login === 'github-actions[bot]' → true /approve cancel dismisses the last APPROVED review of anyone listed after the bot's the reviews fixture holds only the bot's review

Recommendation

Four new unit test files, no existing test or src/ file edited; each case fails under its mutant and passes on main:

  • __tests__/cronJobTest/sweepDelayGuards.test.ts — a former draft with a later labeled event (and an event without created_at) is still timed from its ready_for_review; a draft is skipped before any timeline read; a due pull request by an ignore_authors login gets nothing while its sibling does
  • __tests__/issueCommentTest/meowImageEdges.test.ts — https://evil.example/cdn2.thecatapi.com/… degrades to the note; username-only and password-only urls degrade; a url of exactly 4096 characters renders and 4097 does not
  • __tests__/utils/commandTildeFence.test.ts — ~~~ \code` ~~~` opens a fence (``` with a backtick still does not)
  • __tests__/issueCommentTest/approveCancelAuthor.test.ts — with a human APPROVED review after the bot's, /approve cancel dismisses review 80 and never touches 81

Per #554 ("A repository-wide mutation gate is not required") these are pinned individually. Reproduce with npm run test:mutation -- --mutate "src/cronJobs/sweep.ts,src/issueComment/meow.ts,src/utils/command.ts,src/issueComment/approve.ts"; note that __tests__/workflows.test.ts and __tests__/commands.test.ts read src/ as text and fail Stryker's dry run when meow.ts or handleIssueComment.ts is instrumented, so a probe of those two files needs a vitest config that excludes them.

Reviewed and left alone: meow.ts:12 regex and :56 typeof body (the dispatcher has already matched /meow and normalised a null body before meow() runs); meow.ts:69 attempt > 1 (only a delay, 0 in tests); command.ts:102/:109 (inIndentedCode is shadowed by afterBlockBoundary); sweep.ts:220 and :249 (an Invalid Date compares false either way); labelSync.ts:117/:118 (an undefined spread is dropped by the serializer); the \s+ → \s splits in handleCronJob.ts and handlePullReq.ts (empty tokens are filtered).

Priority

  • Impact: medium (/meow renders a third-party url into a comment; delayed blunderbuss and /approve cancel are user-visible; none is a merge decision)
  • Effort: low

Filed by quality agent (hold-gated mode)


🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5q9t | SHA: f6446bb

— hive: agent=quality backend=copilot model=claude-fable-5.1 copilot=1.0.88

Lingua principale
TypeScript
Stelle
132
Fork
24
Merge medio
1g 18h
PR unite (30g)
211

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di cncf/prow-github-actions

Tutte le issue di cncf/prow-github-actions

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.