Skip to content

Testing plan: the cursor adapter's model flag

Derived from bugfix.md and design.md, before tasks.md — each task's _Test:_ names a row of the matrix below. Authored at test-planning, completed at verification. See reference/testing.md.

This file is executable content. It names commands an agent will run, so review it like code. This work item needs no credentials and touches no network.

Test matrix

#TypeApplies?Scope / what it provesWhere it runs
T1Unityesthe cursor one-shot argv carries --model <name> when a model is resolved (R1.1), and is byte-for-byte today's argv when none is (R1.3); model_args resolves through the corrected flaguv run --project cli python -m pytest -q cli/tests/test_critics.py cli/tests/test_modelchoice.py
T2Unityesa critic declared harness: cursor + model: resolves to the full cursor-agent … --model <name> argv (R1.2) — the end-to-end critic seam, one layer above T1uv run --project cli python -m pytest -q cli/tests/test_critics.py -k builtin_harness
T3Migration / upgradeyesa refused verdict cached against the -m argv no longer withholds the choice once the flag is --model (design D3) — no cache migration is neededuv run --project cli python -m pytest -q cli/tests/test_modelprobe.py
T4Integration (scenario)n/a — the defect is entirely in argv construction, which T1/T2 assert directly; an integration scenario would need a real cursor-agent, which is absent from CI and from this container
T5End-to-endn/a — same reason as T4, plus a Cursor account. The reporter's live cursor-agent run in the ticket is the end-to-end evidence, recorded in evidence/verification.md as external
T6Contract (OpenAPI / GraphQL SDL)n/a — no API surface changes; docs/api-specs/ untouched
T7UI / visualn/a — no user-facing surface (design.md §UI/UX)
T8Snapshotn/a — the argv is asserted verbatim at T1/T2; a snapshot would restate it less legibly
T9Performance / loadn/a — one string constant on a path that already spawns a process
T10Security / abuse caseyesthe three abuse cases of bugfix.md are all "unchanged boundary", so the proof is that the boundary's existing negative tests still hold: no-shell argv, the claude adapter's argv untouched, and a name that resolves to nothing still refuseduv run --project cli python -m pytest -q cli/tests/test_critics.py cli/tests/test_modelprobe.py cli/tests/test_modelchoice.py
T11Accessibilityn/a — no rendered UI
T12Manual exploratoryn/a — there is nothing to explore that T1–T3 do not assert, and the one thing a human could add (a live cursor-agent) is T5's reason
T13Repository gatesyesthe whole repository still passes what CI runs: ruff, ruff format, pyright, config validation, the full suite, and markdownlint over every **/*.md — including this work item's own artifactsmake check

Scenarios & requirement trace

RowRequirement(s)Scenario / case
T1R1.1, R1.4test_cursor_oneshot_argv_uses_the_long_model_flag (new)
T1R1.1test_a_model_resolves_through_the_adapters_flag (corrected from -m)
T1R1.3test_oneshot_argv_without_a_model_is_the_plain_one_shot_run (unchanged — it is the "no flag when no model" guard)
T2R1.2, R1.4test_builtin_harness_derives_argv_from_the_adapter (corrected from -m)
T3design D3test_a_verdict_probed_with_the_old_cursor_flag_no_longer_withholds (new)
T10bugfix.md §AC1test_placeholder_value_with_metacharacters_stays_one_argument and test_the_prompt_reaches_the_critic_as_one_argumentrun_critic spawns a list argv with shell=False (critics.py:446), unchanged here
T10bugfix.md §AC2test_an_effort_level_a_harness_cannot_express_is_refused_without_running and test_abuse_a_forged_verdict_cannot_introduce_a_choice — a choice still has to be probed to be offered, and nothing outside the probe may introduce one
T10bugfix.md §AC3test_oneshot_argv_appends_the_model_flag (claude, unchanged)
T13R2.1, R2.2make check — markdownlint over the capability doc and these artifacts

Verification results

Filled in at verification. Every row marked yes above is ticked here, with the command, the outcome, and where the evidence is committed.

  • [x] T1 — uv run --project cli python -m pytest -q cli/tests/test_critics.py cli/tests/test_modelchoice.py
  • [x] T2 — uv run --project cli python -m pytest -q cli/tests/test_critics.py -k builtin_harness
  • [x] T3 — uv run --project cli python -m pytest -q cli/tests/test_modelprobe.py
  • [x] T10 — uv run --project cli python -m pytest -q cli/tests/test_critics.py cli/tests/test_modelprobe.py cli/tests/test_modelchoice.py
  • [x] T13 — make check
What was verifiedCommandOutcomeEvidence
The failing state: the two new assertions and the corrected ones, before the fixpytest -q cli/tests/test_critics.py::…long_model_flag cli/tests/test_modelchoice.py::…adapters_flagfail (red, as designed)evidence/red.md
T1, T2, T3, T10 — the argv, the critic seam, the verdict cache, the unchanged boundariespytest -q cli/tests/test_critics.py cli/tests/test_modelchoice.py cli/tests/test_modelprobe.pypassevidence/verification.md
T13 — every repository gate CI runsmake checkpassevidence/verification.md

Released under the MIT License.