Skip to content

refactor(code-metrics,mutation-testing): read team settings only from docs/conventions/<concern>.yaml #12290

Description

@kyle-sexton

Parent

Refs #5906

Outcome

Neither plugin reads a team setting from a .claude/ file:

  • code-metrics reads its team layer only from docs/conventions/code-metrics.yaml. Its read of the older
    .claude/code-metrics.yaml (plugins/code-metrics/scripts/resolve-config.py:11-12,250-251) has shipped for more than
    one release (0.6.0, 2026-10-13, plugins/code-metrics/CHANGELOG.md:89,102), so it is dropped, and this repository's copy,
    identical to docs/conventions/code-metrics.yaml, is deleted.
  • mutation-testing reads its team layer from docs/conventions/mutation-testing.yaml, validated by a new
    plugins/mutation-testing/schemas/mutation-testing.schema.json, with .claude/mutation-testing.md read only while
    the YAML is absent, for one release. Today .claude/mutation-testing.md is its only team layer
    (plugins/mutation-testing/skills/setup/SKILL.md:26-28), a fenced YAML block in Markdown.

Decisions

Key interfaces

  • code-metrics: scripts/resolve-config.py and scripts/test_resolve_config.py:463-520, scripts/dispatch.sh:30-31
    and scripts/dispatch.test.sh (its .claude/code-metrics.yaml config cases, for example lines 578 and 687),
    skills/setup/scripts/setup-check.sh:108-111 and setup-check.test.sh:82-85, skills/setup/SKILL.md:14-17,44,
    README.md:77-79, reference/config.md:20-21.
  • mutation-testing: skills/setup/SKILL.md (the config merge model, lines 26-28 and 236),
    skills/setup/templates/config-template.md, skills/audit/SKILL.md:191 and skills/audit/context/config-fallback.md,
    which resolve the config through that merge model, README.md:57, and the eval fixture
    skills/audit/evals/fixtures/exercised-scope/.claude/mutation-testing.md with skills/audit/evals/evals.json.
  • testing: the cleanup eval fixtures plugins/testing/skills/cleanup/evals/fixtures/cleanup/.claude/mutation-testing.md,
    fixtures/mutation-testing-bash.md, fixtures/mutation-testing-dotnet.md and the prompts in
    plugins/testing/skills/cleanup/evals/evals.json that copy them to .claude/mutation-testing.md.
  • Docs: docs/contracts/config-cascade/README.md:650,787, docs/contracts/shell-test-helpers/README.md:122,
    plugins/review/skills/quality-gate/evals/evals.json:238.

Done when

  • scripts/run-test-file.sh plugins/code-metrics/scripts/test_resolve_config.py exits 0 with a case where only .claude/code-metrics.yaml exists and the team layer resolves as absent.
  • scripts/run-test-file.sh plugins/code-metrics/scripts/dispatch.test.sh exits 0.
  • scripts/run-test-file.sh plugins/code-metrics/skills/setup/scripts/setup-check.test.sh exits 0.
  • scripts/run-test-file.sh plugins/code-metrics/skills/setup/scripts/test_setup_apply.py exits 0.
  • git ls-tree --name-only HEAD .claude/ does not list code-metrics.yaml.
  • plugins/mutation-testing/schemas/mutation-testing.schema.json defines every key of the setup template, and scripts/check-convention-yaml.sh --check exits 0.
  • git grep -n "docs/conventions/mutation-testing.yaml" -- plugins/mutation-testing/skills/setup/SKILL.md prints the config merge model's team-layer line.
  • git grep -nE "\.claude/code-metrics\.yaml" -- plugins docs/contracts ":!*CHANGELOG.md" prints only user-global-layer lines (a ~/, $HOME_DIR or fake-home $home path), setup lines that report or move the retired file, and plugins/source-control/skills/babysit-prs/scripts/tests/test_babysit_risk.py:2554.
  • git grep -nE "\.claude/mutation-testing\.md" -- plugins docs/contracts ":!*CHANGELOG.md" prints only lines that name it as the older team file read while docs/conventions/mutation-testing.yaml is absent, setup lines that move it, and lines that name ~/.claude/mutation-testing.md as never read.
  • The PR body lists each migrated setting with its new docs/conventions/<concern>.yaml home and schema.
  • scripts/check-changelog-fragments.sh --check-required origin/main exits 0.

Out of scope

  • The post-merge mutation lane's reader, its test, prompt and workflow comment, this repository's
    docs/conventions/mutation-testing.yaml, and deleting .claude/mutation-testing.md (chore(ci): read the post-merge mutation lane's config from docs/conventions/mutation-testing.yaml #12289).
  • The arid-node record .claude/mutation-testing-arid.md, a finding-suppression record, not a setting
    (docs/contracts/config-cascade/README.md:787).
  • The .claude/<concern>.local.* personal overlays (ADR 0075 fix 8), which the post-merge lane writes
    (.github/workflows/post-merge-test-mutation.yml:188).
  • The user-global ~/.claude/code-metrics.yaml layer (ADR 0075 fix 9).

Posted by the issue-triage session. This was generated by AI.

Activity

  1. added theissue type on Nov 2, 2026
  2. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 2, 2026
  3. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Medium
    Complexity: Medium
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Understood: move code-metrics and mutation-testing team settings to docs/conventions/<concern>.yaml. That means dropping code-metrics' read of the old .claude/code-metrics.yaml, and adding a mutation-testing schema with a one-release fallback read of .claude/mutation-testing.md. The outcome and done-when checks are exact, and the issue leaves no design choice open.

    A previous pull request (#12306) merged with Refs:, so some of this may already be done. A maintainer should check what is left against the done-when list. No decision comment has been recorded. I found no likely duplicates.

    Automated triage, applied by the lanes App.

  4. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Nov 2, 2026
  5. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor
    No description provided.
  6. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor
    No description provided.
  7. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    The lanes App's pull request #12306 merged with Refs:, so this issue stays open and nothing starts the lane on it again. work-unblock removed status: ready and agent-ready, so the hourly triage sweep sends it back to intake triage. Admission then parks it at status: confirmed for a check of what that pull request left, until a **Decision recorded.** comment says what is left or someone closes it.

  8. removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 2, 2026
  9. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  10. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 2, 2026
  11. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: merged pull request #12306 names it with Refs: after its newest decision or refinement comment, so its work may already be done: close the issue if it is, or post a comment whose first line is **Decision recorded.** saying what is left, which sends it back through intake. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  12. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

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

    priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    confirmed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions