@open-agent-toolkit/cli 0.1.41 → 0.1.43

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 (47) hide show
  1. package/assets/agents/oat-phase-implementer.md +13 -9
  2. package/assets/agents/oat-reviewer.md +16 -12
  3. package/assets/docs/cli-utilities/configuration.md +51 -35
  4. package/assets/docs/cli-utilities/workflow-gates.md +55 -0
  5. package/assets/docs/reference/cli-reference.md +1 -1
  6. package/assets/docs/reference/oat-directory-structure.md +26 -24
  7. package/assets/docs/workflows/projects/artifacts.md +22 -0
  8. package/assets/docs/workflows/projects/dispatch-ceiling.md +128 -85
  9. package/assets/docs/workflows/projects/hill-checkpoints.md +2 -0
  10. package/assets/docs/workflows/projects/implementation-execution.md +70 -46
  11. package/assets/docs/workflows/projects/index.md +2 -2
  12. package/assets/docs/workflows/projects/lifecycle.md +17 -2
  13. package/assets/docs/workflows/projects/reviews.md +17 -0
  14. package/assets/public-package-versions.json +4 -4
  15. package/assets/skills/oat-project-implement/SKILL.md +256 -95
  16. package/assets/skills/oat-project-plan/SKILL.md +60 -29
  17. package/assets/skills/oat-project-plan-writing/SKILL.md +10 -10
  18. package/assets/skills/oat-project-quick-start/SKILL.md +60 -29
  19. package/assets/skills/oat-project-review-provide/SKILL.md +25 -13
  20. package/assets/skills/oat-project-review-receive/SKILL.md +20 -10
  21. package/assets/skills/oat-review-provide/SKILL.md +14 -12
  22. package/assets/skills/oat-review-provide/references/review-artifact-template.md +1 -1
  23. package/assets/templates/plan.md +4 -4
  24. package/assets/templates/state.md +7 -3
  25. package/dist/commands/config/index.d.ts.map +1 -1
  26. package/dist/commands/config/index.js +66 -3
  27. package/dist/commands/gate/index.d.ts.map +1 -1
  28. package/dist/commands/gate/index.js +15 -3
  29. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  30. package/dist/commands/project/dispatch-ceiling/index.js +296 -49
  31. package/dist/commands/review/latest.d.ts.map +1 -1
  32. package/dist/commands/review/latest.js +5 -2
  33. package/dist/commands/shared/frontmatter.d.ts +11 -0
  34. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  35. package/dist/commands/shared/frontmatter.js +15 -0
  36. package/dist/config/dispatch-ceiling-preset.d.ts +37 -1
  37. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  38. package/dist/config/dispatch-ceiling-preset.js +20 -0
  39. package/dist/config/oat-config.d.ts +10 -1
  40. package/dist/config/oat-config.d.ts.map +1 -1
  41. package/dist/config/oat-config.js +20 -1
  42. package/dist/config/resolve.d.ts.map +1 -1
  43. package/dist/config/resolve.js +4 -0
  44. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  45. package/dist/providers/ceiling/registry.js +6 -1
  46. package/dist/providers/codex/codec/sync-extension.js +1 -1
  47. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan
3
- version: 1.3.8
3
+ version: 1.3.9
4
4
  description: Use when design.md is complete and executable implementation tasks are needed. Breaks design into bite-sized TDD tasks in canonical plan.md format.
5
5
  oat_gateable: true
6
6
  disable-model-invocation: true
@@ -314,61 +314,92 @@ Unless the source artifact or user already supplied a confirmed `oat_plan_hill_p
314
314
 
315
315
  If `## Planning Checklist` is missing (older plans), add it before finalizing with the items above.
316
316
 
317
- ### Step 11.5: Resolve Dispatch Ceiling Before Implementation Readiness
317
+ ### Step 11.5: Resolve Dispatch Policy Before Implementation Readiness
318
318
 
319
- Before marking the plan ready for implementation, resolve the dispatch ceiling.
319
+ Before marking the plan ready for implementation, resolve the dispatch policy.
320
320
 
321
321
  Resolution order:
322
322
 
323
- 1. Config keys `workflow.dispatchCeiling.providers.<provider>` via the resolver CLI
324
- 2. Project `state.md` frontmatter key `oat_dispatch_ceiling`
325
- 3. Interactive planning prompt (below)
326
- 4. Leave unresolved for implementation preflight when non-interactive
323
+ 1. Config keys `workflow.dispatchPolicy.mode` / `workflow.dispatchPolicy.policy` via the resolver CLI
324
+ 2. Compatibility config keys `workflow.dispatchCeiling.providers.<provider>`
325
+ 3. Project `state.md` frontmatter key `oat_dispatch_policy`
326
+ 4. Legacy project `state.md` frontmatter key `oat_dispatch_ceiling`
327
+ 5. Interactive planning prompt (below)
328
+ 6. Leave unresolved for implementation preflight when non-interactive
327
329
 
328
- If no ceiling resolves and the session is interactive, present the preset
329
- prompt once before final plan review:
330
+ If no policy resolves and the session is interactive, present the dispatch
331
+ policy prompt once before final plan review:
330
332
 
331
333
  ```text
332
- Set the dispatch ceilingthe maximum subagent tier OAT may use.
334
+ Set the dispatch policyhow OAT should choose subagent model/effort controls.
333
335
 
334
- 1. Balanced (recommended) — Codex: high · Claude: sonnet
335
- 2. Maximum — Codex: xhigh · Claude: opus (reviews always run at this tier)
336
- 3. Cost-conscious — Codex: medium · Claude: sonnet
337
- 4. Advanced set per provider
338
- 5. No ceiling
336
+ Managed capped policies:
337
+ 1. Economy — Codex: medium · Claude: sonnet
338
+ 2. Balanced — Codex: high · Claude: sonnet (recommended)
339
+ 3. High Codex: xhigh · Claude: opus
340
+ 4. Frontier — Codex: xhigh · Claude: fable
339
341
 
340
- OAT applies this where the provider exposes a reliable mechanism (Codex: pinned
341
- variants; Claude: Task model parameter). Other providers may treat it as advisory.
342
+ Managed uncapped:
343
+ 5. Uncapped OAT selects the preferred implementer/fix target without a stored maximum cap.
344
+
345
+ Host defaults:
346
+ 6. Inherit Host Defaults — OAT does not select model/effort controls.
347
+
348
+ OAT applies managed policies where the provider exposes a reliable mechanism
349
+ (Codex: pinned variants; Claude: Task model parameter). Other providers may
350
+ treat managed policies as advisory.
342
351
  ```
343
352
 
344
- **Preset selection** persists `preset` + compiled per-provider values. On
345
- selection, print the exact compiled result (e.g., "Ceiling set: balanced
346
- Codex: high · Claude: sonnet") before proceeding.
353
+ **Managed capped policy selection (options 1-4)** persists `mode: managed`,
354
+ `policy`, and the compiled provider targets. On selection, print the exact
355
+ compiled result (e.g., "Dispatch policy set: balanced → Codex: high · Claude:
356
+ sonnet") before proceeding.
347
357
 
348
- **Advanced (option 4)** prompts for each provider's value individually, then
349
- persists `providers` + `source` only no `preset` key.
358
+ **Uncapped (option 5)** persists explicit managed uncapped state. It does not
359
+ write provider caps, and it must not be represented by leaving dispatch policy
360
+ state absent.
350
361
 
351
- **No ceiling (option 5)** leaves `oat_dispatch_ceiling` unset; implementer
352
- subagents run at provider defaults.
362
+ **Inherit Host Defaults (option 6)** persists explicit inherit/default state.
363
+ Use this only when the user wants OAT to leave implementation, fix, and review
364
+ model/effort controls to the executing host/provider.
353
365
 
354
366
  Persist the answer in `"$PROJECT_PATH/state.md"` frontmatter using the
355
367
  normalized shape:
356
368
 
357
369
  ```yaml
358
- oat_dispatch_ceiling:
359
- preset: balanced # omit when Advanced was chosen
370
+ oat_dispatch_policy:
371
+ mode: managed
372
+ policy: balanced
360
373
  providers:
361
374
  codex: high
362
375
  claude: sonnet
363
376
  source: project-state
364
377
  ```
365
378
 
379
+ For `Uncapped`:
380
+
381
+ ```yaml
382
+ oat_dispatch_policy:
383
+ mode: managed
384
+ policy: uncapped
385
+ source: project-state
386
+ ```
387
+
388
+ For `Inherit Host Defaults`:
389
+
390
+ ```yaml
391
+ oat_dispatch_policy:
392
+ mode: inherit
393
+ source: project-state
394
+ ```
395
+
366
396
  Do not prompt when `OAT_NON_INTERACTIVE=1` or when no user-response channel
367
397
  exists. In that case, leave the value unresolved. `oat-project-implement`
368
- must block before work starts if it still cannot resolve a ceiling.
398
+ must block before work starts if it still cannot resolve a policy.
369
399
 
370
- Do not treat provider default effort as the OAT dispatch ceiling. Provider
371
- default is informational for base/unpinned roles only.
400
+ Do not treat provider default effort as the OAT dispatch policy. Provider
401
+ defaults apply only for explicit inherit/default behavior or base/unpinned
402
+ fallback paths.
372
403
 
373
404
  ### Step 12: Review Plan with User
374
405
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.5
3
+ version: 1.2.6
4
4
  description: Use when authoring or mutating plan.md in any OAT workflow. Defines canonical format invariants — stable task IDs, required sections, review table rules, and resume guardrails.
5
5
  disable-model-invocation: true
6
6
  user-invocable: false
@@ -91,10 +91,10 @@ Runtime routing note:
91
91
 
92
92
  - Keep `oat_ready_for` canonical as `oat-project-implement`.
93
93
  - Declare parallelism via `oat_plan_parallel_groups` in plan.md frontmatter (empty = sequential; nested arrays of phase IDs = parallel groups). `oat-project-implement` reads this field to choose sequential vs worktree-isolated parallel execution.
94
- - Dispatch ceilings are not stored in `plan.md`. Plan-producing skills resolve
95
- them from `workflow.dispatchCeiling.<provider>` or project `state.md`
96
- frontmatter, then persist interactive answers back to `state.md` as
97
- `oat_dispatch_ceiling`.
94
+ - Dispatch policies are not stored in `plan.md`. Plan-producing skills resolve
95
+ them from `workflow.dispatchPolicy.*`, compatibility
96
+ `workflow.dispatchCeiling.*` keys, or project `state.md` frontmatter, then
97
+ persist interactive answers back to `state.md` as `oat_dispatch_policy`.
98
98
 
99
99
  Additional frontmatter keys (`oat_phase`, `oat_phase_status`, `oat_blockers`, `oat_last_updated`, `oat_generated`, `oat_template`, `oat_import_reference`, `oat_import_source_path`, `oat_import_provider`) are set by calling skills as needed.
100
100
 
@@ -109,16 +109,16 @@ If a user-authored override is needed, use this table shape:
109
109
  ```markdown
110
110
  ## Dispatch Profile
111
111
 
112
- | Phase | Claude model | Codex effort | Rationale |
113
- | ----- | ------------------------- | ------------------------------ | ----------------------------- |
114
- | pNN | haiku\|sonnet\|opus\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
112
+ | Phase | Claude model | Codex effort | Rationale |
113
+ | ----- | -------------------------------- | ------------------------------ | ----------------------------- |
114
+ | pNN | haiku\|sonnet\|opus\|fable\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
115
115
  ```
116
116
 
117
117
  Validation rules for explicit rows:
118
118
 
119
119
  - `Phase` must match a real `pNN` phase in the plan.
120
- - `Claude model` must be `haiku`, `sonnet`, `opus`, `auto`, or blank.
121
- - `Codex effort` must be `low`, `medium`, `high`, `xhigh`, `auto`, or blank. In Codex, explicit effort values are preferred controls that `oat-project-implement` caps against the resolved OAT dispatch ceiling and maps to pinned implementer variants when selected. Provider default effort is informational for base/unpinned roles and is not an OAT ceiling.
120
+ - `Claude model` must be `haiku`, `sonnet`, `opus`, `fable`, `auto`, or blank.
121
+ - `Codex effort` must be `low`, `medium`, `high`, `xhigh`, `auto`, or blank. In Codex, explicit effort values are preferred controls. `oat-project-implement` caps them when a capped managed policy exists, selects them directly under managed `Uncapped`, and maps selected efforts to pinned implementer variants when available. Provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths.
122
122
  - Blank or `auto` means no explicit constraint for that provider.
123
123
  - `Rationale` is recommended and should explain why runtime selection should not decide on its own.
124
124
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 2.1.8
3
+ version: 2.1.9
4
4
  description: Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design.
5
5
  argument-hint: '<project-name> ["project description"]'
6
6
  oat_gateable: true
@@ -467,62 +467,93 @@ Required parallelism pass before finalizing the plan:
467
467
  - Quick mode is not "sequential by default." A quick-start plan is sequential only when the dependency and write-set analysis says it should be.
468
468
  - When a task claims scoped verification, prefer the exact runner invocation that truly scopes to the intended file, test, or target instead of package-level shortcuts that may execute the full suite.
469
469
 
470
- ### Step 3.5: Resolve Dispatch Ceiling Before Implementation Readiness
470
+ ### Step 3.5: Resolve Dispatch Policy Before Implementation Readiness
471
471
 
472
472
  Before moving the quick project to ready-for-implementation, resolve the
473
- dispatch ceiling.
473
+ dispatch policy.
474
474
 
475
475
  Resolution order:
476
476
 
477
- 1. Config keys `workflow.dispatchCeiling.providers.<provider>` via the resolver CLI
478
- 2. Project `state.md` frontmatter key `oat_dispatch_ceiling`
479
- 3. Interactive quick-planning prompt (below)
480
- 4. Leave unresolved for implementation preflight when non-interactive
477
+ 1. Config keys `workflow.dispatchPolicy.mode` / `workflow.dispatchPolicy.policy` via the resolver CLI
478
+ 2. Compatibility config keys `workflow.dispatchCeiling.providers.<provider>`
479
+ 3. Project `state.md` frontmatter key `oat_dispatch_policy`
480
+ 4. Legacy project `state.md` frontmatter key `oat_dispatch_ceiling`
481
+ 5. Interactive quick-planning prompt (below)
482
+ 6. Leave unresolved for implementation preflight when non-interactive
481
483
 
482
- If no ceiling resolves and the session is interactive, present the preset
483
- prompt once before finalizing `plan.md`:
484
+ If no policy resolves and the session is interactive, present the dispatch
485
+ policy prompt once before finalizing `plan.md`:
484
486
 
485
487
  ```text
486
- Set the dispatch ceilingthe maximum subagent tier OAT may use.
488
+ Set the dispatch policyhow OAT should choose subagent model/effort controls.
487
489
 
488
- 1. Balanced (recommended) — Codex: high · Claude: sonnet
489
- 2. Maximum — Codex: xhigh · Claude: opus (reviews always run at this tier)
490
- 3. Cost-conscious — Codex: medium · Claude: sonnet
491
- 4. Advanced set per provider
492
- 5. No ceiling
490
+ Managed capped policies:
491
+ 1. Economy — Codex: medium · Claude: sonnet
492
+ 2. Balanced — Codex: high · Claude: sonnet (recommended)
493
+ 3. High Codex: xhigh · Claude: opus
494
+ 4. Frontier — Codex: xhigh · Claude: fable
493
495
 
494
- OAT applies this where the provider exposes a reliable mechanism (Codex: pinned
495
- variants; Claude: Task model parameter). Other providers may treat it as advisory.
496
+ Managed uncapped:
497
+ 5. Uncapped OAT selects the preferred implementer/fix target without a stored maximum cap.
498
+
499
+ Host defaults:
500
+ 6. Inherit Host Defaults — OAT does not select model/effort controls.
501
+
502
+ OAT applies managed policies where the provider exposes a reliable mechanism
503
+ (Codex: pinned variants; Claude: Task model parameter). Other providers may
504
+ treat managed policies as advisory.
496
505
  ```
497
506
 
498
- **Preset selection** persists `preset` + compiled per-provider values. On
499
- selection, print the exact compiled result (e.g., "Ceiling set: balanced
500
- Codex: high · Claude: sonnet") before proceeding.
507
+ **Managed capped policy selection (options 1-4)** persists `mode: managed`,
508
+ `policy`, and the compiled provider targets. On selection, print the exact
509
+ compiled result (e.g., "Dispatch policy set: balanced → Codex: high · Claude:
510
+ sonnet") before proceeding.
501
511
 
502
- **Advanced (option 4)** prompts for each provider's value individually, then
503
- persists `providers` + `source` only no `preset` key.
512
+ **Uncapped (option 5)** persists explicit managed uncapped state. It does not
513
+ write provider caps, and it must not be represented by leaving dispatch policy
514
+ state absent.
504
515
 
505
- **No ceiling (option 5)** leaves `oat_dispatch_ceiling` unset; implementer
506
- subagents run at provider defaults.
516
+ **Inherit Host Defaults (option 6)** persists explicit inherit/default state.
517
+ Use this only when the user wants OAT to leave implementation, fix, and review
518
+ model/effort controls to the executing host/provider.
507
519
 
508
520
  Persist the answer in `"$PROJECT_PATH/state.md"` frontmatter using the
509
521
  normalized shape:
510
522
 
511
523
  ```yaml
512
- oat_dispatch_ceiling:
513
- preset: balanced # omit when Advanced was chosen
524
+ oat_dispatch_policy:
525
+ mode: managed
526
+ policy: balanced
514
527
  providers:
515
528
  codex: high
516
529
  claude: sonnet
517
530
  source: project-state
518
531
  ```
519
532
 
533
+ For `Uncapped`:
534
+
535
+ ```yaml
536
+ oat_dispatch_policy:
537
+ mode: managed
538
+ policy: uncapped
539
+ source: project-state
540
+ ```
541
+
542
+ For `Inherit Host Defaults`:
543
+
544
+ ```yaml
545
+ oat_dispatch_policy:
546
+ mode: inherit
547
+ source: project-state
548
+ ```
549
+
520
550
  Do not prompt when `OAT_NON_INTERACTIVE=1` or when no user-response channel
521
551
  exists. In that case, leave the value unresolved. `oat-project-implement`
522
- must block before work starts if it still cannot resolve a ceiling.
552
+ must block before work starts if it still cannot resolve a policy.
523
553
 
524
- Do not treat provider default effort as the OAT dispatch ceiling. Provider
525
- default is informational for base/unpinned roles only.
554
+ Do not treat provider default effort as the OAT dispatch policy. Provider
555
+ defaults apply only for explicit inherit/default behavior or base/unpinned
556
+ fallback paths.
526
557
 
527
558
  ### Step 3.6: Run Plan Artifact Review Loop
528
559
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-provide
3
- version: 1.3.8
3
+ version: 1.3.10
4
4
  description: Use when the user explicitly asks to review an OAT project — e.g. "review project", "review the project", "run project review", or confirms a previously offered review. Do NOT auto-invoke on completed work alone. Resolves a project review scope and offers before running.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -25,11 +25,13 @@ Reviewers should distinguish implementation defects from artifact drift. If code
25
25
 
26
26
  ## Model Invocation Gate
27
27
 
28
- This skill is model-invokable only for explicit review asks such as "review project" or "review the project", or when the user confirms a previously offered project-review step. Do NOT auto-invoke merely because a task, phase, or implementation appears complete.
28
+ This skill is model-invokable only for explicit review asks such as "review project" or "review the project", or when the user confirms a previously offered project-review step. A gate-originated request from `oat gate review` is also an explicit review ask. Do NOT auto-invoke merely because a task, phase, or implementation appears complete.
29
29
 
30
30
  Before acting, verify that there is an active OAT project or a user-provided review target that can be resolved to project state. If neither exists, do not run this skill; offer `oat-project-open` / `oat-project-quick-start` for project workflow setup, or `oat-review-provide` for a non-project ad-hoc review.
31
31
 
32
- When the gate passes, summarize the inferred review type and scope, then ask before running the review.
32
+ When the invocation is manual, summarize the inferred review type and scope, then ask before running the review.
33
+
34
+ **Gate-originated mode:** If the request context says the review is gate-originated, set `REVIEW_INVOCATION=gate`, honor any provided review type/scope arguments, and run without interactive confirmation prompts. The gate session is already the explicit authorization boundary. If subagent dispatch is unavailable, run the review inline in the current gate session instead of handing off to a fresh session.
33
35
 
34
36
  ## Mode Assertion
35
37
 
@@ -123,7 +125,7 @@ Tell user:
123
125
  - `oat-project-quick-start` (new quick project)
124
126
  - `oat-project-import-plan` (external plan import)
125
127
 
126
- If validation passes, derive `{project-name}` as basename of `PROJECT_PATH`. Summarize the resolved project/review target and ask before continuing to Step 1.
128
+ If validation passes, derive `{project-name}` as basename of `PROJECT_PATH`. Summarize the resolved project/review target. For manual invocation, ask before continuing to Step 1. For `REVIEW_INVOCATION=gate`, continue without asking.
127
129
 
128
130
  ### Step 1: Parse Arguments or Ask
129
131
 
@@ -424,6 +426,8 @@ Files changed: {FILE_COUNT}
424
426
  Proceed with review?
425
427
  ```
426
428
 
429
+ If `REVIEW_INVOCATION=gate`, print the same scope summary but do not ask `Proceed with review?`; continue directly.
430
+
427
431
  ### Step 4.1: Dispatch Profile Override Advisory (Artifact Plan Only)
428
432
 
429
433
  When reviewing `artifact plan`, apply this Dispatch Profile override advisory:
@@ -536,6 +540,7 @@ Detection logic:
536
540
  - If the runtime can dispatch reviewer work (`subagent_type` in Claude Code, Cursor invocation via `/name` or natural mention, or Codex multi-agent spawn/auto-spawn) → **Tier 1**.
537
541
  - If the Task tool is not available or subagent dispatch is not supported → **Tier 2**.
538
542
  - If user explicitly requests inline or confirms they are already in a fresh session → **Tier 3**.
543
+ - If `REVIEW_INVOCATION=gate` and Tier 1 is unavailable, skip Tier 2 and use **Tier 3** inline. Do not return fresh-session instructions from a gate invocation.
539
544
 
540
545
  **Step 6b: Tier 1 — Subagent (if available)**
541
546
 
@@ -566,6 +571,7 @@ If subagent not available:
566
571
  - If user is already in a fresh session (confirmed), proceed to Tier 3.
567
572
  - If Codex reported `authorization required` and the user approved delegation, do **not** use Tier 2. Return to Tier 1 and delegate to `oat-reviewer`.
568
573
  - If user prefers fresh session: provide instructions and exit.
574
+ - If `REVIEW_INVOCATION=gate`: do not provide fresh-session instructions; run Tier 3 inline instead.
569
575
 
570
576
  Instructions for fresh session:
571
577
 
@@ -599,13 +605,15 @@ Review storage contract:
599
605
 
600
606
  **Naming convention:**
601
607
 
602
- - Phase review: `{PROJECT_PATH}/reviews/pNN-review-YYYY-MM-DD.md`
603
- - Task review: `{PROJECT_PATH}/reviews/pNN-tNN-review-YYYY-MM-DD.md`
604
- - Final review: `{PROJECT_PATH}/reviews/final-review-YYYY-MM-DD.md`
605
- - Range review: `{PROJECT_PATH}/reviews/range-review-YYYY-MM-DD.md`
606
- - Artifact review: `{PROJECT_PATH}/reviews/artifact-{artifact}-review-YYYY-MM-DD.md`
608
+ Use a seconds-precision **UTC** timestamp token (`YYYY-MM-DDTHHMMSSZ`, from `date -u +%Y-%m-%dT%H%M%SZ` — the `-u` and the trailing `Z` are mandatory), not a date-only or local-time stamp, so that same-scope re-reviews and re-gates within one day never collide and `oat review latest` orders them by recency:
609
+
610
+ - Phase review: `{PROJECT_PATH}/reviews/pNN-review-YYYY-MM-DDTHHMMSSZ.md`
611
+ - Task review: `{PROJECT_PATH}/reviews/pNN-tNN-review-YYYY-MM-DDTHHMMSSZ.md`
612
+ - Final review: `{PROJECT_PATH}/reviews/final-review-YYYY-MM-DDTHHMMSSZ.md`
613
+ - Range review: `{PROJECT_PATH}/reviews/range-review-YYYY-MM-DDTHHMMSSZ.md`
614
+ - Artifact review: `{PROJECT_PATH}/reviews/artifact-{artifact}-review-YYYY-MM-DDTHHMMSSZ.md`
607
615
 
608
- **If file exists for today:** append `-v2`, `-v3`, etc.
616
+ Set `oat_generated_at` in the artifact frontmatter to the matching full timestamp (`YYYY-MM-DDTHH:MM:SSZ`). Same-second collisions are effectively impossible for sequential runs; if one occurs, append `-v2`, `-v3`, etc.
609
617
 
610
618
  **Important:** `PROJECT_PATH` here must be the resolved path from Step 1.5. If a worktree was detected, this path is relative to the worktree root, ensuring the artifact is written on the correct branch.
611
619
 
@@ -636,7 +644,7 @@ Shared ad-hoc companion reference (non-project mode):
636
644
  ```markdown
637
645
  ---
638
646
  oat_generated: true
639
- oat_generated_at: { today }
647
+ oat_generated_at: { full UTC timestamp, e.g. 2026-07-06T11:16:01Z }
640
648
  oat_review_scope: { scope }
641
649
  oat_review_type: { code|artifact }
642
650
  oat_review_invocation: { manual|auto|gate }
@@ -655,9 +663,13 @@ oat_project: { PROJECT_PATH }
655
663
 
656
664
  - `manual` (default): Review was manually triggered by the user. `oat-project-review-receive` uses standard disposition behavior (user prompts for triage, minors auto-deferred for non-final scopes).
657
665
  - `auto`: Review was spawned by the auto-review checkpoint trigger in `oat-project-implement`. `oat-project-review-receive` uses relaxed disposition: minors are auto-converted to fix tasks (not deferred), no user prompts for disposition decisions.
658
- - `gate`: Review was spawned by `oat gate review`. Gate-originated reviews use normal stateful review-provide behavior: write the review artifact, update the `## Reviews` row, and commit review bookkeeping. `oat-project-review-receive` treats gate reviews with the same standard disposition behavior as manual reviews unless a future implementation explicitly designs autonomous receive.
666
+ - `gate`: Review was spawned by `oat gate review` for a workflow gate. Gate-originated reviews use normal stateful review-provide behavior: write the review artifact, update the `## Reviews` row, and commit review bookkeeping. The gate CLI maps the review artifact findings to exit status, and `oat-project-review-receive` dispositions gate reviews autonomously (no user prompts) — selecting convert-to-fix-tasks when the gate **blocked** at its threshold, or non-pausing judgment-sweep disposition (defer / small-fix-now / reject, with sub-threshold findings recorded durably) when the gate **passed**.
667
+
668
+ When `oat-project-implement` spawns this skill for auto-review at checkpoints, it passes context indicating auto invocation. Set `oat_review_invocation: auto` in the artifact frontmatter.
669
+
670
+ When `oat gate review` invokes this skill, it includes gate-originated context instructing the reviewer to write `oat_review_invocation: gate`. Honor that instruction in the artifact frontmatter.
659
671
 
660
- When `oat-project-implement` spawns this skill for auto-review at checkpoints, it passes context indicating auto invocation. Set `oat_review_invocation: auto` in the artifact frontmatter. When `oat gate review` spawns this skill, set `oat_review_invocation: gate`. For all other invocations (user-triggered, fresh session), use `manual`.
672
+ For all other invocations (user-triggered, fresh session), use `manual`.
661
673
 
662
674
  Gate parsing contract:
663
675
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-receive
3
- version: 1.5.4
3
+ version: 1.5.6
4
4
  description: Use when the user explicitly asks to receive review findings for an OAT project — e.g. "receive review", "process review", "process the project review", or confirms a previously offered review-receive step. Do NOT auto-invoke merely because a review file exists. Resolves the latest review and offers before acting.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -102,7 +102,7 @@ fi
102
102
 
103
103
  Selection rules:
104
104
 
105
- - Use `oat review latest` as the first-choice resolver. It scans project reviews (`reviews/` and `reviews/archived/`) plus ad-hoc review locations and orders candidates by `oat_generated_at` frontmatter rather than filesystem mtime.
105
+ - Use `oat review latest` as the first-choice resolver. It scans project reviews (`reviews/` and `reviews/archived/`) plus ad-hoc review locations and orders candidates by `oat_generated_at` frontmatter rather than filesystem mtime. Review artifacts carry a seconds-precision `oat_generated_at` and a matching timestamped filename, so same-scope same-day re-gates order deterministically and the newest round wins — never assume the plain `<scope>-review-<date>.md` name is current.
106
106
  - Read the JSON result:
107
107
  - `path: null` means no review target was found.
108
108
  - `kind: "project"` and `actionable: true` means this skill can process the target when the path is an active top-level project review.
@@ -267,15 +267,23 @@ Read `oat_review_type` and `oat_review_invocation` from review artifact frontmat
267
267
  - Require explicit user confirmation before applying any artifact edits.
268
268
  - Resolve findings directly in artifact files; do not convert findings into plan tasks.
269
269
  - Do not defer findings by default. Only use `rejected_with_rationale` for invalid findings, or `needs_user_direction` when user input is required.
270
- - If `oat_review_type == code` AND `oat_review_invocation == auto`:
271
- - **Auto-disposition mode.** This review was spawned by the auto-review checkpoint trigger in `oat-project-implement`. Apply relaxed disposition defaults:
270
+ - If `oat_review_type == code` AND `oat_review_invocation == auto`, OR `oat_review_invocation == gate` from a **blocking** gate (the gate-originated context does not indicate a passing-gate sweep):
271
+ - **Auto-disposition mode.** This review was spawned by the auto-review checkpoint trigger in `oat-project-implement` or by a blocking `oat gate review`. Apply relaxed disposition defaults:
272
272
  - Critical/Important/Medium: convert to fix tasks (same as manual mode)
273
- - Minor: auto-convert to fix tasks unless clearly out of scope (e.g., cosmetic polish unrelated to changed code). Manual mode now also defaults minors to `convert` (see Step 9); auto mode keeps the same intent — fix everything while context is fresh — but without any user prompts.
274
- - **No user prompts for disposition decisions.** The auto-review path runs fully autonomously.
273
+ - Minor: auto-convert to fix tasks unless clearly out of scope (e.g., cosmetic polish unrelated to changed code). Manual mode now also defaults minors to `convert` (see Step 9); auto/gate mode keeps the same intent — fix everything while context is fresh — but without any user prompts.
274
+ - **No user prompts for disposition decisions.** The auto/gate review path runs fully autonomously.
275
275
  - Genuinely ambiguous findings (e.g., a medium the agent disagrees with) are deferred with a note explaining why, rather than pausing for interactive resolution.
276
276
  - Follow the task-conversion flow in Steps 3-10 with these adjusted defaults.
277
- - If `oat_review_type == code` AND `oat_review_invocation == gate`:
278
- - **Gate review mode.** This review was spawned by `oat gate review`, but receive remains standard disposition behavior. Treat `gate` the same as manual for prompts, finding conversion, artifact archival, and bookkeeping unless a future implementation explicitly designs an autonomous receive path.
277
+ - If `oat_review_type == code` AND `oat_review_invocation == gate` from a **passing** gate (the gate-originated context indicates a passing-gate judgment sweep):
278
+ - **Judgment-sweep mode.** The phase gate already passed at its `exit_nonzero_on` threshold, so the phase does not stop. Consume the artifact anyway, so its sub-threshold findings become durable, ordered dispositions in `implementation.md` instead of evaporating. Fully non-pausing; no user prompts.
279
+ - The gate verdict decided whether the phase stops; it did **not** decide whether Medium/Minor findings are ignored. There are, by definition, no unresolved Critical/Important findings in a passing gate (if there were, the gate would have blocked).
280
+ - Make a per-finding **judgment call** for each Medium/Minor — do not mechanically dump them all:
281
+ - **Defer to final** (default): record under "Deferred Findings" (Mediums under "Deferred Findings (Medium)" so Step 8.5 resurfacing picks them up) with concrete rationale.
282
+ - **Address now:** only for small, contained, low-risk fixes. Apply the fix, commit it with the phase bookkeeping, and record the disposition. Do **not** re-run the standard reviewer or re-gate the phase for address-now fixes.
283
+ - **Reject** as false-positive / out-of-scope, with concrete rationale.
284
+ - `address now` is an **exception, not the norm** — when in doubt, defer. Do not let a passing gate drift into behaving like a Medium-blocking gate by habit.
285
+ - **Escalation exception:** if an address-now fix reveals or creates a Critical/Important concern, stop treating it as a sweep item. Convert it to a fix task and return control to the blocking-gate path (`oat-project-implement` re-runs the standard reviewer and the gate for the phase).
286
+ - Do not add blocking fix tasks for deferred or rejected findings. After recording all dispositions, archive the artifact (Step 7.5) and commit review bookkeeping (Step 7.6) as usual.
279
287
  - If `oat_review_type == code` (manual or `oat_review_invocation` absent):
280
288
  - Follow the existing task-conversion flow in Steps 3-10 with standard disposition behavior.
281
289
 
@@ -483,13 +491,15 @@ If the project itself is still untracked because earlier lifecycle steps never c
483
491
 
484
492
  **Bounded loop protection:**
485
493
 
486
- Count how many review cycles have occurred for this scope:
494
+ Count how many review cycles have occurred for this scope. Exclude gate-originated artifacts (`oat_review_invocation: gate`): the cap measures failed fix cycles of the standard review loop, not artifact volume, and phase gate re-runs are governed by the phase review gate flow in `oat-project-implement`, not by this cap.
487
495
 
488
496
  ```bash
489
497
  {
490
498
  find "$PROJECT_PATH/reviews" -maxdepth 1 -type f -name "*$SCOPE_TOKEN*.md" 2>/dev/null
491
499
  find "$PROJECT_PATH/reviews/archived" -maxdepth 1 -type f -name "*$SCOPE_TOKEN*.md" 2>/dev/null
492
- } | wc -l
500
+ } | while IFS= read -r artifact; do
501
+ grep -q "oat_review_invocation: gate" "$artifact" || echo "$artifact"
502
+ done | wc -l
493
503
  ```
494
504
 
495
505
  **If 3 or more cycles:**
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-review-provide
3
- version: 1.2.2
3
+ version: 1.2.3
4
4
  description: Use when you need an ad-hoc review outside an active OAT project lifecycle. Reviews code or artifacts without project phase state, unlike oat-project-review-provide.
5
5
  argument-hint: '[unstaged|staged|base_branch=<branch>|base_sha=<sha>|<sha1>..<sha2>|--files <path1,path2,...>] [--output <path>] [--mode auto|local|tracked|inline]'
6
6
  disable-model-invocation: true
@@ -151,18 +151,20 @@ If user asks for tracked `.oat/repo/reviews` and it is gitignored, warn and ask
151
151
 
152
152
  Derive a **scope slug** from the resolved scope mode so that the filename indicates what was reviewed:
153
153
 
154
- | Scope mode | Slug derivation | Example filename |
155
- | ---------------------- | ------------------------------------ | --------------------------------------------- |
156
- | `base_branch=<branch>` | Current branch name | `ad-hoc-review-2026-02-16-oat-repo.md` |
157
- | `unstaged` | Literal `unstaged` | `ad-hoc-review-2026-02-16-unstaged.md` |
158
- | `staged` | Literal `staged` | `ad-hoc-review-2026-02-16-staged.md` |
159
- | `--files <paths>` | First 2–3 basenames, joined with `-` | `ad-hoc-review-2026-02-16-auth-login.md` |
160
- | `base_sha=<sha>` | Short SHA (7 chars) | `ad-hoc-review-2026-02-16-abc1234.md` |
161
- | `<sha1>..<sha2>` | Both short SHAs joined with `-` | `ad-hoc-review-2026-02-16-abc1234-def5678.md` |
154
+ | Scope mode | Slug derivation | Example filename |
155
+ | ---------------------- | ------------------------------------ | ----------------------------------------------------- |
156
+ | `base_branch=<branch>` | Current branch name | `ad-hoc-review-2026-02-16T140322Z-oat-repo.md` |
157
+ | `unstaged` | Literal `unstaged` | `ad-hoc-review-2026-02-16T140322Z-unstaged.md` |
158
+ | `staged` | Literal `staged` | `ad-hoc-review-2026-02-16T140322Z-staged.md` |
159
+ | `--files <paths>` | First 2–3 basenames, joined with `-` | `ad-hoc-review-2026-02-16T140322Z-auth-login.md` |
160
+ | `base_sha=<sha>` | Short SHA (7 chars) | `ad-hoc-review-2026-02-16T140322Z-abc1234.md` |
161
+ | `<sha1>..<sha2>` | Both short SHAs joined with `-` | `ad-hoc-review-2026-02-16T140322Z-abc1234-def5678.md` |
162
162
 
163
163
  ```bash
164
164
  mkdir -p "$OUTPUT_DIR"
165
- TODAY=$(date +%Y-%m-%d)
165
+ # Seconds-precision UTC token so same-scope same-day re-reviews never collide and
166
+ # order by recency in `oat review latest`. The trailing Z (UTC) is mandatory.
167
+ STAMP=$(date -u +%Y-%m-%dT%H%M%SZ)
166
168
 
167
169
  # Derive SCOPE_SLUG based on scope mode (examples):
168
170
  # base_branch → SCOPE_SLUG=$(git branch --show-current | tr '/' '-')
@@ -174,10 +176,10 @@ TODAY=$(date +%Y-%m-%d)
174
176
  # Sanitize: lowercase, replace non-alphanumeric with '-', collapse runs, trim to 40 chars
175
177
  SCOPE_SLUG=$(echo "$SCOPE_SLUG" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g; s/--*/-/g; s/^-//; s/-$//' | cut -c1-40)
176
178
 
177
- OUT_FILE="$OUTPUT_DIR/ad-hoc-review-${TODAY}-${SCOPE_SLUG}.md"
179
+ OUT_FILE="$OUTPUT_DIR/ad-hoc-review-${STAMP}-${SCOPE_SLUG}.md"
178
180
  ```
179
181
 
180
- If the file already exists (same scope reviewed twice in one day), suffix with `-v2`, `-v3`, etc.
182
+ Set `oat_generated_at` in the artifact frontmatter to the matching full UTC timestamp (`YYYY-MM-DDTHH:MM:SSZ`). Same-second collisions are effectively impossible for sequential runs; if one occurs, suffix with `-v2`, `-v3`, etc.
181
183
 
182
184
  ### Step 4: Run Review
183
185
 
@@ -5,7 +5,7 @@ Use this template for non-project commit-range reviews.
5
5
  ````markdown
6
6
  ---
7
7
  oat_generated: true
8
- oat_generated_at: YYYY-MM-DD
8
+ oat_generated_at: YYYY-MM-DDTHH:MM:SSZ
9
9
  oat_review_type: code
10
10
  oat_review_scope: { scope }
11
11
  oat_review_scope_mode: { files|unstaged|staged|range }
@@ -57,11 +57,11 @@ _Optional override surface. Use only for explicit user-authored constraints or p
57
57
 
58
58
  Blank or `auto` means there is no explicit constraint for that provider. Do not generate rows by default; a missing phase row uses runtime selection.
59
59
 
60
- | Phase | Claude model | Codex effort | Rationale |
61
- | ----- | ------------------------- | ------------------------------ | ----------------------------- |
62
- | pNN | haiku\|sonnet\|opus\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
60
+ | Phase | Claude model | Codex effort | Rationale |
61
+ | ----- | -------------------------------- | ------------------------------ | ----------------------------- |
62
+ | pNN | haiku\|sonnet\|opus\|fable\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
63
63
 
64
- Codex effort values are preferred controls. `oat-project-implement` caps them against the resolved OAT dispatch ceiling and maps selected efforts to pinned implementer variants. Codex provider default effort is informational for base/unpinned roles and is not an OAT ceiling.
64
+ Codex effort values are preferred controls. `oat-project-implement` caps them when a capped managed dispatch policy exists, selects them directly under managed `Uncapped`, and maps selected efforts to pinned implementer variants when available. Codex provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths.
65
65
 
66
66
  ---
67
67
 
@@ -14,10 +14,14 @@ oat_parallel_execution: false
14
14
  oat_phase: { OAT_PHASE } # Current phase: discovery | spec | design | plan | implement | decomposition
15
15
  oat_phase_status: in_progress # Status: in_progress | complete | pr_open
16
16
  # oat_orchestration_retry_limit: 2 # optional; override fix-loop retry limit (range 0-5)
17
- # oat_dispatch_ceiling: # optional project override for provider-aware dispatch ceilings
18
- # provider: codex # codex | claude
19
- # value: high # codex: low|medium|high|xhigh; claude: haiku|sonnet|opus
17
+ # oat_dispatch_policy: # optional project dispatch policy; managed keeps OAT selection active, inherit leaves controls to the host
18
+ # mode: managed # managed | inherit
19
+ # policy: balanced # economy | balanced | high | frontier | uncapped; omit when mode: inherit
20
+ # providers: # present for capped managed policies; omitted for uncapped/inherit
21
+ # codex: high # low|medium|high|xhigh
22
+ # claude: sonnet # haiku|sonnet|opus|fable
20
23
  # source: project-state
24
+ # oat_dispatch_ceiling: # legacy compatibility alias for capped managed provider targets
21
25
  oat_workflow_mode: { OAT_WORKFLOW_MODE } # spec-driven | quick | import
22
26
  oat_workflow_origin: native # native | imported
23
27
  oat_docs_updated: null # null | skipped | complete — documentation sync status
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAQhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAkvCD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CA0GT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAUhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgEpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAyzCD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CA0GT"}