@open-agent-toolkit/cli 0.1.72 → 0.1.74

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 (134) hide show
  1. package/README.md +1 -0
  2. package/assets/config/dispatch-matrix-recommendation.json +13 -17
  3. package/assets/docs/cli-utilities/configuration.md +42 -60
  4. package/assets/docs/cli-utilities/index.md +1 -0
  5. package/assets/docs/cli-utilities/project-log.md +183 -0
  6. package/assets/docs/cli-utilities/workflow-gates.md +38 -2
  7. package/assets/docs/provider-sync/providers.md +15 -17
  8. package/assets/docs/reference/cli-reference.md +1 -0
  9. package/assets/docs/workflows/projects/artifacts.md +1 -1
  10. package/assets/docs/workflows/projects/dispatch-ceiling.md +29 -33
  11. package/assets/docs/workflows/projects/implementation-execution.md +7 -4
  12. package/assets/docs/workflows/projects/lifecycle.md +4 -3
  13. package/assets/public-package-versions.json +4 -4
  14. package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
  15. package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +27 -15
  16. package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
  17. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -3
  18. package/assets/skills/oat-project-complete/SKILL.md +60 -1
  19. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -3
  20. package/assets/skills/oat-project-implement/SKILL.md +18 -2
  21. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -15
  22. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +15 -9
  23. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -3
  24. package/assets/skills/oat-project-implement/references/phase-execution.md +11 -5
  25. package/assets/skills/oat-project-import-plan/SKILL.md +30 -8
  26. package/assets/skills/oat-project-plan/SKILL.md +30 -8
  27. package/assets/skills/oat-project-plan-writing/SKILL.md +12 -9
  28. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -3
  29. package/assets/skills/oat-project-quick-start/SKILL.md +30 -8
  30. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -3
  31. package/assets/skills/oat-project-review-provide/SKILL.md +19 -11
  32. package/assets/skills/oat-project-review-provide-remote/SKILL.md +27 -4
  33. package/assets/skills/oat-project-summary/SKILL.md +122 -18
  34. package/assets/templates/project-log.md +47 -0
  35. package/dist/commands/config/index.d.ts.map +1 -1
  36. package/dist/commands/config/index.js +41 -0
  37. package/dist/commands/doctor/index.d.ts +2 -1
  38. package/dist/commands/doctor/index.d.ts.map +1 -1
  39. package/dist/commands/doctor/index.js +37 -1
  40. package/dist/commands/gate/index.d.ts +3 -1
  41. package/dist/commands/gate/index.d.ts.map +1 -1
  42. package/dist/commands/gate/index.js +134 -7
  43. package/dist/commands/init/index.d.ts +1 -1
  44. package/dist/commands/init/index.d.ts.map +1 -1
  45. package/dist/commands/init/index.js +40 -8
  46. package/dist/commands/init/tools/shared/skill-manifest.d.ts +1 -1
  47. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  48. package/dist/commands/init/tools/shared/skill-manifest.js +1 -0
  49. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  50. package/dist/commands/project/dispatch-ceiling/index.js +17 -9
  51. package/dist/commands/project/index.d.ts.map +1 -1
  52. package/dist/commands/project/index.js +2 -0
  53. package/dist/commands/project/log/append.d.ts +41 -0
  54. package/dist/commands/project/log/append.d.ts.map +1 -0
  55. package/dist/commands/project/log/append.js +241 -0
  56. package/dist/commands/project/log/check.d.ts +66 -0
  57. package/dist/commands/project/log/check.d.ts.map +1 -0
  58. package/dist/commands/project/log/check.js +194 -0
  59. package/dist/commands/project/log/grammar.d.ts +28 -0
  60. package/dist/commands/project/log/grammar.d.ts.map +1 -0
  61. package/dist/commands/project/log/grammar.js +31 -0
  62. package/dist/commands/project/log/index.d.ts +9 -0
  63. package/dist/commands/project/log/index.d.ts.map +1 -0
  64. package/dist/commands/project/log/index.js +13 -0
  65. package/dist/commands/project/log/rollup.d.ts +40 -0
  66. package/dist/commands/project/log/rollup.d.ts.map +1 -0
  67. package/dist/commands/project/log/rollup.js +203 -0
  68. package/dist/commands/project/log/synthesize.d.ts +23 -0
  69. package/dist/commands/project/log/synthesize.d.ts.map +1 -0
  70. package/dist/commands/project/log/synthesize.js +112 -0
  71. package/dist/commands/project/new/index.d.ts +1 -0
  72. package/dist/commands/project/new/index.d.ts.map +1 -1
  73. package/dist/commands/project/new/index.js +7 -0
  74. package/dist/commands/project/new/scaffold.d.ts +1 -0
  75. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  76. package/dist/commands/project/new/scaffold.js +24 -0
  77. package/dist/commands/shared/codex-strays.d.ts +9 -0
  78. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  79. package/dist/commands/shared/codex-strays.js +4 -0
  80. package/dist/commands/status/index.d.ts +7 -1
  81. package/dist/commands/status/index.d.ts.map +1 -1
  82. package/dist/commands/status/index.js +53 -17
  83. package/dist/commands/sync/apply.d.ts.map +1 -1
  84. package/dist/commands/sync/apply.js +50 -24
  85. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  86. package/dist/commands/sync/dry-run.js +31 -18
  87. package/dist/commands/sync/index.d.ts.map +1 -1
  88. package/dist/commands/sync/index.js +34 -25
  89. package/dist/commands/sync/sync.types.d.ts +26 -11
  90. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  91. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  92. package/dist/commands/sync/sync.utils.js +3 -2
  93. package/dist/config/oat-config.d.ts +3 -0
  94. package/dist/config/oat-config.d.ts.map +1 -1
  95. package/dist/config/oat-config.js +7 -0
  96. package/dist/config/resolve.d.ts.map +1 -1
  97. package/dist/config/resolve.js +2 -0
  98. package/dist/engine/index.d.ts +1 -1
  99. package/dist/engine/index.d.ts.map +1 -1
  100. package/dist/engine/index.js +1 -1
  101. package/dist/engine/scanner.d.ts +3 -1
  102. package/dist/engine/scanner.d.ts.map +1 -1
  103. package/dist/engine/scanner.js +4 -2
  104. package/dist/providers/ceiling/registry.d.ts +2 -0
  105. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  106. package/dist/providers/ceiling/registry.js +20 -4
  107. package/dist/providers/codex/codec/sync-extension.d.ts +11 -10
  108. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  109. package/dist/providers/codex/codec/sync-extension.js +42 -14
  110. package/dist/providers/cursor/codec/catalog.d.ts +18 -0
  111. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -0
  112. package/dist/providers/cursor/codec/catalog.js +39 -0
  113. package/dist/providers/cursor/codec/materialize.d.ts +24 -0
  114. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -0
  115. package/dist/providers/cursor/codec/materialize.js +166 -0
  116. package/dist/providers/cursor/codec/shared.d.ts +14 -0
  117. package/dist/providers/cursor/codec/shared.d.ts.map +1 -0
  118. package/dist/providers/cursor/codec/shared.js +76 -0
  119. package/dist/providers/cursor/codec/sync-extension.d.ts +37 -0
  120. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -0
  121. package/dist/providers/cursor/codec/sync-extension.js +393 -0
  122. package/dist/providers/cursor/index.d.ts +3 -0
  123. package/dist/providers/cursor/index.d.ts.map +1 -1
  124. package/dist/providers/cursor/index.js +3 -0
  125. package/dist/providers/identity/availability.d.ts +7 -0
  126. package/dist/providers/identity/availability.d.ts.map +1 -1
  127. package/dist/providers/identity/availability.js +23 -0
  128. package/dist/providers/shared/index.d.ts +2 -0
  129. package/dist/providers/shared/index.d.ts.map +1 -1
  130. package/dist/providers/shared/index.js +1 -0
  131. package/dist/providers/shared/materialization-extension.d.ts +44 -0
  132. package/dist/providers/shared/materialization-extension.d.ts.map +1 -0
  133. package/dist/providers/shared/materialization-extension.js +26 -0
  134. package/package.json +2 -2
package/README.md CHANGED
@@ -35,6 +35,7 @@ Additional useful entry points:
35
35
  - `oat config dump --json`
36
36
  - `oat project status --json`
37
37
  - `oat project list --json`
38
+ - `oat project log --help`
38
39
  - `oat project complete-state /path/to/project`
39
40
  - `oat project archive /path/to/project`
40
41
  - `oat repo archive sync`
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026-07-10.2",
2
+ "version": "2026-07-11.1",
3
3
  "providers": {
4
4
  "codex": {
5
5
  "economy": {
@@ -101,29 +101,25 @@
101
101
  "cursor": {
102
102
  "economy": {
103
103
  "candidates": [
104
- "gpt-5.6-luna-low",
105
- "gpt-5.6-luna-medium",
106
- "gpt-5.6-luna-high"
104
+ "composer-2.5",
105
+ "claude-sonnet-5-high",
106
+ "gpt-5.6-luna-high",
107
+ "gpt-5.6-luna-xhigh"
107
108
  ]
108
109
  },
109
110
  "balanced": {
110
- "candidates": [
111
- "gpt-5.6-luna-xhigh",
112
- "gpt-5.6-terra-low",
113
- "gpt-5.6-terra-medium",
114
- "gpt-5.6-terra-high",
115
- "gpt-5.6-terra-xhigh"
116
- ]
111
+ "candidates": ["cursor-grok-4.5-high", "gpt-5.6-terra-high"]
117
112
  },
118
113
  "high": {
119
- "candidates": [
120
- "gpt-5.6-sol-low",
121
- "gpt-5.6-sol-medium",
122
- "gpt-5.6-sol-high"
123
- ]
114
+ "candidates": ["gpt-5.6-sol-medium", "gpt-5.6-sol-high"]
124
115
  },
125
116
  "frontier": {
126
- "candidates": ["gpt-5.6-sol-xhigh", "gpt-5.6-sol-max"]
117
+ "candidates": [
118
+ "claude-fable-5-thinking-high",
119
+ "claude-fable-5-thinking-xhigh",
120
+ "gpt-5.6-sol-xhigh",
121
+ "gpt-5.6-sol-max"
122
+ ]
127
123
  }
128
124
  }
129
125
  }
@@ -232,14 +232,15 @@ values. Planning shows the complete bundled recommendation before asking for
232
232
  this scope, then rechecks the effective ladder. If explicit cells still leave
233
233
  the ladder incomplete, readiness blocks; OAT does not overwrite them.
234
234
 
235
- Scope determines ownership and Codex materialization:
235
+ Scope determines ownership and Codex/Cursor materialization:
236
236
 
237
237
  - `--shared` and `--local` are project configuration sources. Their configured
238
- Codex candidates materialize into the tracked project `.codex` view.
238
+ Codex and Cursor candidates materialize into the tracked project `.codex`
239
+ and `.cursor` views.
239
240
  - `--user` writes reusable personal defaults to `~/.oat/config.json`; those
240
- Codex candidates materialize under `~/.codex`.
241
- - Active-project sparse candidates also materialize into the tracked project
242
- view.
241
+ candidates materialize under `~/.codex` and `~/.cursor`.
242
+ - Active-project sparse candidates also materialize into the applicable tracked
243
+ project view.
243
244
 
244
245
  Project-generated provider views remain visible to version control. OAT does
245
246
  not auto-ignore them. A project-specific active policy or ceiling must not be
@@ -274,7 +275,7 @@ even when the reusable ladder is user-owned.
274
275
  },
275
276
  "cursor": {
276
277
  "balanced": {
277
- "candidates": ["opaque:model/lower [v1]", "opaque:model/high [v2]"]
278
+ "candidates": ["cursor-grok-4.5-high", "gpt-5.6-terra-high"]
278
279
  }
279
280
  }
280
281
  }
@@ -285,9 +286,11 @@ even when the reusable ladder is user-owned.
285
286
 
286
287
  The bundled recommendation covers 13 Codex model/effort combinations: Luna and
287
288
  Terra at `low`, `medium`, `high`, and `xhigh`, plus Sol at those efforts and
288
- `max`. Claude covers `haiku`, `sonnet`, `opus`, and `fable`. Cursor covers 13
289
- opaque configured strings. Cursor spelling never supplies capability metadata;
290
- the configured candidate position owns the tier meaning.
289
+ `max`. Claude covers `haiku`, `sonnet`, `opus`, and `fable`. Cursor covers 12
290
+ verified multi-family flat IDs across Composer, Claude, GPT, and Grok. An
291
+ explicit mapping connects each flat ladder ID to a separate bracket-form
292
+ frontmatter model; configuration and skills never derive or normalize either
293
+ form.
291
294
 
292
295
  The corresponding pinned Codex variant catalogue includes
293
296
  `gpt-5.6-luna-high`, `gpt-5.6-terra-xhigh`, `gpt-5.6-sol-high`, and
@@ -360,7 +363,7 @@ oat project dispatch-ceiling resolve \
360
363
  --provider cursor \
361
364
  --role implementer \
362
365
  --ceiling-tier high \
363
- --candidate-model 'opaque:model/lower [v1]' \
366
+ --candidate-model gpt-5.6-sol-high \
364
367
  --json
365
368
  ```
366
369
 
@@ -381,11 +384,12 @@ remains compatibility behavior for legacy scalar ceilings and managed
381
384
  | -------- | ---------------------------------------------------------------------------------------------------- |
382
385
  | Codex | `providers.codex.dispatchArgs.variant` as `agent_type`, or a fresh child pinned to model plus effort |
383
386
  | Claude | `providers.claude.dispatchArgs.model` as the actual Agent `model` |
384
- | Cursor | `providers.cursor.dispatchArgs.model` byte-for-byte as the actual opaque invocation model |
387
+ | Cursor | `providers.cursor.dispatchArgs.variant` as the exact native agent type first |
385
388
 
386
- Project sync materializes the supported Codex catalogue and every configured
387
- project-owned candidate for both `oat-phase-implementer` and `oat-reviewer`.
388
- User sync materializes user-owned candidates under `~/.codex`:
389
+ Project sync materializes the supported Codex and Cursor catalogues and every
390
+ configured project-owned candidate for both `oat-phase-implementer` and
391
+ `oat-reviewer`. User sync materializes user-owned candidates under `~/.codex`
392
+ and `~/.cursor/agents`:
389
393
 
390
394
  ```bash
391
395
  oat sync --scope project
@@ -394,60 +398,31 @@ oat sync --scope all
394
398
  ```
395
399
 
396
400
  Generated roles carry `supported-catalogue`, `project-config`, or `user-config`
397
- ownership. Cleanup reconciles only the current owner. Materialization is best
398
- effort at sync boundaries; the exact fresh-child route means workflow
399
- correctness does not require provider restart or hot reload.
401
+ ownership. Cleanup reconciles only the current owner. Cursor's mapping registry
402
+ rejects unknown flat IDs instead of writing unverified frontmatter.
400
403
 
401
404
  Reviewer resolution uses the final candidate at the configured review ceiling.
402
- Codex selects the exact reviewer variant; Claude and Cursor pass the resolver's
403
- exact model argument. Timeout retries preserve the same complete payload. A
404
- lower reviewer candidate requires a separate reviewed contract.
405
+ Codex and Cursor select exact native reviewer variants; Claude passes the
406
+ resolver's exact model argument. Timeout retries preserve the same complete
407
+ payload. A lower reviewer candidate requires a separate reviewed contract.
405
408
 
406
409
  Tier 2 remains target-preserving. Inline review is permitted only when the host
407
410
  has verified equivalent current-host controls for explicit inherit,
408
411
  managed-uncapped, or base-role behavior. Capped managed reviews still require
409
412
  the exact registered role, pinned child, or resolver-returned model argument.
410
413
 
411
- ### Cursor validation pass and live evidence
412
-
413
- Config adoption and doctor validate Cursor candidates with one command-scoped
414
- pass context. Duplicate references to the same byte-for-byte candidate share
415
- one Task/subagent probe. If a decisive probe is unavailable, the pass resolves
416
- the broad catalog once, with at most one `--list-models` fallback. The cache
417
- ends with that adopt or doctor command; it is not process-global and has no
418
- TTL.
419
-
420
- A correlated Task start/completion pair that preserves the exact model argument
421
- and returns the sentinel establishes that the argument is eligible for that
422
- account and client. A structured rejection or exact allow-list exclusion can
423
- establish `unknown-value`. Neither result identifies the backend runtime model:
424
- `runtimeIdentity` remains `not-reported` unless trusted Cursor telemetry or
425
- Cursor support confirms it. Parent prose and broad catalog presence are
426
- diagnostic-only, so OAT preserves `unvalidated` when launcher evidence is
427
- absent instead of inferring capability from candidate spelling.
428
-
429
- The [dated GPT-5.6 Cursor verification evidence](https://github.com/voxmedia/open-agent-toolkit/blob/main/.oat/repo/reference/project-summaries/20260711-cursor-gpt-5-6-subagent-verification.md)
430
- preserves the original text-mode pass and a versioned stream-JSON second pass.
431
- The second pass ran a dynamic positive control and deliberate invalid control
432
- before candidates. Both parent runs completed without a Task event, making the
433
- controls inconclusive; the stop rule therefore executed zero of the 13
434
- recommended candidates and did not execute exploratory
435
- `gpt-5.6-sol-high-fast`. The recommendation remains unchanged and candidate
436
- eligibility remains unresolved.
437
-
438
- The tracked artifact's structured second-pass block contains only allowlisted
439
- event structure, derived outcomes, sanitized auth-presence context, and
440
- non-reversible identifier hashes. Exact request/session/tool-call IDs and
441
- credential-redacted unprojected streams from that pass stay under gitignored
442
- `.oat/projects/local/` storage for possible Cursor support diagnosis.
443
-
444
- The same public artifact intentionally retains the sanitized historical v1
445
- text-mode record for provenance. That older section includes command arguments
446
- and prompts, stdout and stderr, exit and duration data, and capture-environment
447
- details such as user-specific binary paths; it is not limited to the structured
448
- second-pass allowlist. Re-run after a Cursor client rollout exposes Task in
449
- headless mode or Cursor support confirms the private requests; review the open
450
- verification item by 2026-08-08.
414
+ ### Cursor availability and evidence
415
+
416
+ `oat doctor` compares configured Cursor flat IDs with the current Cursor
417
+ catalogue and reports availability drift. This check is diagnostic: catalogue
418
+ presence does not prove that a bracket-form definition pin was honored.
419
+
420
+ Each shipped mapping has mapping-specific native-launch evidence, but Cursor
421
+ can silently fallback when account, plan, or administration constraints prevent
422
+ the requested pin. OAT therefore records the selected variant and mapped model
423
+ with launcher-owned `configured` provenance. Runtime identity remains
424
+ `not-reported` unless independently observed; self-report and catalogue
425
+ availability do not upgrade that evidence.
451
426
 
452
427
  ### Legacy compatibility
453
428
 
@@ -486,6 +461,8 @@ Workflow preference keys live under the `workflow.*` namespace:
486
461
  - `workflow.autoNarrowReReviewScope` — boolean. Auto-narrow re-review scope to fix-task commits only in `oat-project-review-provide`. When unset, the skill prompts.
487
462
  - `workflow.autoArtifactReview.plan` — boolean, default `true`. Automatically run the bounded artifact-review loop for generated `plan.md` files before implementation handoff. Set to `false` only when you intentionally want to skip the plan artifact review.
488
463
  - `workflow.autoArtifactReview.analysis` — boolean, default `true`. Automatically run the bounded accuracy-review loop for generated docs and agent-instructions analysis artifacts before the matching apply workflow consumes them.
464
+ - `workflow.projectLog` — `auto`, `true`, or `false`; default `auto`. `auto` creates the append-only `project-log.md` on the first lifecycle append, `true` also enables scaffold-time creation, and `false` skips appends when no log exists. An existing artifact remains enabled regardless of the current setting.
465
+ - `workflow.projectLogLedgerPath` — repository-relative string; default `.oat/repo/reference/project-observations.md`. Sets the durable ledger target for `general` judgments written by `oat project log rollup`.
489
466
  - `workflow.dispatchPolicy.mode` — `managed` or `inherit`. `managed` means OAT selects model/effort controls from `workflow.dispatchPolicy.policy`; `inherit` means OAT leaves controls to host/provider defaults.
490
467
  - `workflow.dispatchPolicy.policy` — `economy`, `balanced`, `high`, `frontier`, or `uncapped`. `economy` through `frontier` are capped managed policies; `uncapped` keeps OAT-managed preferred selection without provider caps. It is distinct from `workflow.dispatchPolicy.mode=inherit`, which leaves controls to the host/provider.
491
468
  - `workflow.dispatchCeiling.preset` — legacy compatibility alias (`balanced`, `maximum`, or `cost-conscious`) for capped managed policy setup.
@@ -495,6 +472,9 @@ Workflow preference keys live under the `workflow.*` namespace:
495
472
  - `workflow.gates.skills` / `workflow.gates.execTargets` — structured per-skill final gate commands and exec-target registry. Use `oat gate set`, `oat gate target set`, `oat gate review`, and `oat gate cross-provider-exec`; do not use `oat config set` for these objects.
496
473
  - `workflow.gateTimeouts.code` / `workflow.gateTimeouts.artifact` — validated default gate-review budgets in milliseconds. Both resolve through `local > shared > user`.
497
474
 
475
+ The two project-log keys use the standard workflow precedence:
476
+ `local > shared > user > default`.
477
+
498
478
  ### HiLL plan-field semantics
499
479
 
500
480
  `workflow.hillCheckpointDefault` controls the first implementation run's
@@ -568,6 +548,8 @@ oat config set workflow.designMode collaborative --shared
568
548
  oat config set workflow.dispatchCeiling.preset balanced --shared
569
549
  oat config set workflow.dispatchCeiling.providers.cursor.high composer-2.5 --shared
570
550
  oat config set workflow.autoArtifactReview.plan false --shared
551
+ oat config set workflow.projectLog auto --shared
552
+ oat config set workflow.projectLogLedgerPath .oat/repo/reference/project-observations.md --shared
571
553
 
572
554
  # Repo-local: personal override for this repo (default when no flag)
573
555
  oat config set workflow.hillCheckpointDefault every
@@ -15,6 +15,7 @@ Use this section when you want bootstrap guidance, tool-pack lifecycle details,
15
15
  - [Tool Packs and Installed Assets](tool-packs.md) - Bundled packs and `oat tools` lifecycle commands.
16
16
  - [Configuration](configuration.md) - OAT configuration guidance across shared, local, user, and provider-sync surfaces.
17
17
  - [Config and Local State](config-and-local-state.md) - Utility command groups for config, local state, diagnostics, and related inspection flows.
18
+ - [Project Log](project-log.md) - Append-only project observations, synthesis, inspection, and durable roll-up.
18
19
  - [Backlog Lifecycle](backlog-lifecycle.md) - Backlog item states, atomic close-out with `oat backlog archive`, and lifecycle drift detection in `oat pjm doctor`.
19
20
  - [Workflow Gates](workflow-gates.md) - Completion-safe headless reviews, budgets, liveness evidence, and cross-runtime dispatch with `oat gate`.
20
21
 
@@ -0,0 +1,183 @@
1
+ ---
2
+ title: Project Log
3
+ description: Capture append-only project observations and roll them into durable summary and ledger surfaces.
4
+ ---
5
+
6
+ # Project Log
7
+
8
+ `oat project log` manages an optional, append-only `project-log.md` artifact for
9
+ workflow observations and lifecycle events. Use it to preserve evidence that
10
+ would otherwise remain in agent transcripts, then roll that evidence into
11
+ tracked project and repository references before archiving the project.
12
+
13
+ The command group is the only supported writer for the artifact. Do not edit
14
+ entries or the synthesis section by hand.
15
+
16
+ ## Configure project logs
17
+
18
+ Two workflow keys control the feature:
19
+
20
+ | Key | Values | Default |
21
+ | ------------------------------- | ------------------------ | --------------------------------------------- |
22
+ | `workflow.projectLog` | `auto`, `true`, `false` | `auto` |
23
+ | `workflow.projectLogLedgerPath` | repository-relative path | `.oat/repo/reference/project-observations.md` |
24
+
25
+ ```bash
26
+ oat config set workflow.projectLog auto --shared
27
+ oat config set workflow.projectLogLedgerPath .oat/repo/reference/project-observations.md --shared
28
+ ```
29
+
30
+ `auto` creates the log on the first append. `true` also lets
31
+ `oat project new` scaffold the log up front. `false` skips an append when no log
32
+ exists. An existing `project-log.md` always accepts appends, regardless of the
33
+ current config value.
34
+
35
+ For one scaffold operation, `oat project new --with-project-log` forces
36
+ creation and `--no-project-log` suppresses it.
37
+
38
+ ## Append entries
39
+
40
+ Judgment entries capture evidence about the project or reusable workflow:
41
+
42
+ ```bash
43
+ oat project log append \
44
+ --project .oat/projects/shared/example \
45
+ --type friction \
46
+ --scope project \
47
+ --area "gate review handoff" \
48
+ --body "The gate passed but the handoff was missing, so review receipt stopped."
49
+ ```
50
+
51
+ Judgment flags:
52
+
53
+ - `--type <bug|friction|worked-well|feedback>`
54
+ - `--scope <project|general>`
55
+ - `--area <text>` — one line, at most 120 characters
56
+ - `--body <text>` — use `--body -` to read from stdin
57
+ - `--version-note <text>` — adds an `observed on` clause
58
+ - `--project <path>` — optional when an active project resolves
59
+
60
+ Structural entries record lifecycle events without duplicating larger
61
+ artifacts:
62
+
63
+ ```bash
64
+ oat project log append \
65
+ --structural \
66
+ --producer oat-project-implement \
67
+ --ref p03 \
68
+ --body "Phase passed; details: .oat/projects/shared/example/implementation.md#run-3"
69
+ ```
70
+
71
+ Structural entries require `--structural`, `--producer`, `--ref`, and `--body`.
72
+ Do not combine structural flags with judgment flags.
73
+
74
+ The helper produces these heading grammars in UTC:
75
+
76
+ ```text
77
+ ### YYYY-MM-DD · <project|general> · <bug|friction|worked-well|feedback> · <area>
78
+ ### YYYY-MM-DD · structural · <producer> · <ref>
79
+ ```
80
+
81
+ Prior entries are never edited or struck through. Append corrections as new
82
+ judgments that reference the original heading. Never record secret values such
83
+ as tokens, credentials, keys, or signed URLs; reference their name or source
84
+ instead.
85
+
86
+ Run `oat project log append --help` for the complete entry contract.
87
+
88
+ ## Automatic workflow integration
89
+
90
+ When project logging is enabled, OAT lifecycle surfaces append structural
91
+ entries without asking agents to edit `project-log.md`:
92
+
93
+ - `oat-project-implement` records accepted subagent dispatches, STOP or park
94
+ events, phase outcomes, and parallel-group merge results. These entries point
95
+ to the corresponding `implementation.md` record instead of copying it.
96
+ - `oat gate review` records exactly one entry for every terminal outcome,
97
+ including successful and blocking verdicts, child failure, timeout,
98
+ targeting-correlation failure, and artifact-validation failure. A log append
99
+ failure produces a warning but never changes the gate result.
100
+ - `oat-project-summary` checks for entries, offers append-only promotion of
101
+ reusable project judgments, and invokes `rollup` after authoring
102
+ `summary.md`.
103
+ - `oat-project-complete` warns when synthesis is pending, requires a successful
104
+ roll-up for a populated log, and appends the final seal entry before archive.
105
+ No project-log entry may follow the seal.
106
+
107
+ With the default `auto` setting, the first of these append points creates the
108
+ log. With `false` and no existing artifact, automatic appends are no-ops.
109
+
110
+ ## Inspect status
111
+
112
+ ```bash
113
+ oat project log check --project .oat/projects/shared/example --json
114
+ ```
115
+
116
+ `check` reports whether the log is absent, ready, or still awaiting synthesis;
117
+ entry counts by class, type, and scope; the last entry date; and invalid
118
+ hand-written headings. It reads only `project-log.md`.
119
+
120
+ Use `--require-synthesis` to exit with status 1 while synthesis is pending:
121
+
122
+ ```bash
123
+ oat project log check --require-synthesis
124
+ ```
125
+
126
+ Without that flag, normal `absent`, `ok`, and `synthesis_pending` results exit
127
+ successfully so lifecycle skills can decide whether to warn or enforce.
128
+
129
+ ## Complete the synthesis
130
+
131
+ Write the end-of-run synthesis through the command:
132
+
133
+ ```bash
134
+ oat project log synthesize \
135
+ --project .oat/projects/shared/example \
136
+ --body "The workflow was effective; preserve the gate handoff checks."
137
+ ```
138
+
139
+ Use `--body -` for stdin. `synthesize` replaces the pending synthesis section
140
+ without changing entries. It fails when the log is absent or the synthesis is
141
+ already complete; append a correction judgment instead of replacing a completed
142
+ synthesis.
143
+
144
+ ## Promote and roll up observations
145
+
146
+ Before roll-up, promote a reusable `project` judgment by appending a new
147
+ `general` judgment. Its body must reference the original heading. Never mutate
148
+ or annotate the original entry.
149
+
150
+ ```bash
151
+ oat project log append \
152
+ --type friction \
153
+ --scope general \
154
+ --area "gate review handoff" \
155
+ --body "Promotes '### 2026-07-18 · project · friction · gate review handoff': this applies to all gate-driven reviews."
156
+ ```
157
+
158
+ After `summary.md` exists, roll up the log:
159
+
160
+ ```bash
161
+ oat project log rollup \
162
+ --project .oat/projects/shared/example \
163
+ --json
164
+ ```
165
+
166
+ `rollup` writes or updates `## Workflow Observations` in `summary.md` and
167
+ appends `general` judgments to `workflow.projectLogLedgerPath`. Ledger entries
168
+ deduplicate by date and area. The command is idempotent.
169
+
170
+ The structured result contains:
171
+
172
+ - `status`: `ok` or `failed`
173
+ - `summarySection`: `written` or `updated`
174
+ - `ledgerOutcome`: `appended`, `deduplicated`, `skipped_permitted`, or `failed`
175
+ - `entriesRolledUp`: number of log entries written to the summary section
176
+
177
+ `skipped_permitted` means the default repository reference layer is absent and
178
+ no ledger path was explicitly configured; `status` remains `ok`. An explicitly
179
+ configured ledger write failure returns `status: "failed"`. Completion must not
180
+ seal or archive a project with entries until roll-up reports `status: "ok"`.
181
+
182
+ `rollup` requires an existing `summary.md`; summary authoring remains the
183
+ responsibility of the project summary workflow.
@@ -94,6 +94,37 @@ model that ran, and the reviewer must not replace them with self-identification.
94
94
  The CLI compares the copied values with its gate-owned record before it applies
95
95
  the severity threshold.
96
96
 
97
+ ### Review producer identity
98
+
99
+ Dynamic planning workflows can declare their current parent model to a review
100
+ gate without writing a provider or model into shared/user config:
101
+
102
+ ```bash
103
+ OAT_GATE_PRODUCER_IDENTITY='<model>:declared' oat gate review ...
104
+ ```
105
+
106
+ This is a review-command-only bridge. `oat gate review` accepts it only when
107
+ the value is non-empty and its provenance suffix is exactly `declared`. The
108
+ gate removes the variable from the child reviewer's environment, and non-review
109
+ commands such as `oat gate cross-provider-exec` ignore it.
110
+
111
+ Producer evidence precedence is explicit `--producer-identity`, then a
112
+ qualifying implementation dispatch stamp, then the review-only environment
113
+ declaration, and finally unknown producer behavior. The environment bridge does
114
+ not replace stronger explicit or stamped evidence and does not establish
115
+ observed runtime identity.
116
+
117
+ For final and contiguous-range reviews, each in-scope implementer/fix stamp
118
+ contributes its claimable producer family. If that producer is not claimable or
119
+ has an unknown family, the gate may infer only a family exclusion from the
120
+ stamp's launcher-owned configured target. The target does not become producer
121
+ runtime identity, and generic or unclassifiable targets contribute no family.
122
+
123
+ Keep reusable gate commands producer-neutral in shared and user config.
124
+ Planning skills attach the ephemeral declaration only while executing a
125
+ resolved configured command that invokes `oat gate review`; they leave it
126
+ absent for every other gate command.
127
+
97
128
  ### Headless completion safety
98
129
 
99
130
  Every `oat gate review` child receives the same headless contract through two
@@ -492,7 +523,9 @@ By default the dispatcher:
492
523
  4. Resolves producer identity from `--producer-identity` or dispatch stamps when
493
524
  available. Exact phase/task scopes use the matching stamp. `final` and
494
525
  contiguous ranges such as `p02-p03` aggregate every in-range implementer/fix
495
- stamp.
526
+ stamp. A stamp whose producer is not claimable or has an unknown family may
527
+ contribute its classifiable configured target family to aggregate avoidance
528
+ at lower confidence.
496
529
  5. Applies `--avoid same-family`.
497
530
  6. Checks candidate availability in descending priority order, with target id as
498
531
  the tie-breaker.
@@ -537,7 +570,10 @@ single stamp or when no stamp has a claimable family. Their producer record uses
537
570
  an unknown representative instead of presenting the latest stamp as aggregate
538
571
  truth:
539
572
 
540
- - `avoidFamilies` is the stable deduplicated union of claimable known families.
573
+ - `avoidFamilies` is the stable deduplicated union of claimable known producer
574
+ families plus classifiable configured target families from stamps whose
575
+ producer is not claimable or has an unknown family. A known, claimable
576
+ producer remains authoritative over a conflicting target.
541
577
  - `contributingScopes` is the stable document-order list of distinct scopes from
542
578
  every relevant stamp.
543
579
  - `contributingStampCount` counts every relevant stamp, including unknown or
@@ -18,14 +18,11 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
18
18
 
19
19
  - Project: `.agents/skills` -> `.cursor/skills`, `.agents/agents` -> `.cursor/agents`, `.agents/rules` -> `.cursor/rules`
20
20
  - User: `~/.agents/skills` -> `~/.cursor/skills`, `~/.agents/agents` -> `~/.cursor/agents`
21
- - Subagent invocation in Cursor is prompt-driven (`/name` or natural mention), not `subagent_type`
22
- - OAT-controlled Cursor dispatch uses the generic `.cursor/agents/<name>.md` file plus the exact `providers.cursor.dispatchArgs.model` value selected from the candidate ladder. OAT passes it byte-for-byte as the actual Task-level `model`; a `model` frontmatter value is only a default/fallback mechanism.
23
- - Cursor model strings are opaque. OAT does not infer family, effort, cost, or capability from their spelling; the configured candidate position owns the named tier meaning.
24
- - Cursor model validation checks whether the selected model is eligible for subagent Task dispatch. Each adopt/doctor command probes each distinct exact candidate once and shares one lazy broad-catalog lookup across that pass; the cache ends with the command.
25
- - A correlated accepted Task carrying the exact model argument plus the child sentinel proves argument eligibility for that account/client. It does not prove backend runtime identity; that remains `not-reported` without trusted Cursor telemetry or support confirmation. Structured rejection can establish `unknown-value`, while parent prose and broad `cursor-agent models` catalog presence remain diagnostic-only.
26
- - The [dated GPT-5.6 verification artifact](https://github.com/voxmedia/open-agent-toolkit/blob/main/.oat/repo/reference/project-summaries/20260711-cursor-gpt-5-6-subagent-verification.md) preserves the original probe and a stream-JSON control pass. The controls observed no Task events, so the stop rule ran zero recommendation or exploratory candidates and retained the recommendation unchanged.
27
- - The artifact's structured second-pass block contains only allowlisted event fields, derived outcomes, sanitized auth presence, and identifier hashes. Exact request/session/tool-call IDs and credential-redacted unprojected streams from that pass remain in gitignored local project storage for support escalation.
28
- - The same public artifact retains the sanitized historical v1 text-mode record for provenance. That older section includes command arguments and prompts, stdout and stderr, exit and duration data, and capture-environment details such as user-specific binary paths; it is not limited to the structured second-pass allowlist.
21
+ - Sync materializes pinned Markdown definitions for both `oat-phase-implementer` and `oat-reviewer`. Each generated name keeps the configured flat ladder ID, while an explicit verified mapping writes the separate bracket-form frontmatter model. OAT never derives one form from the other.
22
+ - Generated definitions carry `supported-catalogue`, `project-config`, or `user-config` ownership. Project and supported output lives in the tracked `.cursor/agents` view; user-owned output lives under `~/.cursor/agents`. Cleanup reconciles only the applicable owner.
23
+ - Managed dispatch requires `providers.cursor.dispatchArgs.variant` and launches that exact resolver-selected native agent type first. Skills do not pass a Task-level model argument or normalize Cursor model strings.
24
+ - Cursor may silently fallback when a definition pin cannot be honored. Variant acceptance therefore establishes launcher-owned `configured` provenance only; runtime identity remains `not-reported` unless independently observed.
25
+ - `oat doctor` checks whether each flat ID is still present in the current Cursor catalogue and reports availability drift. Catalogue availability is diagnostic and does not prove that a definition-level bracket pin ran as configured.
29
26
  - Rule files render as `.cursor/rules/*.mdc`
30
27
 
31
28
  === "Copilot"
@@ -81,9 +78,9 @@ oat config adopt dispatch-matrix --user
81
78
  ```
82
79
 
83
80
  Project-config candidates materialize into the tracked, version-controlled
84
- project `.codex` view. User-config candidates materialize under `~/.codex`.
85
- OAT does not auto-ignore project output or create its Git commit; the team owns
86
- that repository change.
81
+ project `.codex` and `.cursor` views. User-config candidates materialize under
82
+ `~/.codex` and `~/.cursor`. OAT does not auto-ignore project output or create
83
+ its Git commit; the team owns that repository change.
87
84
 
88
85
  At implementation time, the root passes the recorded named maximum through
89
86
  invocation-only `--ceiling-tier`, resolves one exact candidate per phase, and
@@ -91,19 +88,20 @@ dispatches one phase implementer. Codex first attempts the resolver-returned
91
88
  materialized role as the native `agent_type`. The launcher records the target,
92
89
  model axis, and effort axis from that resolved payload; child self-report is not
93
90
  provenance and cannot replace those values.
94
- Only an explicit pre-start native role-selection rejection permits a fresh
95
- pinned-child fallback. An accepted child, including one that later returns
91
+ Only an explicit pre-start native role-selection rejection permits another
92
+ target-preserving route. An accepted child, including one that later returns
96
93
  `BLOCKED` or lacks telemetry, is a task outcome rather than a fallback signal.
97
- Claude and Cursor bind the exact model arguments described above. A missing or
98
- unselectable managed target blocks rather than falling back to the root target
99
- or a base role.
94
+ Claude binds the exact model argument described above. Cursor launches the
95
+ exact native variant. A missing or unselectable managed target blocks rather
96
+ than falling back to the root target or a base role.
100
97
 
101
98
  ## Scope rules
102
99
 
103
100
  - Project scope: skills + agents + rules
104
- - User scope: skills, plus the two bundled managed Codex role definitions used only for user-owned target expansion (provider mappings vary by adapter)
101
+ - User scope: skills, plus the two bundled managed Codex and Cursor role definitions used only for user-owned target expansion (provider mappings vary by adapter)
105
102
  - Rules are project-scoped only in this release
106
103
  - Codex user-scope sync materializes user-config custom roles under `~/.codex`; project-config and supported-catalogue output remains project-scoped and version controlled
104
+ - Cursor user-scope sync materializes user-config variants under `~/.cursor/agents`; project-config and supported-catalogue output remains project-scoped and version controlled
107
105
 
108
106
  ## Adoption model
109
107
 
@@ -67,6 +67,7 @@ Notable commands introduced in the current CLI surface:
67
67
  - `oat project archive [project-path]` - archive a tracked project through the same local move, summary export, and optional S3 upload path used by completion. When omitted, the project path falls back to the active project.
68
68
  - `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.
69
69
  - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#plan-declared-parallelism).
70
+ - `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).
70
71
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
71
72
  - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. For `targeting_correlation_failed`, do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
72
73
  - `oat gate route --expect-runtime <runtime> --expect-model <model> --can-await <true|false> --json` - return the headless child route (`inline`, `delegate-sync`, or `refuse`) from provider-marker and model evidence. Ambiguous or contradictory evidence never routes inline.
@@ -127,7 +127,7 @@ Each inner array is a group of phases that execute concurrently in their own wor
127
127
  - Each group must contain **2 or more** phases — singleton groups are rejected.
128
128
  - Every phase ID must exist in the plan body.
129
129
  - No phase may appear in more than one group.
130
- - 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 and Cursor reviewers retain the exact resolver-returned `dispatchArgs.model` in the actual invocation and every retry; Codex retains its exact role or pinned child. Inline review requires verified equivalent host controls or an explicit inherit/default or managed-uncapped base-role exception, and otherwise blocks.
130
+ - 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.
131
131
 
132
132
  **Authoring responsibility:**
133
133