@open-agent-toolkit/cli 0.2.59 → 0.2.63

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 (120) hide show
  1. package/assets/agents/oat-phase-implementer.md +27 -4
  2. package/assets/agents/oat-reviewer.md +25 -14
  3. package/assets/bundle-metadata.json +1 -1
  4. package/assets/docs/cli-utilities/config-and-local-state.md +1 -0
  5. package/assets/docs/cli-utilities/configuration.md +10 -8
  6. package/assets/docs/cli-utilities/project-log.md +16 -0
  7. package/assets/docs/cli-utilities/workflow-gates.md +127 -19
  8. package/assets/docs/provider-sync/commands.md +3 -0
  9. package/assets/docs/provider-sync/instruction-sync.md +107 -0
  10. package/assets/docs/reference/cli-reference.md +26 -9
  11. package/assets/docs/reference/oat-directory-structure.md +33 -31
  12. package/assets/docs/workflows/ideas/index.md +1 -1
  13. package/assets/docs/workflows/index.md +1 -0
  14. package/assets/docs/workflows/projects/artifacts.md +24 -3
  15. package/assets/docs/workflows/projects/hill-checkpoints.md +21 -0
  16. package/assets/docs/workflows/projects/implementation-execution.md +5 -0
  17. package/assets/docs/workflows/projects/lifecycle.md +169 -7
  18. package/assets/docs/workflows/projects/picking-up-projects.md +14 -0
  19. package/assets/docs/workflows/projects/pr-flow.md +2 -0
  20. package/assets/docs/workflows/projects/reviews.md +1 -1
  21. package/assets/docs/workflows/projects/state-machine.md +20 -0
  22. package/assets/docs/workflows/skills/explainer-kit.md +10 -4
  23. package/assets/docs/workflows/skills/index.md +2 -1
  24. package/assets/docs/workflows/skills/repo-improve.md +15 -1
  25. package/assets/public-package-versions.json +4 -4
  26. package/assets/skills/oat-brainstorm/SKILL.md +61 -12
  27. package/assets/skills/oat-docs/SKILL.md +13 -8
  28. package/assets/skills/oat-doctor/SKILL.md +3 -3
  29. package/assets/skills/oat-explainer-kit/SKILL.md +14 -1
  30. package/assets/skills/oat-explainer-kit/references/config-contract.md +12 -0
  31. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +57 -10
  32. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +28 -5
  33. package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +371 -0
  34. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +123 -1
  35. package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
  36. package/assets/skills/oat-project-autonomous/SKILL.md +23 -9
  37. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +164 -150
  38. package/assets/skills/oat-project-capture/SKILL.md +2 -2
  39. package/assets/skills/oat-project-complete/SKILL.md +134 -4
  40. package/assets/skills/oat-project-discover/SKILL.md +6 -5
  41. package/assets/skills/oat-project-document/SKILL.md +11 -1
  42. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +164 -150
  43. package/assets/skills/oat-project-implement/SKILL.md +3 -3
  44. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +144 -21
  45. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +164 -150
  46. package/assets/skills/oat-project-implement/references/phase-execution.md +16 -1
  47. package/assets/skills/oat-project-implement/references/plan-and-resume.md +19 -1
  48. package/assets/skills/oat-project-import-plan/SKILL.md +47 -3
  49. package/assets/skills/oat-project-lite/SKILL.md +467 -0
  50. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +331 -0
  51. package/assets/skills/oat-project-next/SKILL.md +75 -16
  52. package/assets/skills/oat-project-plan/SKILL.md +44 -6
  53. package/assets/skills/oat-project-plan-writing/SKILL.md +6 -3
  54. package/assets/skills/oat-project-pr-final/SKILL.md +33 -7
  55. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +164 -150
  56. package/assets/skills/oat-project-pr-progress/SKILL.md +3 -3
  57. package/assets/skills/oat-project-progress/SKILL.md +27 -5
  58. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +3 -1
  59. package/assets/skills/oat-project-quick-start/SKILL.md +264 -4
  60. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +164 -150
  61. package/assets/skills/oat-project-review-provide/SKILL.md +25 -6
  62. package/assets/skills/oat-project-summary/SKILL.md +61 -26
  63. package/assets/skills/oat-repo-improve/SKILL.md +40 -5
  64. package/assets/skills/oat-repo-improve/references/plan-template.md +84 -7
  65. package/assets/templates/plan-lite.md +165 -0
  66. package/assets/templates/plan.md +1 -1
  67. package/assets/templates/state.md +1 -1
  68. package/dist/commands/config/index.d.ts +1 -0
  69. package/dist/commands/config/index.d.ts.map +1 -1
  70. package/dist/commands/config/index.js +401 -18
  71. package/dist/commands/gate/index.d.ts +3 -1
  72. package/dist/commands/gate/index.d.ts.map +1 -1
  73. package/dist/commands/gate/index.js +699 -211
  74. package/dist/commands/init/tools/shared/skill-script-references.d.ts +126 -0
  75. package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -0
  76. package/dist/commands/init/tools/shared/skill-script-references.js +311 -0
  77. package/dist/commands/instructions/instructions.types.d.ts +63 -0
  78. package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
  79. package/dist/commands/instructions/instructions.utils.d.ts +51 -2
  80. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  81. package/dist/commands/instructions/instructions.utils.js +201 -4
  82. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  83. package/dist/commands/instructions/sync/sync.js +12 -1
  84. package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
  85. package/dist/commands/instructions/validate/validate.js +12 -1
  86. package/dist/commands/project/index.d.ts.map +1 -1
  87. package/dist/commands/project/index.js +2 -0
  88. package/dist/commands/project/log/append.d.ts +195 -0
  89. package/dist/commands/project/log/append.d.ts.map +1 -1
  90. package/dist/commands/project/log/append.js +1034 -11
  91. package/dist/commands/project/new/index.d.ts +3 -2
  92. package/dist/commands/project/new/index.d.ts.map +1 -1
  93. package/dist/commands/project/new/index.js +2 -1
  94. package/dist/commands/project/new/scaffold.d.ts +5 -3
  95. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  96. package/dist/commands/project/new/scaffold.js +38 -10
  97. package/dist/commands/project/promote/index.d.ts +2 -0
  98. package/dist/commands/project/promote/index.d.ts.map +1 -0
  99. package/dist/commands/project/promote/index.js +1 -0
  100. package/dist/commands/project/promote/promote.d.ts +47 -0
  101. package/dist/commands/project/promote/promote.d.ts.map +1 -0
  102. package/dist/commands/project/promote/promote.js +322 -0
  103. package/dist/commands/project/split/run.d.ts.map +1 -1
  104. package/dist/commands/project/split/run.js +8 -1
  105. package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
  106. package/dist/commands/project/validate-plan/index.js +25 -1
  107. package/dist/commands/project/validate-plan/validate-plan.d.ts +8 -0
  108. package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
  109. package/dist/commands/project/validate-plan/validate-plan.js +49 -0
  110. package/dist/commands/shared/frontmatter.d.ts +1 -1
  111. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  112. package/dist/commands/shared/frontmatter.js +1 -0
  113. package/dist/commands/state/generate.d.ts.map +1 -1
  114. package/dist/commands/state/generate.js +23 -0
  115. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  116. package/dist/commands/tools/shared/pack-manifest.js +2 -0
  117. package/dist/config/oat-config.d.ts +41 -0
  118. package/dist/config/oat-config.d.ts.map +1 -1
  119. package/dist/config/oat-config.js +111 -0
  120. package/package.json +2 -2
@@ -17,10 +17,12 @@ Expected artifacts:
17
17
  - Required (all modes): `plan.md`
18
18
  - Required (spec-driven mode): `spec.md`, `design.md`
19
19
  - Optional (quick/import): `spec.md`, `design.md`
20
+ - Not expected (lite): `discovery.md`, `spec.md`, or `design.md`
20
21
  - Recommended (quick mode): `discovery.md`
21
22
  - Recommended (import mode): `references/imported-plan.md`
22
23
  - Recommended: `implementation.md` final summary
23
24
  - Recommended: `summary.md` — pr-final treats it as the primary source for the PR Summary section and automatically refreshes it first when missing or stale
25
+ - Lite source row: `oat-project-pr-final` uses the plan's Summary, Decisions, and Validation Criteria plus the `implementation.md` Final Summary; it does not create `summary.md` unless lite closeout explicitly opts in
24
26
  - Required gate for final PR: review table final row should be `passed`
25
27
 
26
28
  ## Output
@@ -173,7 +173,7 @@ This feature is opt-in and disabled by default (missing or `enabled: false`). Fo
173
173
 
174
174
  Generated planning and analysis artifacts have a separate review loop from code/phase reviews.
175
175
 
176
- For plans, `oat-project-plan`, `oat-project-quick-start`, and `oat-project-import-plan` run a bounded `plan.md` artifact review before marking the plan ready for implementation. The loop dispatches `oat-reviewer` in structured-output artifact mode with `scope: plan`, applies unambiguous Critical and Important artifact-local fixes, offers Medium and Minor fixes, and re-runs until clean or the retry bound is exhausted. A clean result records the `plan` row in the plan's `## Reviews` table as `passed`.
176
+ For plans, `oat-project-plan`, `oat-project-quick-start`, `oat-project-lite`, and `oat-project-import-plan` run a bounded `plan.md` artifact review before marking the plan ready for implementation. The loop dispatches `oat-reviewer` in structured-output artifact mode with `scope: plan`, applies unambiguous Critical and Important artifact-local fixes, offers Medium and Minor fixes, and re-runs until clean or the retry bound is exhausted. A clean result records the `plan` row in the plan's `## Reviews` table as `passed`.
177
177
 
178
178
  For analysis artifacts, `oat-docs-analyze` and `oat-agent-instructions-analyze` run a bounded accuracy review after writing their severity-rated artifacts. The reviewer checks cited evidence, severity, and recommendations before the matching apply workflow consumes the artifact. The analysis loop updates tracking metadata to mark the artifact verified.
179
179
 
@@ -32,8 +32,14 @@ flowchart TD
32
32
  FA --> FC["Fixes completed"]
33
33
  FC --> PASSED["Review passed"]
34
34
  PASSED --> I
35
+
36
+ LITE["Lite: batched interview\n(no discovery/spec/design)"] -. entry point .-> P
35
37
  ```
36
38
 
39
+ The solid chain is the spec-driven progression. Lite enters at **Plan in
40
+ progress** and never sets `oat_phase` to `discovery`, `spec`, or `design`;
41
+ quick and import projects also skip part of the leading chain.
42
+
37
43
  ## Phase status values
38
44
 
39
45
  `oat_phase_status` in `state.md`:
@@ -65,6 +71,20 @@ Typical progression:
65
71
  12. Revision loop (optional): `pr_open` → revise → `in_progress` → implement → `pr_open`
66
72
  13. Complete
67
73
 
74
+ Lite progression:
75
+
76
+ 1. Plan in progress (`oat_workflow_mode: lite`, `oat_phase: plan`)
77
+ 2. Ready for implement (one approval; no discovery, spec, or design states)
78
+ 3. Implement in progress (single phase, no HiLL checkpoint pauses)
79
+ 4. Implement complete (final review passed)
80
+ 5. PR open (`pr_open`) — lite closeout routes straight to `oat-project-pr-final`
81
+ 6. Complete
82
+
83
+ A lite project that outgrows one sitting can move to the quick chain with `oat
84
+ project promote <project-path> --to quick`, which flips `oat_workflow_mode` to
85
+ `quick` and sets `oat_phase: discovery` with `oat_phase_status: complete`. See
86
+ [Lifecycle](lifecycle.md#promoting-a-lite-project-to-quick).
87
+
68
88
  ## Review progression
69
89
 
70
90
  In `plan.md` Reviews table:
@@ -420,10 +420,16 @@ Interactive project explainer and recap preferences resolve independently from
420
420
  the built-in default is `ask`. A resolved project decision in `state.md`
421
421
  outranks those preferences.
422
422
 
423
- Autonomous mode has stricter policy: it always attempts a project recap, while
424
- a project explainer runs only when the kickoff request explicitly asks for
425
- one. Lifecycle-triggered runs do not publish automatically, and recap failure
426
- does not block project completion.
423
+ Autonomous mode has stricter policy: it always runs the project-recap gate,
424
+ while a project explainer runs only when the kickoff request explicitly asks
425
+ for one. The gate probes the five seams an unattended recap needs — author,
426
+ fact critic, browser session, visual critic, and set planner — before
427
+ generating. It attempts the recap only when all five resolve; when a seam has
428
+ no provider configured at all, it records a `skip` with source
429
+ `capability_probe` and a warning instead. A seam that is configured but invalid
430
+ is a configuration error and still fails closed. Lifecycle-triggered runs do
431
+ not publish automatically, and neither recap failure nor an unavailable seam
432
+ blocks project completion.
427
433
 
428
434
  See [Project Artifacts](../projects/artifacts.md) for active and durable output
429
435
  locations, and [Configuration](../../cli-utilities/configuration.md) for the
@@ -18,7 +18,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
18
18
 
19
19
  ## Key Skills by Use Case
20
20
 
21
- - Start a new tracked project: `oat-project-new` or `oat-project-quick-start` (quick start accepts a project name plus optional description; if you omit the description it should ask before discovery begins)
21
+ - Start a new tracked project: `oat-project-new`, `oat-project-quick-start`, or `oat-project-lite` for a single-sitting change with one batched interview and one approval (quick start accepts a project name plus optional description; if you omit the description it should ask before discovery begins)
22
22
  - Resume an existing project: `oat-project-open` and `oat-project-progress`
23
23
  - Execute a ready plan: `oat-project-implement`
24
24
  - Import an existing plan: `oat-project-import-plan`
@@ -58,6 +58,7 @@ Use this section when you want to choose the right OAT skill for a task. If you
58
58
 
59
59
  - `oat-project-new`
60
60
  - `oat-project-quick-start`
61
+ - `oat-project-lite`
61
62
  - `oat-project-import-plan`
62
63
  - `oat-project-promote-spec-driven`
63
64
  - `oat-project-open`
@@ -35,7 +35,7 @@ These are findings exclusions, not absolute read prohibitions. Improve may read
35
35
 
36
36
  ## Output boundary
37
37
 
38
- External plans are not canonical OAT project `plan.md` files. They contain self-contained context, scope, steps, verification, done criteria, and STOP conditions, but no OAT phase/task IDs or lifecycle bookkeeping.
38
+ External plans are not canonical OAT project `plan.md` files. They contain self-contained context, scope, steps, verification, done criteria, and STOP conditions, but no canonical OAT phase/task IDs or lifecycle bookkeeping. External execution-readiness metadata is a separate thing and is carried deliberately: it describes whether the plan's own prerequisites have merged, not how an OAT project is moving through phases.
39
39
 
40
40
  After generation, choose either execution path:
41
41
 
@@ -44,6 +44,20 @@ After generation, choose either execution path:
44
44
 
45
45
  Project-sized candidates are split when possible. If inseparable work needs multiple design decisions or lacks one coherent verification boundary, improve recommends an OAT project workflow instead of emitting a mega-plan.
46
46
 
47
+ ## Plan readiness and execution readiness
48
+
49
+ Improve scores candidates on two independent axes. A candidate is plan-ready when it is understood well enough to write a self-contained executable plan, and execution-ready when every hard dependency it names has already merged.
50
+
51
+ A blocked candidate is still planned. Rather than dropping work whose prerequisite has not landed, improve writes the plan and records the block:
52
+
53
+ - `oat_execution_status` is `READY` or `BLOCKED` in plan frontmatter.
54
+ - A typed `## Dependencies` table marks each row `Hard`, `Soft`, or `Satisfied`, and every `Hard` row names the state that would unblock it.
55
+ - `## Landing-event impact` records what to re-anchor when a named PR or project lands, and `## Revalidation Before Execution` records when the plan must be re-checked against live state.
56
+
57
+ Plan provenance is recorded as two separate SHAs: `oat_external_plan_commit` is the full SHA of the `HEAD` whose content was actually inspected, and `oat_external_plan_main_commit` is the fetched `origin/main` or merge-base used only for comparison. They may differ, and normally do when planning happens on a branch.
58
+
59
+ Plans written before this contract landed are read in legacy mode: a short SHA, a missing comparison SHA, missing sections, and a missing status (read as `READY`) are all accepted, and those plans are never rewritten.
60
+
47
61
  ## Optional tracking
48
62
 
49
63
  Plans are always the primary output. Tracking is optional and source-aware:
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.59",
3
- "docs-config": "0.2.59",
4
- "docs-theme": "0.2.59",
5
- "docs-transforms": "0.2.59"
2
+ "cli": "0.2.63",
3
+ "docs-config": "0.2.63",
4
+ "docs-theme": "0.2.63",
5
+ "docs-transforms": "0.2.63"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-brainstorm
3
- version: 1.3.5
3
+ version: 1.3.6
4
4
  description: Use when the user explicitly invokes the `brainstorm` verb, including `/oat-brainstorm`, "let's brainstorm", "brainstorm this", "can we brainstorm X", or "help me brainstorm X". For ambiguous exploratory phrasing ("I've been thinking", "what if", "help me think through"), do NOT auto-enter; respond conversationally and offer mode only after ≥2 sustained exploratory turns. Do NOT use for review, debug, PR, status, implementation, or active-workflow questions.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -233,7 +233,7 @@ ACTIVE_PROJECT_PR_STATUS=""
233
233
  if [ -n "$ACTIVE_PROJECT" ] && [ -f "$ACTIVE_PROJECT/state.md" ]; then
234
234
  ACTIVE_PROJECT_VALID="true"
235
235
  # Read state.md frontmatter — extract:
236
- # oat_workflow_mode → ACTIVE_PROJECT_MODE (e.g., "spec-driven", "quick")
236
+ # oat_workflow_mode → ACTIVE_PROJECT_MODE (e.g., "spec-driven", "quick", "lite")
237
237
  # oat_phase → ACTIVE_PROJECT_PHASE (e.g., "discovery", "design", "plan", "implement")
238
238
  # oat_pr_status → ACTIVE_PROJECT_PR_STATUS (e.g., "none", "open", "closed")
239
239
  fi
@@ -396,8 +396,8 @@ The payload is staged in memory only — it is not persisted between conversatio
396
396
  - Capture as new idea → confirm slug.
397
397
  - Extend existing idea → confirm which idea (slug or path).
398
398
  - Doc-to-path → confirm path.
399
- - Promote to new project → confirm slug + workflow mode (`quick` vs `spec-driven`, with skill proposing a default based on the chosen direction and scope signals).
400
- - Active-project fold-back → confirm which artifact (`design.md` if exists, else `discovery.md`; user signal can override toward `discovery.md` for foundational changes).
399
+ - Promote to new project → confirm slug + workflow mode (`lite`, `quick`, or `spec-driven`, with skill proposing a default based on the chosen direction and scope signals).
400
+ - Active-project fold-back → for lite confirm `plan.md`; otherwise confirm which artifact (`design.md` if exists, else `discovery.md`; user signal can override toward `discovery.md` for foundational changes).
401
401
  - Active-project reference file → confirm filename (default `YYYY-MM-DD-<topic>.md`).
402
402
 
403
403
  - **`none`** (currently `Inline only` and `Summarize idea directly`): no per-field confirmation at this layer. For `Inline only`, write the closing summary directly. For `Summarize idea directly`, hand off — the downstream `oat-idea-summarize` surfaces its own summary for accept/refine review.
@@ -505,13 +505,50 @@ End mode assertion when the backlog-add hands control back.
505
505
 
506
506
  #### 9g — Promote to new OAT project
507
507
 
508
- The slug and workflow mode (`quick` vs `spec-driven`) were confirmed at step 8. Run:
508
+ The slug and workflow mode (`lite`, `quick`, or `spec-driven`) were confirmed at
509
+ step 8. Run:
509
510
 
510
511
  ```bash
511
512
  oat project new <slug> --mode <mode>
512
513
  ```
513
514
 
514
- This scaffolds the project directory under `.oat/projects/<scope>/<slug>/` with the standard core files (state.md, discovery.md, etc.).
515
+ This scaffolds the project directory under `.oat/projects/<scope>/<slug>/` with
516
+ the files owned by the selected mode.
517
+
518
+ **Lite branch:** When mode is `lite`, use and preserve `<project>/plan.md` as
519
+ the canonical artifact. Fill its `Summary`, `Decisions`, `Assumptions`, `Out of
520
+ Scope`, and `Validation Criteria` sections from the synthesized payload without
521
+ replacing an already populated section or the scaffolded `## Phase 1`. Do not
522
+ create, write, or complete `discovery.md` or `design.md`. Set the project state
523
+ to plan/in-progress with `oat_ready_for: oat-project-lite`, print the
524
+ `oat-project-lite` handoff, and stop.
525
+
526
+ Use this branch contract to validate the lite scaffold before the handoff:
527
+
528
+ ```bash
529
+ # BEGIN LITE PROJECT PROMOTION CONTRACT
530
+ if [ "$PROMOTION_MODE" = "lite" ]; then
531
+ LITE_PLAN_PATH="$PROMOTED_PROJECT/plan.md"
532
+ if [ ! -f "$LITE_PLAN_PATH" ]; then
533
+ mkdir -p "$PROMOTED_PROJECT"
534
+ printf '%s\n' '# Plan' '' '## Summary' '' '## Decisions' '' \
535
+ '## Assumptions' '' '## Out of Scope' '' '## Validation Criteria' '' \
536
+ '## Phase 1' > "$LITE_PLAN_PATH"
537
+ fi
538
+ if [ -e "$PROMOTED_PROJECT/discovery.md" ]; then
539
+ echo "oat: lite promotion must not create discovery.md" >&2
540
+ exit 64
541
+ fi
542
+ NEXT_SKILL="oat-project-lite"
543
+ else
544
+ LITE_PLAN_PATH=""
545
+ NEXT_SKILL="oat-project-quick-start-or-design"
546
+ fi
547
+ # END LITE PROJECT PROMOTION CONTRACT
548
+ ```
549
+
550
+ **Quick/spec-driven branch:** Only for those two modes, continue with the
551
+ discovery flow below.
515
552
 
516
553
  Then **write a field-filled `discovery.md`** at `<project>/discovery.md` using the synthesized payload:
517
554
 
@@ -536,7 +573,7 @@ Print a pointer to the next skill, e.g.:
536
573
 
537
574
  **Stop here. Do NOT inline-execute the next phase.** The deliberate transition is the point — the user runs the next skill at their own pace.
538
575
 
539
- End mode assertion.
576
+ End mode assertion after the selected branch stops.
540
577
 
541
578
  #### 9h — Active-project router (3-way picker)
542
579
 
@@ -556,14 +593,25 @@ The 3-way router fires once per session. After convergence resumes (e.g., the us
556
593
 
557
594
  #### 9i — Active project: fold-back to upstream artifact
558
595
 
559
- Uniform across spec-driven and quick modes. Differs only in which plan-authoring skill the handoff prompt addresses (resolved by `ACTIVE_PROJECT_MODE` and `ACTIVE_PROJECT_PR_STATUS`).
596
+ Uniform across spec-driven, quick, and lite modes. Differs only in which plan-authoring skill the handoff prompt addresses (resolved by `ACTIVE_PROJECT_MODE` and `ACTIVE_PROJECT_PR_STATUS`).
560
597
 
561
598
  **Step 1 — Pick upstream artifact.** Prefer the most-specific existing one:
562
599
 
600
+ - For lite, always select `<ACTIVE_PROJECT>/plan.md`. Append `## Brainstorming Update` immediately above `## Phase 1`; lite has no discovery or design artifact.
563
601
  - `<ACTIVE_PROJECT>/design.md` if it exists (any mode — quick lightweight design counts).
564
602
  - Otherwise `<ACTIVE_PROJECT>/discovery.md`.
565
603
  - The user's signal during the conversation can override toward `discovery.md` even when `design.md` exists ("this is foundational" → discovery; "this is a design refinement" → design).
566
604
 
605
+ Use this executable artifact-selection contract before confirming the path:
606
+
607
+ ```bash
608
+ # BEGIN LITE FOLD-BACK CONTRACT
609
+ if [ "$ACTIVE_PROJECT_MODE" = "lite" ]; then
610
+ ARTIFACT_PATH="$ACTIVE_PROJECT/plan.md"
611
+ fi
612
+ # END LITE FOLD-BACK CONTRACT
613
+ ```
614
+
567
615
  Confirm the chosen artifact with the user (minimal confirmation per `references/destinations.md`). Set `ARTIFACT_PATH` to the absolute path.
568
616
 
569
617
  **Persistence invariant:** shared and local project artifacts remain ordinary
@@ -602,7 +650,7 @@ beside another dirty project file must take Step 4.
602
650
  ## Brainstorming Update: YYYY-MM-DD — <topic>
603
651
  ```
604
652
 
605
- Section body contains: `chosenDirection` (with rationale), key decisions (extracted from the conversation), and a transcript appendix (`transcriptSessionNote`). Optionally include `openQuestions` and `nextSteps` if surfaced.
653
+ Section body contains: `chosenDirection` (with rationale), key decisions (extracted from the conversation), and a transcript appendix (`transcriptSessionNote`). Optionally include `openQuestions` and `nextSteps` if surfaced. In lite mode, insert this section above `## Phase 1` in `plan.md` rather than appending after the task plan.
606
654
 
607
655
  2. Persist **only** the artifact under the scope guard:
608
656
 
@@ -621,7 +669,7 @@ beside another dirty project file must take Step 4.
621
669
 
622
670
  For non-synced projects, use the explicit `--` filename form. **Never `git add -A`. Never directory globs.** Other working-tree paths are not touched by this commit. For synced projects, `FOLD_BACK_COMMIT_SHA` comes from the push JSON rather than the parent branch.
623
671
 
624
- 3. `<artifact-basename>` is `design.md` or `discovery.md` depending on which was chosen. `<project-name>` is the active project's slug.
672
+ 3. `<artifact-basename>` is `plan.md` for lite, otherwise `design.md` or `discovery.md` depending on which was chosen. `<project-name>` is the active project's slug.
625
673
 
626
674
  4. If the guarded persistence succeeded → proceed to step 5 (handoff prompt).
627
675
 
@@ -695,7 +743,8 @@ Resolve the handoff target by `ACTIVE_PROJECT_MODE` and `ACTIVE_PROJECT_PR_STATU
695
743
  | ----------- | ---------------------------- | ------------------------- |
696
744
  | spec-driven | none / closed | `oat-project-plan` |
697
745
  | quick | none / closed | `oat-project-quick-start` |
698
- | either | open (`oat_pr_status: open`) | `oat-project-revise` |
746
+ | lite | none / closed | `oat-project-lite` |
747
+ | any mode | open (`oat_pr_status: open`) | `oat-project-revise` |
699
748
 
700
749
  Print the handoff prompt template, substituting `<skill-name>`, `<artifact>`, `<hash>`, and `<subject>` from the actual branch commit or synced push receipt:
701
750
 
@@ -771,6 +820,6 @@ End mode assertion when the split handoff completes or reports its own blocker.
771
820
  - ✅ Each handoff branch (9a-9k) reads the correct downstream `SKILL.md` path and enters at the documented step. Project promotion writes `discovery.md` only — never `design.md` — and does not auto-chain into the next phase.
772
821
  - ✅ Doc-to-path validation handles all four cases: path-is-directory, parent-missing (with explicit out-of-repo confirmation), file-already-exists (overwrite or rename), unwritable (surface OS error).
773
822
  - ✅ Fold-back persistence safety contract honored: preflight `git status --porcelain -- "$ARTIFACT_PATH"` runs before any artifact mutation; clean → append + exact-path branch commit for shared/local or validated `oat project push --json` for synced; dirty → three-option picker (persist-prior-first / mix / abort-to-reference-file); handoff prompt prints only after the scope-appropriate receipt succeeds.
774
- - ✅ Handoff target for fold-back resolves correctly per `oat_workflow_mode` + `oat_pr_status`: `oat-project-plan` (spec-driven, no/closed PR) / `oat-project-quick-start` (quick, no/closed PR) / `oat-project-revise` (either mode, open PR).
823
+ - ✅ Handoff target for fold-back resolves correctly per `oat_workflow_mode` + `oat_pr_status`: `oat-project-plan` (spec-driven, no/closed PR) / `oat-project-quick-start` (quick, no/closed PR) / `oat-project-lite` (lite, no/closed PR) / `oat-project-revise` (any mode, open PR).
775
824
  - ✅ Active-project 3-way router (related / independent / supplementary) fires before the standard pack-filtered picker when both `WORKFLOWS_INSTALLED == "true"` and `ACTIVE_PROJECT_VALID == "true"`.
776
825
  - ✅ Skill validates cleanly under `pnpm oat:validate-skills` (frontmatter contract, allowed-tools, mode-assertion structure).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-docs
3
- version: 1.0.1
3
+ version: 1.0.2
4
4
  description: Use when a user asks questions about OAT workflows, CLI commands, skill authoring, configuration, or project lifecycle. Answers questions by reading locally-bundled OAT documentation.
5
5
  argument-hint: '[question]'
6
6
  disable-model-invocation: false
@@ -145,7 +145,7 @@ Based on the docs, here's how OAT project workflows work: [answer]
145
145
  You can read more in `guide/workflow/lifecycle.md`.
146
146
 
147
147
  Would you like me to:
148
- - Start a new project? (I'd invoke oat-project-quick-start)
148
+ - Start a new project? (I'd invoke oat-project-lite for single-sitting work, or oat-project-quick-start for a larger quick workflow)
149
149
  - Check your current project status? (I'd read your active project's state.md)
150
150
  ```
151
151
 
@@ -158,22 +158,27 @@ Would you like me to:
158
158
  **Response:**
159
159
 
160
160
  ```
161
- To create a new OAT project, you have two main approaches:
161
+ To create a new OAT project, you have three main approaches:
162
162
 
163
- 1. **Quick mode** (recommended for most tasks):
163
+ 1. **Lite mode** (recommended for single-sitting changes):
164
+ oat-project-lite <project-name> "project description"
165
+
166
+ 2. **Quick mode** (recommended for larger bounded work):
164
167
  oat-project-quick-start <project-name> "project description"
165
168
 
166
- 2. **Spec-driven mode** (for complex features):
169
+ 3. **Spec-driven mode** (for complex features):
167
170
  oat-project-new <project-name>
168
171
 
169
- Quick mode goes straight from discovery to plan. Spec-driven mode adds
170
- formal spec and design phases. If you invoke quick mode with only a
172
+ Lite combines the interview and requirements contract in one plan for a
173
+ single sitting. Quick mode goes straight from discovery to plan. Spec-driven
174
+ mode adds formal spec and design phases. If you invoke quick mode with only a
171
175
  project name, it should ask you for the missing project description
172
176
  before discovery starts.
173
177
 
174
178
  Both create a project directory under your projects root
175
179
  (default: .oat/projects/shared/<project-name>/) with standard artifacts:
176
- state.md, discovery.md, plan.md, and implementation.md.
180
+ state.md, plan.md, and implementation.md; quick and spec-driven modes also use
181
+ discovery.md.
177
182
 
178
183
  See: guide/workflow/lifecycle.md, guide/getting-started.md
179
184
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-doctor
3
- version: 1.2.0
3
+ version: 1.2.1
4
4
  description: Use when you need to diagnose your OAT setup, check for outdated skills, identify misconfigurations, or get a summary of installed tools and config. Runs health checks and recommends corrective actions.
5
5
  argument-hint: '[--summary]'
6
6
  disable-model-invocation: true
@@ -174,7 +174,7 @@ it, and lists every skill that pack ships.
174
174
  - oat-project-capture, oat-project-clear-active, oat-project-complete
175
175
  - oat-project-design, oat-project-dispatch-subagents, oat-project-discover
176
176
  - oat-project-document, oat-project-implement, oat-project-import-plan
177
- - oat-project-new, oat-project-next, oat-project-open
177
+ - oat-project-lite, oat-project-new, oat-project-next, oat-project-open
178
178
  - oat-project-plan, oat-project-plan-writing, oat-project-pr-final
179
179
  - oat-project-pr-progress, oat-project-progress, oat-project-promote-spec-driven
180
180
  - oat-project-quick-start, oat-project-reconcile, oat-project-retro
@@ -238,7 +238,7 @@ OAT ▸ DOCTOR SUMMARY
238
238
  | --------- | ------- | ------ | -------- |
239
239
  | core | user | 2/2 | current |
240
240
  | docs | project | 7/7 | current |
241
- | workflows | project | 39/39 | current |
241
+ | workflows | project | 40/40 | current |
242
242
  | ideas | user | 4/4 | current |
243
243
  | project-management | project | 4/4 | current |
244
244
  | research | project | 6/6 | current |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-explainer-kit
3
- version: 1.0.6
3
+ version: 1.0.7
4
4
  description: Use when building project explainers or recaps from OAT configuration, state, and lifecycle artifacts.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -18,6 +18,7 @@ Adapt OAT project context into the versioned request consumed by the canonical
18
18
  - Resolve typed OAT configuration with source attribution.
19
19
  - Derive canonical project or repository output roots.
20
20
  - Bind OAT lifecycle artifacts to generic recipe source roles.
21
+ - Probe recap seam availability before an unattended run is attempted.
21
22
  - Resolve project explainer and recap intent before invoking the core.
22
23
  - Resolve one provider-neutral set planner for unattended project recaps.
23
24
  - Require lifecycle callers to construct a brief-aware author seam.
@@ -79,6 +80,18 @@ source evidence, and medium rationale. The installed core continues reading
79
80
  `project-recap@1` for replay; the adapter never rewrites a retained request's
80
81
  recipe selector.
81
82
 
83
+ Before an unattended `project-recap`, call
84
+ `scripts/probe-recap-seams.mjs#probeRecapSeams` with the seam inputs you are
85
+ about to pass. The probe is pure and checks all five required seams — author,
86
+ fact critic, browser session, visual critic, and set planner — using the same
87
+ rules `run.mjs` applies. `seams-unavailable` means no provider is configured
88
+ for a required seam: pass the probe result to the intent resolver as
89
+ `seamProbe`, which returns a recordable `skip` with source `capability_probe`
90
+ and a warning. `seams-invalid` means a supplied seam violates a resolution
91
+ rule: fail closed and report the configuration error; it is never a skip. When
92
+ the probe returns `ok: true`, invoke the adapter with unchanged behavior, and
93
+ treat any later failure as `failed` rather than as a skip.
94
+
82
95
  Before invocation, read `references/author-callback.md`. Unattended
83
96
  `project-recap` runs require exactly one provider-neutral set planner:
84
97
  in-process callers supply `planSet`, while JSON/CLI callers supply
@@ -27,6 +27,18 @@ do not write config. Recipe, slug, fact-base path, output root, per-run art
27
27
  direction, and private wrapper lanes are invocation inputs rather than config
28
28
  keys and are rejected from the runtime config-override map.
29
29
 
30
+ ## Seams are invocation inputs, not configuration
31
+
32
+ No supported key names an author, fact critic, browser session, visual critic,
33
+ or set planner. Every seam is supplied per invocation as a callback or a module
34
+ entry point, so seam availability is discovered by
35
+ `scripts/probe-recap-seams.mjs#probeRecapSeams` against the inputs a caller is
36
+ about to pass, not read from stored config. A host on which those inputs are
37
+ absent has no configuration to correct: the probe reports `seams-unavailable`
38
+ and the lifecycle caller records a `skip / capability_probe` recap intent. The
39
+ `workflow.explainers.projectRecap` preference expresses whether a host _wants_
40
+ a recap and cannot make an unavailable seam available.
41
+
30
42
  ## Source-sensitive paths
31
43
 
32
44
  A shared theme bundle path is repository-relative and must remain inside the
@@ -18,11 +18,31 @@ now })` is pure. Its result contains the effective `decision`, the
18
18
  `resolutionSource`, whether a prompt is needed, an optional state `record`, and
19
19
  warnings.
20
20
 
21
- In autonomous mode, `projectRecap` always resolves to `generate` with source
22
- `autonomous_policy`. A lower-precedence skip or `never` preference is overridden
23
- and reported as a warning. Autonomous `projectExplainer` resolves to `generate`
24
- only when the kickoff prompt explicitly requested it; otherwise it resolves to
25
- `skip` without writing an invalid prompt-source skip record.
21
+ In autonomous mode, `projectRecap` resolves to `generate` with source
22
+ `autonomous_policy` on any host whose recap seams resolve. A lower-precedence
23
+ skip or `never` preference is overridden and reported as a warning. Autonomous
24
+ `projectExplainer` resolves to `generate` only when the kickoff prompt
25
+ explicitly requested it; otherwise it resolves to `skip` without writing an
26
+ invalid prompt-source skip record.
27
+
28
+ Autonomous `projectRecap` resolution accepts an optional `seamProbe`, the
29
+ result of `scripts/probe-recap-seams.mjs#probeRecapSeams`. It is a pre-flight
30
+ capability input, never a post-hoc reaction to a failed run:
31
+
32
+ - `ok: true` leaves resolution unchanged, so a configured host still forces
33
+ `generate / autonomous_policy`.
34
+ - `seams-unavailable` — no callback and no module path is supplied for a seam
35
+ this mode requires — resolves `skip` with source `capability_probe` and a
36
+ warning naming the unavailable seams.
37
+ - `seams-invalid` — a seam is supplied but violates a resolution rule — throws
38
+ `E_RECAP_SEAMS_INVALID` and fails closed exactly as the runtime would. A
39
+ configured-but-invalid seam is a configuration error, never a capability
40
+ skip.
41
+
42
+ A seam probe is scoped to autonomous `projectRecap`; supplying one for
43
+ `projectExplainer` or for interactive resolution is an error. A recap that
44
+ fails after a passing probe stays `failed` and is never reinterpreted as a
45
+ skip.
26
46
 
27
47
  In interactive mode, an existing valid project record prevents another prompt.
28
48
  Preferences `always` and `never` resolve directly but are not copied into
@@ -47,12 +67,22 @@ oat_project_recap:
47
67
 
48
68
  Allowed decision/source pairs are:
49
69
 
50
- | Product | Allowed pairs |
51
- | ------------------ | ------------------------------------------------------------------------ |
52
- | `projectExplainer` | `generate/interactive`, `skip/interactive`, `generate/kickoff_prompt` |
53
- | `projectRecap` | `generate/interactive`, `skip/interactive`, `generate/autonomous_policy` |
70
+ | Product | Allowed pairs |
71
+ | ------------------ | ------------------------------------------------------------------------------------------------- |
72
+ | `projectExplainer` | `generate/interactive`, `skip/interactive`, `generate/kickoff_prompt` |
73
+ | `projectRecap` | `generate/interactive`, `skip/interactive`, `generate/autonomous_policy`, `skip/capability_probe` |
54
74
 
55
- In particular, `skip/autonomous_policy` is invalid.
75
+ In particular, `skip/autonomous_policy` is invalid: an autonomous skip is
76
+ recordable only as the probe-driven `skip/capability_probe`, and that pair is
77
+ product-scoped to `projectRecap`. `generate/capability_probe` is invalid too,
78
+ because a probe can only withhold a run, never authorize one.
79
+
80
+ The pair is product-scoped but not mode-scoped, and that is deliberate. Only
81
+ autonomous resolution can _produce_ a `skip/capability_probe`, but once one is
82
+ persisted a later interactive resolution reads it back as a valid recorded
83
+ decision and honors it, exactly as it honors `skip/interactive`. A resumed
84
+ project therefore neither re-prompts nor fails validation on a legitimately
85
+ recorded capability skip.
56
86
 
57
87
  ## Safe persistence
58
88
 
@@ -120,6 +150,23 @@ the relative path and public URL. Neither summary contract is mutated in place.
120
150
 
121
151
  ## Browser and visual-review execution
122
152
 
153
+ Lifecycle callers probe seam availability before attempting an unattended
154
+ `project-recap`. `scripts/probe-recap-seams.mjs#probeRecapSeams({ mode, ...
155
+ seams })` is pure: it applies the same resolution and exclusivity rules this
156
+ adapter applies at run time, but never imports a module, calls a callback,
157
+ validates a session brand, or touches the filesystem. Unattended runs require
158
+ all five seams — author, fact critic, browser session, visual critic, and set
159
+ planner — and interactive runs require the author and fact critic. A probe that
160
+ checks only four of the five passes on a host with no set planner and the
161
+ adapter still throws `E_SET_PLANNER_REQUIRED`, so the planner is probed with
162
+ the rest.
163
+
164
+ The probe classifies each seam as resolved, `missing`, or `invalid` and never
165
+ conflates them. Only `missing` may become a recorded skip. Requirements below
166
+ are unchanged for every run that is actually attempted: the probe gates whether
167
+ a run is attempted, and never weakens the evidence a run that happens must
168
+ produce.
169
+
123
170
  Every unattended `project-recap` must provide exactly one browser-evidence
124
171
  session and exactly one whole-set visual critic through the adapter's
125
172
  first-class boundary. In-process callers pass `browserSession`, created by the
@@ -8,9 +8,25 @@ const TERMINAL_OUTCOMES = new Set([
8
8
  'failed',
9
9
  ]);
10
10
 
11
- export function checkTerminalOutcome({ intent, outcome }) {
11
+ /**
12
+ * A skip reason is the recorded `source` of the skip decision, so the guard
13
+ * accepts exactly the sources that may produce a `skip` recap record.
14
+ */
15
+ const SKIP_REASONS = new Set(['interactive', 'capability_probe']);
16
+
17
+ export function checkTerminalOutcome({ intent, outcome, reason }) {
18
+ if (reason !== undefined && !SKIP_REASONS.has(reason)) {
19
+ throw recapOutcomeError(
20
+ `Recap skip reason must be one of ${[...SKIP_REASONS].join(', ')}.`,
21
+ );
22
+ }
12
23
  if (intent === 'skip') {
13
- return { ok: true, intent, outcome: null };
24
+ return { ok: true, intent, outcome: null, reason: reason ?? null };
25
+ }
26
+ if (reason !== undefined) {
27
+ throw recapOutcomeError(
28
+ 'A recap skip reason applies only to a skip intent.',
29
+ );
14
30
  }
15
31
  if (intent !== 'generate') {
16
32
  throw recapOutcomeError('Recap intent must be generate or skip.');
@@ -24,7 +40,7 @@ export function checkTerminalOutcome({ intent, outcome }) {
24
40
  }
25
41
 
26
42
  async function main(argv) {
27
- const { intent, manifestPath } = parseArguments(argv);
43
+ const { intent, manifestPath, reason } = parseArguments(argv);
28
44
  let outcome;
29
45
  if (manifestPath !== undefined) {
30
46
  let manifest;
@@ -37,12 +53,17 @@ async function main(argv) {
37
53
  }
38
54
  outcome = manifest?.outcome;
39
55
  }
40
- return checkTerminalOutcome({ intent, outcome });
56
+ return checkTerminalOutcome({
57
+ intent,
58
+ outcome,
59
+ ...(reason !== undefined && { reason }),
60
+ });
41
61
  }
42
62
 
43
63
  function parseArguments(argv) {
44
64
  let intent;
45
65
  let manifestPath;
66
+ let reason;
46
67
  for (let index = 0; index < argv.length; index += 2) {
47
68
  const flag = argv[index];
48
69
  const value = argv[index + 1];
@@ -53,11 +74,13 @@ function parseArguments(argv) {
53
74
  intent = value;
54
75
  } else if (flag === '--manifest') {
55
76
  manifestPath = value;
77
+ } else if (flag === '--skip-reason') {
78
+ reason = value;
56
79
  } else {
57
80
  throw recapOutcomeError(`Unsupported argument: ${flag}.`);
58
81
  }
59
82
  }
60
- return { intent, manifestPath };
83
+ return { intent, manifestPath, reason };
61
84
  }
62
85
 
63
86
  function recapOutcomeError(message) {