[quality] Pin the ten behavioural Stryker survivors in sweep's delayed-reviewer guards, meow's image validation, the tilde-fence opener and /approve cancel
Los mantenedores suelen responder en 2 días
@hivecommons-hive ya está trabajando en esto.
Desde el 26/10/2026.
- #593 de @hivecommons-hive — abierto
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 25/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Estancado
- Stack tecnológico
- github-actions, typescript
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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 laterlabeledevent (and an event withoutcreated_at) is still timed from itsready_for_review; a draft is skipped before any timeline read; a due pull request by anignore_authorslogin 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 canceldismisses 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 (
/meowrenders a third-party url into a comment; delayed blunderbuss and/approve cancelare 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
- Lenguaje dominante
- TypeScript
- Estrellas
- 132
- Forks
- 24
- Merge medio
- 1 d 16 h
- PR fusionados (30 d)
- 209
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de cncf/prow-github-actions
-
[quality] Unit suite's call-through @actions/core emits workflow commands: green build-test runs carry 10 failure + 10 warning fixture annotationsPosiblemente ocupada @hivecommons-hive la tomó hace 1 día. Abiertoagent/quality needs-kind stage/040-covered-by-pr testing
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
cncf/prow-github-actions#604 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[quality] src/server (GitHub App server) is never executed: entry point at 0 % lines, default background arm unpinned, dist-server bundle never built-and-run by any testPosiblemente ocupada @hivecommons-hive la tomó hoy. Abiertoagent/quality needs-kind stage/040-covered-by-pr testing
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
cncf/prow-github-actions#610 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[quality] CI's Node version follows the open engines range >=24, not the node24 runtime action.yml declaresPosiblemente ocupada @hivecommons-hive la tomó hace 1 día. Abiertoagent/quality needs-kind stage/040-covered-by-pr testing
Dificultad 2/5 1-3 horas Aptitud para principiantes 28/100
cncf/prow-github-actions#602 · 2 comentarios ·
Los mantenedores suelen responder en 2 días
-
[quality] Nothing verifies the unit test each v8-ignore hint in src/ says drives its arm; add a static guard over the 25 hintsPosiblemente ocupada @hivecommons-hive la tomó hace 1 día. Abiertoagent/quality needs-kind stage/040-covered-by-pr testing
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
cncf/prow-github-actions#600 · 2 comentarios ·
Los mantenedores suelen responder en 2 días
-
[quality] Gate proposal: scheduled Stryker run over the whole src/ tree (five advisory shards)Abiertoagent/quality needs-kind stage/045-needs-decision testing
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
cncf/prow-github-actions#594 · 3 comentarios ·
Los mantenedores suelen responder en 2 días
Todos los issues de cncf/prow-github-actions
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Graphify-Labs/graphify#4860 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
sveltejs/eslint-plugin-svelte#1615 ·
Los mantenedores suelen responder en 7 días
-
Parallel reticle_verify opens per-flow leases without the source lease's ignoreHTTPSErrorsPosiblemente ocupada @as992949791 la tomó hoy. Abiertogood first issue help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
reticlehq/reticle#2033 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día