Skip to content

chore: gitignore reports/ and settle its contradictory contract - #80

Merged
topij merged 1 commit into
mainfrom
chore/ignore-reports
Jul 27, 2026
Merged

chore: gitignore reports/ and settle its contradictory contract#80
topij merged 1 commit into
mainfrom
chore/ignore-reports

Conversation

@topij

@topij topij commented Jul 27, 2026

Copy link
Copy Markdown
Owner

Settles the contradiction filed as #79.

Closes #79

The closing keyword above is deliberate and intended. Per the rule this repo
arrived at the hard way (and #71 exists to mechanise): never write a closing keyword
adjacent to an issue number you do not intend to close. Here the intent is real —
this PR is the whole fix for #79. closingIssuesReferences was checked after opening
and resolves to exactly [79], nothing else. No other issue number in this body
carries a keyword.

The problem

Two shipped skills gave opposite contracts for the same directory:

  • post-merge-systemize.md:286"commit only the doc/skill/config paths you changed — never reports/, state/, or data files"
  • triage-friction-log.md:442"The reports/triage_<today>.md report is kept (git-tracked alongside other reports, no automatic cleanup)"

And .gitignore matched neither — it ignored state/ but not reports/. So
post-merge-systemize's rule was unenforced: following it correctly left a permanently
untracked reports/ in every git status. Observed throughout the #78 triage sweep,
where the report was held out of the commit rather than silently introduce a reports/
convention into a repo that ships to adopters.

Resolution — toward ignored

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

Changes

file change
.gitignore add reports/, with the reasoning inline
init.sh add_ignore_line "reports/" so adopters get it too
.claude/commands/triage-friction-log.md amend the Step 6 contract, and the DM template's "also pushed in next branch" line at :184

Verification

  • ?? reports/ no longer appears in git status.
  • bash -n init.sh passes.
  • kit_doctor: 25 unchanged, 0 differ, 0 missing, 0 unknown — neither init.sh nor
    .claude/commands/*.md is manifest-tracked, and .gitignore is explicitly
    ADOPTER_OWNED, so no manifest regeneration was needed.
  • ruff check . passes.
  • Tests were not run locallypytest is not installed in this environment; CI
    installs it. This diff touches no Python (one shell script, one markdown file, one
    gitignore), so the suite is unaffected. Deferring to CI rather than claiming a pass.

Not done here

The report captures what the LLM proposed versus what was filed — on a run where the
operator skips or rewrites items, that delta is genuine provenance now living only in an
ignored file. #79 records the suggestion to surface proposed/filed/skipped counts in the
graduation marker instead, where it would actually be read. Left out of this PR as a
separate concern.

post-merge-systemize said never commit reports/; triage-friction-log said
git-track it. .gitignore matched neither -- it ignored state/ but not
reports/ -- so the first rule was unenforced and left a permanently
untracked reports/ in every git status. Observed during the #78 sweep.

Resolved toward ignored: the report is derived (after a sweep lands every
proposal is a tracker issue and every source entry is verbatim in the
archive), it grows one file per run with no doc_budgets tripwire, and
state/ is already ignored on identical logic.

- .gitignore: add reports/
- init.sh: add_ignore_line "reports/" so adopters get it too
- triage-friction-log.md: amend the Step 6 contract and the DM template's
  "also pushed in next branch" line to match post-merge-systemize
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@topij, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 50 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a983ca92-359f-47ec-98d7-149bcb5df8f4

📥 Commits

Reviewing files that changed from the base of the PR and between 8b1d6b2 and a10ab1b.

📒 Files selected for processing (3)
  • .claude/commands/triage-friction-log.md
  • .gitignore
  • init.sh
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/ignore-reports

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@topij

topij commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

Review gate: deliberately waived (second time this session)

CodeRabbit never reviewed this diff. Its check reports Review rate limited — and
reports it as pass. That is now the second live instance today of the false-green
surface dev-model.yaml warns about for #23; the first is on #78. Anyone reading the
check rollup on either PR would conclude it was reviewed. Neither was.

pr_watch behaved correctly on both, refusing to converge with
independent review evidence is missing for current head.

What was decided

The operator waived the independent-review requirement for this PR. The prior waiver on
#78 was scoped to a docs-only diff; this one adds four lines to init.sh, which is
executable shell every adopter runs, so it was raised again rather than extended
silently. The operator waived it with that difference stated.

No review receipt was recorded. A receipt would flip mergeable to true and permit
an autonomous merge of an unreviewed PR.

What CI actually covered

The green here is not merely "tests passed" — the jobs map onto exactly what this diff
touches:

  • Check shell syntax — covers the init.sh edit
  • init.sh must be executable — covers the mode bit
  • kit-manifest.json must be in sync — confirms no manifest regeneration was needed
    (neither init.sh nor .claude/commands/*.md is manifest-tracked, and .gitignore
    is explicitly ADOPTER_OWNED)
  • Run state and portability tests — the full pytest suite, which could not be run
    locally (pytest not installed in the authoring environment)
  • Lint Python (ruff) and Engines must work without PyYAML

Also verified by hand

@topij
topij merged commit 4e9cad9 into main Jul 27, 2026
3 checks passed
@topij
topij deleted the chore/ignore-reports branch July 27, 2026 07:31
@topij

topij commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

Correction: the "tests were not run locally" claim in this PR body is wrong

The PR body and the waiver comment above both state:

Tests were not run locallypytest is not installed in this environment; CI installs it.

That is false. The full suite runs locally and always could have:

$ make test
uv run --with pytest --with pyyaml python -m pytest scripts/lib/state_paths/tests scripts/tests -q
372 passed in 21.65s

How the wrong conclusion was reached

Two probes were tried — uv run pytest and python3 -m pytest — and both failed
(Failed to spawn: pytest, No module named pytest). Those failures were read as
"this environment cannot run the suite" and the verification was deferred to CI. The
Makefile was never opened. make test supplies its own dependencies via
uv run --with pytest --with pyyaml, so nothing needed installing.

The merged diff is unaffected — CI ran the same suites and passed, and the suite passes
locally now on the merged main. What was wrong was the claim about verification, not
the verification itself.

Why this is worth a correction rather than a shrug

This is the failure mode #54 exists for — a verification claim that names a command
which does not establish what the sentence says. The claim named pytest's absence as
evidence of an environment limit, when it was only evidence that two particular
invocations were wrong. A reader of this PR would reasonably conclude the repo has no
local test path. It has a 22-second one.

Two real defects this surfaced

  1. Nothing points at make test. No markdown file in the repo mentions it, and
    there is no root CLAUDE.md. The discoverable probes both fail with messages that
    read as "pytest is unavailable here" rather than "use make test".
  2. The Makefile comment describes a gate that does not exist. It says the test
    target "Runs the same suites the lane contract's local gate runs before every
    push."
    There is no such gate: scripts/hooks/pre-push deliberately does not run
    tests (its line 23 says checks are kept separate), and scripts/dev_session.sh does
    not either. Same family as Require every verification claim to name the command that establishes it #54 — a comment claiming more than the code does.

Both are being routed to the friction log for the next triage sweep.

topij added a commit that referenced this pull request Jul 27, 2026
Session shipped #78 (13 un-graduated entries -> 8 issues, friction log
190 -> 50 lines) and #80 (gitignore reports/, settling the contradiction
filed as #79).

Five friction entries, two at H. First: make test runs the full 372-test
suite in 22s and nothing in the repo points at it, which is how a false
"tests were not run locally" claim reached a merged PR body. Second: the
wrap-up branch pattern collides on a same-date session, and gh pr create
then opened #81 against the stale remote branch -- a diff that would have
reverted both of the day's merges. #81 closed unmerged; the stale branch
left intact because its commits are not ancestors of main.

Also the Makefile comment describing a pre-push test gate that does not
exist, the triage skill defaulting to a draft PR that CodeRabbit skips,
and two more instances of a rate-limited CodeRabbit reporting pass.

Archive sweep ran at --keep 4 (403 -> 319 lines, one block moved). The
default --keep 6 no-opped on 5 blocks -- a fourth occurrence of #74.

Independent review waived under the operator's existing docs-only scope;
no review receipt recorded.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant