mutation-model: indirect-ownership self-test pins a test that stopped reaching scroll-edge-state

Open Beginner friendly
#2,547 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
88/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
testing

Research direction

Start in scripts/mutation/ownership.test.ts, especially the indirect-ownership assertion around lines 40-44 and its sibling failure message at lines 37-38. Run pnpm mutation:test, inspect the verified scroll-runtime test candidates and ownershipDeriver().ownersOf, then run pnpm check:affected --run. Done means the indirect reachability check remains meaningful, reports a useful stale-pair message, and both commands pass.

Written by the indexing model from the issue text.

Description

bug needs-triage

Purpose

mutation-model — the mutation harness self-test inside pnpm check:affected — fails on a clean origin/main checkout, so any contributor whose diff selects that check sees a red local gate for a reason unrelated to their work. It hit #2533 and #2521 during wave 1 of #2531.

Reproduce

pnpm install --frozen-lockfile
pnpm mutation:test
# or, as check:affected selects it:
pnpm check:affected --run   # → check:affected: mutation-model failed.
ℹ pass 39
ℹ fail 1
✖ a kernel is owned by tests that reach it indirectly
  AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
  at scripts/mutation/ownership.test.ts:40:10

The other 39 assertions in that file pass, including ownership is complete: every test reaching a kernel owns it.

Root cause

scripts/mutation/ownership.test.ts:40-44 pins src/commands/interaction/runtime/gestures.test.ts as an indirect owner of the scroll-edge-state kernel. That kernel is packages/capture-kit/src/snapshot/scroll-edge-state.ts plus packages/capture-kit/src/snapshot/scroll-edge-state/selection.ts.

gestures.test.ts no longer imports anything on the scroll path: its resolved import graph is 257 modules and contains neither kernel source, so ownersOf returns kernel-errors, interaction-settle, selectors, target-annotation-serde, snapshot-occlusion and no scroll-edge-state. Scroll moved out of the interaction command family — src/daemon/scroll-runtime.ts was added by bcca714a07 ("refactor: move gesture family to platform runtime", #1952) and the snapshot zone relocation landed in 1f9d940bff (#2385) — and the ownership assertion was never moved with it.

The kernel itself is not uncovered: it has 82 owning test files, including the mirrored packages/capture-kit/src/snapshot/__tests__/scroll-edge-state-*.test.ts set, and the ownership is complete: every test reaching a kernel owns it test passes. Only this hand-pinned pair is stale.

Required behavior

  • The indirect-reachability assertion keeps its purpose — proving the deriver credits a test that exercises a kernel without importing it by name — while naming a pair that is true today.
  • Verified live replacement pair: src/daemon/__tests__/scroll-runtime.test.ts. It never contains the string scroll-edge-state, reaches both kernel sources through src/daemon/scroll-runtime.ts, and ownershipDeriver(...).ownersOf includes scroll-edge-state. src/daemon/scroll-until.test.ts is a second verified candidate.
  • Give the assertion a failure message in the style of its sibling at :37-38, so the next relocation reports which pair went stale instead of printing a bare falsy expression.

Observable completion conditions

  • pnpm mutation:test passes on a clean tree with no other assertion weakened.
  • pnpm check:affected --run reports no mutation-model failure on a docs- or config-only diff.
  • The replacement assertion still fails when the deriver stops crediting indirect reach, i.e. it is not converted into a direct-import assertion.

Dependencies and blast radius

  • No CI job runs mutation:test or check:affected: mutation-affected.yml triggers on scripts/mutation/**, scripts/lib/**, stryker.config.json, or its own workflow file, and mutation-weekly.yml is a Sunday schedule plus workflow_dispatch. This issue therefore gates local contribution, not PRs, and no PR label or re-run depends on it.
  • Contained in scripts/mutation/**; no runtime or kernel source changes are implied.
Dominant language
TypeScript
Stars
4.7k
Forks
304
Avg merge
12h 42m
Merged PRs (30d)
463

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from callstack/agent-device

All issues in callstack/agent-device

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.