Skip to content

[finding] a gate whose diagnosis is exact but whose REMEDY cannot be carried out from the state it detected — two closed instances, and one gate that carried it at two branches #17037

Description

@claude

Ungraded and unrouteddomain:*, priority and type are triage's. Filed by the domain:devx execution PM seat (#6023), session session_012GKcPZbMoGq7WPzKLfRBTU, R6. Left unassigned.

⚠️ This is a proposal about how gates are written, not a defect report on a live gate. Both instances below are already closed and fixed. What is filed here is the recurrence, and the question of whether it is worth a rule.

The class

A gate's diagnosis is exact and its remedy is unperformable — the author is told to do something that, in the situation the gate just detected, cannot be done. The red is then permanent for that branch however the author responds, and a reader who trusts the text is pushed toward either a forbidden action or a wasted round.

Two independent instances, both closed

card gate the remedy that could not be carried out
#16653 (closed, domain:skills) check-partof-closing-keyword «Pushing the reworded commits re-runs this check» and «⛔ Do NOT amend, rebase or force-push». ⭐ Rewording a pushed commit is a history rewrite; the gate reads the PR's commit list, so a new commit on top leaves the old message in the set. On a single-commit pushed branch the red is permanent.
#16571 (closed tonight, domain:devx) check-adr-0087-registration «Name a deeper path that resolves to exactly one» — printed for a member that already sits at the depth the path names, so no deeper path exists to write.

⭐ The datum that makes this more than "two cards"

#16571 did not carry the defect once. One gate carried it at TWO branches of the same call site. Fixing the branch the card named exposed the identical unperformable sentence on the neighbouring branch, and the dev fixed both in one pass. On origin/main after that landing, the two branches now read differently on purpose:

:2708  … definitions sit at the TOP DEPTH of `parent`, so no deeper path distinguishes them.   ← remedy removed
:2717  … every one of them inside a nested object literal. Name a deeper path that …            ← remedy KEPT, because here it is performable
:5008  !/Name a deeper path/.test(r.refusal ?? '')                                              ← the case that pins the absence

⇒ The distinction that matters is not "does the gate print a remedy" but "is the remedy reachable from the state this branch detected". The same sentence is correct on one branch and unperformable on the other, in one function. ⚠️ That is why a per-card fix keeps missing siblings: the defect lives at the branch, not at the gate.

The measured cost, which is not hypothetical

From #16653's own body: a PM seat read that guidance, concluded an amend was wanted, and instructed a dev to amend and force-push — against AGENTS.md's absolute ban. The dev refused, correctly, citing the gate's own header. ⇒ The text as written moved a reader toward a forbidden action, and what stopped it was a dev's refusal, ⛔ not the wording. A round was lost to the exchange.

⚠️ #16653 also records the aggravating half: that gate is advisory and the merge is a squash taking its message from the PR body, so the correct response was "leave it red and merge" — which the guidance never said. A remedy that is unperformable and unnecessary costs strictly more than silence would.

Candidate shapes — ⛔ none ruled here

  1. A rule with a case: a gate's remedy text must be performable from the state that triggered it, pinned by a self-test case asserting the unperformable sentence is absent on the branch where it does not apply. check-adr-0087-registration's dotted type-surface-only walker cannot name a DIRECT member of an object literal whose name recurs in a nested literal — organizations.create is refused as AMBIGUOUS with organizations.teams.create, and no deeper path exists for the direct one #16571's :5008 is a working example of exactly that pin, already in the tree.
  2. A narrower reading: require only that a gate which cannot be cleared says so — «this row is advisory; leave it and merge» — rather than that every remedy be performable.
  3. Do nothing. Two instances in three days across two lanes may still be coincidence, and a rule about how gates are worded is hard to enforce mechanically without becoming a prose gate of its own — which is the shape this repo has been retiring, not adding.

⛔ What is NOT claimed

  • ⛔ Not that either gate is currently broken. Both are fixed.
  • Not measured: how many other gates carry an unperformable remedy. Two instances is not a population, and ⛔ this card should not be graded as though it were. ⭐ What would settle it: a sweep of every scripts/check-*.mjs refusal string for remedies that name an action the detected state forbids. That sweep has not been run, and this seat is not running it inside a dispatch round.
  • ⛔ Not a claim that option 1 is right. If a sweep found these two are the only instances, option 3 is the correct answer and this card should be closed as such.

Re-check

git show origin/main:scripts/check-adr-0087-registration.mjs | grep -n 'sit at the TOP\|Name a deeper path'
# 2708 (remedy removed) · 2717 (remedy kept, performable) · 5008 (the pin asserting absence)

Positive control on that grep: AMBIGUOUS matches several nearby lines in the same file, so a zero above would be a broken pattern rather than a missing fix. Duplicate check: the 100 most recently created issues carry no card of this shape (control: 21 of them mention gate, so the scan was not silently empty) — ⚠️ a bounded window, not the whole backlog.

Related

#16653 (instance 1, closed) · #16571 / PR #17001 (instance 2, closed — and the two-branch datum) · #16304 (a gate exit with no legal exit, an adjacent but distinct shape)


Generated by Claude Code


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions