Skip to content

feat(#947): adopt feedback_mode: append for code and fix harnesses - #948

Merged
waynesun09 merged 1 commit into
mainfrom
agent/947-adopt-feedback-mode
Aug 23, 2026
Merged

feat(#947): adopt feedback_mode: append for code and fix harnesses#948
waynesun09 merged 1 commit into
mainfrom
agent/947-adopt-feedback-mode

Conversation

@fullsend-ai-coder

@fullsend-ai-coder fullsend-ai-coder Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add feedback_mode: append to validation_loop in harness/code.yaml and harness/fix.yaml, enabling the runner (Implement validation loop feedback so agents can self-correct fullsend#1050) to pass previous-iteration validation failure text to the agent on retry
  • Add retry-prompt handling guidance to agents/code.md ("Retry behavior" section) and skills/code-implementation/SKILL.md ("Retry-prompt handling" section before step 1), teaching the agent to fix the reported failure instead of restarting the implementation from scratch

Context

The upstream runner support for feedback_mode landed in fullsend-ai/fullsend#1050. Without this harness-side opt-in, every retry iteration was byte-identical to iteration 1 — the agent received the same constant prompt and re-rolled blindly, often reproducing the exact same failure (fullsend-ai/fullsend#5009).

With feedback_mode: append, the runner replaces the constant prompt with the default prompt plus the previous iteration's validation failure text (redacted, truncated to 10 KiB). The agent can now read the diagnostics and fix what actually failed.

Design decisions

  • max_iterations stays at 2 for both harnesses. Each iteration costs up to 35 minutes; informed retries increase value per iteration but don't reduce the cost. Can be revisited after observing improvement.
  • Only code and fix harnesses opted in. The retro harness is a strong candidate (original motivating case for fullsend#1050), but the issue scopes the initial rollout to the two most expensive retry scenarios. Remaining harnesses can follow once these are observed in the wild.

Testing

  • YAML validity verified (both harness files parse correctly)
  • Gitlint passes on the commit message
  • No test suite applies to YAML/Markdown config changes; behavioral verification requires a real run where iteration 1 fails validation and iteration 2 receives the failure text

Closes #947

Post-script verification

  • Branch is not main/master (agent/947-adopt-feedback-mode)
  • Secret scan passed (gitleaks — d021f80aea083fc3921b662b0b8534ff2433d09a..HEAD)
  • PR body secret scan passed (gitleaks — no-git)

Also fixes the roll-up defect (#954)

While validating this PR, functional-tests-complete — a required status check in this repo's ruleset — went red with no code change. Sequence: functional tests passed; the review agent then added ready-for-review; that labeled event re-fired the workflow; the gate job skipped by design (labeled is a trigger only so ok-to-test can authorize); check-rollup-result.sh read the resulting skip as "tests were not authorized" and failed the roll-up. GitHub reports the latest run per check name, so the green result was overwritten.

Because the review agent labels every PR it reviews, this hits every PR here.

The roll-up job now carries the same label carve-out as the gate, phrased so push, merge_group, workflow_dispatch and workflow_call are unaffected.

Why skip rather than exit 0. Exiting 0 would report success on a run that carries no verdict, which would let a label added after a genuinely failing run silently turn the check green. Skipping fails safe in the other direction. The residual question is how the ruleset treats a skipped conclusion on a required check — if it does not satisfy, the symptom is a PR sitting blocked rather than one falsely green, which is the right way round for a security-relevant gate.

This rides along in this PR because the coder app intentionally has no workflows write permission, so no agent can fix a workflow file.

Closes #954

Decision on the remaining harnesses and max_iterations (#947 criterion 3)

Recorded here as well as in the commit body, since the criterion asks for a decision rather than a change.

max_iterations stays at 2 for both code and fix. An informed retry raises the value of each iteration, but each still costs up to 35 minutes for code; raising it to 3 is worth revisiting once there is evidence that informed retries actually converge, not before.

The remaining five harnesses do not opt in here, and the decision is deliberately split by evidence rather than taken in bulk:

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 9:50 PM UTC · Ended 10:10 PM UTC

Commit: e2d38f5 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:11 PM UTC · Completed 10:28 PM UTC

Commit: ea87ae1 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

Review

Findings

Medium

Low

  • [edge-case] .github/scripts/check-rollup-result.sh:49 — The check-runs API query uses per_page=100 without pagination. The check_name filter narrows results to runs of functional-tests-complete only, making >100 results per commit extremely unlikely, and the script fails closed when the prior run is not found. This is a theoretical edge case that fails in the safe direction.

  • [GHA workflow command injection] .github/scripts/check-rollup-result.sh:60LABEL_NAME sanitization (tr -d '\n\r\033', replace :: with __, replace % with _) covers all known injection vectors for GHA workflow commands: literal newlines, carriage returns, ESC byte, :: command boundaries, and % characters (blocking %0A/%0D and %25 re-encoding). Practical impact remains limited: label creation requires triage/write access, and remaining injectable commands (notice, warning, error, group) cannot escalate privileges or exfiltrate secrets.

  • [incomplete-acceptance-criteria] harness/code.yaml:57 — Issue Adopt validation_loop feedback_mode: append now that the runner consumes it #947 acceptance criterion 3 requires "A decision recorded on remaining harnesses and max_iterations." The PR addresses criteria 1 and 2 but does not document a decision on the remaining five harnesses (review, retro, triage, prioritize, scribe) or whether max_iterations should change.

Previous run

Review

Findings

Medium

Low

  • [edge-case] .github/scripts/check-rollup-result.sh:49 — The check-runs API query uses per_page=100 without pagination. The check_name filter narrows results to runs of functional-tests-complete only, making >100 results per commit extremely unlikely, and the script fails closed when the prior run is not found. This is a theoretical edge case that fails in the safe direction.

  • [GHA workflow command injection] .github/scripts/check-rollup-result.sh:60LABEL_NAME sanitization (tr -d '\n\r', replace :: with __, replace % with _) covers literal newlines, :: command boundaries, and URL-encoded newlines (%0A/%0D). ANSI escape sequences are not stripped, though their exploitability in workflow commands is negligible. Practical impact remains limited: label creation requires triage/write access, and remaining injectable commands (notice, warning, error, group) cannot escalate privileges or exfiltrate secrets.

  • [step-label formatting] skills/code-implementation/SKILL.md:168 — R4 and R5 lack a blank line between them. Every other bold step label in this file is preceded by a blank line, as are R1/R2, R2/R3, and R3/R4. The missing separator breaks the established visual rhythm for step boundaries.

  • [scope-creep] agents/fix.md:188 — Issue Adopt validation_loop feedback_mode: append now that the runner consumes it #947 acceptance criteria item 2 scopes agent instruction updates to agents/code.md / skills/code-implementation. The agents/fix.md additions are a logical consequence of enabling feedback_mode on harness/fix.yaml (listed in criterion 1), but are not explicitly authorized in criterion 2.

  • [missing-documentation] docs/code.md:55docs/code.md describes the code agent as a "three-phase pipeline" (pre-script, sandbox, post-script) and omits the validation loop step entirely. The sibling docs (docs/fix.md, docs/review.md, docs/retro.md) all document their validation loop as a fourth phase. This was a pre-existing gap but is now more relevant with feedback_mode: append introducing substantive retry behavior.

  • [incomplete-documentation] docs/fix.md:70docs/fix.md describes the validation loop as "the output is checked against a schema, with up to 2 retry iterations if the output is malformed." With feedback_mode: append, retries also append the validation failure text to the agent's prompt — a behavioral detail not reflected in the current description.

Previous run (2)

Review

Findings

Medium

Low

  • [test-adequacy] .github/scripts/check-rollup-result-test.sh:122 — The test "labeled ok-to-test still requires detect to run" calls run_rollup (not run_rollup_labeled) without setting EVENT_ACTION=labeled or LABEL_NAME=ok-to-test, so the new mirror-block code path is never exercised for the ok-to-test case. The test passes via the existing "detect skipped on pull_request_target" rule, making it a functional duplicate. In production the behavior is correct (ok-to-test triggers the gate job so GATE_RESULT is never skipped, preventing entry to the mirror block), but the test does not verify that specific bypass. Consider adding a run_rollup_labeled-style call that sets LABEL_NAME=ok-to-test and GATE_RESULT=success to exercise the intended code path.

  • [edge-case] .github/scripts/check-rollup-result.sh:37 — The check-runs API query uses per_page=100 without pagination. The check_name filter narrows results to runs of functional-tests-complete only, making >100 results per commit extremely unlikely, and the script fails closed when the prior run is not found. This is a theoretical edge case that fails in the safe direction.

  • [GHA workflow command injection] .github/scripts/check-rollup-result.sh:39LABEL_NAME sanitization strips literal newlines and replaces :: sequences, but does not strip %0A or %0D substrings. GitHub Actions' workflow command parser interprets %0A/%0D as newline boundaries, so a label name containing %0A::notice::Injected could break out of the current workflow command. Practical impact is limited: label creation requires triage/write access, GitHub disabled the most dangerous commands (set-env, add-path), and remaining injectable commands (notice, warning, error, group) cannot escalate privileges or exfiltrate secrets.

  • [section-heading consistency] agents/code.md:116 — The new section is titled ## Retry behavior while the corresponding section in agents/fix.md uses ## Validation retry behavior. The fix agent's heading is more precise because it distinguishes the validation retry from the existing ## Iteration awareness section. Consider renaming to ## Validation retry behavior in agents/code.md for consistency.

  • [step-label formatting] skills/code-implementation/SKILL.md:145 — The retry steps R3 and R4 lack a blank line between them (R4 starts immediately after R3's closing code block), creating visual ambiguity about step boundaries. The rest of the file uses consistent paragraph breaks between sub-steps (e.g., 9a/9b/9c/9d).

  • [missing-documentation] docs/code.md:55docs/code.md describes the code agent as a "three-phase pipeline" (pre-script, sandbox, post-script) and omits the validation loop step entirely. The sibling docs (docs/fix.md, docs/review.md, docs/retro.md) all document their validation loop as a fourth phase. This was a pre-existing gap but is now more relevant with feedback_mode: append introducing substantive retry behavior.

  • [incomplete-documentation] docs/fix.md:70docs/fix.md describes the validation loop as "the output is checked against a schema, with up to 2 retry iterations if the output is malformed." With feedback_mode: append, the retry now also appends the validation failure text to the agent's prompt — a behavioral detail not reflected in the current description.

Previous run (3)

Review

Findings

Medium

Low

  • [test-adequacy] .github/scripts/check-rollup-result-test.sh:214 — The test "labeled ok-to-test still requires detect to run" calls run_rollup (not run_rollup_labeled) without setting EVENT_ACTION=labeled or LABEL_NAME=ok-to-test, so the new mirror-block code path is never exercised for the ok-to-test case. The test passes via the existing "detect skipped on pull_request_target" rule, making it a functional duplicate. In production the behavior is correct (ok-to-test triggers the gate job so GATE_RESULT is never skipped, preventing entry to the mirror block), but the test does not verify that specific bypass. Consider adding a run_rollup_labeled-style call that sets LABEL_NAME=ok-to-test and GATE_RESULT=success to exercise the intended code path.

  • [edge-case] .github/scripts/check-rollup-result.sh:51 — The check-runs API query uses per_page=100 without pagination. If a commit accumulates more than 100 check runs (from many workflow re-runs or external CI), the functional-tests-complete check run from a prior workflow may not appear in the first page, causing the script to fail closed even when a prior success exists. This is unlikely for typical repositories and fails in the safe direction.

  • [GHA workflow command injection] .github/scripts/check-rollup-result.sh:59LABEL_NAME is interpolated unsanitized into ::notice:: and ::error:: workflow commands (lines 59 and 62). LABEL_NAME originates from github.event.label.name, which is controlled by anyone with triage/write access. A label name containing :: sequences could inject workflow commands. Practical impact is limited: GitHub disabled the most dangerous commands (set-env, add-path), label creation requires triage access, and remaining injectable commands cannot escalate privileges or exfiltrate secrets.

  • [line-length consistency] skills/code-implementation/SKILL.md:347 — The edited "Open PR/MR exists" bullet produces a line significantly longer than the surrounding prose (~72-80 character wrapping) because the parenthetical insertion pushed existing text further right without re-wrapping.

Previous run (4)

Review

Findings

Medium

  • [protected-path] agents/code.md, harness/code.yaml, harness/fix.yaml, skills/code-implementation/SKILL.md — All changed files fall under protected paths (agents/, harness/, skills/). The PR links to issue Adopt validation_loop feedback_mode: append now that the runner consumes it #947 which explicitly authorizes these changes, and the PR description explains the rationale. Human approval is required for protected-path changes regardless of context.

Low

  • [consumer-completeness] harness/fix.yaml:38 — The PR adds feedback_mode: append to the fix harness without adding corresponding retry-prompt handling guidance to agents/fix.md or skills/fix-review/SKILL.md. The code agent receives detailed retry documentation in both agents/code.md (new "Retry behavior" section) and skills/code-implementation/SKILL.md (new "Retry-prompt handling" subsection), but the fix agent has no equivalent. The fix agent's existing iteration awareness (FIX_ITERATION, escalation logic) and structured-output re-validation guidance in its step 9 mitigate this gap, and issue Adopt validation_loop feedback_mode: append now that the runner consumes it #947's acceptance criteria explicitly scope the retry-prompt teaching to the code agent only. Consider adding a brief note about recognizing the retry sentinel string in a follow-up.

  • [edge-case] skills/code-implementation/SKILL.md:151 — The retry-prompt handling step 2 references step 4 for branch recovery ("follow step 4, which handles existing branches properly — it scopes the search to this issue's number"). Step 4 requires the issue number, but the retry path skips step 1 (Identify the issue) where the issue is normally discovered. The ISSUE_NUMBER env var is set by the harness and will be available, so this works in practice, but the retry documentation does not mention that the issue number comes from the environment variable rather than from the skipped step 1.

fullsend-ai-review[bot]

This comment was marked as outdated.

@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.

All checks green (13 pass) after re-triggering functional-tests with ok-to-test — the earlier functional-tests-complete failure was the roll-up defect filed as #954, where a label added by the review agent re-fires the workflow, the gate skips by design, and the roll-up reads that skip as "unauthorized". No code involvement.

Local validation on ea87ae1: YAML parsed to confirm feedback_mode: append nests inside validation_loop in both harnesses; step references (9 implement-and-verify, 10 commit, 11 validate output) checked against the file; test-merged against #946 with no conflict; pre-commit clean including lint agent doc references and structure.

Noting for the record that I amended and force-pushed this branch: the sentinel-based retry detection, the deferral of branch handling to step 4, and the "Do not skip steps" qualification are my changes, not the coder agent's. This approval is therefore not an independent review of that portion.

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from ea87ae1 to 026b4b8 Compare August 22, 2026 22:39
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 10:41 PM UTC · Ended 10:50 PM UTC

Commit: 026b4b8 · View workflow run →

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from 026b4b8 to 457f82f Compare August 22, 2026 22:49
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 10:52 PM UTC · Ended 10:56 PM UTC

Commit: 457f82f · View workflow run →

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from 457f82f to e841266 Compare August 22, 2026 22:55
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 10:58 PM UTC · Ended 11:08 PM UTC

Commit: e841266 · View workflow run →

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from e841266 to 024256d Compare August 22, 2026 23:08
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:10 PM UTC · Completed 11:29 PM UTC

Commit: 024256d · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from 024256d to 9e613c9 Compare August 22, 2026 23:32
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:33 PM UTC · Completed 12:14 AM UTC

Commit: 9e613c9 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from 9e613c9 to 362787a Compare August 23, 2026 00:16
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 23, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:18 AM UTC · Completed 12:59 AM UTC

Commit: 362787a · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

Enable validation_loop feedback so retry iterations receive
the previous iteration's failure diagnostics instead of a
blind re-roll. The runner (fullsend#1050) replaces the
constant prompt with the default prompt plus the redacted,
truncated (10 KiB) failure text.

Changes:
- harness/code.yaml: add feedback_mode: append
- harness/fix.yaml: add feedback_mode: append
- agents/code.md: add "Retry behavior" section describing
  how the agent should handle retry prompts
- skills/code-implementation/SKILL.md: add "Retry-prompt
  handling" section before step 1 with concrete procedure
  for fixing validation failures without restarting

Design decisions:
- max_iterations stays at 2 for both harnesses. Informed
  retries increase value per iteration but each still costs
  up to 35 minutes; revisit after observing improvement.
- Remaining harnesses (retro, triage, review, scribe,
  prioritize) not opted in yet. Retro is a strong candidate
  (fullsend#1050 motivating case) but the issue scopes this
  to code and fix first.

Retry detection matches the runner's literal sentinel ("The previous
iteration's output failed validation. Here is the validation error:")
rather than a description of the text's shape, so the agent can tell a
retry from a first iteration deterministically.

The retry path defers branch handling to step 4 instead of re-deriving
it. A retry runs in the same sandbox with the branch already checked
out and the previous commits still on it, so there is nothing to check
out; and where recovery is genuinely needed, step 4 already scopes the
search to this issue's number and explains why local refs must be used
rather than origin/ ones. It also states there is no feedback file to
read — the runner writes validation-feedback.txt on the runner for the
audit trail and never uploads it into the sandbox.

The "Do not skip steps" line above the process now names the retry path
as its one exception, which the new section would otherwise contradict.

Review follow-ups: agents/fix.md gains a "Validation retry behavior"
section, since enabling feedback_mode on the fix harness without telling
the fix agent what a retry prompt looks like left the two agents
asymmetric. It is kept distinct from the existing FIX_ITERATION section,
which counts runs of the review->fix loop rather than retries within one
run. The code-implementation retry step also now says to take the issue
number from ISSUE_NUMBER when deferring to step 4, since the retry path
skips step 1 where the issue is normally identified.

Also fix the functional-tests roll-up so a label change stops repainting
an already-green required check red.

`labeled` is in this workflow's pull_request_target trigger list solely so
ok-to-test can authorize a run. For any other label the gate job's own
`if:` skips, detect skips with it, and functional-tests-complete read that
as "tests were not authorized" and failed — so the review agent adding
ready-for-review to a PR whose tests had just passed turned a required
check red with no code change. That is what happened on this PR.

Such a run carries no verdict about the code, but it cannot stay silent
either: GitHub supersedes the previous check run of the same name with
whatever this one reports. Neither constant answer is safe. Exiting 0
would launder a genuinely failing run green the moment anyone labelled
the PR. Guarding the job with the gate's own `if:` was tried and has the
same hole one layer up — a skipped job still publishes a check run that
supersedes, and `skipped` satisfies a required check.

So the roll-up now mirrors the verdict the previous run reached on this
same commit, and fails closed when there is no previous verdict to
mirror. Green stays green, red stays red, and a first label before any
test run is an error rather than a free pass. The lookup is a read-only
check-runs query excluding this run's own check, so the fix stays inside
the base-branch-checkout boundary the job already documents; the job
gains `checks: read` for it.

Five cases added to check-rollup-result-test.sh, including that a
previous failure and a previous cancellation are not laundered, and that
ok-to-test still falls through to the normal rules (19 tests, 0 failures).

This rides along here because the coder app intentionally has no
`workflows` write permission, so no agent can fix a workflow file.

Review round two (Grok, read-only) found five live defects in the retry
guidance itself, all fixed here:

- The retry path skipped step 1, where AGENT_START is captured. At step 9
  the time checks would then subtract an unset variable from the clock,
  conclude the budget was exhausted, and skip pre-commit and gitlint on
  the one iteration that most needs them. The retry path now starts its
  own clock first.
- The runner clears the output directory between iterations, so the
  previous agent-result.json is gone. Nothing said to write it again, so
  a retry could fix the reported problem and then fail validation for a
  second, different reason. Now stated in both the skill and agents/fix.md,
  and in step 4's existing-PR branch which assumed step 3 had written it.
- The sentinel was wrapped across two blockquote lines while the prose
  called it an "exact sentence"; a literal match would miss it. Now one
  line in all three files.
- Retry sub-steps were numbered 1-4, colliding with process steps 1-11.
  Relettered R1-R6.
- The "cannot tell what failed, fall through to step 1" escape hatch
  undid the anti-duplication guarantee. It now points at step 4's
  treat-existing-work-as-yours path rather than a clean restart, and a
  JSON-only fix with nothing to commit is called out as a correct
  outcome rather than a reason to manufacture a code change.

agents/fix.md gains the same clock and output-file notes, and says the
fix-review skill's "follow these steps in order" describes a first
iteration.

Review round three tightened the roll-up query and its logging:

- The check-runs lookup now filters server-side with check_name, so only
  this one check's history is paged over. A commit can easily exceed 100
  check runs in total, which would have pushed a prior success off the
  first page and failed closed against a genuinely green PR.
- LABEL_NAME reaches ::notice::/::error:: lines and is settable by anyone
  with triage access, so the workflow-command delimiter and newlines are
  stripped first.

Review round four:

- The ok-to-test test never entered the mirror block — it went through
  run_rollup, so it passed on the pre-existing "detect skipped" rule and
  was a functional duplicate. It now drives run_rollup_labeled with a
  stubbed prior success, asserting that ok-to-test declines to mirror and
  falls through to the normal rules.
- Label sanitisation stripped literal newlines but not %0A/%0D, which the
  workflow-command parser decodes as line breaks; %25 could rebuild them.
  Every percent sign is now neutralised too.
- agents/code.md's heading becomes "Validation retry behavior", matching
  agents/fix.md — the more precise of the two, since it distinguishes the
  within-run retry from cross-run iteration counting.
- Blank line between retry steps R3 and R4.

Review round five: drop ESC from the label sanitiser so a label cannot
smuggle ANSI into a log line, and add the missing blank line between
retry steps R4 and R5.

Closes #947
Closes #954

Assisted-by: Claude (review, fix)
Signed-off-by: Wayne Sun <gsun@redhat.com>
@waynesun09
waynesun09 force-pushed the agent/947-adopt-feedback-mode branch from 362787a to 63422b4 Compare August 23, 2026 01:00
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 23, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 1:02 AM UTC · Completed 1:19 AM UTC

Commit: 63422b4 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot 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.

Note: The following review comments could not be posted on the diff (GitHub returned 422) and are included here instead:

  • .github/scripts/check-rollup-result.sh (file-level): Line 1 · [medium] scope-bundling

This PR bundles work for two independent issues: #947 (adopt feedback_mode: append) and #954 (fix roll-up check on label events). The CI/workflow changes are entirely for #954 and share no code or logical dependency with the #947 feedback_mode work. The PR title references only #947, obscuring the #954 scope.

Suggested fix: Split the #954 roll-up fix into its own PR, or at minimum update the PR title to reflect both issues.

@fullsend-ai-review fullsend-ai-review Bot 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.

See the review comment for full details.

Comment thread .github/scripts/check-rollup-result.sh
Comment thread .github/scripts/check-rollup-result.sh
Comment thread harness/code.yaml
Merged via the queue into main with commit c71d143 Aug 23, 2026
109 checks passed
@waynesun09
waynesun09 deleted the agent/947-adopt-feedback-mode branch August 23, 2026 01:22
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 23, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 1:24 AM UTC · Completed 1:38 AM UTC

Commit: 63422b4 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #948 — adopt feedback_mode: append + rollup fix

Code agent performed well: completed in 4m14s / $1.92, addressed the two actionable acceptance criteria from #947 (setting feedback_mode: append in code and fix harnesses, adding retry-prompt handling guidance to agents/code.md and skills/code-implementation/SKILL.md). Wayne manually added the #954 rollup fix (workflow files the code agent cannot modify) and iteratively hardened the code based on review feedback.

Review agent ran 5 substantive rounds across ~3.5 hours, producing genuinely valuable findings — most notably a progressive hardening of GHA workflow command injection sanitization across 4 rounds (literal newlines → ::%0A/%0D → ANSI ESC). It also caught a missing retry-guidance section for the fix agent, a test not exercising the intended code path, and documentation inconsistencies. All addressed findings led to real improvements.

Inefficiencies observed:

  1. Repeated resolved finding — the per_page=100 pagination edge-case was raised 4 times. After Wayne added a server-side check_name filter in Round 3, the agent acknowledged in its own analysis that the filter narrows results adequately but still surfaced the finding in Rounds 3–5. Existing issue Review agent should explicitly resolve or persist prior-iteration findings on re-review #685 directly addresses this pattern. This PR provides additional evidence: 3 of 5 rounds included a finding the agent's own text acknowledged was mitigated.

  2. Self-contradicting findings — in Round 1, the agent filed a consumer-completeness finding requesting retry guidance in agents/fix.md. Wayne added it. In Round 4, the agent flagged those same additions as scope-creep. Wayne correctly pointed out the contradiction. Existing issue Review agent should reconcile findings against its own prior remediation suggestions #372 covers this pattern. This PR is a clear example where the agent asked for a change and then flagged it as unauthorized.

  3. Incremental injection vector discovery — the security sub-agent discovered bypass vectors one per round across 4 iterations, each requiring a separate commit. The sub-agent's definition already enumerates the full GHA workflow command injection checklist (security.md lines 23–33), but the initial finding reported only that the variable was unsanitized without listing all vectors the remediation must cover. One proposal filed below.

Existing issue evidence (no duplicate proposals filed):

Proposals filed

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

Labels

ok-to-test ready-for-review Triggers review agent dispatch requires-manual-review Review requires human judgment

Projects

None yet

1 participant