Skip to content

feat(retro): add flapping detection to retro analysis skill (#5512) - #5513

Closed
Benkapner wants to merge 2 commits into
fullsend-ai:mainfrom
Benkapner:feat/retro-flapping-detection
Closed

feat(retro): add flapping detection to retro analysis skill (#5512)#5513
Benkapner wants to merge 2 commits into
fullsend-ai:mainfrom
Benkapner:feat/retro-flapping-detection

Conversation

@Benkapner

Copy link
Copy Markdown
Contributor

Summary

Adds flapping detection guidance to the retro-analysis skill. The retro agent now knows how to identify fix-break oscillation patterns during its post-workflow analysis.

What it adds to the skill

  • File oscillation detection: check if the same files were changed and reverted across consecutive agent runs
  • Test result flipping: detect tests that pass/fail/pass across runs
  • Cycle count threshold: flag more than 2 review-fix cycles without convergence
  • Concrete bash commands for comparing diffs between runs
  • Proposal guidance: how to structure a flapping finding (title format, evidence, suggested intervention)
  • False positive guard: single rework cycles and different-file changes are explicitly excluded

Why this matters

Flapping wastes agent cycles and often indicates a deeper problem (conflicting instructions, flaky tests, or an approach the agent cannot converge on). Today, the retro agent has no specific guidance to detect this pattern, even though the flapping-convergence problem doc identifies it as a key concern.

Related Issue

Closes #5512

Testing

  • Docs-only change to an existing skill (no code/lint/test changes required)
  • Section integrates with existing skill structure (placed before the "Before proposing" section)
  • Follows the skill's existing pattern of providing bash commands and subagent prompts

Checklist

  • PR title follows Conventional Commits
  • Commits are signed off (DCO)

…-ai#5512)

Add a "Flapping detection" section to the retro-analysis skill that
teaches the retro agent how to identify fix-break oscillation patterns:
file-level oscillation (same files changed and reverted across runs),
test result flipping, and excessive review-fix cycles.

Includes concrete signals to check, bash commands for diff comparison,
guidance on when to flag vs when NOT to flag (single rework is normal),
and how to structure proposals when flapping is detected.

Signed-off-by: Benjamin Kapner <bkapner@redhat.com>
@Benkapner
Benkapner requested a review from a team as a code owner July 23, 2026 08:49
@github-actions

Copy link
Copy Markdown

E2E tests did not run

E2E tests run automatically for org/repo members and collaborators on pull requests.

For other contributors, a maintainer must add the ok-to-test label after the latest push.

See E2E testing guide for details.

1 similar comment
@github-actions

Copy link
Copy Markdown

E2E tests did not run

E2E tests run automatically for org/repo members and collaborators on pull requests.

For other contributors, a maintainer must add the ok-to-test label after the latest push.

See E2E testing guide for details.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add flapping detection guidance to retro-analysis skill

📝 Documentation 🕐 10-20 Minutes

Grey Divider

AI Description

• Add a "Flapping detection" section to retro-analysis guidance.
• Document file/test oscillation signals and excessive review-fix cycle thresholds.
• Provide bash commands, proposal template fields, and false-positive guards.
Diagram

graph TD
  A["Retro agent"] --> B["Subagent: gather runs"] --> C["Run artifacts"] --> D{"Flapping signals"} --> E["Proposal guidance"] --> F["Existing issues check"]
  C --> G["CI results"] --> D
  subgraph Legend
    direction LR
    _proc["Process step"] ~~~ _data["Data/artifact"] ~~~ _dec{"Decision"}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Add a small helper script/gh alias for oscillation detection
  • ➕ Reduces manual steps and makes detection more repeatable across retros
  • ➕ Can compute overlaps/reverts across multiple runs more reliably than ad-hoc commands
  • ➖ Introduces maintenance surface area beyond the skill doc
  • ➖ May require decisions about where the script lives and how it’s distributed
2. Implement first-class flapping detection in the retro agent/harness
  • ➕ Most reliable: can automatically inspect run graph, diffs, and CI outcomes
  • ➕ Enables consistent thresholds and structured evidence generation
  • ➖ Higher effort and risk than a docs-only change
  • ➖ Requires tighter coupling to workflow/run metadata sources and permissions

Recommendation: For the stated goal (teach the retro agent what to look for), the docs-first approach in this PR is the right lowest-friction improvement. If flapping findings become common, follow up with automation (script or harness support) to make detection deterministic and less labor-intensive.

Files changed (1) +44 / -0

Documentation (1) +44 / -0
SKILL.mdDocument flapping detection signals, commands, and proposal format +44/-0

Document flapping detection signals, commands, and proposal format

• Adds a dedicated "Flapping detection" section describing how to identify fix-break oscillation via file-level reversions, test pass/fail flipping, and excessive review-fix cycles. Includes concrete bash commands for comparing changed files across runs plus guidance on how to structure a flapping proposal and when not to flag.

internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md

@github-actions

github-actions Bot commented Jul 23, 2026

Copy link
Copy Markdown

Site preview

Preview: https://4aebfafa-site.fullsend-ai.workers.dev

Commit: 8113425f65bfdaf571eb929338e4592fce4db5c8

@qodo-code-review

qodo-code-review Bot commented Jul 23, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 61 rules

Grey Divider


Remediation recommended

1. PR files API unpaginated ✓ Resolved 🐞 Bug ≡ Correctness
Description
The snippet calls the PR files endpoint without pagination, so it can return an incomplete file list
on larger PRs. That incomplete list undermines file-oscillation detection by omitting files that may
have been changed repeatedly.
Code

internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[R117-118]

+gh api "repos/$REPO_FULL_NAME/pulls/$PR_NUMBER/files" \
+  --jq '.[].filename' | sort > /tmp/current_files.txt
Relevance

⭐⭐⭐ High

Repo has accepted adding --paginate/error handling for PR files listing to avoid incomplete
file-based decisions.

PR-#2398
PR-#337

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new section uses a non-paginated PR files listing, while other in-repo guidance/workflows
explicitly paginate PR file retrieval to avoid missing files; this discrepancy indicates the new
snippet is likely to be incomplete in real use.

internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[115-125]
internal/scaffold/fullsend-repo/agents/review.md[181-196]
.github/workflows/e2e.yml[121-139]
PR-#2398

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The example `gh api` call to list PR files is not paginated, so it may omit files and weaken oscillation detection.

### Issue Context
Other repo guidance and workflows consistently use `--paginate` and/or `?per_page=100` when fetching PR files.

### Fix Focus Areas
- internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[117-118]

### Suggested change
- Update the snippet to fetch all pages, e.g.:
 - `gh api "repos/$REPO_FULL_NAME/pulls/$PR_NUMBER/files" --paginate --jq '.[].filename' ...`
 - (Optionally) include a short note that API failures should be surfaced (don’t treat an empty list as authoritative).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Run diff comparison wrong 🐞 Bug ≡ Correctness
Description
The flapping-detection snippet compares the full PR file list against git diff HEAD~1 HEAD, which
is not a comparison between consecutive code/fix runs and only yields filename overlap (not reversed
changes). This can cause the retro agent to miss real oscillations or generate false flapping
candidates that aren’t tied to specific run-to-run transitions.
Code

internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[R115-125]

+```bash
+# Compare diffs between consecutive code/fix runs
+gh api "repos/$REPO_FULL_NAME/pulls/$PR_NUMBER/files" \
+  --jq '.[].filename' | sort > /tmp/current_files.txt
+
+# Get previous run's changed files from the commit before
+git diff --name-only HEAD~1 HEAD | sort > /tmp/prev_files.txt
+
+# Files changed in both runs (potential oscillation)
+comm -12 /tmp/prev_files.txt /tmp/current_files.txt
+```
Relevance

⭐⭐⭐ High

Team favors comparing specific SHAs/ranges for run-to-run diffs; has accepted similar diff-range
correctness fixes.

PR-#2617
PR-#337

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added snippet intersects a PR-wide file list with only the latest commit’s file list, which
can’t represent consecutive run transitions and doesn’t demonstrate reversal. Elsewhere in this
repo, comparing changes between two specific SHAs via the GitHub compare API is the established
pattern for run-to-run comparisons and includes safeguards for compare limitations.

internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[99-125]
internal/scaffold/fullsend-repo/skills/pr-review/SKILL.md[160-173]
PR-#2617

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The current flapping-detection bash example doesn’t compare *consecutive code/fix runs* (it compares PR-wide files to the last commit), and it doesn’t provide a way to verify that changes were actually reversed.

### Issue Context
The section describes detecting oscillation between *runs* (run N vs run N+1), but the snippet uses `HEAD~1..HEAD` and PR-wide file listing, which is not run-scoped.

### Fix Focus Areas
- internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[115-125]

### Suggested direction
- Change the snippet to:
 - Use run-specific commit SHAs (e.g., from each run’s produced commit / PR head at the time) and compare consecutive SHAs via `gh api repos/$REPO_FULL_NAME/compare/<shaN>...<shaNplus1>` (or `git diff <shaN>..<shaNplus1>` if available locally).
 - Add an explicit step that checks *reversal* for candidate files (e.g., show `git diff <shaN>..<shaNplus1> -- <file>` and `git diff <shaNplus1>..<shaNplus2> -- <file>` to demonstrate add/remove reversal).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines +115 to +125
```bash
# Compare diffs between consecutive code/fix runs
gh api "repos/$REPO_FULL_NAME/pulls/$PR_NUMBER/files" \
--jq '.[].filename' | sort > /tmp/current_files.txt

# Get previous run's changed files from the commit before
git diff --name-only HEAD~1 HEAD | sort > /tmp/prev_files.txt

# Files changed in both runs (potential oscillation)
comm -12 /tmp/prev_files.txt /tmp/current_files.txt
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

1. Run diff comparison wrong 🐞 Bug ≡ Correctness

The flapping-detection snippet compares the full PR file list against git diff HEAD~1 HEAD, which
is not a comparison between consecutive code/fix runs and only yields filename overlap (not reversed
changes). This can cause the retro agent to miss real oscillations or generate false flapping
candidates that aren’t tied to specific run-to-run transitions.
Agent Prompt
### Issue description
The current flapping-detection bash example doesn’t compare *consecutive code/fix runs* (it compares PR-wide files to the last commit), and it doesn’t provide a way to verify that changes were actually reversed.

### Issue Context
The section describes detecting oscillation between *runs* (run N vs run N+1), but the snippet uses `HEAD~1..HEAD` and PR-wide file listing, which is not run-scoped.

### Fix Focus Areas
- internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md[115-125]

### Suggested direction
- Change the snippet to:
  - Use run-specific commit SHAs (e.g., from each run’s produced commit / PR head at the time) and compare consecutive SHAs via `gh api repos/$REPO_FULL_NAME/compare/<shaN>...<shaNplus1>` (or `git diff <shaN>..<shaNplus1>` if available locally).
  - Add an explicit step that checks *reversal* for candidate files (e.g., show `git diff <shaN>..<shaNplus1> -- <file>` and `git diff <shaNplus1>..<shaNplus2> -- <file>` to demonstrate add/remove reversal).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

fixed. now compares consecutive commit SHAs instead of using HEAD~1.

Comment thread internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md Outdated
@codecov

codecov Bot commented Jul 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Address review feedback:
- Compare consecutive commit SHAs instead of HEAD~1
- Add --paginate to gh api calls for PR files

Signed-off-by: Benjamin Kapner <bkapner@redhat.com>

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

CRITICAL — PR targets a file/directory tree already deleted from fullsend-ai/fullsend main; real, verified merge conflict

File: internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md

This PR's only change is to internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md, but that file no longer exists on fullsend-ai/fullsend's main branch. Verified independently via three methods:

  1. git ls-tree origin/main -- internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md returns nothing, and git cat-file -e origin/main:<path> fails.
  2. Commit 8b8c3bb ("refactor(scaffold)!: delete agent files from scaffold embed (#5552)", merged to main via PR #5588) deleted the entire internal/scaffold/fullsend-repo/{skills,agents,harness,schemas,env,plugins,policies} tree, with the commit message stating "Agent resolution now uses fullsend-ai/agents repo exclusively... No migration needed."
  3. gh pr view 5513 currently reports mergeable: CONFLICTING, mergeStateStatus: DIRTY, and a local git merge-tree $(git merge-base origin/main pr-5513) origin/main pr-5513 confirms a genuine modify/delete conflict on this exact path ("removed in local" vs "their" still modifying it) — this is the PR's actual current state, not a hypothetical.

The canonical copy of this skill today is fullsend-ai/agents:skills/retro-analysis/SKILL.md (confirmed via the GitHub contents API), which has no flapping-detection content yet, so the underlying feature is still wanted — it is simply aimed at a file fullsend-ai/fullsend's main has deleted. Confirming the root cause, the linked issue #5512 itself still cites the stale paths internal/scaffold/fullsend-repo/skills/retro-analysis/ and internal/scaffold/fullsend-repo/schemas/retro-result.schema.json (also deleted by the same commit), which is presumably why the author targeted the wrong repo.

Suggestion: Close or redirect this PR. Re-implement the "Flapping detection" section (adjusted per the inline findings below) as a PR against fullsend-ai/agents at skills/retro-analysis/SKILL.md instead — note that repo's copy has already diverged from the base this PR assumes (e.g. it has since gained a "Discovering the agents repo" section and a different run-tracing model based on gh run list --workflow=code.yml|fix.yml in $DISPATCH_REPO, not PR commits), so the content needs manual rework rather than a straight port. Do not attempt to resolve the current conflict by keeping the deleted path in fullsend-ai/fullsend. Also consider updating issue #5512's description to point at the fullsend-ai/agents paths.


The inline comments below cover additional findings on the section's content itself, in case it's ported to the correct repo.


```bash
# Get the last two code/fix run SHAs for this PR
COMMITS=$(gh api "repos/$REPO_FULL_NAME/pulls/$PR_NUMBER/commits" \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

HIGH — New bash example uses $PR_NUMBER, which is never exported to the retro agent's sandbox

The new "Flapping detection" bash block references $PR_NUMBER in two gh api calls (line 117: pulls/$PR_NUMBER/commits; line 126: pulls/$PR_NUMBER/files). Confirmed directly against fullsend-ai/agents that the retro agent's environment never sets this variable: env/retro.env exports only ORIGINATING_URL, RETRO_COMMENT, REPO_FULL_NAME, and GH_TOKEN; harness/retro.yaml's runner_env block confirms the same three (plus GH_TOKEN) with no PR_NUMBER. By contrast, env/review.env does export PR_NUMBER, because the review agent is always dispatched against a specific PR — the retro agent is dispatched from an ORIGINATING_URL that this same skill's pre-existing "From an issue"/"From a PR" sections treat as possibly-an-issue-or-possibly-a-PR, and nothing (old or new) in the skill derives a PR number from it. The file's own established convention (the pre-existing "Setup" section explicitly derives ORG/DISPATCH_REPO from the given $REPO_FULL_NAME before using them) is not followed here — $PR_NUMBER is used as if it were an established env var with no derivation step, and the rest of the file only ever refers to PR numbers via the narrative placeholder #N in subagent prompts, never as a shell variable. As written, $PR_NUMBER expands to empty, producing malformed paths like repos/owner/repo/pulls//commits that will 404 if an agent runs this snippet literally.

Suggestion: Add an explicit step deriving the PR number from $ORIGINATING_URL (mirroring how the Setup section derives ORG from REPO_FULL_NAME), e.g. gh pr view "$ORIGINATING_URL" --json number -q .number, before using it — or replace the bash variable with the same narrative-placeholder convention (#N) used elsewhere in the file, instructing the agent to substitute the number it already has from context.

3. **Cycle count:** more than 2 review-fix cycles on the same PR without convergence (the review keeps requesting changes on the same findings).

```bash
# Get the last two code/fix run SHAs for this PR

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

MEDIUM — Run-boundary logic assumes one PR commit equals one code/fix agent run, an unconfirmed and internally inconsistent assumption

Lines 116-120 take tail -2/tail -1 of pulls/$PR_NUMBER/commits as "the last two code/fix run SHAs," silently equating one PR commit with one agent run. This is only partially supported: docs/agents/fix.md states "Post-script pushes the commit" (singular), consistent with one commit per fix run, but docs/agents/code.md only says the code agent "commits locally" and the post-script "pushes the branch" — it never confirms exactly one commit reaches the pushed branch. More importantly, this same skill file's own pre-existing "Tracing the workflow graph" section (unchanged by this PR) defines a "run" as a distinct GitHub Actions execution discovered via gh run list --repo $DISPATCH_REPO --workflow=code.yml|fix.yml, not a commit-list position — a discontinuity with the new snippet's methodology that is never reconciled or flagged. If any run ever produces more than one commit (amend, fixup, incremental push), tail -2 would silently compare two commits from the same run with no error surfaced.

Suggestion: Either derive PREVIOUS_SHA/CURRENT_SHA from actual workflow-run boundaries (mapping each gh run list --workflow=code.yml|fix.yml run to its resulting commit SHA, consistent with the file's own established run-tracing approach), or explicitly caveat that this heuristic assumes exactly one commit per run and may misfire otherwise.


Include a proposal with these specifics:

- **title:** Start with "Flapping detected:" followed by what oscillated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

MEDIUM — Flapping proposal checklist omits target_repo, which the schema requires

The "When flapping is detected" checklist (lines 137-141) lists exactly five fields: title, what_happened, what_could_go_better, proposed_change, validation_criteria. Confirmed directly against fullsend-ai/agents:schemas/retro-result.schema.json that a proposal object's required array is ["target_repo", "title", "what_happened", "what_could_go_better", "proposed_change", "validation_criteria"] with additionalProperties: falsetarget_repo is mandatory, not merely allowed. This new, self-contained checklist reads as a complete spec for a flapping proposal and appears before the general "Output format" section (which does list all six fields) later in the same file. An agent that treats this checklist as authoritative risks emitting a proposal missing target_repo, which would fail fullsend-check-output schema validation (mitigated somewhat by the harness's 2-iteration validation retry, but still a real inconsistency in the guidance).

Suggestion: Add target_repo to the bullet list, e.g. "- target_repo: the repo where the fix should land — see Localization guidance above," so the checklist is self-consistent with the schema described later in the file.

- **what_happened:** List each cycle with the run IDs, which files changed, and how the changes reversed
- **what_could_go_better:** Identify what might be causing the loop (conflicting review criteria, flaky test, ambiguous instructions)
- **proposed_change:** Suggest a concrete intervention (clarify the conflicting instruction, fix the flaky test, add a convergence guard)
- **validation_criteria:** "The next code/fix cycle on similar PRs should converge within 2 iterations"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

MEDIUM — validation_criteria guidance breaks this file's own established convention for that field

Line 141 gives validation_criteria as a bare quoted sentence — "The next code/fix cycle on similar PRs should converge within 2 iterations" — with no "for example" framing, no instance-specific detail, and no timeframe/sample-size guidance. This file's own pre-existing, unchanged "Writing good proposals" section explicitly establishes a different convention for this exact field: "validation_criteria: Define measurable or observable outcomes. Include a timeframe or sample size. For example: 'The next 5 code agent runs on this repo should not trigger the same review comment about missing error handling.'" — i.e., instruction plus a labeled example, with explicit timeframe/sample-size guidance. The new bullet is also inconsistent with its own sibling bullet one line above (what_happened), which asks for instance-specific detail ("run IDs, which files changed") while validation_criteria stays generic and copy-pasteable.

Suggestion: Rewrite to match the file's established convention, e.g.: "validation_criteria: Define a measurable, checkable outcome tied to the specific files/pattern involved, with a timeframe or sample size. For example: 'The next 2 fix cycles touching <file> should not re-introduce the change reverted in run N+1.'"


1. **File oscillation:** the same file was changed in two or more consecutive runs, and the changes reverse each other (lines added in run N were removed in run N+1, or vice versa).
2. **Test result flipping:** a test that passed after run N fails after run N+1, then passes again after run N+2.
3. **Cycle count:** more than 2 review-fix cycles on the same PR without convergence (the review keeps requesting changes on the same findings).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

MEDIUM — Hardcoded 2-cycle threshold contradicts the linked design doc's explicit open question on configurability

Line 113 sets "more than 2 review-fix cycles" as the cycle-count signal, and line 141 hardcodes "converge within 2 iterations" as the validation bar. docs/problems/flapping-convergence.md — the doc this PR's description cites as motivation — treats this exact parameter as explicitly unresolved: its "Open questions" section asks "What is the right default flapping budget (max iterations before circuit-breaking)? Should it be count-based, cost-based, or time-based?", and its "Thresholds and configuration" section states thresholds should vary by repo/task type ("A documentation repo might tolerate only 2 review cycles... A complex backend service might allow 5 cycles...") and be "configurable per repo and per agent role," not a single constant. This PR ships "2" as settled fact in agent-facing guidance without that decision having been made in the design doc it references. (Issue #5512 does list "> 2 fix cycles" as one bullet, so the number isn't fabricated, but the issue doesn't reconcile it with the doc's open-question status either.)

Suggestion: Phrase the threshold as an explicit, overridable default rather than a bare fact — e.g., "more than N review-fix cycles (default N=2; see flapping-convergence.md open questions on configurability)" — so a future config-driven threshold change doesn't silently contradict shipped agent guidance.

@Benkapner

Copy link
Copy Markdown
Contributor Author

Closing this PR. The scaffold extraction (PR #5552/#5588) moved internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md to fullsend-ai/agents. Re-opened as fullsend-ai/agents#540, adapted to the current version of the file and incorporating review feedback from this thread. @waynesun09

@Benkapner Benkapner closed this Jul 30, 2026
@fullsend-ai-retro

fullsend-ai-retro Bot commented Jul 30, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 5:39 AM UTC · Completed 5:49 AM UTC
Commit: 8113425 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #5513 — feat(retro): add flapping detection to retro analysis skill

Outcome: Closed without merge. The PR modified internal/scaffold/fullsend-repo/skills/retro-analysis/SKILL.md, which was deleted from main by the scaffold extraction (PRs #5552/#5588). The author re-filed as fullsend-ai/agents#540.

Timeline

  1. Jul 23 08:49 UTC — External contributor (Benkapner, Red Hat) opens PR feat(retro): add flapping detection to retro analysis skill (#5512) #5513 from fork, adding flapping detection guidance to the retro analysis skill.
  2. Jul 23 09:00 — Qodo Code Review bot posts automated review catching 2 bugs: unpaginated API call and incorrect run-to-run diff comparison.
  3. Jul 23 09:17 — Author pushes fix addressing the pagination bug. Second Qodo finding (run-scoped SHA comparison) remains open.
  4. Jul 23–28 — PR sits idle for 6 days. During this window, PR Step 7: Remove scaffold agent fallback infrastructure #5552/refactor(scaffold)!: delete agent files from scaffold embed #5588 merges and deletes the entire internal/scaffold/fullsend-repo/ tree, making this PR unmergeable.
  5. Jul 29 — Human reviewer (waynesun09) identifies the critical targeting issue: the file no longer exists on main. Posts 5 additional inline findings about content problems worth porting to the correct repo.
  6. Jul 30 05:36 — Author closes PR and re-files against fullsend-ai/agents.

Agent involvement

  • No code/review/fix agent dispatched — By design. The fullsend dispatch logic requires the PR author to have write permission on the repo. Benkapner is an external contributor from a fork, so is_event_actor_authorized correctly returned false for all pull_request_target events.
  • Qodo Code Review bot — Caught 2 content bugs in the skill file additions. One was addressed by the author.
  • Retro agent — Dispatched on PR close (this run).

Review quality assessment

  • Human review was excellent. waynesun09 caught the critical structural issue (file deleted from main) plus 5 substantive inline findings about content correctness, schema compliance, and convention adherence. The review was thorough and constructive, with actionable guidance for re-filing.
  • Qodo provided complementary value on content-level bugs but could not detect the structural targeting issue.
  • No fullsend review agent ran, which is the expected security posture for fork PRs.

Evidence for existing issues (no new proposals needed)

Conclusion

The workflow functioned as designed — security gates correctly blocked agent dispatch for an external contributor, and human review eventually caught the fundamental issue. The 6-day latency was the main cost. Implementing #3488 (CI-level deprecated-path check) would have reduced this to near-zero for this class of problem. No new proposals are warranted.

Sign up for free to 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.

feat(retro): detect flapping and fix-break oscillation in retro analysis

2 participants