Skip to content

reports/ has two contradictory contracts: post-merge-systemize says never commit it, triage-friction-log says git-track it #79

Description

@topij

Two shipped skills give opposite contracts for the same directory, and .gitignore matches neither.

The contradiction

.claude/commands/post-merge-systemize.md:286 — commit only the paths you edited:

commit only the doc/skill/config paths you changed — never reports/, state/, or data files

.claude/commands/triage-friction-log.md:442:

Delete the state file. The reports/triage_<today>.md report is kept (git-tracked alongside other reports, no automatic cleanup).

triage-friction-log.md:184 reinforces the second reading, telling the operator the report is "also pushed in next branch".

Why it bites

.gitignore ignores state/ but not reports/. So post-merge-systemize's rule is unenforced: an operator who follows it correctly is left with a permanently untracked reports/ in every git status, forever. Observed during the 2026-07-27 triage sweep (PR #78) — ?? reports/ showed up in every status check of the session, and the report was deliberately held out of the commit rather than silently introduce a reports/ convention into a repo that ships to adopters.

Which way it should resolve

Toward ignored, for four reasons beyond the inconsistency:

  1. Derived. After a triage sweep lands, every proposal is an issue body and every source entry is verbatim in the friction-log archive. Nothing in the report is unrecoverable.
  2. Unbounded with no budget. One file per run plus "no automatic cleanup". Every other narrative file in the kit has a doc_budgets tripwire; a tracked reports/ would be the sole exception — the kit violating Principle docs: step-by-step parallel-sessions how-to #1 by design.
  3. state/ is already ignored on identical logic, including init.sh:731 appending it to adopters. The report is scratch from the same pipeline run.
  4. This repo ships to adopters. A tracked reports/ becomes inherited structure nobody asked for — the same kit-owned/adopter-owned boundary problem as The cp -r quickstart can't distinguish kit-owned from adopter-owned files #18.

The honest counter-argument, recorded so it is not lost: the report is the only artifact showing what the LLM proposed versus what was filed. On a run where the operator skips or rewrites items, that delta is genuine provenance. But a git-tracked draft is a weak place to hold it — nobody reads old drafts. The better home is the graduation marker, which already summarizes outcomes and does get read.

Proposed change

  • add reports/ to .gitignore, and to init.sh's add_ignore_line block so adopters get it too;
  • amend triage-friction-log.md:442 (and the "also pushed in next branch" line at :184) to match post-merge-systemize;
  • consider recording proposed-vs-filed counts in the graduation marker, where the provenance would actually be read.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions