fix(apm-review-panel): require synchronous fan-out so the panel never ends its turn with empty safe outputs#1712
Closed
Copilot wants to merge 4 commits into
Closed
fix(apm-review-panel): require synchronous fan-out so the panel never ends its turn with empty safe outputs#1712Copilot wants to merge 4 commits into
Copilot wants to merge 4 commits into
Conversation
Co-authored-by: danielmeppiel <51440732+danielmeppiel@users.noreply.github.com>
…s turn with empty safe outputs Co-authored-by: danielmeppiel <51440732+danielmeppiel@users.noreply.github.com>
…ion-confirmation in skill guidance Co-authored-by: danielmeppiel <51440732+danielmeppiel@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Fix workflow failure in PR review panel
fix(apm-review-panel): require synchronous fan-out so the panel never ends its turn with empty safe outputs
Jun 9, 2026
2 tasks
Collaborator
|
Superseded by #1714, which audited this fix and rebuilt it around a stronger contract: a deterministic "Non-empty turn exit" invariant keyed off gh-aw's own |
danielmeppiel
added a commit
that referenced
this pull request
Jun 9, 2026
…fan-out (#1714) * fix(apm-review-panel): guarantee non-empty turn exit via synchronous fan-out PR Review Panel runs could report success yet open a "No Safe Outputs Generated" failure: the orchestrator spawned the CEO synthesizer in background/detached mode and ended its turn before synthesis returned, so agent_output was empty, gh-aw skipped safe-output detection, and the add-comment job never ran. This hardens the apm-review-panel skill prose -- the correct (and only) layer, since no deterministic tool can force an orchestrator LLM to await its own subagent or keep its turn open: - New "Non-empty turn exit" invariant framed on gh-aw's actual detection mechanism: every turn ends with >=1 safe output -- the rendered comment, or an explicit `noop` (a real, configured safe-output) -- never empty. - New "Synchronous fan-out" invariant: every task spawn (panelists + CEO) is BLOCKING; describes the blocking-vs-detached affordance, not vendor syntax. - Step 5 (CEO spawn) point-of-use blocking anchor; checklist-intro anchor. - New step 9: guarantee a non-empty exit, with the `noop` fallback as the deterministic backstop. - New gotcha cataloguing background spawn-and-forget as the canonical empty-output cause. Supersedes the approach in #1712; the lockfile is unchanged (it tracks dependency resolution, not skill body content) and no workflow recompile is needed (the workflow pulls SKILL.md from main at runtime). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chore(apm-review-panel): re-sync deployed .agents/skills copy with source The committed deployed copy under .agents/skills/apm-review-panel/ had drifted from packages/apm-review-panel/ (the source): it predated the performance-expert persona (SKILL.md 415 vs 446 lines; schema enum + description both missing performance-expert). Re-deployed via `apm install --target agent-skills` so the deployed copy matches source again -- this also carries the synchronous-fan-out fix from the parent commit. The deployed SKILL.md diff is larger than the source fix because it folds in the pre-existing performance-expert drift; both deployed files are now byte-identical to packages/. Scope notes: - Lockfile intentionally NOT touched. The committed apm.lock.yaml is a copilot-target lockfile (deployed_files: copilot-app-db://workflows/...) and does not govern .agents/skills/ at all -- which is precisely why the audit/integrity gate never caught this drift. Retargeting it to agent-skills here would be out of scope and would corrupt the evidence for the separate root-cause investigation. - Other pre-existing .agents/skills drift (e.g. an undeployed cut-release skill) is left for that investigation rather than folded in here. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: danielmeppiel <danielmeppiel@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
PR Review Panel run 27194415500 reported
successyet opened a "No Safe Outputs Generated" failure.gh aw audittraced the chain: the orchestrator spawned the CEO synthesizer in background/detached mode and ended its turn before the synthesis returned, so the singleadd-commentwas never emitted.The
apm-review-panelskill never stated that subagenttaskspawns are blocking, nor that the turn must not end before the comment is written. Fix is prompt-hardening inpackages/apm-review-panel/SKILL.md(the copy the workflow pulls frommicrosoft/apm#main; no workflow recompile needed).taskspawn (panelists and CEO) must use synchronous mode, never the background/asyncagent_idvariant; documents the empty-output failure chain and thenoopfallback.add-commentsafe-output tool was actually invoked (and did not error) before ending the turn.gh awdebug logs accidentally captured under.github/aw/logs/.Type of change
Testing
Prompt-only change to a skill primitive; no code paths or tests exercise
SKILL.mdcontent. Verified the checklist still reads coherently (steps 1–9, cross-references intact).Spec conformance (OpenAPM v0.1)
If this PR changes behaviour that an OpenAPM v0.1
req-XXXcovers,confirm the three-step ritual (see CONTRIBUTING.md "Adding or
changing a normative requirement"):
docs/src/content/docs/specs/openapm-v0.1.mdupdated(new/changed
<a id="req-XXX"></a>anchor + prose + Appendix Crow).
docs/src/content/docs/specs/manifests/openapm-v0.1.requirements.ymlupdated.
@pytest.mark.req("req-XXX")test undertests/spec_conformance/added or extended.CONFORMANCE.{md,json}regenerated viauv run --extra dev python -m tests.spec_conformance.gen_statementand committed.