Skip to content

chore(ai-slop): drop the one-release .claude/ai-slop.json team read #13471

Description

@kyle-sexton

Refs #9737

Outcome

/ai-slop:audit reads its team and personal layers only from <home>/ai-slop.yaml and <home>/ai-slop.local.yaml. The repo-relative .claude/ai-slop.json and .claude/ai-slop.local.json fallbacks are gone. They were deprecated in ai-slop 0.15.0 (plugins/ai-slop/CHANGELOG.md:120-131), and 0.16.9 has shipped since. The em-dash purge gate, which copies this repository's detector config and reads it through that fallback, moves to the YAML, so the CI gate's verdict does not change. The user-global $HOME/.claude/ai-slop.json layer stays (detect.sh:220, ADR 0075).

Change

  • plugins/ai-slop/skills/audit/scripts/detect.sh:233: drop the .claude/$_name.json fallback, and update the comment at :225-226. Keep USER_CFG (:220) and the jq path for the JSON user layer.
  • scripts/check-purged-em-dashes.sh:
    • Today it defaults to .claude/ai-slop.json (:115), exits 2 when that file is unreadable (:137), and writes its throwaway layer to $TMP/root/.claude/ai-slop.json (:337), which detect.sh will no longer read.
    • Make it read docs/conventions/ai-slop.yaml and write its throwaway layer as $TMP/root/docs/conventions/ai-slop.yaml. Override the same keys: replace disabled_rules with every slug except rule-em-dash, strip em_dash_allowed_paths and rule_allowed_paths["rule-em-dash"], and keep excluded_paths and thresholds. jq cannot read YAML, so state the mechanism. One option keeps the copy-not-synthesize property: copy the tracked YAML unchanged to $TMP/root/docs/conventions/ai-slop.yaml and write the overrides as $TMP/root/docs/conventions/ai-slop.local.yaml, after confirming in lib/cascade-read.sh that a later layer's empty list or slug entry replaces an earlier one and that yaml-subset accepts []. Keep the jq prerequisite (:133-136), or change scripts/check-script-contract.test.sh:109 to match.
    • Update its header comment (:45), scripts/check-purged-em-dashes.test.sh:62,77,128-130,345,365,375,386 and scripts/em-dash-purged-paths.txt:46,54.
  • Fixtures that configure a temp repo through .claude/ai-slop.json (detect.test.sh, cross-check.test.sh) move to docs/conventions/ai-slop.yaml. A fixture may keep writing the old file only to assert that the file is not read. A case that tests the JSON parser itself (for example detect.test.sh:583, a truncated JSON) moves to the user-global $HOME/.claude/ai-slop.json layer, which jq still reads.
  • Docs that describe the fallback:
    • plugins/ai-slop/schemas/ai-slop.schema.json:5 description.
    • plugins/ai-slop/README.md:62-64.
    • The fallback clause at plugins/ai-slop/skills/setup/SKILL.md:28-29. Keep setup's offer to carry an old JSON file into the YAML: the 2026-11-02 decision on chore: drop the one-release .claude config reads and this repository's old config files #9737 keeps setup lines that report or move a retired file. Setup's eval cases do not change.
    • docs/contracts/config-cascade/README.md:658,781.
    • The docs/conventions/ai-slop.yaml:2-5 header: drop the sentence that names the legacy .claude/ai-slop.json and the 'made in both files' sentence.
  • Leave .claude/ai-slop.json in place. The lane mounts .claude/ read-only. After this merges, the host slice deletes it.
  • Add an ai-slop changelog fragment.

Done when

  • git grep -nP '(?<!~/)(?<!HOME/)(?<!\}/)\.claude/(ai-slop(\.local)?\.json|\$_name\.json)' -- plugins/ai-slop scripts docs/conventions/ai-slop.yaml docs/contracts ':!*CHANGELOG*' ':!*.test.sh' prints nothing (on origin/main it prints 11 lines in 6 files).
  • git grep -n 'beside them is absent' -- plugins/ai-slop ':!*CHANGELOG*' prints nothing.
  • git grep -n 'USER_CFG="${HOME:-/nonexistent}/.claude/ai-slop.json"' -- plugins/ai-slop/skills/audit/scripts/detect.sh prints one line (the user layer stays).
  • git diff --name-only origin/main...HEAD -- .claude plugins/ai-slop/skills/setup/evals plugins/ai-slop/evals prints nothing.
  • grep -n '^## \[0.16.0\]' plugins/ai-slop/CHANGELOG.md prints one line (a release after the 0.15.0 YAML reader).
  • bash scripts/run-test-file.sh plugins/ai-slop/skills/audit/scripts/detect.test.sh exits 0.
  • bash scripts/run-test-file.sh plugins/ai-slop/skills/audit/scripts/cross-check.test.sh exits 0.
  • bash scripts/run-test-file.sh scripts/check-purged-em-dashes.test.sh exits 0.
  • bash scripts/run-test-file.sh scripts/check-script-contract.test.sh exits 0.
  • bash scripts/check-purged-em-dashes.sh exits 0.
  • scripts/check-changelog-fragments.sh --check-required origin/main exits 0.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  2. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor

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

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

    Understood: remove the deprecated repo-relative .claude/ai-slop.json and .claude/ai-slop.local.json fallbacks from /ai-slop:audit. The user-global JSON layer stays. The em-dash purge gate moves to the YAML layers, and the affected tests, fixtures, docs and changelog fragment are updated. The issue gives exact done-when checks and names no open design choices. It is a child of #9737, which is the parent tracker, not a duplicate. I found no other open issue asking for the same change. Siblings #13472 to #13475 cover other plugins' files.

    Automated triage, applied by the lanes App.

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 5, 2026
  4. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.
    on Nov 5, 2026
  5. added
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    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 5, 2026
  6. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor
    No description provided.
  7. github-actions commented on Nov 5, 2026

    @github-actions
    Contributor
    No description provided.
  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 5, 2026
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.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Type

    Fields

    Work status

    agent-ready

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions