Skip to content

fix(pr-review): dispatch sub-agents by persona when the runtime registers them - #1211

Merged
waynesun09 merged 8 commits into
mainfrom
pr-review-persona-dispatch
Sep 9, 2026
Merged

fix(pr-review): dispatch sub-agents by persona when the runtime registers them#1211
waynesun09 merged 8 commits into
mainfrom
pr-review-persona-dispatch

Conversation

@waynesun09

@waynesun09 waynesun09 commented Sep 8, 2026

Copy link
Copy Markdown
Member

What

The pr-review skill tells the orchestrator how to dispatch its sub-agents. On pi (fullsend 0.42.0 and later) the runtime registers sub-agents/*.md as personas and its runtime note says: dispatch with subagent_type: <persona name> and no model; the runner resolves each persona's model from the repository's agents[].subagents and the file's frontmatter (fullsend ADR 0104). Step 4 item 2 said the opposite — "model set from each sub-agent file's frontmatter … Do not set subagent_type" — and the orchestrator follows the skill over the note.

This PR makes the dispatch shape depend on the runtime note, in the four places that dispatch: step 3c-1 (security-triage), 3c-2 (risk-assessment), step 4 item 2 (dimension sub-agents) and 6d (challenger):

runtime note subagent_type model
lists registered personas (pi) the persona name omitted — the runner resolves it
lists none (Claude Code) not set (Explore for security-triage, as today) from the sub-agent frontmatter, as today

Claude Code behaviour is unchanged: there the personas are not registered agent types, an unknown subagent_type is a hard error, and the frontmatter model argument is what routes children.

Evidence

Local fullsend run review on 2026-09-08 (fullsend built from main, agents main at a359832, 0.42.0 image) with a repository config that routes correctness, security and challenger to xai/grok-4.6 and docs-currency, style-conventions to google-vertex/gemini-3.8-flash:

  • Bootstrap resolved all nine personas exactly as configured (subagents: correctness → xai-vertex/xai/grok-4.6 (from subagents.correctness), …).
  • Every child then ran as an anonymous sub-agent with a model argument: [fullsend-agent] #1 anthropic-vertex/claude-opus-4-6 start "Correctness review", #2 … claude-opus-4-6 "Security review", #4 … claude-sonnet-5 "Style conventions review", #5 … claude-sonnet-5 "Docs currency review" — no [persona] tag, none on Grok or Gemini.

The "Do not set subagent_type" line arrived in #1178 (merged 2026-09-05), after the run that verified persona dispatch on pi with the then-current skill.

Validation

  • The same local review run repeated on this branch must show [fullsend-agent] #n [correctness] xai-vertex/xai/grok-4.6 start … for the routed personas and per_model_usage with five models. Result will be posted here.
  • chore(config): route agents across runtimes and models #1209 (per-repo routing config) depends on this and is held until it merges.

Also in this PR (docs)

Alongside the four pr-review dispatch sites, this PR corrects the pi runtime-support
documentation that described the old behaviour:

  • docs/review.md — pi review runs the sub-agent roster, each persona with its own model,
    rather than a single-context fallback.
  • docs/retro.md and the README runtime matrix — same correction for retro, whose
    sub-agents are anonymous and therefore inherit the agent's model. The retro wording is
    deliberately NOT identical to review's: retro ships no sub-agents/ persona files, so
    "sub-agents run with the agent model" is the accurate phrasing for it.

These are the same behaviour this PR fixes in the skill, so they are in scope; calling them
out here explicitly at the review bot's request.

Rollback

Revert; the skill goes back to frontmatter-model dispatch on every runtime.

…ters them

Since fullsend 0.42.0 the pi runtime registers the skill's sub-agents/*.md
files as personas: the orchestrator dispatches one with
subagent_type: <persona name> and no model, and the runner resolves the
model from the repository's agents[].subagents config and the file's
frontmatter (fullsend ADR 0104). The runtime note in the system prompt
says exactly that.

Step 4 item 2, however, said the opposite — pass model from the
frontmatter and "Do not set subagent_type" — and the orchestrator
followed the skill over the note. Measured on 2026-09-08 with a repo
that routes correctness, security and challenger to Grok and the two
document checks to Gemini: Bootstrap resolved all nine personas as
configured, then every child ran on opus-4-6 or sonnet as an anonymous
sub-agent with a model argument. The per-repo routing was inert.

Make the dispatch shape depend on the runtime note: persona name and no
model when personas are listed, frontmatter model and no subagent_type
otherwise (Claude Code, where the personas are not registered agent
types and an unknown subagent_type is a hard error). Apply the same
rule to the security-triage pre-pass, risk-assessment and the
challenger.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Route PR review sub-agents through registered personas

🐞 Bug fix ⚙️ Configuration changes 🕐 10-20 Minutes

Grey Divider

AI Description

• Dispatches registered pi personas by name so repository model routing takes effect.
• Preserves frontmatter-model dispatch where Claude Code does not register personas.
• Applies runtime-aware dispatch across triage, risk, review, and challenger agents.
Diagram

graph TD
  A["Review orchestrator"] --> B["Dispatch phase"] --> C{"Personas listed?"}
  C -->|pi| D["Persona dispatch"] --> E["Runner model resolution"]
  C -->|Claude Code| F["Frontmatter model"] --> G["Claude Code agent"]
Loading
High-Level Assessment

The runtime-aware split is the appropriate approach because pi requires registered persona names for repository-level model routing, while Claude Code rejects those names and still requires explicit models. Always using persona dispatch would break Claude Code, and always passing models would continue bypassing pi routing.

Files changed (1) +28 / -9

Bug fix (1) +28 / -9
SKILL.mdMake review-agent dispatch aware of registered runtime personas +28/-9

Make review-agent dispatch aware of registered runtime personas

• Updates security triage, risk assessment, dimension review, and challenger instructions to use persona-based dispatch when the runtime registers personas. Retains existing explicit frontmatter-model behavior for Claude Code, including the read-only Explore type for security triage.

skills/pr-review/SKILL.md

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 8:36 PM UTC · Ended 8:38 PM UTC

Commit: f4e46e4 · View workflow run →

@qodo-code-review

qodo-code-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (2)

Grey Divider


Action required

1. Persona routing lacks regression tests 📜 Skill insight ▣ Testability
Description
SKILL.md changes four dispatch paths to branch on the runtime note and choose either a registered
persona or a frontmatter model, but this PR adds or updates no automated test for either branch. A
wording or runtime-note format change can now send agents through the wrong routing path without a
test detecting the model or persona mismatch.
Code

skills/pr-review/SKILL.md[R807-810]

+   - **The runtime note lists registered sub-agent personas (pi).** Set
+     `subagent_type` to the persona name — the sub-agent file's `name:`
+     (`correctness`, `security`, `style-conventions`, ...) — and do
+     **not** pass `model`. The runner resolves each persona's model from
Relevance

●●● Strong

Recent precedent accepts behavioral evaluation coverage for new skill guidance.

PR-#1096

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Compliance rule 1538339 requires every behavioral change to have a corresponding test change. The
supplied PR changes the dispatch behavior in SKILL.md, while its diff contains no new or modified
test file.

skills/pr-review/SKILL.md[803-817]
Skill: code-implementation

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 persona-routing behavior changes without a corresponding automated test.

## Issue Context
Cover both runtime modes: registered personas must use `subagent_type` without `model`, while runtimes without personas must use the frontmatter model and the documented fallback agent type.

## Fix Focus Areas
- skills/pr-review/SKILL.md[803-817]

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


2. Human review is required for this skill 📜 Skill insight § Compliance
Description
skills/pr-review/SKILL.md is under the checklist's protected skills/ path, and this PR modifies
its agent-dispatch instructions. These instructions control which persona and model review code, so
the governance-sensitive update requires human approval before merge.
Code

skills/pr-review/SKILL.md[R807-810]

+   - **The runtime note lists registered sub-agent personas (pi).** Set
+     `subagent_type` to the persona name — the sub-agent file's `name:`
+     (`correctness`, `security`, `style-conventions`, ...) — and do
+     **not** pass `model`. The runner resolves each persona's model from
Evidence
Compliance rule 1538392 explicitly designates skills/ as a protected path and requires a finding
whenever it is modified. The cited change alters dispatch behavior in skills/pr-review/SKILL.md;
although the PR explains the reason, the rule still requires human approval.

skills/pr-review/SKILL.md[807-817]
Skill: pr-review



Remediation recommended

3. Operators get the wrong review mode ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
SKILL.md now directs the pi runtime to dispatch registered personas concurrently, while the
runtime-support documentation still labels pi reviews as single-context. Whenever operators select
pi, both the review guide and top-level agent matrix therefore describe an execution model that no
longer matches the orchestrator.
Code

skills/pr-review/SKILL.md[R807-810]

+   - **The runtime note lists registered sub-agent personas (pi).** Set
+     `subagent_type` to the persona name — the sub-agent file's `name:`
+     (`correctness`, `security`, `style-conventions`, ...) — and do
+     **not** pass `model`. The runner resolves each persona's model from
Relevance

●●● Strong

Recent precedent accepts correcting contradictory documentation across related review skills.

PR-#1038

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The changed skill explicitly selects persona-based dispatch for pi and elsewhere mandates
simultaneous Agent calls. The detailed runtime guide and README still state that pi reviews run in
single-context mode, directly contradicting the new execution path.

skills/pr-review/SKILL.md[803-820]
docs/review.md[247-251]
README.md[7-17]

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 PR enables registered-persona dispatch for pi reviews, but existing documentation still says pi uses a single-context review. Update the documentation to describe the new parallel persona-dispatch behavior and its runtime requirements.

## Issue Context
The skill now requires simultaneous persona dispatch when the runtime note lists registered personas. Both the detailed review guide and README runtime matrix retain the previous single-context description.

## Fix Focus Areas
- docs/review.md[247-251]
- README.md[7-17]

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


Grey Divider

Context sources
✅ Compliance rules (platform): 57 rules
✅ Skills: 4 invoked
  code-review
  code-implementation
  pr-review
  docs-review
✅ Cross-repo context — repo relationships
  Explored: repo: fullsend-ai/fullsend (branch: main, sha: e4749da8)
Review mode: ⚖️ Balanced: This changes runtime-dependent sub-agent dispatch behavior across four orchestration paths, with contract-sensitive persona/model selection, but is not sufficiently bug-dense to warrant extended review.

Grey Divider

Tip of the day
💡 Did you know, you can commit Qodo's fix in one click with committable suggestions (GitHub & GitLab)

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread skills/pr-review/SKILL.md Outdated
Comment thread skills/pr-review/SKILL.md Outdated
Comment thread skills/pr-review/SKILL.md Outdated
…rsona

Review feedback: the authoritative persona list is the runtime note's,
which holds only the personas this run registered — a persona whose
frontmatter model the project cannot serve is dropped at Bootstrap, and
dispatching its name is a hard rejection, not a fallback. Say "as
listed in the runtime note", and send an unlisted persona anonymously
with its frontmatter model instead of dropping the dimension. Also make
the Claude Code case observable: there is no runtime note there at all,
so the condition is its absence, not an empty list.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
…default

A persona is left unregistered on pi when this run cannot serve its
model, so falling back to the frontmatter alias would be rejected for
the same reason (the extension validates a non-empty model against the
run's model table). Omit both subagent_type and model instead: the
child takes the run's sub-agent default, which is always servable. The
Claude Code case keeps the frontmatter model.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Ended 8:40 PM UTC

Commit: 9b4e075 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:41 PM UTC · Completed 8:59 PM UTC

Commit: 46a779a · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.47

@fullsend-ai-review fullsend-ai-review Bot added the risk/moderate PR risk: moderate label Sep 8, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

Risk Assessment: elevated (3/5)

Details

Tier 1 signals are unchanged from the prior assessment (5 files, 91 lines, 1 protected path, zero test coverage, medium blast radius, no dependency or CI changes); Tier 2 confirms the same highly volatile pattern (49 commits in 30d, 12 authors, 76 fix/revert commits in 90d); composite of 2.84 rounds to 3 and re-review anchoring preserves the prior elevated score.

Previous run

Risk Assessment: elevated (3/5)

Details

Tier 1 and Tier 2 signals are unchanged from the prior assessment — five files, one protected path, zero test coverage, medium blast radius, with docs/review.md (10 distinct authors, 17 commits in 30d, 26 fix commits) and skills/pr-review/SKILL.md (54 cumulative fix commits, 18 in 30d) remaining highly volatile; per re-review anchoring, the prior elevated score of 3 is preserved.

Previous run (2)

Risk Assessment: elevated (3/5)

Details

Prior assessment described a two-file change; the current PR spans five files (88 lines, medium blast radius), adding the highly volatile docs/review.md (10 distinct authors, 17 commits in 30d, 26 fix commits) to scope alongside SKILL.md already-elevated churn, pushing the weighted composite from the prior moderate 2 to an elevated 3.

Previous run (3)

Risk Assessment: moderate (2/5)

Details

A small two-file, 78-line documentation and baseline update to a high-churn, multi-author skills file; SKILL.md's 9 distinct authors and 18 commits in 30 days continue to elevate the git-history sub-score, but the change itself is narrow in scope and touches no security-sensitive or CI-critical paths, sustaining the prior moderate score.

Previous run (4)

Risk Assessment: moderate (2/5)

Details

A small, single-file documentation change to a high-churn, multi-author skills file; the underlying file's churn history elevates the score slightly above low, but the change itself is narrow in scope and touches no security-sensitive or CI-critical paths.

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

Review

Findings

High

  • [protected-path] skills/pr-review/SKILL.md — This PR modifies skills/pr-review/SKILL.md, which is under the protected path skills/. The PR has no linked issue providing formal authorization for modifying governance/infrastructure files. Human approval is required for protected-path changes.
    Remediation: Link a tracking issue to this PR that authorizes the modification of the pr-review skill's dispatch behavior, or obtain explicit human approval.

Low

  • [logic-error] skills/pr-review/SKILL.md:465 — The sentence "It uses haiku for speed — classification does not require deep reasoning" is an unqualified statement that only holds for the Claude Code dispatch case. On pi, the model is resolved by the runner (case 1) or defaults to the sub-agent default (case 3), and is not guaranteed to be haiku.

  • [missing-authorization] skills/pr-review/SKILL.md — No linked issue with a closing keyword authorizes this change. The fullsend-no-fix label remains the apparent process exemption.

  • [scope-creep] docs/retro.md:105 — The PR body now explicitly claims the retro.md update as in-scope. However, the doc update replaces "single-context mode" with a claim that retro sub-agents run with the agent model on pi, but the retro skill's SKILL.md is not in this diff — the doc may be ahead of any corresponding skill change visible in this PR.

  • [naming-convention] docs/retro.md:105 — Sibling doc files docs/retro.md and docs/review.md use non-parallel phrasing for the same pi runtime sub-agent behaviour. retro.md says "sub-agents run with the agent model"; review.md says "each sub-agent runs with its own model". The two phrases carry different meanings.

  • [naming-convention] skills/pr-review/SKILL.md:459 — The security-pre-pass step 4 third bullet uses an ordinal cross-reference "step 4 item 2 case 3", but the target bullets use descriptive bold labels, not numbered cases. The ordinal is unanchored and "step 4 item 2" is ambiguous within the sub-procedure's own step 4.
    Remediation: Either add explicit case labels to the main dispatch bullets or replace ordinal references with the descriptive labels.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

High

  • [protected-path] skills/pr-review/SKILL.md — This PR modifies skills/pr-review/SKILL.md, which is under the protected path skills/. The PR has no linked issue providing formal authorization for modifying governance/infrastructure files. Human approval is required for protected-path changes.
    Remediation: Link a tracking issue to this PR that authorizes the modification of the pr-review skill's dispatch behavior, or obtain explicit human approval.

Low

  • [logic-error] skills/pr-review/SKILL.md:816 — Step 4 item 2 case 2 says "model from the sub-agent frontmatter (opus for correctness and security, sonnet for the rest)". Step 6d (line 985) references "the step 4 item 2 dispatch shape (persona challenger)". The parenthetical omits the challenger (which is also opus per its frontmatter), so an LLM might apply the "sonnet for the rest" shortcut instead of reading the challenger's frontmatter.
    Remediation: Either expand the parenthetical to "opus for correctness, security, and challenger, sonnet for the rest", or add a note in step 6d that the challenger's frontmatter model is opus.

  • [logic-error] skills/pr-review/SKILL.md:465 — The sentence "It uses haiku for speed — classification does not require deep reasoning" is an unqualified statement that only holds for the Claude Code dispatch case (case 2). On pi, the model is either resolved by the runner (case 1) or defaults to the sub-agent default (case 3), and is not guaranteed to be haiku.

  • [missing-authorization] skills/pr-review/SKILL.md — No linked issue with a closing keyword authorizes this change. The PR body references fix(#1177): size the review budget from the pipeline floor, materialise the PR head once #1178 (closed/merged) as the regression source and chore(config): route agents across runtimes and models #1209 as a downstream dependent, but these are context references rather than formal authorization tickets. The fullsend-no-fix label suggests an alternative process approval was applied.
    Remediation: Link a tracking issue and reference it with a closing keyword (e.g. "Fixes #NNNN") in the PR body, or confirm that the fullsend-no-fix label is the project's accepted override mechanism for emergency regression fixes.

  • [scope-creep] docs/retro.md:105 — The PR title is scoped to fix(pr-review) and the PR body describes changes to four dispatch sites in the pr-review skill only. However, docs/retro.md and the README's Retro row are also updated to remove the "single-context mode" framing for pi. The retro agent is not mentioned in the PR body.
    Remediation: Either mention the retro documentation update explicitly in the PR body to bring it within scope, or split the retro docs fix into a separate PR.

  • [naming-convention] docs/retro.md:105 — Sibling doc files docs/retro.md and docs/review.md use non-parallel phrasing for the same pi runtime sub-agent behaviour. retro.md says "sub-agents run with the agent model"; review.md says "each sub-agent runs with its own model". The two phrases carry different meanings: the retro phrasing implies all sub-agents share the parent agent's model, while the review phrasing implies each sub-agent uses its individually configured model.
    Remediation: Align the wording. Prefer the review.md phrasing ("each sub-agent runs with its own model") or mirror it exactly across both files.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (2)

Review

Findings

High

  • [protected-path] skills/pr-review/SKILL.md — This PR modifies skills/pr-review/SKILL.md, which is under the protected path skills/. The PR has no linked issue providing formal authorization for modifying governance/infrastructure files. Human approval is required for protected-path changes.
    Remediation: Link a tracking issue to this PR that authorizes the modification of the pr-review skill's dispatch behavior, or obtain explicit human approval.

Low

  • [logic-error] skills/pr-review/SKILL.md:459 — Step 3c-1 case 3 says "resolves as in step 4 item 2" while other dispatch sites (step 3c-2 line 606, step 6d line 983) use the more precise phrase "step 4 item 2 dispatch shape". The different phrasing is vague about whether it refers to model resolution only or the full three-case dispatch shape, since the subagent_type diverges (Explore vs. omitted in step 4 item 2 case 3).
    Remediation: Clarify that only model resolution follows step 4 item 2 case 3, e.g.: "no model — model resolution follows step 4 item 2 case 3 (runner default); subagent_type intentionally differs because the triage agent requires read-only tool access."

  • [stale-reference] skills/pr-review/SKILL.md:463 — The sentence "It uses haiku for speed — classification does not require deep reasoning" is an unqualified statement that now only holds for the Claude Code dispatch case. In the pi cases, the model is resolved by the runner and is not guaranteed to be haiku.

  • [missing-authorization] skills/pr-review/SKILL.md — No linked issue with a closing keyword authorizes this change. The PR body references fix(#1177): size the review budget from the pipeline floor, materialise the PR head once #1178 (closed/merged) as the source of the regression and provides run logs as evidence, but that is context rather than a formal authorization ticket. The scope itself is coherent.

  • [stale-doc] docs/code.md:263 — The Runtime support section says "No single-context fallback". This PR retires single-context mode from Review and Retro; the contrasting phrase now references a distinction that no longer applies.
    Remediation: Replace the "No single-context fallback" clause with a positive description of how the Code agent runs on pi.

  • [stale-doc] docs/fix.md:209 — Same orphaned "No single-context fallback" reference.
    Remediation: Replace with a positive statement about full multi-step fix execution on both runtimes.

  • [stale-doc] docs/prioritize.md:114 — Same orphaned "No single-context fallback" reference.
    Remediation: Replace with a positive statement describing full RICE scoring on both runtimes.

  • [stale-doc] docs/triage.md:314 — Same orphaned "No single-context fallback" reference.
    Remediation: Replace with a positive statement about full multi-step triage on both runtimes.

  • [stale-doc] docs/scribe.md:142 — Same orphaned "No single-context fallback" reference.
    Remediation: Replace with a positive statement about full meeting-notes processing on both runtimes.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (3)

Review

Findings

High

  • [protected-path] skills/pr-review/SKILL.md — This PR modifies skills/pr-review/SKILL.md, which is under the protected path skills/. The PR has no linked issue providing formal authorization for modifying governance/infrastructure files. Human approval is required for protected-path changes.
    Remediation: Link a tracking issue to this PR that authorizes the modification of the pr-review skill’s dispatch behavior, or obtain explicit human approval.

  • [stale-doc] docs/review.md:249 — The Runtime support section states “On pi, review runs in single-context mode — the parallel sub-agent orchestration is replaced by a single-pass review.” This PR changes the dispatch to use persona-aware parallel dispatch on pi, making the “single-context mode” description incorrect.
    Remediation: Update the Runtime support section in docs/review.md to reflect that pi now supports persona-aware parallel dispatch via registered personas.

  • [stale-doc] README.md:11 — The agent table lists the Review agent’s pi support as “pi (single-context)”. This PR enables parallel sub-agent dispatch on pi via persona registration, making the “(single-context)” qualifier inaccurate.
    Remediation: Update the Review row’s runtime column from “claude, pi (single-context)” to “claude, pi” or “claude, pi (persona-aware dispatch)”.

Medium

  • [logic-error] skills/pr-review/SKILL.md:457 — Step 3c-1 case 3 (runtime note without security-triage) sets subagent_type: Explore and labels this as “(step 4 item 2 fallback)”, but step 4 item 2 case 3 (lines 814–817) says to “Omit both subagent_type and model”. The cross-reference is misleading because the actual instructions diverge. On pi, whether Explore (a built-in CLI agent type) is rejected the same way an unregistered persona would be is unspecified by this document, so the failure scenario is plausible but not certain.
    Remediation: Either (a) remove the “(step 4 item 2 fallback)” parenthetical and document why step 3c-1 case 3 intentionally uses Explore instead of omitting both; or (b) align with step 4 item 2 case 3 by omitting both subagent_type and model.

Low

  • [stale-reference] skills/pr-review/SKILL.md:462 — The sentence “It uses haiku for speed — classification does not require deep reasoning” is now only accurate for the Claude Code dispatch case (case 2). In case 1 (pi with persona), the runner resolves the model from config. In case 3 (pi without persona), the sub-agent default is used.

  • [formatting-consistency] skills/pr-review/SKILL.md:452 — The three-case dispatch bullets at lines 452–458 (security-triage step) use lowercase, colon-separated label-value style, while the structurally identical three-case bullets at lines 806–817 (main dispatch step) use Bold header: style. Both sets describe the same three runtime cases; they should share a single formatting convention.

  • [line-length] skills/pr-review/SKILL.md:605 — Line 605 is ~91 characters, exceeding the ~68–71 character wrap width used by surrounding prose. The line was not hard-wrapped at the sentence boundary.

  • [missing-authorization] skills/pr-review/SKILL.md — No directly linked issue with a closing keyword. The PR body references fix(#1177): size the review budget from the pipeline floor, materialise the PR head once #1178 (closed/merged) as the source of the regression and provides fullsend run logs as evidence, but there is no formal authorization ticket.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (4)

Review

Findings

High

  • [protected-path] skills/pr-review/SKILL.md — This PR modifies skills/pr-review/SKILL.md, which is under the protected path skills/. The PR has no linked issue providing formal authorization for modifying governance/infrastructure files. Human approval is required for protected-path changes.
    Remediation: Link a tracking issue to this PR that authorizes the modification of the pr-review skill's dispatch behavior, or obtain explicit human approval.

  • [stale-doc] docs/review.md:249 — The Runtime support section states "On pi, review runs in single-context mode — the parallel sub-agent orchestration is replaced by a single-pass review." This PR changes the dispatch to use persona-aware parallel dispatch on pi, making the "single-context mode" description incorrect.
    Remediation: Update the Runtime support section in docs/review.md to reflect that pi now supports persona-aware parallel dispatch via registered personas.

  • [stale-doc] README.md:11 — The agent table lists the Review agent's pi support as "pi (single-context)". This PR enables parallel sub-agent dispatch on pi via persona registration, making the "(single-context)" qualifier inaccurate.
    Remediation: Update the Review row's runtime column from "claude, pi (single-context)" to "claude, pi" or "claude, pi (persona-aware dispatch)".

Low

  • [intent-mismatch] skills/pr-review/SKILL.md — The commit type is fix, but the change adds three conditional dispatch paths that did not exist before. The PR body describes prior broken behavior from fix(#1177): size the review budget from the pipeline floor, materialise the PR head once #1178, giving fix a defensible basis, but the change could also be argued as a feature addition.

  • [stale-reference] skills/pr-review/SKILL.md:466 — The sentence "It uses haiku for speed — classification does not require deep reasoning" is now only accurate for the Claude Code dispatch case. In case 1 (pi, persona registered), the runner resolves the model from config. In case 3 (pi, persona not registered), the sub-agent default is used.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09

Copy link
Copy Markdown
Member Author

Validation

Run 1, current agents main skill — every child went out as an anonymous sub-agent with a model argument (no persona tag), so this routing was inert:

[fullsend-agent] #1 anthropic-vertex/claude-opus-4-6 start "Correctness review"
[fullsend-agent] #2 anthropic-vertex/claude-opus-4-6 start "Security review"
[fullsend-agent] #4 anthropic-vertex/claude-sonnet-5 start "Style conventions review"

65 turns, $5.80 (opus-4-6 ×3 $2.36, sonnet-5 ×6 $3.45).

Run 2, #1211 skill (46a779a) — all eight dispatches by persona name, no model argument, no rejection:

[fullsend-agent] #1 [correctness] xai-vertex/xai/grok-4.6 start "Correctness review PR 7087"
[fullsend-agent] #2 [security] xai-vertex/xai/grok-4.6 start "Security review PR 7087"
[fullsend-agent] #3 [intent-coherence] anthropic-vertex/claude-sonnet-5 start "Intent-coherence review PR 7087"
[fullsend-agent] #4 [style-conventions] google-vertex/gemini-3.8-flash start "Style review PR 7087"
[fullsend-agent] #5 [docs-currency] google-vertex/gemini-3.8-flash start "Docs currency review PR 7087"
[fullsend-agent] #6 [cross-repo-contracts] anthropic-vertex/claude-sonnet-5 start "Cross-repo contracts review PR 7087"
[fullsend-agent] #7 [risk-assessment] anthropic-vertex/claude-sonnet-5 start "Risk assessment PR 7087"
[fullsend-agent] #8 [challenger] xai-vertex/xai/grok-4.6 start "Challenger review PR 7087"

43 turns, agent exit 0, $5.34 — per_model_usage: sonnet-5 ×4 $2.61, grok-4.6 ×3 $2.15, gemini-3.8-flash ×2 $0.58. (security-triage is not dispatched on a PR this size, by design.)

… ceiling

skillsaw's context-budget baseline pins pr-review at 15,709 tokens and
main sits at 15,705, so any addition fails the lint. The dispatch rule
is compressed to what the orchestrator needs (the three cases in step 4
item 2, one line each at the other three call sites) and the baseline
ceiling for skills/pr-review/SKILL.md moves to the new estimate. No
other baseline entry changes.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:06 PM UTC · Completed 9:24 PM UTC

Commit: ffb63a5 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.29

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09

waynesun09 commented Sep 8, 2026

Copy link
Copy Markdown
Member Author

Validation, part 2 — the default Claude runtime (existing users)

Same probe harness on this branch (ffb63a5), configured the way an installed repo is today: runtime: claude, model: opus, no subagents block, no models.aliases. Target fullsend-ai/fullsend#7087 again, nothing posted.

Every Agent tool call in the transcript (iteration-1/output.jsonl):

description model subagent_type
Correctness review opus not set
Security review opus not set
Intent coherence review sonnet not set
Style conventions review sonnet not set
Docs currency review sonnet not set
Risk assessment sonnet not set
Challenger adversarial review opus not set

No dispatch failure and zero Agent type … not found; no persona name appears as a subagent_type anywhere in the transcript. cross-repo-contracts was skipped (no public-API change) and security-triage was not dispatched (PR under the per-file threshold), as on main — so the Claude haiku + Explore branch of step 3c-1 is unchanged text but not exercised by this run. Four tool results carry is_error, none of them a dispatch: two tirith hook blocks (analysis_incomplete, the shell-dialect issue tracked in #1190, which bites the Claude runtime too), one ugrep on a missing path, one malformed Read offset. modelUsage: claude-opus-4-6 $5.14 + claude-sonnet-4-6 $1.30 = $6.44; 43 orchestrator turns. That is byte-for-byte the pre-change dispatch shape: frontmatter model, no subagent_type, children on the env-pinned sonnet-4-6.

Cost context on this PR. The fleet's own six review runs of fullsend#7087 with the main skill on Claude/opus cost $3.81–$5.91. This run at $6.44 sits at the top of that spread; the diverse pi run above ($5.34, Grok ×3 + Gemini ×2 + sonnet-5 ×4) sits inside it.

…t fallback

Both runtime-support sections still said review and retro fall back to a
single-context pass on pi. Since fullsend 0.42.0 the runner's Agent tool
dispatches the same sub-agents on pi, and the repository's
.fullsend/config.yaml can route each persona to its own model
(agents[].subagents), which this branch now does. Say so, and point at
the per-persona configuration docs.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
(cherry picked from commit f529668)
…E runtime matrix

Review feedback: the step 3c-1 third case said "step 4 item 2 fallback"
while setting subagent_type: Explore, which step 4 does not — say why
Explore is kept (a built-in read-only type the runner always accepts)
and that only the omitted model resolves as in step 4. Match the bullet
style between the two sites, wrap one long line, and say "usually" for
why a persona is unregistered (unservable model is the common cause,
not the only one). README no longer labels pi review/retro
single-context; docs/review.md and docs/retro.md were fixed in the
previous commit.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 8, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:29 PM UTC · Completed 9:49 PM UTC

Commit: 015766d · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.41

@fullsend-ai-review fullsend-ai-review Bot added risk/elevated PR risk: elevated and removed risk/moderate PR risk: moderate labels Sep 8, 2026
fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

Comment thread docs/retro.md Outdated
Comment thread docs/review.md Outdated

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

Other than my two comments, looks good to me. At least point to the docs on both agents, now it is inconsistent.

…docs

Maintainer review: keep the runtime-support sections short and
consistent — say that sub-agents on pi run with their model and point
at the fullsend pi docs for how to set a different one, instead of
restating the mechanism in each agent's doc. Also state in step 3c-1
that only the model follows step 4 item 2 while subagent_type stays
Explore so the pre-pass remains read-only.

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 9, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:01 PM UTC · Completed 12:24 PM UTC

Commit: d345998 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $6.95

fullsend-ai-review[bot]

This comment was marked as outdated.

fullsend-ai-review[bot]

This comment was marked as outdated.

Step 6d dispatches the challenger with "the step 4 item 2 dispatch
shape", and step 4 item 2's Claude-Code case summarises the frontmatter
models as "opus for correctness and security, sonnet for the rest".
The challenger's frontmatter is model: opus, so the literal reading of
that shortcut routes the adversarial pass to sonnet instead of reading
challenger.md. Name it in the parenthetical.

Found by fullsend-ai-review on d345998. Skill grows 5 tokens; baseline
ceiling regenerated for the pr-review entry only (16,045 -> 16,050).

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 9, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:48 PM UTC · Completed 1:07 PM UTC

Commit: 7075e05 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $4.55

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

  • skills/pr-review/SKILL.md (file-level): Line 465 · [low] logic-error

The sentence "It uses haiku for speed — classification does not require deep reasoning" is an unqualified statement that only holds for the Claude Code dispatch case. On pi, the model is resolved by the runner (case 1) or defaults to the sub-agent default (case 3), and is not guaranteed to be haiku.

@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 docs/retro.md
Comment thread docs/retro.md
Comment thread skills/pr-review/SKILL.md
@waynesun09
waynesun09 added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 4749344 Sep 9, 2026
100 checks passed
@waynesun09
waynesun09 deleted the pr-review-persona-dispatch branch September 9, 2026 13:31
@fullsend-ai-retro

fullsend-ai-retro Bot commented Sep 9, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 1:33 PM UTC · Completed 1:46 PM UTC

Commit: 7075e05 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $3.96

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #1211fix(pr-review): dispatch sub-agents by persona when the runtime registers them

What happened

Human-authored PR by waynesun09 modifying the pr-review skill's sub-agent dispatch logic across 4 dispatch sites to support persona-based dispatch on the pi runtime while preserving Claude Code behavior. 8 commits, 5 review agent runs ($24.67 total), 1 human review by rh-hemartin (approved with 2 inline comments). Merged 2026-09-09.

Review quality

High-value catch by the review agent: The correctness sub-agent identified that the parenthetical model-assignment list ("opus for correctness and security, sonnet for the rest") omitted the challenger sub-agent, which should also use opus. The author confirmed this was a real bug — "Good catch — this is a real one" — that would have silently downgraded the challenger sub-agent for Claude Code users. Fixed in commit 7075e05.

Complementary human value: rh-hemartin caught that docs/review.md and docs/retro.md were inconsistent in their pi runtime descriptions and suggested simplifying both to one sentence plus a link to the pi docs. The review agent did not flag this cross-file documentation inconsistency. Both suggestions were applied in commit d345998.

Review noise: 4 of 6 unique review findings were low-value and persisted across all 5 review iterations: a scope-creep finding on docs/retro.md (author explained it was a doc correction, not scope creep), two naming-convention findings on natural-language content (author declined both), and a logic-error about "haiku for speed" being unqualified (never addressed). These findings were re-raised on every iteration without escalation or suppression.

Evidence for existing issues

  • #106 (re-raises after author declines): The scope-creep finding on docs/retro.md persisted across iterations after the author explicitly explained it was a documentation correction for existing runtime behavior.
  • #685 (resolve or persist prior findings): The logic-error finding about "haiku for speed" appeared in all 5 review iterations without being resolved, escalated, or suppressed.
  • #1208 (raise severity threshold on re-review): All 4 low-value findings repeated unchanged across 5 iterations. No severity adjustment or suppression occurred despite the author not addressing them.
  • #1216 (cosmetic naming findings as info): Two naming-convention findings were applied to natural-language prompt and documentation content where naming/style rules don't apply in the same way as code.

Overall assessment

This workflow went well. The review agent delivered genuine value by catching a correctness bug the human reviewer missed. The human reviewer added complementary value on documentation quality. The author iterated efficiently (8 commits over ~17 hours) with clear validation evidence (two real runs on both runtimes). The main friction was persistent low-value findings across review iterations — an area already tracked by multiple open issues. No novel improvement proposals are warranted.

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

Labels

fullsend-no-fix Skip bot-triggered fix agent runs risk/elevated PR risk: elevated

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants