No rule ID for a required context only a non-PR event can ever post #16
Notifications
Total Time Spent: 6 minutes
oleks
6 minutes
No due date set.
Dependencies
No dependencies set.
Reference: oleks/pipetree#16
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why: Shape: branch protection requires e.g.
ci/woodpecker/cron/nightly, produced by a workflow whose trigger iswhen: - event: cron(equally:deployment,release). It can never land on a PR head commit, so every PR on that branch is permanently unmergeable.It fits none of the frozen class-2 IDs cleanly:
pull_requesttrigger exists at all") — other workflows may well have apull_requesttrigger.Surfaced when an independent reader applied the companion skill to a constructed case and correctly diagnosed it from first principles while reporting it could not cite a rule ID.
The companion skill (
oleks/claude-plugin-cicd-insights, woodpecker-trigger-discipline) now documents the shape narratively and tells readers the ID list is not exhaustive, but the linter registry gap inoleks/pipetreeitself is still real.Acceptance:
First acceptance box done in
e9989b5: WP014 is now reserved in theclass-2 registry (
internal/analyze/lint.go), with the disambiguationfrom WP010/WP011/WP012 written into the registry comment itself rather
than only here.
SPEC.mdrecords it as reserved-not-shipped.Leaving this open, because the second box — implementing it — is blocked
on evidence rather than effort, and that is worth stating explicitly.
The verified event→slug table has exactly two entries (
push→push,pull_request→pr).cron,deploymentandreleaseslugs have neverbeen observed. To flag
ci/woodpecker/cron/nightlyas unsatisfiable thelinter must first believe
cronis the slug that aevent: crontriggerposts — and constitution principle IV forbids guessing it, precisely
because the one slug we did verify (
pr, notpull_request) provesthe obvious guess is wrong. A guessed slug here produces a false
unsatisfiablewhose remediation is "delete a required status check",which is the most damaging thing this tool can get wrong.
So today that shape lands as verdict
unverifiablewith no finding —correct but unhelpful, which is exactly the gap this issue names.
What unblocks it: one observed status context from a cron-triggered
(or deployment/release-triggered) Woodpecker run on this instance.
internal/gitea's client already hasCommitStatusesfor reading them;it is there for this. One real posted context per event extends the
table with evidence, and WP014 becomes implementable for that event.
Both boxes done — WP014 ships in
af91006.My earlier comment said implementation was blocked on evidence rather
than effort. That was the right diagnosis and the wrong place to stop:
the evidence was obtainable, so I went and got it instead of leaving the
rule reserved.
Two slugs verified from real posted statuses (not inferred):
croncronoleks/ci-scripts01ee5d2c→ci/woodpecker/cron/drifttagtagoleks/builder-arbitrage8a2c2bbe(v0.1.69), six workflowsThe cron evidence is unusually clean: commit
01ee5d2ccarries both apush run (pipeline 66) and a cron run (67), so a single status list shows
ci/woodpecker/push/testandci/woodpecker/cron/driftside by side —which also rules out the competing reading that the middle segment is
just the workflow's own name.
manual,deploymentandreleaseare deliberately still out of thetable.
manualis used by 38 pipelines in this fleet but no manual runwas available to sample, and I would rather ship a rule that stays silent
on it than one that guesses.
TestWP014_NotClaimedForUnverifiedSlugsasserts a required
ci/woodpecker/manual/<wf>context still comes backunverifiablewith no finding, andTestVerifiedSlugTablefails ifanyone adds an entry the comments can't point at a commit for.
Why WP014 needed its own ID, now that it is real code: its
remediation is the opposite of WP010's. WP010 says "the trigger was
narrowed — rescope it or drop the requirement". For WP014 no trigger
change helps at all, because the event never reaches a PR head, so it
says so explicitly and points at adding a
pull_requesttrigger andrequiring that context instead.
A bug this shook out, worth recording since it would have made the
rule wrong in the quiet direction:
preMerge's "unscoped means it fireson any branch" shortcut ran before the event-capability check, so an
unscoped
when: - event: croncame backsatisfied. The shortcut isabout branch scoping; cron and tag are not branch-driven. The fixture
caught it on the first run.
Bonus from the tag evidence: the workflow-segment rule is off its single
sample — eight workflow names across three repos now match their config
file basenames, hyphens included (
publish-gateway-arm64,version-guard, …). Behaviour under an explicit workflowname:key isstill untested.
Fleet check after shipping: an online sweep over the whole corpus
produces zero WP010/WP011/WP014 findings — almost no repo here configures
branch protection at all, and the one that did (oleks/oracle-adb-backend)
has since been fixed. A clean bill of health, not an inert rule; the
founding-case and cron fixtures are what prove the rules fire.
⏱ worked | 13-08-26 | session oleks/3b3844a4 | +6min | session-total 6min | elapsed from local-record
(Re-posted by hand: the release's own ledger POST failed with an SSL
handshake timeout. The
agent/worked:oleks/3b3844a4:6minlabel did land,so the two agree.)