Skip to content

fix(inventory): claude-skills' two callers are wired, so mark them required - #335

Merged
LukasWodka merged 3 commits into
developfrom
fix/2481-inventory-drift
Aug 25, 2026
Merged

fix(inventory): claude-skills' two callers are wired, so mark them required#335
LukasWodka merged 3 commits into
developfrom
fix/2481-inventory-drift

Conversation

@LukasWodka

@LukasWodkaLukasWodka commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Summary

claude-skills gained code-quality-caller.yml and bugbot-gate-caller.yml today. The inventory still carried both as exempt, so caller-drift.py reported two stale exemptions and the conformance gate went red on the .github staging mirror (#334) — which is what is currently holding .github out of staging, and therefore out of main.

Measured

Both callers are present in tracebloc/claude-skills/.github/workflows:

bugbot-gate-caller.yml
code-quality-caller.yml

With these two rows flipped, the audit is clean:

No drift. Every repo read, every entry matched.

Why this keeps happening

Worth recording, because the fix is one line and the pattern is not.

The audit is not a function of the commit — it is a function of the commit and the live state of every repo in the org. The same sha 669971apassed the audit at 12:52:54 and failed it at 14:20:51 today, because two callers landed in a third repo in between. GitHub evaluates the newest run per context, so the later failure is what blocks the merge.

That is why .github has now missed five prod hops with a different finding each time:

hopfinding
1release-train's customer-priority-bump caller
2rfcs — two board callers
3design-system-v2 absent from the inventory
4rfcscode-quality + protection.develop
5claude-skills — these two

Every fix was correct. Every one was overtaken before the mirror could merge. These exemptions are not defects in anyone's work — they are the inventory lagging a fleet that changes daily, which is the cost of gating a promotion on live org state.

Not proposing a mechanism change here; this PR is the two rows. But the recurrence is worth a decision of its own, because the current shape means .github can only merge in a window where no other repo has changed since its audit ran.

Type

fix

Test plan

python3 scripts/caller-drift.py against the live org, before and after:

  • before:2 drift finding(s) — both claude-skills
  • after:No drift. Every repo read, every entry matched.

No behaviour change beyond the two rows; repo-inventory.yml parses under yaml.safe_load.

Checklist

  • Targets develop
  • One self-contained change (2 lines)
  • Assignee set, one reviewer requested
  • No secrets, tokens or customer data

Note

Low Risk
Inventory and documentation only; no application or CI workflow behavior changes beyond what the drift audit already enforces.

Overview
Updates repo-inventory.yml so claude-skills matches org reality after code-quality-caller.yml landed: code-quality.yml goes from exempt: *code_quality_caller_missing to required, which should clear caller-drift for that stale exemption and unblock the conformance gate on .github.

The same entry flips fr-gate.yml from required to exempt with a structural reason (no staging branch or promotion PRs, so an fr-gate caller is not applicable). That addresses audit noise from a required row when no caller exists in the repo.

claude-skillsprod protection comments are rewritten so empty required_checks is documented as a measured decision on a non-train working main, not as “quality contexts dropped because code-quality is absent.” The shared code_quality_caller_missing anchor prose is refreshed so only release-train still cites it and claude-skills appears in remediation history.

Reviewed by Cursor Bugbot for commit a4e978b. Bugbot is set up for automated code reviews on this repo. Configure here.

@LukasWodkaLukasWodka self-assigned this Aug 25, 2026
Comment threadrepo-inventory.yml
Comment threadrepo-inventory.yml

@saadqbalsaadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bugbot-gate.yml hunk is already in #333, which is open, approved and CLEAN. Same file, same line, same replacement — bugbot-gate.yml: required # bugbot-gate-caller.yml. Whichever merges second conflicts, and #333 is the better home for it because it also corrects the anchor text, which is precisely what Bugbot's second thread here is asking for. Dropping that hunk leaves this PR with its own unique contribution and no overlap.

The other thread is real, and I verified it rather than relaying it.claude-skills' prod cell still reads:

# `exempt: *code_quality_caller_missing` above. Requiring a context
# ... this cell drops them BECAUSE the producer is absent, not because the

(repo-inventory.yml:719-721.) Flip code-quality.yml to required and "the producer is absent" is false of that cell. The required_checks list may well still be correct — but the reason stops being, which is the same defect I reviewed on .github#332 a couple of hours ago for rfcs: the list was right and only its justification had rotted, and correcting it in the same PR was the whole point of that one.

So: keep the code-quality.yml flip, fix the prod cell's reasoning alongside it, and let #333 carry the bugbot half.

Two checks are still pending as well, so nothing was approvable regardless.

… falsifies
REBASED ONTO develop AND NARROWED. This branch originally also flipped
`claude-skills`' `bugbot-gate.yml` row and re-measured the
`bugbot_gate_rollout_pending` anchor. .github#333 (backend#2284) landed both while
this was open, and did the anchor better -- it names `claude-skills#36` as the
first caller. Those edits are dropped rather than merged: two PRs asserting the
same fact in different words is how the next reader learns to distrust both.
What is left is the half #333 did not cover, confirmed by running the audit
against current develop:
1 drift finding(s):
- claude-skills: code-quality.yml is marked `exempt` but a caller exists
So:
1. Flip that row to `required`. `code-quality-caller.yml` is present in
`tracebloc/claude-skills/.github/workflows`.
2. Fix the reason the flip falsifies. `claude-skills` prod `required_checks` said
the three `quality / *` contexts are dropped "BECAUSE the producer is absent",
citing the very exemption being removed. The measured reason is narrower:
`claude-skills/main` carries no required status checks at all (classic
protection, empty `contexts`, measured 2026-08-25), because it is non-train
infra whose `main` is a working branch. `required_checks: []` was and stays
correct; only its cause was wrong.
`release-train` carries the SAME wording and keeps it -- verified it has no
code-quality caller, so its producer really is absent. One comment became
false; the other did not.
`caller-drift.py` against the live org: 1 finding before, "No drift. Every repo
read, every entry matched." after.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@LukasWodka
LukasWodkaforce-pushed the fix/2481-inventory-drift branch from 490d4fd to 68634f0CompareAugust 25, 2026 15:40

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 68634f0. Configure here.

Comment threadrepo-inventory.yml

@saadqbalsaadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both of my asks are addressed — the bugbot-gate.yml hunk is gone, and the new reasoning is right where the old one self-contradicted: once code-quality.yml flips to required, "the producer is absent" can't also be why the contexts are dropped. Keeping the client#665 lesson as an ordering rule rather than deleting it is the better save, and calling out that release-train keeps the original wording correctly stops the next person from "fixing" that one too.

One thing you should know rather than change: I can't reproduce the load-bearing measurement. GET /repos/tracebloc/claude-skills/branches/main/protection 404s for me — and it also 404s for .github/develop, which is certainly protected, so that's my token (maintain, not admin), not an absence. Dated + attributed is the right form for a claim like that; just be aware only an admin can re-check it.

Not approving yet: audit, gate, selftests and Bugbot are still pending. I'll pick it up next pass once they land.

Bugbot Medium on .github#335, and correct. Removing the `claude-skills` alias
made the `code_quality_caller_missing` anchor's own prose false:
said: FOUR lines -- two real aliases and two comments
measured: THREE lines -- ONE real alias (release-train) and two comments
Both numbers re-measured and stated, plus the remediation history extended with
`claude-skills` (2026-08-25, .github#335, caller added by claude-skills#36) --
the thread flagged that omission too.
The anchor stays rather than being deleted: `release-train`'s citation is
genuine, verified again here (no code-quality caller in its workflows).
WHY THIS KEEPS RECURRING, since this is the third time in one PR that a flip
falsified a sentence. A count written into prose is falsified by the NEXT flip,
every time -- this anchor's text already carried that scar ("A reader following
it lands back on 'three or four', which is where this sentence started") and
acquired a fresh one anyway. The note now says so explicitly, so the next
person flipping a row knows the count is theirs to re-measure.
Not proposing a mechanism here. But a guard that parses the anchor's stated
counts and compares them to the two greps would end the class, and it is the
same shape as the citation guard .github#329 already landed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@saadqbalsaadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Content's right, and I checked the counts rather than taking them: unanchored grep returns 3, anchored returns 1, and the one surviving alias at repo-inventory.yml:1225 is release-train's — which does have no code-quality caller (no matching workflow in my checkout). The two remaining hits are the comment mentions at 730 and 1205.

Bugbot's catch is the good one here, and your response is better than the fix: "a count in prose is falsified by the next flip, every time" is the general rule, and it's the same lesson as the anchored grep one layer out. Leaving release-train's original "BECAUSE the producer is absent" wording in place at 1205 is correct and now explicitly justified.

The red is not you.audit failed on HTTP 403 — API rate limit exceeded for user ID 54042461 — across seventeen repos: "0 clean, 1 drift, 2 could not evaluate". Failing closed on an unevaluable audit is the right design, so there's nothing to fix in the workflow either. gate is purely downstream of it (caller-drift.yml concluded 'failure'). Re-run both once that token's budget recovers and they should go green; my own budget is 4988/5000, so it isn't org-wide.

For the record: every finding I raised on this PR is cleared — the duplicate bugbot-gate.yml hunk, the self-contradicting cell reason, and now the anchor counts. My earlier change-request is still the standing decision only because I can't lift it without approving, and I won't approve over two red checks. Nothing is outstanding from me; ping me when the audit is green and I'll stamp it.

UNRELATED PRE-EXISTING DRIFT, surfaced mid-review and fixed here because it is
what keeps `audit` (and therefore the required `gate`) red on this PR. Nothing in
this branch touched the fr-gate row -- `git diff origin/develop..HEAD` does not
mention it -- the audit simply started reporting:
claude-skills: MISSING required caller for fr-gate.yml on develop.
Measured: `fr-gate-caller.yml` is absent from `tracebloc/claude-skills`, while the
inventory carried `fr-gate.yml: required`. So the row asserts a caller that is not
there.
FLIPPED TO EXEMPT RATHER THAN RESTORING THE CALLER, and the reason is in the file
already: this entry's own `rulesets.promotion_merge_commit_only` exemption states
that claude-skills has "no staging branch and no promotion PRs". The fr-gate only
reports on a PR targeting staging/main/master AS A PROMOTION, so there is nothing
here for it to gate -- structurally the same case as release-train's fr-gate
exemption. Requiring a context nothing produces is the client#665 defect this file
warns about two entries above.
The remedy runs both ways and the reason says so: if the caller was removed by
mistake, restore it and flip this back. The audit reports either direction.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@saadqbalsaadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Evidence for the re-run, so you don't go digging: caller-drift.ymlsucceeded at 15:40 on 68634f00 and failed at 15:49 on a4d49e23. Same workflow, nine minutes apart, and the only difference in the failing run is the 403s. Just re-run it.

@saadqbalsaadqbal left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Green now, and the fr-gate flip is right. Verified claude-skills has no fr-gate-caller.yml and no staging branch — only develop, main and feature branches — so there is genuinely nothing for the gate to report on.

One thing worth fixing in the reason, because it's the difference between a decision and a symptom. It says the audit "began reporting ... mid-review, and the caller is genuinely absent" — which reads as though the absence were discovered. It wasn't: claude-skills#38removed the caller deliberately on 2026-08-25 as backend#2347's remainder, and its PR body names this exact row:

repo-inventory.yml records claude-skills -> fr-gate.yml: required # fr-gate-caller.yml. With the caller gone that row must flip to exempt

So this commit is the follow-up #38 asked for, and citing it says so. That also retires the "if the caller was removed by mistake, restore it and flip this back" branch — it wasn't a mistake, and the next reader shouldn't have to work that out from the audit log.

Everything else checks out: 3 unanchored / 1 anchored on the code-quality grep, the surviving alias is release-train's, and release-train really has no code-quality caller. Approving — fold the citation in whenever, it doesn't need another round.

@LukasWodka
LukasWodka merged commit 7202700 into developAug 25, 2026
13 checks passed
@LukasWodka
LukasWodka deleted the fix/2481-inventory-drift branch August 25, 2026 16:05
Sign up for freeto 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.

2 participants

@LukasWodka@saadqbal