Skip to content
This repository was archived by the owner on Sep 17, 2026. It is now read-only.

Open every PR with which checks are safe to merge without - #22

Merged
Peeja merged 1 commit into
mainfrom
claude/ignorable-checks
Sep 17, 2026
Merged

Peeja merged 1 commit into
mainfrom
claude/ignorable-checks

Conversation

@Peeja

@Peeja Peeja commented Sep 17, 2026

Copy link
Copy Markdown

⏭️ Safe to merge without waiting for CI — all of it

Refreshed on every push. Checks are not required yet, so this is advice, not a gate.

One file changed: AGENTS.md. Nothing in the repository reads it.

$ git diff --name-only origin/main HEAD
AGENTS.md
$ grep -rn "AGENTS.md" --include='*.yml' --include='*.sh' --include='*.go' --include=Makefile .
(no output)

No workflow, guard script, Go package or Makefile target mentions it. ci, images, e2e and itest will all pass, and none of them could have done otherwise.

What this costs if it's wrong: the checks still run; we just don't wait. If an ignored check goes red after merge, main is red. That is the trade, and it is why the reasoning is re-derived per push rather than encoded as a paths: list that goes stale.


Your idea, written down so it survives this session. One file, based on main, stacked on nothing.

The problem it addresses

Nothing is path-filtered, on purpose, and itest alone is ~23 minutes. So a Markdown-only pull request — which most of the recent ones have been — costs a full run before anyone can merge it. #8 changed one Markdown file and still cost itest 26m27s.

Why manual beats the automatic version, for now

MONOREPO_TODO.md records the two faults real path filtering has here, and a per-PR block has neither:

paths: filter a block written per push
goes stale when a module gains a dependency yes, silently cannot — it is rewritten each time
a filtered job reports skipped, never satisfying a required check yes n/a, nothing is skipped

And it can say things no path pattern can express. The block on #21 right now says "itest already passed on f4c5c21f and git diff f4c5c21f HEAD -- .github/ is empty" — that is not a path, it is a fact about two shas.

The part that matters: derive, don't assert

The section names how, per change shape — Markdown only, one workflow's own YAML, Go code (go list -deps), already-green-at-an-earlier-head — because the closure here is not obvious, which is the entire reason CI is unfiltered. ingot → indexing-service and delegator → forgectl were both invisible in go.mod and only appeared under go list -deps (rule 3). A hand-waved "this can't affect anything" is how that gets missed.

It also requires the block to state what it costs when wrong. The checks still run; skipping the wait means an ignored check that goes red leaves main red. The reviewer is the one taking that trade and should be able to see it.

The blocks are kept, not discarded

When real filtering is designed, they are the worked examples of what it has to be able to express — and the ones that turned out wrong are worth more than the ones that didn't. That is the cheapest way to get evidence for a design nobody can currently specify.

Listed in the scaffolding section among the things a finished monorepo should drop, since it is explicitly an interim.

Worth your eye

This is a process proposal, like #20 — it changes how pull requests are written, not what the code does. Two things I'd look at: whether "derive, don't assert" is stated strongly enough to actually bind, and whether the four change-shapes cover the cases you expect (a Dockerfile-only change and a go.mod bump are both absent, deliberately — I did not want to guess at shapes I have not had to reason about yet).

🤖 Generated with Claude Code

https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt


Generated by Claude Code

Nothing is path-filtered, on purpose, and itest alone is ~23 minutes, so a
Markdown-only pull request costs a full run before anyone can merge it. Until
real filtering is designed, each PR body opens with a block naming the checks a
reviewer can skip and why, refreshed on every push.

It is manual on purpose, and it avoids both faults the automatic version has: a
paths: list goes stale silently when a module gains a dependency, and a
path-filtered job reports *skipped*, which never satisfies a required status
check. A sentence written per push cannot go stale, and it can say things no
filter can express -- "this already passed on <sha> and nothing under .github/
has changed since" is not a path pattern.

The section says to derive the claim rather than assert it, and names how per
change shape, because the closure here is not obvious: ingot -> indexing-service
and delegator -> forgectl were both invisible in go.mod and only appeared under
go list -deps. It also requires the block to state what it costs when wrong --
the checks still run, so an ignored check that goes red leaves main red, and the
reviewer is the one taking that trade.

The blocks are kept rather than discarded: when real filtering is designed they
are the worked examples of what it has to express, and the ones that turned out
wrong are worth more than the ones that did not. Listed in the scaffolding
section among the things a finished monorepo should drop.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt
Peeja pushed a commit that referenced this pull request Sep 17, 2026
Petra's idea: since nothing is required yet, say per PR which checks a reviewer
can merge without waiting for, with reasoning a paths: filter could not express.
It is the interim for the path-filtering question and avoids both of that
question's faults -- a list that goes stale silently, and skipped jobs that
never satisfy a required check.

Two conditions make it real rather than comfortable: derive the claim (the
closure is not obvious, which is why CI is unfiltered at all), and state what it
costs when wrong (the checks still run, so an ignored red leaves main red). The
blocks are kept as the worked examples that design the real filtering later.

#22 puts it in AGENTS.md. Also: #19 is green, #21 is at e020534.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt
@Peeja
Peeja merged commit e837c0c into main Sep 17, 2026
22 checks passed
@Peeja
Peeja deleted the claude/ignorable-checks branch September 17, 2026 16:20
Peeja pushed a commit that referenced this pull request Sep 17, 2026
The page said "itest ingot is sharded" as of the last commit, which stopped
being true at 16:21Z. Fixed everywhere: the open-PR tables are #19 and #22, the
second outstanding check-name change is off the table, and the debt entry now
leads with ~30 minutes unsharded as a measured choice rather than an unexamined
one.

The measurement is kept in full, because every remaining option is judged
against it and because reviving the branch is a reopen rather than a rebuild --
claude/shard-itest survives at e020534, and the branch list now says
explicitly not to delete it.

Flagged: the two levers that need no sharding -- the missing buildx layer cache
in itest/e2e, and the self-imposed 3s lockWaitTime in our versitygw fork -- were
born on the closed branch and exist nowhere on main. They are the live work now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt
Peeja pushed a commit that referenced this pull request Sep 17, 2026
TestUploadAndRetrieve/filesystem has failed 2 of 40 e2e runs, and both are the
same shape: compose up reports a dependency unhealthy, a different container
each time (upload-1 on run 160, plc-1 on run 182), always the filesystem
permutation and never s3. plc-1's log says connect ECONNREFUSED to its postgres,
one restart, then the healthcheck deadline. That is a startup race, not a broken
image.

Run 160 is on main at ff2f794, two and a half hours before any of today's
branches existed, which is what rules #25 out -- it changes how images are built,
so the red looked exactly like a regression until the main failure was found.
The two permutations are t.Parallel(), so ~40 containers start on one runner at
once; both observed failures being filesystem is suggestive of something
systematic, but two data points is not proof.

One re-run queued on #25, the single re-run allowed for establishing that a
failure is not the PR's. The honest fix is compose healthcheck ordering, not a
retry.

Also: main is 144b316 -- Petra merged #22, #23 and #24 while this was running.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt
Peeja pushed a commit that referenced this pull request Sep 17, 2026
Petra merged #20, #17, #22, #19, #23 and #24; main is 144b316 and the open
list is #25 and #26. Dropped the merged rows from both tables rather than
letting them accumulate.

#25's e2e red turned out to be the pre-existing filesystem flake, and the one
re-run that cleared it was warm -- so it produced the measurement as well as the
green: 8 images in 23s against a 7m34s baseline, and the e2e job from 13m10s to
5m29s. #26 puts that in MONOREPO_TODO.md with the caveats attached rather than
the headline alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGAGAib517Ae1kg8SCdcEt
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants