ums: an untested negative capability claim is its own failure mode - #2721
Conversation
Records the shigella#46 learning: branch-protection and ruleset settings were reported "not readable from this session" across several turns, and in two deliverables, on the strength of no dedicated MCP tool existing. Plain curl against the REST API answered the whole question on the first attempt. - shared/workflow/growth-mindset.md gains "A limitation you never tested leaves no error to diagnose". Its three existing subsections each start from a call that was made and came back wrong, so none of their remedies reaches a limitation that was only inferred. - shared/workflow/metacognitive-monitoring.md gains a Capability claim type, whose remedy is to attempt the call rather than to re-query; four count-based back-references to that list are made count-free. - memories/gh-cli.md extends the existing ruleset bullet in place with the effective-rules endpoint and the bypass fields, measured live. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJnmjBt8DbqWZhAkuvj1fc
The caveat was scoped to one ruleset by its author's own self-review. A second, UCD-SERG/shigella 6339629, reports the same shape: no bypass_actors key rather than an empty array, and current_user_can_bypass never. Records how the trap is actually met: reading the value through dict.get returns None for an absent key as well as a null one, so it gets written down as 'bypass_actors: null' when there is no such field in the response. That happened in the session that produced this entry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJnmjBt8DbqWZhAkuvj1fc
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Review found both. The Do-and-don't checklist still enumerated five types and omitted capability, so a reader following it literally would skip the type this change exists to add. The rationale companion still opened with "The five" in the section mirroring the taxonomy, while its two siblings a few lines below had been made count-free. Neither was caught by the first sweep because that sweep searched for the word "five". The checklist carries the staleness as an enumeration rather than a count, so a count-keyed query cannot see it. Derived the replacement population from the enumeration itself rather than from the count, which is address-every-comment.cases.md's own round-3 case in this same file. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YJnmjBt8DbqWZhAkuvj1fc
|
Claude finished review — View run Links are clean, no broken references. Review: #2721This round's diff (
I re-swept both files (and their siblings No new content issues in this round's diff. The prior round's two findings are both resolved and no new ones were introduced. VerdictReady for merge Reviewed commit: abd8fc8 |
What this records
UCD-SERG/shigella#46, 2026-08-31.Across several turns I told the user that GitHub branch-protection and ruleset settings were "not readable from this session", and that confirming a required-checks list needed a human to open Settings.
That was false, and I never tested it.
It was inferred from the absence of a dedicated MCP tool for rulesets, and then restated in a merged PR body and in a filed issue as a "needs a human with branch-protection access" note.
GH_TOKENwas set in the environment the whole time.Plain
curlagainst the REST API answered every part of the question on the first attempt.Three properties make this its own failure mode rather than an ordinary wrong guess:
New section, not a recurrence note
Added as a new subsection of
shared/workflow/growth-mindset.md, "A limitation you never tested leaves no error to diagnose".That file already owns "the limitation may not be real", and its three existing subsections are the closest existing coverage.
Each of them starts from a call that was made and came back wrong: a tool errored, a bounded probe returned nothing, a request was refused.
Their remedies all read the artifact that call produced.
None of those remedies is reachable when no call was made at all, so this is a gap in that file rather than a repetition of it.
shared/workflow/metacognitive-monitoring.mdgets a taxonomy entry instead of the section, because its State type ("re-query, never recall") prescribes a remedy that does not apply here: there is nothing to re-query when no call was ever made.Files changed
shared/workflow/growth-mindset.mdshared/workflow/growth-mindset.cases.mdshared/workflow/metacognitive-monitoring.mdshared/workflow/metacognitive-monitoring.rationale.mdshared/workflow/challenge-the-assignment.mdmemories/gh-cli.mdThe
gh-cli.mdedit extends the existing "gh pr checksdoes NOT say which checks are REQUIRED" bullet rather than adding a sibling, perums's step 3.It adds the effective-rules endpoint (
repos/{owner}/{repo}/rules/branches/{branch}, which covers org-level rulesets in one call) and the bypass fields that makemergeable_state: "clean"mean something.Measured live against two rulesets, both reporting
current_user_can_bypass: "never"and nobypass_actorskey at all rather than an empty array:Morrison-Lab/ai-config17712474 andUCD-SERG/shigella6339629.The second also records how the trap is met in practice: reading the value through
dict.getreturnsNonefor an absent key as readily as a null one, so it gets written down asbypass_actors: nullwhen there is no such field in the response.Review rounds
Round 1 returned two findings, both accepted and fixed in
abd8fc8:capability, so a reader following it literally would skip the type this change exists to add;Neither was caught by the first sweep because that sweep searched for the word "five".
The checklist carries the staleness as an enumeration rather than a count, so a count-keyed query cannot see it.
That is
address-every-comment.cases.md's own round-3 case, recurring in the same file it was recorded about.Round 2 confirmed both fixed, re-swept the two files and their siblings independently, and returned no findings.
Dupe-check
Queries run over
shared/,memories/,CLAUDE.md,CLAUDE.cases.md,AGENTS.md,skills/, andhooks/:not readable from this sessionmenu, not a boundaryabsence of a toolno dedicated toolself-sealingattempted callbypass_actorscurrent_user_can_bypassrules/branchescapability claimself-review-fallback.md,challenge-the-assignment.cases.md)tool surfacememories/about MCP tool inventoriesrulesetmemories/gh-cli.md, which is why that file was extended in placePer "Never assert a corpus gap from a grep": these are the queries and their results, not a claim that the corpus lacked the idea.
The coverage judgment came from reading the four candidate fragments (
research-before-asking,growth-mindset,metacognitive-monitoring,verify-the-right-artifact) plususe-mcp-servers.md's "When a rule names a mechanism this session does not have", the nearest near-miss: it covers a mechanism that is genuinely absent and prescribes finding a local equivalent, where this covers one assumed absent and never probed.Checks run locally
check-links.py-- 2815 links, 0 broken. Negative control: breaking the newgh-cli.mdlink made it report exactly that link.validate-skills.py-- all valid.check-context-closure.py-- under budget; none of the six edited files is in the always-loaded pool.markdownlint-cli2@0.23.0, the versionMorrison-Lab/gha'slint-markdown/package.jsonpins at@v2-- 692 files, 0 errors.check-new-line-breaksat the SHAvalidate.ymlpins (fdaeccc4), diff-scoped after committing -- clean, with a negative control that flagged a deliberate two-sentence line in each edited file.scripts/test_*.pysuite andscripts/check-*.pygate -- pass.check-stale-records.py-- no new orphans; age bucket not read, per the fragment's own instruction under a shallow clone.Generated by Claude Code