Skip to content

enhance(#2272): forward --cursor/--qwen reviewer flags to convergence - #2412

Open
drungrin wants to merge 6 commits into
open-gsd:nextfrom
drungrin:enhance/2272-convergence-reviewer-flag-parity
Open

enhance(#2272): forward --cursor/--qwen reviewer flags to convergence#2412
drungrin wants to merge 6 commits into
open-gsd:nextfrom
drungrin:enhance/2272-convergence-reviewer-flag-parity

Conversation

@drungrin

@drungrin drungrin commented Jul 18, 2026

Copy link
Copy Markdown

Enhancement PR


Linked Issue

Closes #2272


What this enhancement improves

Reviewer-flag parsing in /gsd-plan-review-convergence (the gsd-plan-review-convergence workflow). It brings the convergence wrapper to parity with the reviewer flags /gsd-review already accepts.

Before / After

Before:
The convergence REVIEWER_FLAGS whitelist parsed only a subset of the reviewers /gsd-review supports. Passing --cursor or --qwen was silently ignored and the loop fell back to the default --codex:

/gsd-plan-review-convergence 3 --cursor   # silently converged against Codex, not Cursor

The only way to reach Cursor/Qwen was --all, which also pulls in every other detected reviewer on every cycle. (--agy/--antigravity from the original proposal had already landed via #2293.)

After:
--cursor and --qwen are recognized and forwarded to the inner review call, exactly like --codex:

/gsd-plan-review-convergence 3 --cursor   # converges against Cursor alone
/gsd-plan-review-convergence 3 --qwen     # converges against Qwen Code alone

Purely additive — default behavior, --all, and the already-parsed flags are unchanged. An unknown reviewer flag still falls back to --codex.

How it was implemented

  • gsd-core/workflows/plan-review-convergence.md — added --cursor and --qwen to the REVIEWER_FLAGS grep-accumulation step (and to the "Extract from $ARGUMENTS" prose list) so each appends and is forwarded to the inner gsd-review call.
  • commands/gsd/plan-review-convergence.md — added the two flags to argument-hint and the flag documentation list.
  • skills/gsd-plan-review-convergence/SKILL.md — regenerated from the command via npm run gen:plugin-skills (not hand-edited).
  • docs/COMMANDS.md — documented the added reviewer flags and added usage examples.
  • tests/plan-review-convergence.test.cjs — new #2272 suite.

Testing

How I verified the enhancement works

  • node --test tests/plan-review-convergence.test.cjs → 122 pass, 0 fail.
  • New behavioral test executes the actual deployed REVIEWER_FLAGS extraction block and asserts --cursor/--qwen pass through (not the --codex fallback), both accumulate together, the unknown-reviewer fallback to --codex is preserved, and an unrelated flag (--gemini) does not trip the new whitelist entries.
  • Static tests assert argument-hint / command / generated SKILL.md parity.
  • npm run lint:generated-sync → clean (SKILL.md in sync with the command source).
  • npx eslint tests/plan-review-convergence.test.cjs → clean.
  • tests/plan-review-convergence.test.cjs — new #2272 suite.

Upstream --converge passthrough (disclosed on #2272, re-approval pending — see Scope note):

  • gsd-core/workflows/autonomous.md, gsd-core/workflows/next.md — added --cursor --qwen --agy --antigravity to the CONVERGENCE_ARGS allowlist loops so /gsd-autonomous --converge and /gsd-progress --next --converge stop silently dropping these flags to --codex.
  • commands/gsd/autonomous.md, commands/gsd/progress.md, docs/how-to/run-phases-autonomously.md — corrected the reviewer-flag enumerations.
  • skills/gsd-autonomous/SKILL.md, skills/gsd-progress/SKILL.md — regenerated from the commands (npm run gen:plugin-skills), not hand-edited.
  • tests/plan-review-convergence.test.cjs — added a dynamic parity test asserting both CONVERGENCE_ARGS loops are a superset of the convergence REVIEWER_FLAGS set, so CI fails if a future reviewer flag is added to one forwarder but not the others.

Platforms tested

  • Linux
  • macOS
  • Windows (including backslash path handling)
  • N/A (not platform-specific)

The behavioral shell test is POSIX-only and self-skips on Windows, mirroring the existing #2293 --agy test.

Runtimes tested

  • Claude Code
  • Gemini CLI
  • OpenCode
  • Other: ___
  • N/A (not runtime-specific)

Scope confirmation

  • The implementation matches the scope approved in the linked issue — no additions or removals
  • If scope changed during implementation, I updated the issue and got re-approval before continuing

Scope note: this PR expanded beyond the approved convergence-workflow scope to also fix the --converge passthrough in gsd-core/workflows/autonomous.md and gsd-core/workflows/next.md (plus their command/skill/how-to surfaces), which dropped the same reviewer flags one hop upstream. That was not disclosed on #2272 when it landed — I've since posted the disclosure there and requested re-approval. I'll re-check the second box once re-approval lands, or split the passthrough into a separate PR if the maintainer prefers.
(The issue's original proposal also listed --agy/--antigravity, which had already landed via #2293; this PR delivers the remaining --cursor/--qwen gap in the convergence workflow plus the upstream passthrough fix described above.)

Documentation

  • Updated the relevant file(s) under docs/ to reflect this change (docs/COMMANDS.md)
  • All docs/ content added in this PR is written in English

Checklist

  • Issue linked above with Closes #NNNPR will be auto-closed if missing
  • Linked issue has the approved-enhancement label — PR will be closed if missing
  • Changes are scoped to the approved enhancement — nothing extra included (see Scope note above: upstream passthrough disclosed on Add --cursor, --qwen, and --agy reviewer flags to /gsd-plan-review-convergence for parity with /gsd-review #2272, re-approval pending)
  • All existing tests pass (npm test)
  • New or updated tests cover the enhanced behavior
  • .changeset/ fragment added (npm run changeset -- --type Changed --pr <NNN> --body "...") — or no-changelog label applied if not user-facing
  • No unnecessary dependencies added

Breaking changes

None


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.

@github-actions

Copy link
Copy Markdown
Contributor

PR template required

This PR does not follow one of the required pull request templates from the contribution guidelines.

Please update the PR description to use the correct typed template:

This check only validates template format. It does not close PRs for an unfilled issue number such as Fixes #; the issue-link workflow handles issue references separately after the PR exists.

Detected problem: PR body does not match the fix, enhancement, or feature template.

@drungrin

Copy link
Copy Markdown
Author

PR body fixed

@trek-e trek-e left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This is a small, correctly-wired parity fix — the --cursor/--qwen flags do reach the inner gsd-review call (verified at plan-review-convergence.md:141), and the issue/changeset/template gates are otherwise in order. But it ships incomplete:

  • gsd-core/workflows/help/modes/full.md (both the direct convergence signature and the --next --converge passthrough list) wasn't updated for the new flags.
  • tests/fixtures/golden-install-parity/*.json wasn't regenerated despite this PR changing the content of plan-review-convergence.md and SKILL.md — compare with #2417, which touches the same workflow file and correctly bumped ~13 fixture hashes. That will fail golden-parity in CI.
  • .changeset/2272-convergence-reviewer-flags.md has pr: 1 — please set it to the real PR number (2412).

Separately, heads-up that CI's Tests / Docs / Security / Changeset workflows are stuck in action_required (fork-approval) and haven't actually run yet — a maintainer approval is needed so these issues surface in CI, not just here. And #2321 also edits this same REVIEWER_FLAGS block, so there's a merge-order rebase to coordinate.

@trek-e trek-e added area: workflows Workflow definitions review: changes requested PR reviewed — changes required before merge labels Jul 19, 2026
@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 60168de to 4bcd913 Compare July 20, 2026 13:24
@drungrin

Copy link
Copy Markdown
Author

Thanks for the thorough review. All three blocking items are addressed, and the branch is now rebased onto current next.

1. help/modes/full.md not updated. Fixed in both places you flagged: the direct convergence signature and the --next --converge passthrough list. I also updated the prose reviewer summary on the signature line to read Codex/Gemini/Claude/OpenCode/Cursor/Qwen, since it enumerated the cloud reviewers explicitly.

2. Golden fixtures not regenerated. Regenerated via npm run gen:golden. 17 golden-install-parity/*.json files changed. I verified the delta against next is scoped to only the files this PR actually changes:

.agents/skills/gsd-plan-review-convergence/SKILL.md
command/gsd-plan-review-convergence.md
commands/gsd-plan-review-convergence.md
gsd-core/workflows/help/modes/full.md
gsd-core/workflows/plan-review-convergence.md
skills/gsd-plan-review-convergence/SKILL.md
skills/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md
skills/gsd/gsd-ns-workflow/skills/plan-review-convergence/SKILL.md

No unrelated hashes moved. The install-tree fixtures correctly did not change, since this PR adds no new install paths, only content.

One gotcha for anyone else regenerating on top of current next: gen:golden fails with TypeError: isSymlinkedDestOptIn is not a function unless you run npm run build:lib first. #2393 added that function to install-engine, and a stale compiled gsd-core/bin/lib/ makes the generator blow up inside the installer rather than reporting anything useful. Not a defect in #2393, just a non-obvious build-order dependency.

3. pr: 1 in the changeset. Set to 2412.

On the rebase. Done, onto eb45fc0e. All 16 conflicts were in golden-install-parity/*.json, with no source conflicts. Since those are generated artifacts, I reset them to next and re-ran the generator rather than hand-merging hashes.

Worth noting for merge ordering: the REVIEWER_FLAGS block rebased cleanly, so #2321 hasn't landed on next yet. Your merge-order concern is still live. If #2321 goes first, that block will conflict and I'll rebase again.

Verification run locally. CI is still gated on fork-approval, so none of this has been confirmed by CI yet:

  • golden-install-parity, golden-install-tree, golden-parity-single-source, plan-review-convergence: 161 pass / 0 fail
  • lint:docs and lint:generated-sync: clean

I have not run the full suite locally, so the fork-approval you mentioned is still the real gate.

One open question. docs/COMMANDS.md in this PR lists --agy/--antigravity in the convergence reviewer row, but full.md has never listed it, both before and after this PR. That's pre-existing drift rather than something this PR introduced, so I left it alone to keep the diff scoped to the parity fix. Happy to fold the one-line full.md fix in here if you'd rather close it now, or split it out. Your call.

@drungrin
drungrin requested a review from trek-e July 20, 2026 13:31

@trek-e trek-e left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The core change is right — I ran the actual extraction block from both origin/next and your head: on base, --cursor and --qwen both collapse to --codex (reproducing the bug); on your branch both pass through, mixed accumulation works, unknown-flag fallback is preserved, and --gemini doesn't false-trip the new entries. Flag spellings match gsd-core/workflows/review.md exactly, so nothing is forwarded-then-rejected downstream.

Two blockers.

Blocker

B1 — Stale tests/workflow-size-baseline.json; will fail CI.
I measured at PR head:

actual bytes      : 23903
committed baseline: 23713

tests/workflow-size-budget.test.cjsassertFileBaseline (scripts/lib/allowlist-ratchet.cjs:180-207) fails on any growth against the committed snapshot. Tests is already red on test (ubuntu-latest, 22), test (ubuntu-latest, 24), and the full test shard-1 jobs on macOS and Windows.

Fix: npm run size:baseline and commit tests/workflow-size-baseline.json. (I confirmed agent-size-baseline.json needs no change — regen produced zero diff there.)

B2 — Two upstream CONVERGENCE_ARGS allowlists still drop --cursor/--qwen.
gsd-core/workflows/autonomous.md:49 and gsd-core/workflows/next.md:266 both build CONVERGENCE_ARGS via

for REVIEW_FLAG in --codex --gemini --claude --opencode --ollama --lm-studio --llama-cpp --all --text; do …

and forward only CONVERGENCE_ARGS, never raw $ARGUMENTS, into the skill call (autonomous.md:384,405,419; next.md:313). So /gsd:autonomous --converge --cursor and /gsd:progress --next --converge --cursor silently drop the flag and fall back to --codex — the exact silent-fallback footgun #2272 exists to kill, one hop upstream.

This isn't newly introduced (--agy never got added to these loops after #2293 either). What makes it blocking here is that your own edit to gsd-core/workflows/help/modes/full.md:287 now asserts these flags "forward to the convergence loop" via --next --converge — and for that path the claim is false. Shipping the doc promise without the wiring is worse than the status quo.

Same stale claim also appears in, none touched by this PR: commands/gsd/autonomous.md:43, skills/gsd-autonomous/SKILL.md:43, commands/gsd/progress.md:28, skills/gsd-progress/SKILL.md:28, docs/COMMANDS.md:631, docs/COMMANDS.md:861, docs/how-to/run-phases-autonomously.md:73.

No test catches this — tests/docs-parity-live-registry.test.cjs:708 only does a loose "flag token appears anywhere in help.md" check, which your full.md edit already satisfies trivially. So it ships silently broken unless fixed by hand.

Fix: add --cursor and --qwen to both CONVERGENCE_ARGS loops (and --agy/--antigravity while you're in there, since it's the same omission). A test asserting CONVERGENCE_ARGS parity against the convergence REVIEWER_FLAGS whitelist would stop this recurring.

Minor

  • m3 — Branch prefix enhance/ isn't in CONTRIBUTING.md's table (CONTRIBUTING.md:131-136) or .github/workflows/branch-naming.yml:24-27. The check passes only because the script warns rather than setFailed, so the green tick isn't compliance. Non-blocking — enhance(#NNN): as a PR-title/commit type is established and well-precedented here.

Verified as correct

REVIEWER_FLAGS whitelisting at plan-review-convergence.md:33-34 is shaped exactly like the existing --codex entries and forwarded verbatim at :143. Default --codex fallback and --all semantics unchanged; no new quoting/word-splitting exposure. --agy/--antigravity genuinely already landed on next (commit 1bb724048, #2293), so with this PR merged the aggregate satisfies #2272's full scope — not a blocker on its own. skills/gsd-plan-review-convergence/SKILL.md is correctly machine-regenerated (gen:plugin-skills --check → 71 skills up to date; full lint:generated-sync clean). Changeset valid (type: Changed, real backfilled pr: 2412, correct bold-lead + (#2272)). docs/COMMANDS.md:262,268-269 accurate and complete for both flags. Localized docs correctly left alone per CONTRIBUTING.md:277. No source-grep violation; eslint clean.

Memtrace Evidence

  • detect_changes / diff scoping: confined to workflow/command/skill markdown, docs/COMMANDS.md, a test, and regenerated goldens. No .cts/.cjs source symbols touched, so there is no changed code symbol for get_impact / get_symbol_context to anchor to. Stating that plainly rather than implying a call-graph analysis I did not run — the real blast radius here is the set of parallel flag-declaration surfaces, which is what B2 is about.
  • find_code_review_issues (strict, deterministic AST + YAML + cross-module) on the REVIEWER_FLAGS diff → 0 issues. Expected: B2 is a cross-surface completeness gap between two shell allowlists in separate markdown files, which no AST rule models.
  • recall_decision over the reviewer-flag/convergence topic returned ranked prior decisions with no recorded ban — this is additive parity work consistent with #2293's precedent, not a reversal.
  • Direct diff inspection confirmed the --agy/--antigravity claim: the pre-image line at plan-review-convergence.md:18 already lists --agy/--antigravity, so that flag genuinely landed earlier (#2293) and its absence from this PR is correct scope, not an omission.
  • Measured directly: plan-review-convergence.md at PR head is 23,903 bytes against a committed baseline of 23,713 in tests/workflow-size-baseline.json — that is B1.

@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 1377467 to 8718621 Compare July 20, 2026 15:35
@drungrin

Copy link
Copy Markdown
Author

Thanks, both blockers were real. Fixed, and the branch is rebased onto 352876ff.

B1: stale size baseline

Confirmed at the same numbers you measured (23713 → 23903). npm run size:baseline committed. agent-size-baseline.json produced zero diff, matching your check.

B2: CONVERGENCE_ARGS allowlists

Verified independently before fixing. Both loops stop at --llama-cpp, and only CONVERGENCE_ARGS is forwarded (autonomous.md:384,405,419, next.md:313), so raw $ARGUMENTS genuinely never reaches the skill call. Your framing is right about what makes it blocking here: my own full.md:287 edit turned a pre-existing gap into an asserted-but-false promise.

Added --agy --antigravity --cursor --qwen to both loops, and corrected the flag enumerations in commands/gsd/autonomous.md, commands/gsd/progress.md, docs/COMMANDS.md:631,861, and docs/how-to/run-phases-autonomously.md:73. The two SKILL.md files you listed are generated from commands/ via gen:plugin-skills, so they came out of the regen rather than by hand.

Parity test added, and deliberately not hardcoded: it parses the reviewer set out of the convergence REVIEWER_FLAGS block and asserts both CONVERGENCE_ARGS loops are a superset, excluding --text/--max-cycles as non-reviewer flags. So the next reviewer flag added to the workflow fails CI until both forwarders are updated. I verified it actually goes red by reverting the autonomous.md loop and re-running, rather than trusting a green pass on already-fixed code. There is also a behavioral case that executes the real loop under bash and asserts --antigravity does not spuriously match the --agy entry.

The changeset is widened to cover the passthrough, since /gsd-autonomous --converge --cursor is a user-visible behavior change, not just the direct convergence call.

Rebase onto #2315

#2451 landed while I was working, and it removes the unconditional if [ -z "$REVIEWER_FLAGS" ]; then REVIEWER_FLAGS="--codex"; fi line that my #2272 behavioral test used as its endMarker, with a bare invocation asserted to return --codex. Both would have broken. I adapted that test the same way #2451 adapted the #2293 one: endMarker is now the last --all grep line, and the bare and unknown-flag cases assert empty output, with the default resolved in step 1.5.

Worth flagging since it is a genuine interaction rather than a clean merge: the conflict was in the test file, not the workflow, and git resolved the REVIEWER_FLAGS block cleanly with both your #2315 restructure and my two new grep lines intact.

Verification

  • plan-review-convergence, workflow-size-budget, golden-install-parity, golden-install-tree, golden-parity-single-source, docs-parity-live-registry, autonomous-converge: 524 pass, 0 fail, 2 skipped
  • lint clean (0 errors), lint:docs and lint:generated-sync clean
  • Golden fixture delta against next is scoped to only the files this PR changes, with no unrelated hashes moved

On m3

Agreed it is not compliance, just a warning-only check rather than a real gate. Renaming the branch now would mean closing and reopening the PR and losing this review thread.

@drungrin
drungrin requested a review from trek-e July 20, 2026 15:37
@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 8718621 to 7a2c2da Compare July 20, 2026 19:02

@trek-e trek-e left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The reviewer-flag parity work itself is well done — the flags are wired end-to-end into the real gsd-review invocation rather than just added to a whitelist, and the dynamic cross-surface parity test is a better guard than I'd have asked for. Three things block.

Blocker

B1 — The branch conflicts with next.

gh api repos/open-gsd/gsd-core/pulls/2412 returns {"mergeable": false, "mergeable_state": "dirty", "rebaseable": false}. git merge-tree confirms 21 conflicting files, including all 17 golden install-parity fixtures, tests/workflow-size-baseline.json, docs/COMMANDS.md, and gsd-core/workflows/help/modes/full.md.

The fixtures are the awkward part: next's antigravity.json now records help/modes/full.md at a hash matching neither your pre- nor post-image, because another PR changed that file independently. So this needs a rebase and a regeneration (npm run gen:golden + npm run size:baseline), not a textual conflict resolution.

B2 — The substantive CI has never run on this head.

All seven green ticks are lightweight validators (title, template, issue-link, target, GitGuardian, Socket). The checks that matter — Tests, Changeset Required, Docs Required, Security Scan, Validate Branch Name — are all completed/action_required on 7a2c2daf, i.e. queued behind fork-workflow approval and never executed. My static read of the baseline and fixtures says they're internally consistent, but that is a manual check, not a CI verdict, and B1 will invalidate it anyway.

Major

M1 — Scope expanded past what #2272 approved, and the checklist says otherwise.

Issue #2272's scope-of-changes names the convergence workflow, its command and skill, its test, docs/COMMANDS.md, and the changeset. My approval comment on 2026-07-15 said "exactly as the issue's scope-of-changes describes."

Commit 7a2c2daf (07-20) additionally modifies commands/gsd/autonomous.md, commands/gsd/progress.md, gsd-core/workflows/autonomous.md, gsd-core/workflows/next.md, skills/gsd-autonomous/SKILL.md, skills/gsd-progress/SKILL.md, and docs/how-to/run-phases-autonomously.md. Issue #2272 has two comments — my approval and your 07-18 implementation note — and neither discloses this.

Meanwhile the PR body checks both "The implementation matches the scope approved in the linked issue — no additions or removals" and "If scope changed during implementation, I updated the issue and got re-approval." Both are contradicted by the issue timeline.

To be clear about the substance: the change itself is correct. autonomous.md and next.md were dropping the same flags one hop upstream, so fixing only the convergence workflow would have left the feature half-working. I'd have approved it on request. The problem is that it landed silently against an issue-first rule, with a checklist asserting the opposite.

Fix: comment on #2272 describing the upstream forwarders and get re-approval, or split them into their own issue/PR. Either way, correct the checklist.

Minor

  • m2tests/autonomous-converge.test.cjs:82-96 and tests/adr-15-progress-converge.test.cjs:95-109 still hardcode a reviewerFlags array missing --cursor/--qwen/--agy/--antigravity, despite testing exactly the two files your last commit changed. Not a coverage hole (your new dynamic parity test supersedes them), but they now read as authoritative and are wrong. Extend both arrays or annotate them as superseded.

Verified as correct

Flags reach the actual reviewer invocation (plan-review-convergence.md:33-34 accumulate, forwarded at the Skill(skill='gsd-review', ...) call); gsd-review already implements Cursor and Qwen so this is genuine parity, not a dead whitelist entry; argument-hint / help/modes/full.md / docs/COMMANDS.md are all three updated per the parity gate; changeset is type: Changed, pr: 2412 (correctly backfilled from the earlier pr: 1); no injection surface — every new line appends a fixed literal with $ARGUMENTS double-quoted throughout.

I also checked the surfaces you did not touch and confirmed they're correctly excluded rather than missed: /gsd-review's own flag list is the parity target; the two ADRs are point-in-time records; translated docs are exempt per CONTRIBUTING; and the --codex/--cursor hits in stale-bake-guard.cjs and docs/ARCHITECTURE.md are installer runtime-target flags in a different namespace.

Memtrace Evidence

  • No indexed code symbols change in this PR — the diff is workflow/command/skill markdown plus regenerated fixtures. get_impact/get_symbol_context have no changed symbol to anchor to, so the blast radius here is contract-level (LLM-executed workflow instructions), not call-graph-level. Recording that explicitly rather than implying an analysis I did not run.
  • The verification that carried weight was direct: gh api .../pulls/2412 for mergeability and git merge-tree origin/next <head> for the conflicting-file set (B1), and gh api .../actions/runs?head_sha=7a2c2daf for the real check states (B2). Both are reproducible from the commands quoted above.
  • The reviewer-flag surface inventory was built by grepping every --codex occurrence across *.md/*.cts/*.cjs and classifying each hit, rather than trusting the PR's own list — that is what surfaced m2.
  • get_impact / get_symbol_context: this diff changes no indexed code symbol, so neither tool has a changed target to anchor to. I probed the runtime-resolution seam the reviewer flags eventually reach and confirmed the flags terminate in workflow prose rather than in a typed resolver. Stating that plainly rather than attaching a blast radius to a symbol this PR does not touch.
  • recall_decision over the convergence/reviewer-flag topic surfaced no recorded ban or contract that this change reverses — adding cursor/qwen to the whitelist is an extension of the existing counting contract, not a reversal.
  • find_code_review_issues (strict; AST + YAML + cross-module) on the changed flag-parsing block → 0 issues. Expected for shell-in-markdown: the rule pack does not model workflow prose, and all three findings here (merge conflict, unrun CI, scope disclosure) sit outside what static analysis can see.

@drungrin

Copy link
Copy Markdown
Author

Rebased onto current next and re-ran the generators. m2 fixed. B2 is still the fork-approval gate. M1 disclosure posted on #2272 and the checklist corrected.

B1 — rebased and regenerated

All 21 conflicting paths were generated artifacts: the 18 golden-install-parity/*.json fixtures and tests/workflow-size-baseline.json. help/modes/full.md auto-merged with no conflict markers. As you flagged, this needed regeneration rather than a hash merge — next's antigravity.json recorded full.md at a hash matching neither of my images — so I reset the generated files and ran npm run build:lib && npm run gen:golden && npm run size:baseline on top of current next (34352180).

  • install-tree fixtures did not change — this PR adds no new install paths, only content.
  • Diff vs next is scoped to the PR's own source/doc/skill/command files plus the 18 golden-install-parity fixtures and the size baseline. No unrelated hashes moved.

Rebased head: 8e3b0e32.

m2 — stale hardcoded reviewer arrays

Extended the reviewerFlags arrays in tests/autonomous-converge.test.cjs and tests/adr-15-progress-converge.test.cjs with --agy --antigravity --cursor --qwen, in the same order as the CONVERGENCE_ARGS loops they test. They now match the workflows instead of reading as authoritative-but-stale. The dynamic parity test remains the real guard.

B2 — CI still gated on fork approval

Confirmed — the substantive checks are still action_required behind fork-workflow approval, so none of this is a CI verdict, and the rebase invalidates the earlier static read anyway. Local run on the rebased head:

  • golden-install-parity, golden-install-tree, golden-parity-single-source, workflow-size-budget, plan-review-convergence, autonomous-converge, adr-15-progress-converge, docs-parity-live-registry: 535 pass / 0 fail.
  • lint:generated-sync and lint:docs: clean.

A maintainer approval is still the real gate.

M1 — scope disclosure

You're right — the upstream forwarders (autonomous.md/next.md and their command/skill/how-to surfaces) landed without disclosure on #2272 and against a checklist that asserted the opposite. That was my mistake. I've posted a comment on #2272 describing exactly what was added and why, and requested re-approval. I've also corrected the PR body: the two scope-confirmation boxes and the "nothing extra included" box are unchecked with a scope note, and "How it was implemented" now lists the passthrough files. Happy to split the passthrough into its own issue/PR instead if you'd rather keep #2412 scoped to the convergence workflow alone — just say the word.

@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 7a2c2da to 8e3b0e3 Compare July 21, 2026 16:43
@drungrin
drungrin requested a review from trek-e July 21, 2026 16:43
@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 8e3b0e3 to 7edc3a3 Compare July 22, 2026 14:50

@trek-e trek-e left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This was generated by AI during review.

Summary

enhance/2272-convergence-reviewer-flag-parity forwards --cursor/--qwen through /gsd-plan-review-convergence's REVIEWER_FLAGS whitelist, plus (disclosed mid-review, not in the original approved scope) the same two flags through the upstream CONVERGENCE_ARGS allowlists in autonomous.md/next.md. Three prior maintainer review rounds (2026-07-19, 07-20, 07-21) are on record, all CHANGES_REQUESTED. This is a Phase B.1.5 merge-conflict-gate pass: it re-verifies the conflict set against current next (ae8526cd5) and re-checks which prior findings are actually still resolved post-rebase, rather than re-litigating already-settled points.

Prior findings now resolved

Verified directly against the current diff/tree, not just taken on the author's word:

  • Round 1 — help/modes/full.md not updated — fixed; both the direct convergence signature and the --next --converge passthrough list now list --cursor/--qwen.
  • Round 1 — golden fixtures not regenerated — fixed then, and regenerated again on every subsequent rebase (most recently for next @ 352876ff0).
  • Round 1 — changeset pr: 1 — corrected to pr: 2412.
  • Round 2 (B1) — stale tests/workflow-size-baseline.json (23713 actual vs 23713 committed at the time) — fixed via f13920c6.
  • Round 2 (B2) — CONVERGENCE_ARGS allowlists in autonomous.md/next.md still dropped --cursor/--qwen — fixed via 70db6cce, and this is the one finding that's more than cosmetic: without it, /gsd-autonomous --converge --cursor would have kept silently falling back to --codex one hop upstream of the flag this PR was written to fix. The added dynamic parity test (asserts both CONVERGENCE_ARGS loops are a superset of the convergence REVIEWER_FLAGS set) is a real regression guard, not a static pin.
  • Round 3 (m2) — hardcoded reviewerFlags arrays in tests/autonomous-converge.test.cjs / tests/adr-15-progress-converge.test.cjs stale — extended via 7edc3a38.
  • Round 3 (B2) — CI never ran (fork-approval gate) — moot for this pass; not re-verified here since gate re-verification is out of scope for B.1.5, but note it below under CI.

Merge-conflict detail

Throwaway merge test (git merge --no-commit --no-ff) of PR head 7edc3a380aeae393ee6a800882a3758aef13df23 (confirmed current — matches gh pr view --json headRefOid) onto next @ ae8526cd5: 20 conflicting files, all generated artifacts, zero source conflicts:

  • tests/fixtures/golden-install-parity/{antigravity,augment,claude,claude-local,cline,codebuddy,codex,copilot,cursor,hermes,kilo,kimi,kimi-code,opencode,pi,qwen,trae,windsurf,zcode}.json (19 files)
  • tests/workflow-size-baseline.json

Root cause: next has moved under this branch again since its last rebase (352876ff0). The structural driver is the #2505 Kimi-variant-disambiguation epic — bf8f32008 (feat(#2505): Phase 1 — EoS descriptor split (kimi-code capability.json + drift-guard registration), PR #2519) and f654c24a3 (feat(#2505): Phase 4, PR #2525) — which introduced kimi-code as an 18th runtime after this PR's fixtures were last regenerated, so every golden fixture (and the workflow-size baseline, which tracks byte counts across the same regenerated surface) now disagrees with next's committed hashes in the kimi-code row this PR never touched. 0ad3c5dd1/200daa456/77bf21b3a (unrelated fixes landed today) compound it. This is the same treadmill the author already described three times in review comments — it is not a defect in this PR's own source, just staleness. docs/COMMANDS.md and gsd-core/workflows/help/modes/full.md, which conflicted in round 3, now merge cleanly (no longer in the conflict list), confirming the round-3 rebase's regen was real.

Blast radius

No indexed .cts/.cjs source symbol is touched by this diff — the change is confined to workflow/command/skill markdown, docs/COMMANDS.md, a test file, and regenerated golden fixtures. get_impact/get_symbol_context have no changed symbol to anchor to, consistent with all three prior maintainer reviews' own conclusion. The real blast radius here is the parallel flag-declaration surface (workflow prose, command docs, generated skills, two CONVERGENCE_ARGS loops) rather than a call graph — which is exactly what round 2's B2 finding, and the parity test that now guards it, addressed.

Co-change completeness

get_cochange_context on gsd-core/workflows/plan-review-convergence.md returns only a batch of agents/gsd-*.md files sharing one commit timestamp (2026-07-05T18:20:52Z, an unrelated bulk resync) — no historically-coupled file is absent from this diff. Given this file's low natural co-change signal (prose workflow, not a heavily-shared module), this check is low-confidence either way; nothing concrete to flag.

Memtrace Evidence

  • get_impact / get_symbol_context: no indexed .cts/.cjs production symbol is touched by this diff (workflow/command/skill markdown + docs/COMMANDS.md + a test file only), so neither tool has a changed symbol to anchor to — stated plainly rather than implying a call-graph analysis that doesn't apply here.
  • get_symbol_context on normalizeKimiPayload (a same-shape sibling function in hooks/gsd-prompt-guard.js, used for pattern comparison since this PR touches no equivalent symbol itself) confirms the Map-based lookup convention used elsewhere in the guard family — not directly relevant to this PR's diff, included for completeness since it's the nearest indexed symbol to the PR's problem domain (reviewer-flag dispatch tables).
  • find_code_review_issues (repo-graph-backed, online mode) against the new tests/plan-review-convergence.test.cjs suite → 0 reviewer-facing issues (1 raw AST candidate, filtered below the confidence threshold).
  • recall_decision("reviewer flag whitelist convergence gsd-review cursor qwen antigravity") → ranked results returned, no clearly on-point recorded ban or convention outranking the rest — consistent with this being additive parity work, not a policy reversal.
  • get_cochange_context on gsd-core/workflows/plan-review-convergence.md (180-day default window) → top partners are a batch of agents/gsd-*.md files from one unrelated bulk-resync commit (2026-07-05); no historically-coupled file absent from this diff.

Findings by severity

Major

  • M1 — Scope re-approval on #2272 is still pending. The author disclosed the upstream CONVERGENCE_ARGS passthrough expansion on issue #2272 on 2026-07-21T16:40:12Z and asked for explicit re-approval or a split into a separate PR. As of this review, there is no maintainer response on the issue thread. The PR body's scope-confirmation boxes are correctly left unchecked with a note, which is the right interim state — but the substantive gate (maintainer says yes, keep it in #2412, or split it) has not closed. This blocks merge independent of the conflict/CI state; recommend resolving on #2272 before further rounds on the code itself.

Minor

  • m3 (carried from round 2, still true) — branch prefix enhance/ is not in CONTRIBUTING.md's allowed-prefix table (feat, fix, chore, docs, refactor, test, perf, ci, revert) and is not recognized by .github/workflows/branch-naming.yml. Non-blocking today only because that check warns instead of failing the build — the green tick is not actually compliance. enhance(#NNN): as a commit-message type is established in this repo; the branch prefix is the specific gap.
  • Generated-fixture conflicts (20 files) will recur on every future rebase until this merges — not actionable now, just flagging the churn.

Nit

  • None beyond what's already tracked above.

Verdict

Request changes. The reviewer-flag-parity mechanism itself is sound and thoroughly reviewed (three rounds, all substantive findings fixed and independently re-verified here) — this is not a code-quality rejection. Two blockers remain, neither of which is new: (1) the branch needs another rebase + fixture/baseline regen against current next (mechanical, same as the author has done three times already), and (2) the scope-expansion re-approval on #2272 needs a maintainer answer before the upstream autonomous.md/next.md passthrough can be considered in-scope for this PR. Branch-prefix nonconformance (m3) remains a non-blocking carry-over.

@drungrin drungrin closed this Jul 27, 2026
@drungrin
drungrin force-pushed the enhance/2272-convergence-reviewer-flag-parity branch from 7edc3a3 to 09477f9 Compare July 27, 2026 20:38
drungrin added 2 commits July 27, 2026 17:58
…vergence

The plan-review-convergence REVIEWER_FLAGS whitelist parsed only a subset
of the reviewers gsd-review accepts. Passing --cursor or --qwen was
silently dropped and the loop fell back to --codex, so a user believed
they converged against Cursor/Qwen when they converged against Codex, and
the only way to reach those reviewers was --all (which pulls in every
detected CLI).

Add --cursor and --qwen to the argument-parsing step so each accumulates
into REVIEWER_FLAGS and is forwarded to the inner gsd-review call, and
mirror them in the argument-hint and flag docs (command, generated
SKILL.md, COMMANDS.md). Purely additive: default behavior, --all, and the
already-parsed flags are unchanged; an unknown reviewer still falls back
to --codex.

Tests assert both new flags pass through the deployed extraction block
and that the unknown-reviewer fallback is preserved.
drungrin added 4 commits July 27, 2026 17:59
…golden fixtures

The convergence signature in the full help mode and the --next --converge
passthrough list still advertised the pre-parity reviewer set. Add the two
flags to both, and regenerate the golden-install-parity hashes for the
command, skill, and workflow files whose content changed.
…e flags

Adding the --cursor/--qwen parse lines grew plan-review-convergence.md
from 23713 to 23903 bytes, tripping the per-file workflow size ratchet.
The growth is two grep lines plus their doc entries, not lazy-loadable
content, so the baseline is regenerated rather than the content extracted.
…omous/next

autonomous.md and next.md build CONVERGENCE_ARGS from a fixed allowlist and
forward only that variable into the convergence skill call; raw ARGUMENTS never
reaches it. The allowlist stopped at --llama-cpp, so '--converge --cursor' and
'--converge --qwen' were silently dropped to the --codex default one hop before
the convergence workflow ever saw them. --agy/--antigravity had the same gap.

Add the four flags to both loops, correct the flag enumerations in the command
and how-to docs that advertise the passthrough, widen the changeset to cover the
passthrough fix, and regenerate the derived skills, install-parity fixtures, and
workflow size baseline.

Cover it with a parity test that derives the expected set from the convergence
REVIEWER_FLAGS whitelist rather than hardcoding it, so a future reviewer flag
cannot be added to the workflow without both forwarders being updated too.
…r/qwen/agy/antigravity

The static reviewerFlags arrays in autonomous-converge and
adr-15-progress-converge asserted only the pre-existing flag set, so they
read as authoritative while omitting the flags the forwarding loops now
emit. Align both arrays with the CONVERGENCE_ARGS loop order in
autonomous.md and next.md.
@drungrin drungrin reopened this Jul 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: workflows Workflow definitions review: changes requested PR reviewed — changes required before merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add --cursor, --qwen, and --agy reviewer flags to /gsd-plan-review-convergence for parity with /gsd-review

2 participants