Browse Source

fix(ci): make the issue analyst map the bug class before suggesting a fix

The analysis of the node inbound rebuild traced the reported path
correctly but stopped there: the same sink (the node's Del+Add on
UpdateInbound) was also reached by auto-renew, traffic reset, delete
depleted, the reconcile after a master restart and bulk ops past their
threshold, and its suggested per-client push ignored the 32-push cap the
codebase already enforces. A maintainer following it would have fixed one
caller and left the rest dropping connections.

Step 4 now asks the analyst to name the broken invariant, find the sink
and grep every other path into it; a new `Same class:` field carries what
it found; `Suggested fix:` must target the layer that closes all of them
and be checked against existing caps, batch endpoints and mixed-version
peers. `Not determined:` is no longer for a file the analyst did not open.

No test reaches a prompt; the YAML still parses (checked with the
frontend's yaml package) and the next analyst run is the demonstration.
MHSanaei 14 hours ago
parent
commit
6eeaaa912a
1 changed files with 27 additions and 2 deletions
  1. 27 2
      .github/workflows/claude-issue-analyst.yml

+ 27 - 2
.github/workflows/claude-issue-analyst.yml

@@ -150,6 +150,18 @@ jobs:
                (`git log -S '<literal>' -- <path>`, `git blame -L`), give the
                (`git log -S '<literal>' -- <path>`, `git blame -L`), give the
                short sha and subject.
                short sha and subject.
 
 
+               Then MAP THE BUG CLASS. The reporter saw one path; the same wrong
+               decision is usually reached from several. Name the invariant the
+               bug breaks in one sentence ("a change to X must never Y"), then
+               find the SINK where it is broken - the function that makes the
+               wrong decision, not the caller the reporter hit - and Grep every
+               other path that reaches it: the other callers, the other jobs and
+               endpoints that send the same request, the retry or reconcile loop
+               that replays it, the bulk variant past its threshold. For each one
+               you confirm, note its file:line. An analysis that names only the
+               reported caller sends the maintainer to fix one path while the
+               siblings stay broken.
+
             5. CHECK WHETHER IT IS ALREADY FIXED. The reporter's version is
             5. CHECK WHETHER IT IS ALREADY FIXED. The reporter's version is
                almost never the tip. Compare their stated version against
                almost never the tip. Compare their stated version against
                `gh release list -L 10`, then search forward:
                `gh release list -L 10`, then search forward:
@@ -215,7 +227,10 @@ jobs:
               for a screenshot - ask for the exact error text, the raw JSON, or
               for a screenshot - ask for the exact error text, the raw JSON, or
               the log lines.
               the log lines.
             - Say what you could NOT determine and what would settle it. An
             - Say what you could NOT determine and what would settle it. An
-              honest gap is worth more than a confident invention.
+              honest gap is worth more than a confident invention. But a gap is
+              for what the source cannot answer - runtime state, the reporter's
+              environment - never for a file you did not open: if reading one
+              more function settles it, read it.
 
 
             SEVERITY (exactly one):
             SEVERITY (exactly one):
             - Critical: security hole, data corruption or loss, authentication
             - Critical: security hole, data corruption or loss, authentication
@@ -388,6 +403,9 @@ jobs:
                 Root cause:     exact file, function and line and the triggering
                 Root cause:     exact file, function and line and the triggering
                                 condition, or one sentence on why there is none.
                                 condition, or one sentence on why there is none.
                                 Name the introducing commit when you found it.
                                 Name the introducing commit when you found it.
+                Same class:     every other path step 4 confirmed reaches the
+                                same root cause, each with file:line, or
+                                `None found` once you searched for them
                 Already fixed:  the commit and the release that carries it,
                 Already fixed:  the commit and the release that carries it,
                                 "still present on the default branch", or
                                 "still present on the default branch", or
                                 `Not applicable`
                                 `Not applicable`
@@ -400,9 +418,16 @@ jobs:
                                 that would settle it, or `None`
                                 that would settle it, or `None`
               A plain fenced code block naming the exact file, function and line
               A plain fenced code block naming the exact file, function and line
               is welcome. Never a ```suggestion``` block.
               is welcome. Never a ```suggestion``` block.
-            - `Suggested fix:` at most three sentences, and ONLY when the
+            - `Suggested fix:` at most four sentences, and ONLY when the
               verdict is Confirmed bug. It is a pointer for the maintainer, not
               verdict is Confirmed bug. It is a pointer for the maintainer, not
               a patch - do not write the diff and do not offer to implement it.
               a patch - do not write the diff and do not offer to implement it.
+              Point at the layer where ONE change closes the reported path AND
+              every `Same class:` path - usually the sink, not the reported
+              caller. Check the suggestion against what the code already does
+              there before writing it: per-operation caps and thresholds, an
+              existing batch endpoint, a peer running an older version. When a
+              narrower patch would only cover the reported path, say in one
+              clause what it would leave broken.
             - A feature request, a plain question or a documentation issue gets
             - A feature request, a plain question or a documentation issue gets
               a prose answer in the style above with NO field scaffold - just
               a prose answer in the style above with NO field scaffold - just
               the answer, and a `Verdict:` line.
               the answer, and a `Verdict:` line.