@open-agent-toolkit/cli 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/assets/agents/oat-reviewer.md +7 -2
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/config/dispatch-matrix-recommendation.json +63 -43
  4. package/assets/docs/cli-utilities/configuration.md +20 -8
  5. package/assets/docs/cli-utilities/workflow-gates.md +1 -1
  6. package/assets/docs/contributing/index.md +1 -0
  7. package/assets/docs/contributing/updating-model-guidance.md +106 -0
  8. package/assets/docs/contributing/verifying-cursor-pins.md +30 -18
  9. package/assets/docs/provider-sync/providers.md +5 -2
  10. package/assets/docs/reference/cli-reference.md +1 -1
  11. package/assets/docs/reference/oat-directory-structure.md +1 -1
  12. package/assets/docs/workflows/projects/artifacts.md +1 -1
  13. package/assets/docs/workflows/projects/dispatch-ceiling.md +67 -50
  14. package/assets/docs/workflows/projects/evidence-layers.md +6 -2
  15. package/assets/docs/workflows/projects/implementation-execution.md +9 -4
  16. package/assets/docs/workflows/projects/lifecycle.md +8 -6
  17. package/assets/docs/workflows/projects/programmatic-execution.md +4 -3
  18. package/assets/public-package-versions.json +4 -4
  19. package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
  20. package/assets/skills/oat-dispatch-subagents/references/provider-claude.md +20 -7
  21. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -4
  22. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -4
  23. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  24. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +2 -0
  25. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +82 -25
  26. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -4
  27. package/assets/skills/oat-project-implement/references/phase-execution.md +16 -8
  28. package/assets/skills/oat-project-import-plan/SKILL.md +7 -4
  29. package/assets/skills/oat-project-lite/SKILL.md +5 -3
  30. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +4 -4
  31. package/assets/skills/oat-project-plan/SKILL.md +7 -4
  32. package/assets/skills/oat-project-plan-writing/SKILL.md +28 -16
  33. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -4
  34. package/assets/skills/oat-project-quick-start/SKILL.md +7 -4
  35. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -4
  36. package/assets/skills/oat-project-review-provide/SKILL.md +7 -4
  37. package/assets/skills/subagent-orchestration/SKILL.md +1 -1
  38. package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +30 -29
  39. package/assets/skills/subagent-orchestration/references/provider-claude.md +41 -36
  40. package/assets/skills/subagent-orchestration/references/provider-codex.md +30 -35
  41. package/assets/skills/subagent-orchestration/references/provider-cursor.md +46 -38
  42. package/assets/templates/plan.md +5 -5
  43. package/dist/commands/project/dispatch/record.d.ts.map +1 -1
  44. package/dist/commands/project/dispatch/record.js +27 -5
  45. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  46. package/dist/commands/project/dispatch-ceiling/index.js +112 -35
  47. package/dist/config/dispatch-matrix.d.ts.map +1 -1
  48. package/dist/config/dispatch-matrix.js +13 -0
  49. package/dist/providers/ceiling/registry.d.ts +7 -2
  50. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  51. package/dist/providers/ceiling/registry.js +35 -11
  52. package/dist/providers/claude/codec/materialize.d.ts +33 -0
  53. package/dist/providers/claude/codec/materialize.d.ts.map +1 -0
  54. package/dist/providers/claude/codec/materialize.js +149 -0
  55. package/dist/providers/claude/codec/sync-extension.d.ts +24 -0
  56. package/dist/providers/claude/codec/sync-extension.d.ts.map +1 -0
  57. package/dist/providers/claude/codec/sync-extension.js +312 -0
  58. package/dist/providers/claude/dispatch-envelope.d.ts +34 -0
  59. package/dist/providers/claude/dispatch-envelope.d.ts.map +1 -0
  60. package/dist/providers/claude/dispatch-envelope.js +233 -0
  61. package/dist/providers/claude/targets.d.ts +48 -0
  62. package/dist/providers/claude/targets.d.ts.map +1 -0
  63. package/dist/providers/claude/targets.js +228 -0
  64. package/dist/providers/codex/codec/shared.d.ts +6 -0
  65. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  66. package/dist/providers/codex/codec/shared.js +8 -0
  67. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
  68. package/dist/providers/cursor/codec/catalog.js +47 -45
  69. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts +35 -0
  70. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts.map +1 -1
  71. package/dist/providers/identity/claude-runtime-observation.fixtures.js +225 -12
  72. package/dist/providers/shared/registry.d.ts.map +1 -1
  73. package/dist/providers/shared/registry.js +5 -2
  74. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.2.8
3
+ version: 1.2.9
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
5
5
  tools: Read, Bash, Grep, Glob, Write, Task
6
6
  color: yellow
@@ -72,7 +72,12 @@ The orchestrator owns dispatch control. Do not read `plan.md` Dispatch Profile r
72
72
 
73
73
  For Codex, deterministic review dispatch under a capped managed policy uses the materialized Codex role name returned by `providers.codex.dispatchArgs.variant`; the orchestrator also supplies `providers.codex.selection.target` context when available and should derive `model_axis` and `effort_axis` from resolver output. Managed `Uncapped` and inherit/default policies have no reviewer target, so the base `oat-reviewer` role is used only when the resolver returns no `dispatchArgs.variant`, as a provider-default/unpinned fallback. If you are running as the base role, report any provided `provider_default_effort` as context but do not treat it as managed uncapped selection or an OAT cap. Use base `oat-reviewer` only when the resolver returns no `dispatchArgs.variant`.
74
74
 
75
- For Claude Code, review dispatch is model-axis based and the effort axis is `not-applicable`.
75
+ For Claude Code, an effort-pinned managed review launches the exact generated
76
+ variant returned by `providers.claude.dispatchArgs.variant`; the variant's
77
+ frontmatter applies both model and effort because the Agent call has no effort
78
+ field. Any per-call model must match the definition. Derive both selected axes
79
+ from resolver output and the launcher payload. Legacy model-only and inherited
80
+ routes retain their existing provider-default or inherited effort behavior.
76
81
 
77
82
  ## Bounded Reviewer Reconnaissance
78
83
 
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.1"
3
+ "oatVersion": "0.3.2"
4
4
  }
@@ -1,22 +1,22 @@
1
1
  {
2
- "version": "2026-07-27.1",
2
+ "version": "2026-09-23.2",
3
3
  "providers": {
4
4
  "codex": {
5
5
  "economy": {
6
6
  "candidates": [
7
7
  {
8
8
  "harness": "codex",
9
- "model": "gpt-5.6-luna",
9
+ "model": "gpt-6-luna",
10
10
  "effort": "low"
11
11
  },
12
12
  {
13
13
  "harness": "codex",
14
- "model": "gpt-5.6-luna",
14
+ "model": "gpt-6-luna",
15
15
  "effort": "medium"
16
16
  },
17
17
  {
18
18
  "harness": "codex",
19
- "model": "gpt-5.6-luna",
19
+ "model": "gpt-6-luna",
20
20
  "effort": "high"
21
21
  }
22
22
  ]
@@ -25,28 +25,13 @@
25
25
  "candidates": [
26
26
  {
27
27
  "harness": "codex",
28
- "model": "gpt-5.6-luna",
28
+ "model": "gpt-6-luna",
29
29
  "effort": "xhigh"
30
30
  },
31
31
  {
32
32
  "harness": "codex",
33
- "model": "gpt-5.6-terra",
34
- "effort": "low"
35
- },
36
- {
37
- "harness": "codex",
38
- "model": "gpt-5.6-terra",
39
- "effort": "medium"
40
- },
41
- {
42
- "harness": "codex",
43
- "model": "gpt-5.6-terra",
44
- "effort": "high"
45
- },
46
- {
47
- "harness": "codex",
48
- "model": "gpt-5.6-terra",
49
- "effort": "xhigh"
33
+ "model": "gpt-6-luna",
34
+ "effort": "max"
50
35
  }
51
36
  ]
52
37
  },
@@ -54,17 +39,17 @@
54
39
  "candidates": [
55
40
  {
56
41
  "harness": "codex",
57
- "model": "gpt-5.6-sol",
42
+ "model": "gpt-6-sol",
58
43
  "effort": "low"
59
44
  },
60
45
  {
61
46
  "harness": "codex",
62
- "model": "gpt-5.6-sol",
47
+ "model": "gpt-6-sol",
63
48
  "effort": "medium"
64
49
  },
65
50
  {
66
51
  "harness": "codex",
67
- "model": "gpt-5.6-sol",
52
+ "model": "gpt-6-sol",
68
53
  "effort": "high"
69
54
  }
70
55
  ]
@@ -73,12 +58,12 @@
73
58
  "candidates": [
74
59
  {
75
60
  "harness": "codex",
76
- "model": "gpt-5.6-sol",
61
+ "model": "gpt-6-sol",
77
62
  "effort": "xhigh"
78
63
  },
79
64
  {
80
65
  "harness": "codex",
81
- "model": "gpt-5.6-sol",
66
+ "model": "gpt-6-sol",
82
67
  "effort": "max"
83
68
  }
84
69
  ]
@@ -86,16 +71,61 @@
86
71
  },
87
72
  "claude": {
88
73
  "economy": {
89
- "candidates": ["haiku", "sonnet"]
74
+ "candidates": [
75
+ "haiku",
76
+ {
77
+ "harness": "claude",
78
+ "model": "claude-sonnet-5",
79
+ "effort": "medium"
80
+ }
81
+ ]
90
82
  },
91
83
  "balanced": {
92
- "candidates": ["sonnet"]
84
+ "candidates": [
85
+ {
86
+ "harness": "claude",
87
+ "model": "claude-opus-5-5",
88
+ "effort": "low"
89
+ }
90
+ ]
93
91
  },
94
92
  "high": {
95
- "candidates": ["opus"]
93
+ "candidates": [
94
+ {
95
+ "harness": "claude",
96
+ "model": "claude-opus-5-5",
97
+ "effort": "low"
98
+ },
99
+ {
100
+ "harness": "claude",
101
+ "model": "claude-opus-5-5",
102
+ "effort": "medium"
103
+ },
104
+ {
105
+ "harness": "claude",
106
+ "model": "claude-opus-5-5",
107
+ "effort": "high"
108
+ }
109
+ ]
96
110
  },
97
111
  "frontier": {
98
- "candidates": ["fable"]
112
+ "candidates": [
113
+ {
114
+ "harness": "claude",
115
+ "model": "claude-opus-5-5",
116
+ "effort": "xhigh"
117
+ },
118
+ {
119
+ "harness": "claude",
120
+ "model": "claude-opus-5-5",
121
+ "effort": "max"
122
+ },
123
+ {
124
+ "harness": "claude",
125
+ "model": "claude-fable-5-1",
126
+ "effort": "high"
127
+ }
128
+ ]
99
129
  }
100
130
  },
101
131
  "cursor": {
@@ -107,24 +137,14 @@
107
137
  ]
108
138
  },
109
139
  "balanced": {
110
- "candidates": [
111
- "cursor-grok-4.5-high",
112
- "gpt-5.6-terra-high",
113
- "claude-opus-5-thinking-low"
114
- ]
140
+ "candidates": ["cursor-grok-4.5-high", "gpt-5.6-terra-high"]
115
141
  },
116
142
  "high": {
117
- "candidates": [
118
- "claude-opus-5-thinking-medium",
119
- "gpt-5.6-sol-medium",
120
- "claude-opus-5-thinking-high",
121
- "gpt-5.6-sol-high"
122
- ]
143
+ "candidates": ["gpt-5.6-sol-medium", "gpt-5.6-sol-high"]
123
144
  },
124
145
  "frontier": {
125
146
  "candidates": [
126
147
  "gpt-5.6-sol-xhigh",
127
- "claude-opus-5-thinking-xhigh",
128
148
  "gpt-5.6-sol-max",
129
149
  "claude-fable-5-thinking-high"
130
150
  ]
@@ -475,12 +475,24 @@ even when the reusable ladder is user-owned.
475
475
  The example above is illustrative rather than a copy of the bundled ladder; its
476
476
  tiers are trimmed for readability.
477
477
 
478
- The bundled recommendation covers 13 Codex model/effort combinations: Luna and
479
- Terra at `low`, `medium`, `high`, and `xhigh`, plus Sol at those efforts and
480
- `max`. Claude covers `haiku`, `sonnet`, `opus`, and `fable`. The recommendation
481
- carries 14 Cursor candidates across four tiers, drawn from a materialization
482
- catalogue with 18 catalogued multi-family flat IDs spanning Composer, Claude
483
- (Sonnet, Opus, and Fable), GPT, and Grok; the two figures differ because some
478
+ The bundled recommendation covers 10 Codex model/effort combinations: GPT-6
479
+ Luna at `low` through `max`, and GPT-6 Sol at the same efforts.
480
+ Claude covers `haiku`, plus explicit Sonnet, Opus, and Fable
481
+ model/effort pairs. Effort-pinned Claude cells require a recognized versioned
482
+ model ID (`fable-5-1`, `fable-5`, `opus-5-5`, `sonnet-5`,
483
+ `opus-4-7`, `opus-4-6`, or `sonnet-4-6`) or a matching
484
+ `ANTHROPIC_DEFAULT_<FAMILY>_MODEL` pin. A custom provider pin must declare
485
+ matching capability through `<PIN>_SUPPORTED_CAPABILITIES`: `effort` enables
486
+ `low`, `medium`, and `high`, while `xhigh_effort` and `max_effort` add those
487
+ rungs. A present declaration is authoritative. Host-managed routing through
488
+ `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST` takes precedence over family pins, and a
489
+ bare effort-pinned alias fails closed when its generation cannot be proven.
490
+ Model-only Claude aliases remain compatible through the per-call model argument
491
+ and report `effortAxis: not-applicable` because the Agent API exposes no
492
+ per-call effort argument. The recommendation carries 10 Cursor candidates
493
+ across four tiers, drawn from a materialization
494
+ catalogue with 17 catalogued multi-family flat IDs spanning Composer, Claude
495
+ (Sonnet, Opus 5.5, and Fable), GPT, and Grok; the two figures differ because some
484
496
  approved mappings stay materializable without being recommended. An explicit
485
497
  mapping connects each flat ladder ID to a separate bracket-form frontmatter
486
498
  model; configuration and skills never derive or normalize either form.
@@ -598,7 +610,7 @@ not the exact managed phase-agent path.
598
610
  | Provider | Exact phase-agent or optional-child mechanism |
599
611
  | -------- | ---------------------------------------------------------------------------------------------------- |
600
612
  | Codex | `providers.codex.dispatchArgs.variant` as `agent_type`, or a fresh child pinned to model plus effort |
601
- | Claude | `providers.claude.dispatchArgs.model` as the actual Agent `model` |
613
+ | Claude | `providers.claude.dispatchArgs.variant` for effort-pinned targets; exact `model` for legacy targets |
602
614
  | Cursor | `providers.cursor.dispatchArgs.variant` as the exact native agent type first |
603
615
 
604
616
  Project sync materializes the supported Codex and Cursor catalogues and every
@@ -617,7 +629,7 @@ ownership. Cleanup reconciles only the current owner. Cursor's mapping registry
617
629
  rejects unknown flat IDs instead of writing unverified frontmatter.
618
630
 
619
631
  Reviewer resolution uses the final candidate at the configured review ceiling.
620
- Codex and Cursor select exact native reviewer variants; Claude passes the
632
+ Codex, Cursor, and effort-pinned Claude targets select exact native reviewer variants; legacy Claude passes the
621
633
  resolver's exact model argument. Timeout retries preserve the same complete
622
634
  payload. A lower reviewer candidate requires a separate reviewed contract.
623
635
 
@@ -605,7 +605,7 @@ that candidate's model and is not double-pinned.
605
605
  "model": "composer-2.5",
606
606
  "reasoningEffort": "provider-default"
607
607
  },
608
- "models": ["composer-2.5", "gpt-5.5-xhigh", "claude-opus-4-8"],
608
+ "models": ["composer-2.5", "gpt-5.5-xhigh", "claude-opus-5-5"],
609
609
  "availabilityCommand": [
610
610
  "sh",
611
611
  "-c",
@@ -17,4 +17,5 @@ Use this section when you are changing OAT itself rather than consuming it as a
17
17
  - [Commit Conventions](commit-conventions.md) - Traceable commit patterns for project and docs work.
18
18
  - [Hooks and Safety](hooks-and-safety.md) - Safety and mutation contracts for provider-sync behavior.
19
19
  - [Smoke Testing](smoke-testing.md) - Runbook for the live workflow smoke runner: prerequisites, scenarios, evidence reports, and recovery.
20
+ - [Updating Model Guidance](updating-model-guidance.md) - Source map and verification checklist for provider model refreshes.
20
21
  - [Verifying Cursor Pins](verifying-cursor-pins.md) - Runbook for probe-verifying a Cursor model pin before shipping it.
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: Updating Model Guidance
3
+ description: How to verify provider model IDs, update supported dispatch targets and preferred ladders, sync agent views, and validate a model refresh.
4
+ ---
5
+
6
+ # Updating Model Guidance
7
+
8
+ A model refresh crosses several independently owned surfaces. First establish the
9
+ provider's exact model ID and effort controls; then update the runtime's supported
10
+ targets, the optional preferred dispatch ladder, and the human selection guidance.
11
+ A model appearing in a provider's catalog does not by itself establish that a
12
+ subagent pin resolves to it. Keep an explicit user's dispatch cells intact unless
13
+ they choose to adopt a newer recommendation.
14
+
15
+ ## Source Ownership
16
+
17
+ | Concern | Canonical source | Effect |
18
+ | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
+ | Codex model and effort support | `packages/cli/src/providers/codex/codec/shared.ts`, `packages/cli/src/commands/project/dispatch-ceiling/index.ts`, and `packages/cli/src/providers/ceiling/registry.ts` | The catalogue materializes role variants; candidate validation accepts supported efforts through `max`, while the scalar ceiling in `packages/cli/src/config/oat-config.ts` stops at `max`. |
20
+ | Claude generation and effort support | `packages/cli/src/providers/claude/targets.ts` and `packages/cli/src/providers/claude/dispatch-envelope.ts` | Resolver validates the versioned model and permitted efforts, including the schema for a dispatch envelope. |
21
+ | Cursor flat ID to frontmatter selector | `packages/cli/src/providers/cursor/codec/catalog.ts` | Approved, evidence-backed mappings can be materialized; flat IDs are not derived from selector syntax. |
22
+ | Bundled preferred ladder | `packages/cli/config/dispatch-matrix-recommendation.json` | Ordered candidates per provider and tier; it is a preference, not the entire support catalog. |
23
+ | Dispatch advice | `.agents/skills/subagent-orchestration/SKILL.md` and `references/provider-{codex,claude,cursor}.md` | Agents learn the task-class routes and evidence limits. Increment `metadata.version` when bundled skill content changes. |
24
+ | Published CLI asset | `packages/cli/assets/config/dispatch-matrix-recommendation.json` | Generated copy of the canonical recommendation; regenerate via the CLI asset build. |
25
+ | Generated project agent views | `.codex/agents`, `.codex/config.toml`, `.claude/agents`, `.cursor/agents` | Outputs of `oat sync`; never use them as catalog sources. |
26
+
27
+ A model can remain supported for a user's explicit configuration without being
28
+ recommended by the new ladder. For example, this refresh keeps GPT-5.6 Codex
29
+ and Cursor targets available while preferring GPT-6 in Codex. Claude Opus 4.8
30
+ and 5.0 have left current supported generations and recommendations; historical
31
+ probe records can still describe past behavior, clearly labeled as historical.
32
+
33
+ ## Establish Provider Evidence
34
+
35
+ Check the provider's official model documentation and the local runtime before
36
+ editing an ID or effort range. The [OpenAI model catalog](https://developers.openai.com/api/docs/models)
37
+ lists GPT-6 Sol and Luna; compare it with the installed Codex runtime model
38
+ cache for the exact names and local effort set. The
39
+ [Anthropic Opus 5.5 documentation](https://www.anthropic.com/claude-opus-5-5)
40
+ names `claude-opus-5-5`; confirm a Claude Code invocation reports that exact
41
+ assistant model before admitting it to the Claude catalog. Claude subagent
42
+ `model` and `effort` frontmatter select a per-agent route; see the
43
+ [Claude Code subagent fields](https://code.claude.com/docs/en/sub-agents).
44
+ An API model announcement alone does not prove a third-party harness supports
45
+ or resolves that model.
46
+
47
+ Cursor requires an additional mapping-specific native desktop probe. Follow
48
+ [Verifying Cursor Pins](verifying-cursor-pins.md): launch a temporary subagent
49
+ in Cursor Agent Chat and compare the `subagentStart.subagent_model` hook value
50
+ with the proposed flat ID, using positive and unknown-family/effort controls.
51
+ Record the submitted selector, resolved model, time, and evidence path in the
52
+ mapping. `agent models` proves catalog visibility only; CLI `agent -p` and
53
+ remote runs do not emit the required native subagent hook.
54
+
55
+ During this refresh, `agent models` listed `claude-opus-5-5-*` flat IDs.
56
+ The CLI `agent -p` bracket selector returned `Cannot use this model`, but a
57
+ later Cursor desktop 3.20.14 native hook probe (provenance at
58
+ `packages/cli/src/providers/cursor/codec/__fixtures__/README.md`, observations
59
+ in adjacent JSONL records) resolved each of the five Opus 5.5 effort
60
+ selectors to its matching flat ID.
61
+ The positive Sonnet control resolved, while invalid family and effort controls
62
+ fell back to defaults. Five Opus 5.5 mappings are now approved for desktop
63
+ subagents; the CLI result alone does not establish that the same bracket syntax
64
+ works as a CLI top-level `--model` argument. Likewise, do not add GPT-6
65
+ Cursor targets until that runtime lists and verifies them. See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
66
+ for the distinction between catalog, configured mapping, and runtime identity.
67
+
68
+ ## Change and Validate
69
+
70
+ 1. Update the supported catalog for each verified runtime and its tests. Preserve
71
+ old model targets that are intentionally still supported; remove retired
72
+ generations from active support and recommendations, while retaining
73
+ historically sourced fixtures when they are explicitly testing history.
74
+ 2. Update the bundled recommendation's ordered candidate cells and version.
75
+ Check the _last_ candidate in each tier: it determines that tier's pinned
76
+ self-review target. Keep the ladder within its provider's supported catalog.
77
+ 3. Update the provider selection references and bump the canonical skill
78
+ version once for the PR. Search the repository for the old and new IDs,
79
+ including schemas, fixtures, examples, and generated projections. Replace
80
+ current guidance; do not rewrite clearly marked historical evidence.
81
+ 4. Build the CLI to regenerate its bundled asset, run project sync, and inspect
82
+ the generated role definitions and configuration diff. Use `oat sync --scope project --dry-run` afterward to verify source/output parity.
83
+ 5. Run the focused catalog, recommendation, sync, and asset tests, followed by
84
+ the repository gates in `AGENTS.md`: `pnpm check`, `pnpm type-check`,
85
+ `pnpm test`, `pnpm build`, `pnpm run check:skill-bumps`,
86
+ `pnpm release:check-versions`, `pnpm release:validate`, and
87
+ `pnpm build:docs`. Fetch `origin/main` before the version check. For
88
+ `.agents/skills` changes also run `pnpm lint` and `pnpm format`.
89
+ Inspect cache replay in Turborepo output; force fresh tests when the
90
+ evidence matters. Record exact failures and distinguish an unavailable
91
+ native provider probe from a successful one.
92
+
93
+ Changes to shipped skills, generated agents, CLI assets, or docs require the
94
+ public packages' lockstep version bump under the repository release policy.
95
+ Follow [Contributing Code](code.md) for the current validation and PR workflow.
96
+
97
+ ## Adoption Is Separate
98
+
99
+ The bundled ladder is a default for missing provider/tier cells. `oat config
100
+ adopt dispatch-matrix --shared`, `--local`, or `--user` fills missing cells but
101
+ does not replace populated explicit cells, even when its recommendation version
102
+ changes. A user who wants the new model ordering must edit those cells or
103
+ clear and re-adopt them deliberately. The active project's named ceiling is a
104
+ separate policy in its `state.md`; a model update must not silently change it.
105
+ See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#ownership-and-adoption)
106
+ for config precedence and examples.
@@ -6,8 +6,8 @@ description: 'Runbook for probe-verifying a Cursor model pin before shipping it:
6
6
  # Verifying Cursor Pins
7
7
 
8
8
  A Cursor model pin maps an OAT ladder model ID to the frontmatter selector that
9
- materialized role files carry, for example `claude-opus-5-thinking-medium` to
10
- `claude-opus-5[effort=medium]`. Adding one to
9
+ materialized role files carry, for example `gpt-5.6-sol-medium` to
10
+ `gpt-5.6-sol[reasoning=medium]`. Adding one to
11
11
  `packages/cli/src/providers/cursor/codec/catalog.ts` requires evidence that
12
12
  Cursor actually resolves that selector to the intended model.
13
13
 
@@ -26,7 +26,7 @@ that look like evidence are not:
26
26
  ask.
27
27
 
28
28
  The catalog alone is also insufficient wherever a family carries both a
29
- thinking and a non-thinking flat ID at the same rung. Opus 5 carries both at
29
+ thinking and a non-thinking flat ID at the same rung. Historically, Opus 5 carried both at
30
30
  low, medium, and high, so the bracket selector is genuinely ambiguous there and
31
31
  only a probe can resolve it. At rungs where only one variant exists, the
32
32
  catalog settles the question without a probe — but you still need the probe to
@@ -57,6 +57,15 @@ flag) is empty and `model_id` is absent. Thinking is therefore established by
57
57
  the resolved slug itself, which is sound because the non-thinking IDs are
58
58
  distinct.
59
59
 
60
+ The 2026-09-23 Opus 5.5 desktop probe is an example: all five
61
+ `claude-opus-5-5[effort=...]` selectors resolved to matching flat IDs in
62
+ Cursor 3.20.14, while `effort=ultra` fell back to medium. The Sonnet 5 high control
63
+ resolved to `claude-sonnet-5-thinking-high`, correcting an older flat ID. The provenance summary at
64
+ `packages/cli/src/providers/cursor/codec/__fixtures__/README.md` identifies
65
+ the adjacent redacted summary and 32-event native JSONL records in the OAT
66
+ repository. Re-run this procedure for a new family or changed
67
+ provider behavior.
68
+
60
69
  ## Prerequisites
61
70
 
62
71
  - Cursor desktop app, with the repository open as a workspace.
@@ -133,10 +142,10 @@ the probe is the hook payload, not anything the agent produces.
133
142
  ````markdown
134
143
  ---
135
144
  # TEMPORARY pin probe - not oat-managed. Delete after probing.
136
- # Class: subject - expect claude-opus-5-thinking-medium
137
- name: zz-pin-probe-opus5-medium
138
- description: Temporary pin probe (subject) for claude-opus-5[effort=medium]. Delete after use.
139
- model: claude-opus-5[effort=medium]
145
+ # Class: subject - expect gpt-5.6-sol-medium
146
+ name: zz-pin-probe-sol56-medium
147
+ description: Temporary pin probe (subject) for gpt-5.6-sol[reasoning=medium]. Delete after use.
148
+ model: gpt-5.6-sol[reasoning=medium]
140
149
  ---
141
150
 
142
151
  ## Role
@@ -144,7 +153,7 @@ model: claude-opus-5[effort=medium]
144
153
  You are a throwaway pin probe. Run exactly one command and then stop:
145
154
 
146
155
  ```bash
147
- echo PIN-PROBE zz-pin-probe-opus5-medium
156
+ echo PIN-PROBE zz-pin-probe-sol56-medium
148
157
  ```
149
158
 
150
159
  Then reply with the single word `done`. Do not read files or use any
@@ -162,12 +171,12 @@ corroborating `preToolUse` event.
162
171
  Probe every rung you intend to pin. Then add controls, which are what make the
163
172
  subject results interpretable:
164
173
 
165
- | Class | Example selector | Proves |
166
- | ---------------- | ------------------------------ | ---------------------------------------------------------------- |
167
- | Subject | `claude-opus-5[effort=medium]` | The mapping resolves as intended |
168
- | Positive control | `claude-sonnet-5[effort=high]` | Reproduces an already-verified mapping |
169
- | Negative control | `claude-opus-9[effort=high]` | Unknown family — the channel reports resolution, not the request |
170
- | Negative control | `claude-opus-5[effort=ultra]` | Unknown effort — exposes rung-level fallback |
174
+ | Class | Example selector | Proves |
175
+ | ---------------- | -------------------------------- | ---------------------------------------------------------------- |
176
+ | Subject | `gpt-5.6-sol[reasoning=medium]` | The mapping resolves as intended |
177
+ | Positive control | `claude-sonnet-5[effort=high]` | Reproduces an already-verified mapping |
178
+ | Negative control | `claude-opus-9[effort=high]` | Unknown family — the channel reports resolution, not the request |
179
+ | Negative control | `gpt-5.6-sol[reasoning=unknown]` | Unknown effort — exposes rung-level fallback |
171
180
 
172
181
  The negative controls carry most of the interpretive weight. Without them you
173
182
  cannot distinguish a hook that reports what Cursor actually resolved from one
@@ -194,6 +203,9 @@ PY
194
203
 
195
204
  ## Interpreting results
196
205
 
206
+ The following Opus 5 observations document earlier probes; Opus 5 is retired
207
+ from current mappings. Use the current live catalogue for new selectors.
208
+
197
209
  ### Unresolvable components fall back silently
198
210
 
199
211
  Cursor does not reject a malformed pin. It substitutes a default for whichever
@@ -240,10 +252,10 @@ approved it:
240
252
 
241
253
  ```ts
242
254
  approvedMapping(
243
- 'claude-opus-5-thinking-medium',
244
- 'claude-opus-5[effort=medium]',
245
- 'claude-effort',
246
- { probeName: 'zz-pin-probe-opus5-medium', verifiedAt: '2026-07-25', evidencePath: '...' },
255
+ 'gpt-5.6-sol-medium',
256
+ 'gpt-5.6-sol[reasoning=medium]',
257
+ 'gpt-reasoning',
258
+ { probeName: 'zz-pin-probe-sol56-medium', verifiedAt: '2026-07-25', evidencePath: '...' },
247
259
  ),
248
260
  ```
249
261
 
@@ -12,7 +12,9 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
12
12
  - Project: `.agents/skills` -> `.claude/skills`, `.agents/agents` -> `.claude/agents`, `.agents/rules` -> `.claude/rules`
13
13
  - User: `~/.agents/skills` -> `~/.claude/skills`, `~/.agents/agents` -> `~/.claude/agents`
14
14
  - Rule files stay `.md` and are rendered with Claude-compatible frontmatter when needed
15
- - Managed phase implementers and optional nested workers use the exact configured candidate returned as `providers.claude.dispatchArgs.model`; OAT passes that value as the actual Agent `model`
15
+ - Managed effort-pinned phase implementers and reviewers use the exact generated candidate returned as `providers.claude.dispatchArgs.variant`; its frontmatter carries model and effort because Agent has no per-call effort field. Legacy model-only candidates retain `providers.claude.dispatchArgs.model`, and any model supplied alongside a variant must match its definition.
16
+ - Generated names preserve the full normalized configured model ID after the provider token. A versioned ID such as `claude-opus-5-5` therefore produces the deterministic slug `oat-reviewer-claude-claude-opus-5-5-high`. This doubled `claude-` is the current managed-role contract, not a request to rename existing roles.
17
+ - Project variants live under `.claude/agents/`; user variants live under `~/.claude/agents/`. Sync removes stale managed variants for the reconciled owner while preserving base roles and unmanaged agents.
16
18
  - Claude's official subagent contract says existing agent directories are watched and changes load within seconds. It describes a conditional restart for the first agent added to a directory that was absent when the session started, for agents added through `--add-dir`, and when Claude starts with `--disable-slash-commands`. OAT cannot observe those session-start and launch-mode facts. After a successful provider-visible file change, the generic OAT repository policy therefore conservatively advises starting a new provider session; it does not claim that Claude hot-reloaded the file or that the application process must restart. The provider semantics were verified against [Claude Code subagent documentation](https://code.claude.com/docs/en/sub-agents) on 2026-08-31.
17
19
 
18
20
  === "Cursor"
@@ -100,7 +102,8 @@ provenance and cannot replace those values.
100
102
  Only an explicit pre-start native role-selection rejection permits another
101
103
  target-preserving route. An accepted child, including one that later returns
102
104
  `BLOCKED` or lacks telemetry, is a task outcome rather than a fallback signal.
103
- Claude binds the exact model argument described above. Cursor launches the
105
+ Claude binds the exact generated variant for effort-pinned targets or the exact
106
+ model argument for legacy targets. Cursor launches the
104
107
  exact native variant. A missing or unselectable managed target blocks rather
105
108
  than falling back to the root target or a base role.
106
109
 
@@ -153,7 +153,7 @@ Notable commands introduced in the current CLI surface:
153
153
  - `oat project complete-state <project-path>` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout
154
154
  - `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive stages the selected complete package into `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>/`, verifies every manifest-declared file byte, then atomically installs the export before deleting the active project. Existing destinations, incomplete inventory coverage, stale bytes, path escapes, and recipe mismatches fail without removing the active project. For synced projects, a configured S3 upload must succeed before terminal cleanup. Successful closeout makes `refs/oat/completed/<project>` authoritative, deletes the tracked JSON record and nested checkout, and leaves archive metadata sufficient for an idempotent recordless retry. With `--json`, the terminal receipt reports `completedRef`, `verifiedSourceSha`, whether `activeAliasDisposition` was `retained` or `removed`, whether `recordRetired` completed, and the parent `lifecycleCommit`. `--no-commit` is a manual/library-only option: for a synced project it still removes the checkout but deliberately leaves `lifecycleCommit` null. Never pass it through `oat-project-complete`, which requires that receipt.
155
155
  - `oat repo archive sync [project-name]` - hydrate archived project snapshots from the configured repo-scoped S3 archive into `.oat/projects/archived/`. The old `oat project archive sync` path remains as a deprecated shim.
156
- - `oat project dispatch record --event-file <json-file-or-dash> [--project <project-path>]` - validate one generic dispatch record plus its namespaced OAT evidence event, and persist it into the project's append-only `dispatch/` journal (optional; no lifecycle skill requires it). Omit `--project` to validate without persisting. Revision 1 is `dispatch/<request-id>.json` and every later revision is `dispatch/<request-id>@<NNNN>.json`; superseded revisions are never replaced or removed. The command validates and records evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never persisted, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
156
+ - `oat project dispatch record --event-file <json-file-or-dash> [--project <project-path>]` - validate one generic dispatch record plus its namespaced OAT evidence event, and persist it into the project's append-only `dispatch/` journal (optional; no lifecycle skill requires persistence). Omit `--project` to validate without persisting. Managed, effort-pinned Claude launches use the validation-only form before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. Revision 1 is `dispatch/<request-id>.json` and every later revision is `dispatch/<request-id>@<NNNN>.json`; superseded revisions are never replaced or removed. The command validates and records evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never persisted, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
157
157
  - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
158
158
  - `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../cli-utilities/project-log.md).
159
159
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
@@ -133,7 +133,7 @@ Current schema keys:
133
133
  | `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. `inherit` mode is separate and leaves controls to the host/provider. |
134
134
  | `workflow.dispatchCeiling.preset` | `string` | unset | Legacy compatibility preset for capped managed policy setup (`balanced`, `maximum`, `cost-conscious`). `maximum` maps to `high`; `cost-conscious` maps to `economy`. |
135
135
  | `workflow.dispatchCeiling.providers.<provider>` | `object` or legacy scalar | unset | Reusable provider candidate ladder. The canonical shape maps `economy`, `balanced`, `high`, and `frontier` to ordered candidate cells; project and phase state record only a named maximum over that ladder. |
136
- | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `{ candidates: [...] }` | unset | One ordered candidate cell. Codex entries carry exact `model` plus `effort` and resolve to materialized roles; Claude entries carry a model; Cursor strings remain opaque and pass to Cursor byte-for-byte. The final candidate defines that tier's reviewer ceiling. |
136
+ | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `{ candidates: [...] }` | unset | One ordered candidate cell. Codex and effort-pinned Claude entries carry exact `model` plus `effort` and resolve to materialized roles; legacy Claude model-only entries remain supported; Cursor strings remain opaque and pass to Cursor byte-for-byte. The final candidate defines that tier's reviewer ceiling. |
137
137
  | `workflow.dispatchCeiling.providers.{codex,claude,cursor}` | `string`, route, or target | unset | Legacy compatibility input normalized to a one-candidate ladder. New configuration should use tiered candidate cells. The flat keys `workflow.dispatchCeiling.codex` and `workflow.dispatchCeiling.claude` were removed without migration. |
138
138
  | `workflow.gates.skills` | `object` | unset | Per-skill final gate config keyed by skill name. Managed with `oat gate set/unset`; gate-aware skills declare `oat_gateable: true`. |
139
139
  | `workflow.gates.execTargets` | `object` | built-ins | Cross-runtime exec target registry keyed by opaque target id. Managed with `oat gate target set/unset`; built-ins cover Codex, Claude, and Cursor defaults. |
@@ -223,7 +223,7 @@ Each inner array is a group of phases that execute concurrently in their own wor
223
223
  - Each group must contain **2 or more** phases — singleton groups are rejected.
224
224
  - Every phase ID must exist in the plan body.
225
225
  - No phase may appear in more than one group.
226
- - Parallelism is only honored at Tier 1 (native subagents). Tier 2 degrades parallel groups to sequential target-preserving execution, not unconditional inline review. Concrete managed Claude reviewers retain the exact resolver-returned `dispatchArgs.model`; Cursor reviewers retain the exact `providers.cursor.dispatchArgs.variant` native agent type; Codex retains its exact role or pinned child. Every retry preserves the complete target. Inline review requires verified equivalent host controls or an explicit inherit/default or managed-uncapped base-role exception, and otherwise blocks.
226
+ - Parallelism is only honored at Tier 1 (native subagents). Tier 2 degrades parallel groups to sequential target-preserving execution, not unconditional inline review. Concrete managed Claude reviewers use the exact generated `providers.claude.dispatchArgs.variant` for effort-pinned targets and retain `providers.claude.dispatchArgs.model` only for legacy model-only targets; Cursor reviewers retain the exact `providers.cursor.dispatchArgs.variant` native agent type; Codex retains its exact role or pinned child. Every retry preserves the complete target. Inline review requires verified equivalent host controls or an explicit inherit/default or managed-uncapped base-role exception, and otherwise blocks.
227
227
 
228
228
  **Authoring responsibility:**
229
229