Skip to content

[quality] owners.ts: 13 behavioural mutants survive the suite, incl. a shared group cache key that gives every team the first team's members #574

Closed

Description

@hivecommons-hive

Finding

Running the bounded Stryker harness proposed in #572 against src/utils/owners.ts (npx stryker run --mutate src/utils/owners.ts --force, Stryker 10.0.0, Vitest 5.0.4, main @ e3119ad) gives 332 mutants: 304 killed, 13 timed out, 15 survived (95.48%). Unit coverage of the file is 100/100/100/100 (npm run test:coverage @ e3119ad), so these are assertion gaps, not coverage gaps; the bundle suite runs the committed dist/index.js and cannot see a mutation of src/.

Thirteen of the survivors are behavioural (each applied by hand at its reported span and re-run to confirm):

Site Mutant What goes unpinned
owners.ts:151 memoized(groupCache, \${owner}/${slug}`, …)` key → '' Every team shares one cache entry: the second @org/team in an OWNERS set resolves to the first team's members. No test expands two distinct teams in one run.
owners.ts:99 parseGroup regex leading ^ removed alice@org/team is read as a group of org and a team is fetched for it
owners.ts:52 options !== null → true a bare options: key (YAML null) throws TypeError instead of meaning "no options"
owners.ts:278 file.content === undefined → false a blob with an encoding but no content fails with a Buffer TypeError, not "invalid OWNERS file returned from GitHub API for …" (only encoding-less blobs are tested)
owners.ts:468 repository?.default_branch ?. → . a payload with no repository at all throws instead of asking repos.get (every test payload carries a repository object)
owners.ts:482 isNotFound (6 mutants) guards → true / &&→|| a string or null rejection from git.getTree is never exercised; several arms would throw TypeError: Cannot use 'in' operator instead of the listing error
owners.ts:447 entry.path !== undefined → true a tree entry without a path throws inside probeBranchOwners (the same guard in loadOwnersTree is pinned)
owners.ts:398 hasOwnersCache key ${owner}/${repo} → '' repoHasOwners answers a second repository from the first
owners.ts:139 other-organization warning text → '' the only user-facing hint that a group was ignored

Not counted: owners.ts:161 (warning text, asserted exactly by held #564) and owners.ts:317 (core.debug text, equivalent by the review standard #572 documents).

Recommendation

Pin each contract in one new unit file, __tests__/utils/ownersGuards.test.ts, with direct expandGroups/parseOwners/loadOwnersTree/repoHasOwners/branchHasOwners calls (no src/ change). Re-running the harness with that file: 15 → 2 survivors (98.49%), both the exclusions above.

  • __tests__/utils/ownersGuards.test.ts pins the 13 behavioural mutants listed above

Priority

  • Impact: medium (the group-cache key is a real bug class for repositories that list two teams; the rest are guard contracts)
  • Effort: low

Refs #554 ("Strengthen assertions and the test harness" — a consumer of the mutation harness, not a tracker box of its own).


Filed by quality agent (hold-gated mode)


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

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

Activity

  1. added
    testingCreated by Hive for agent-filed issue provenance
    agent/qualityCreated by Hive for agent-filed issue provenance
    on Oct 24, 2026
  2. github-actions commented on Oct 24, 2026

    @github-actions
    Contributor

    Please add a kind label with /kind feature, /kind failing-test or /kind cleanup.

  3. added a commit that references this issue on Oct 26, 2026
    8f1ae13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent/qualityCreated by Hive for agent-filed issue provenanceneeds-kindtestingCreated by Hive for agent-filed issue provenance

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions