feat(#3653): add review.models.cursor — wire modelArg/modelConfigKey for the cursor reviewer lane (#4160)
* feat(#3653): add review.models.cursor — wire modelArg/modelConfigKey for the cursor reviewer lane cursor-agent exposes --model (204 selectable models) but the cursor lane declared modelArg: null / modelConfigKey: null, so review.models.cursor was rejected as an unknown config key and the #1517 reviewer-instances escape hatch silently discarded a configured model at modelExpansion. Wire the lane the same way codex already is: inject {{model}} into args right after -p, set modelArg to --model, and declare modelConfigKey as review.models.cursor plus its config schema entry. An unconfigured lane still invokes byte-identically to today. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs(#3653): add changeset for review.models.cursor Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(#3653): update co-change surfaces that assumed cursor has no model key gsd-test surfaced three surfaces still hardcoding "cursor declares no modelConfigKey", broken by wiring review.models.cursor: - tests/reviewer-config-federation.test.cjs: the #3691-narrows-#2797 invariant test listed cursor among lanes that must own no model key. - tests/settings-integrations.test.cjs: the #3651 keyless-lane test listed cursor as keyless, including a live config-set assertion that now correctly succeeds instead of failing (swapped to qwen). - gsd-core/workflows/settings-integrations.md: the settable-keys enumeration and two prose call-outs still named cursor as keyless. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(#3653): acknowledge deliberate growth of settings-integrations.md settings-integrations.md grew 4 bytes because it now enumerates review.models.cursor as a settable key alongside the other reviewer lanes, matching the modelConfigKey wired for cursor in this PR. Emitted-Drift-Ack-Growth: settings-integrations.md — adds review.models.cursor to the settable-keys enumeration and removes cursor from the two keyless-lane call-outs, matching #3653's modelConfigKey change Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(#3653): fix malformed Emitted-Drift-Ack-Growth trailer The previous commit's trailer was separated from Co-Authored-By by a blank line, splitting it into an earlier, non-trailer paragraph — git's trailer parser only recognizes the last contiguous block. Restating it here immediately adjacent to Co-Authored-By so both parse as trailers. Emitted-Drift-Ack-Growth: settings-integrations.md — adds review.models.cursor to the settable-keys enumeration and removes cursor from the two keyless-lane call-outs, matching #3653's modelConfigKey change Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * docs(#3653): backfill changeset pr number pr:0 -> pr:4160 now that https://github.com/open-gsd/gsd-core/pull/4160 exists. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: sim <sim@local> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -195,10 +195,11 @@ interface ReviewerLaneCommon {
|
||||
* config value that is not a positive finite number, falls back to `timeoutFloorMs` unchanged.
|
||||
* For a lane whose `args` template ALSO carries a native tool-side timeout (antigravity's
|
||||
* `--print-timeout`, via the `{{nativeTimeout}}` ARGV_PLACEHOLDER), the resolved value feeds both
|
||||
* levels — see `resolveLanePlan`'s expansion of that token. Three lanes — `qwen`, `cursor`,
|
||||
* `coderabbit` — accept neither a model flag nor a host and own no `review.timeouts.<slug>` key
|
||||
* either, matching the same narrow key-ownership invariant `modelConfigKey` already follows for
|
||||
* them (#3691 narrows #2797).
|
||||
* levels — see `resolveLanePlan`'s expansion of that token. Two lanes — `qwen` and `coderabbit` —
|
||||
* accept neither a model flag nor a host and own no `review.timeouts.<slug>` key either, matching
|
||||
* the same narrow key-ownership invariant `modelConfigKey` already follows for them (#3691 narrows
|
||||
* #2797). `cursor` gained a model flag (`review.models.cursor`, #3653) but still owns no
|
||||
* `review.timeouts.cursor` key of its own.
|
||||
*/
|
||||
timeoutConfigKey: string | null;
|
||||
emptyOutput: EmptyOutputPolicy;
|
||||
@@ -431,10 +432,10 @@ export const REVIEWER_LANES: ReadonlyArray<ReviewerLane> = Object.freeze([
|
||||
probe: { kind: 'command-exists', binary: 'cursor-agent' },
|
||||
invoke: {
|
||||
binary: 'cursor-agent',
|
||||
args: ['-p', '--mode', 'ask', '--trust', '--output-format', 'text', '{{prompt}}'],
|
||||
args: ['-p', '{{model}}', '--mode', 'ask', '--trust', '--output-format', 'text', '{{prompt}}'],
|
||||
promptChannel: 'argv-file-ref',
|
||||
outputChannel: 'stdout',
|
||||
modelArg: null,
|
||||
modelArg: '--model',
|
||||
effortChannel: 'none',
|
||||
},
|
||||
timeoutFloorMs: 900_000,
|
||||
@@ -444,7 +445,8 @@ export const REVIEWER_LANES: ReadonlyArray<ReviewerLane> = Object.freeze([
|
||||
evidenceClass: 'source-grounded',
|
||||
requiresBinaries: [],
|
||||
promptBudgetKey: 'review.max_prompt_tokens_per_reviewer.cursor',
|
||||
modelConfigKey: null,
|
||||
// #3653: cursor-agent exposes --model (204 selectable models); wired the same as codex.
|
||||
modelConfigKey: 'review.models.cursor',
|
||||
handler: null,
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user