@open-agent-toolkit/cli 0.3.18 → 0.3.19

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 (99) hide show
  1. package/assets/agents/oat-phase-implementer.md +81 -3
  2. package/assets/agents/oat-reviewer.md +15 -5
  3. package/assets/bundle-metadata.json +1 -1
  4. package/assets/docs/reference/cli-reference.md +8 -5
  5. package/assets/docs/reference/oat-directory-structure.md +1 -0
  6. package/assets/docs/reference/project-artifacts.md +17 -1
  7. package/assets/docs/reference/project-state-machine.md +19 -4
  8. package/assets/docs/skills/brainstorm.md +2 -1
  9. package/assets/docs/skills/index.md +1 -0
  10. package/assets/docs/workflows/advanced/autonomy.md +9 -1
  11. package/assets/docs/workflows/advanced/workflow-gates.md +11 -6
  12. package/assets/docs/workflows/approvals-and-automation.md +13 -8
  13. package/assets/docs/workflows/choose-workflow.md +16 -8
  14. package/assets/docs/workflows/projects/closeout/closeout-skills.md +8 -3
  15. package/assets/docs/workflows/projects/closeout/pr-flow.md +2 -0
  16. package/assets/docs/workflows/projects/execution/execution-skills.md +14 -2
  17. package/assets/docs/workflows/projects/execution/implementation-execution.md +15 -0
  18. package/assets/docs/workflows/projects/execution/picking-up-projects.md +10 -1
  19. package/assets/docs/workflows/projects/lifecycle.md +73 -9
  20. package/assets/docs/workflows/projects/planning/hill-checkpoints.md +18 -1
  21. package/assets/docs/workflows/projects/planning/planning-skills.md +11 -10
  22. package/assets/docs/workflows/projects/planning/starting-projects.md +92 -20
  23. package/assets/docs/workflows/projects/reviews/index.md +15 -2
  24. package/assets/docs/workflows/projects/reviews/review-flavors.md +5 -3
  25. package/assets/public-package-versions.json +4 -4
  26. package/assets/skills/oat-brainstorm/SKILL.md +33 -9
  27. package/assets/skills/oat-brainstorm/references/destinations.md +9 -4
  28. package/assets/skills/oat-docs/SKILL.md +9 -4
  29. package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
  30. package/assets/skills/oat-project-autonomous/SKILL.md +14 -8
  31. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +17 -2
  32. package/assets/skills/oat-project-brief/SKILL.md +592 -0
  33. package/assets/skills/oat-project-brief/references/brief-contract.md +294 -0
  34. package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +393 -0
  35. package/assets/skills/oat-project-brief/references/docs/gate-approval-record.md +84 -0
  36. package/assets/skills/oat-project-capture/SKILL.md +2 -2
  37. package/assets/skills/oat-project-complete/SKILL.md +7 -2
  38. package/assets/skills/oat-project-discover/SKILL.md +3 -2
  39. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +9 -1
  40. package/assets/skills/oat-project-document/SKILL.md +11 -1
  41. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +17 -2
  42. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  43. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +40 -0
  44. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +17 -2
  45. package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +4 -0
  46. package/assets/skills/oat-project-implement/references/phase-execution.md +166 -1
  47. package/assets/skills/oat-project-implement/references/plan-and-resume.md +97 -3
  48. package/assets/skills/oat-project-import-plan/SKILL.md +5 -1
  49. package/assets/skills/oat-project-lite/SKILL.md +4 -1
  50. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +17 -2
  51. package/assets/skills/oat-project-new/SKILL.md +5 -1
  52. package/assets/skills/oat-project-next/SKILL.md +31 -4
  53. package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +4 -0
  54. package/assets/skills/oat-project-plan/SKILL.md +12 -2
  55. package/assets/skills/oat-project-plan-writing/SKILL.md +6 -4
  56. package/assets/skills/oat-project-pr-final/SKILL.md +15 -3
  57. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +17 -2
  58. package/assets/skills/oat-project-pr-progress/SKILL.md +31 -4
  59. package/assets/skills/oat-project-progress/SKILL.md +30 -8
  60. package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +4 -0
  61. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
  62. package/assets/skills/oat-project-quick-start/SKILL.md +60 -1
  63. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +17 -2
  64. package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +4 -0
  65. package/assets/skills/oat-project-reconcile/SKILL.md +65 -3
  66. package/assets/skills/oat-project-review-provide/SKILL.md +331 -12
  67. package/assets/skills/oat-project-review-receive/SKILL.md +86 -1
  68. package/assets/skills/oat-project-revise/SKILL.md +27 -4
  69. package/assets/skills/oat-project-summary/SKILL.md +95 -2
  70. package/assets/skills/oat-wave-execute/SKILL.md +3 -2
  71. package/assets/templates/implementation-brief.md +165 -0
  72. package/assets/templates/plan-brief.md +140 -0
  73. package/assets/templates/plan.md +1 -1
  74. package/assets/templates/state.md +8 -2
  75. package/dist/commands/project/new/scaffold.d.ts +1 -1
  76. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  77. package/dist/commands/project/new/scaffold.js +35 -7
  78. package/dist/commands/project/promote/promote.d.ts +32 -1
  79. package/dist/commands/project/promote/promote.d.ts.map +1 -1
  80. package/dist/commands/project/promote/promote.js +562 -5
  81. package/dist/commands/project/validate-plan/frontmatter.d.ts +12 -0
  82. package/dist/commands/project/validate-plan/frontmatter.d.ts.map +1 -0
  83. package/dist/commands/project/validate-plan/frontmatter.js +27 -0
  84. package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
  85. package/dist/commands/project/validate-plan/index.js +52 -18
  86. package/dist/commands/project/validate-plan/profiles.d.ts +54 -0
  87. package/dist/commands/project/validate-plan/profiles.d.ts.map +1 -0
  88. package/dist/commands/project/validate-plan/profiles.js +269 -0
  89. package/dist/commands/project/validate-plan/validate-plan.d.ts +3 -19
  90. package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
  91. package/dist/commands/project/validate-plan/validate-plan.js +5 -82
  92. package/dist/commands/shared/frontmatter.d.ts +1 -1
  93. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  94. package/dist/commands/shared/frontmatter.js +1 -0
  95. package/dist/commands/state/generate.d.ts.map +1 -1
  96. package/dist/commands/state/generate.js +51 -2
  97. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  98. package/dist/commands/tools/shared/pack-manifest.js +3 -0
  99. package/package.json +2 -2
@@ -5,7 +5,7 @@ disable-model-invocation: false
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Glob, Grep, Write, Edit, Bash(git:*), Bash(oat:*), Bash(pnpm:*), Bash(mkdir:*), Bash(date:*), Bash(realpath:*), Bash(awk:*), AskUserQuestion
7
7
  metadata:
8
- version: 1.5.13
8
+ version: 1.5.14
9
9
  ---
10
10
 
11
11
  # Request Review
@@ -180,6 +180,14 @@ Inference rules (first match wins):
180
180
  | `implement` | `in_progress` | `code` with current phase scope (derive from `implementation.md` current task) |
181
181
  | `implement` | `complete` | `code final` |
182
182
 
183
+ When `WORKFLOW_MODE` is `brief`, the `implement` / `in_progress` row derives
184
+ the phase from `oat_current_task_id` by the brief pointer rule
185
+ (`oat-project-brief/references/brief-contract.md` section 8): a task ID
186
+ resolves to its phase, a phase ID to itself, and `null`, an unknown ID, or an
187
+ accepted unit to the first incomplete unit in document order. A brief code
188
+ scope is always a phase-unit (`pNN`, `p-revN`, `pNN-pMM`, or `final`), never an
189
+ execution record.
190
+
183
191
  If inference produces a result, propose it and proceed unless the user overrides:
184
192
 
185
193
  ```
@@ -193,7 +201,7 @@ If the user confirms (or just presses enter), use the inferred type and scope. I
193
201
 
194
202
  - Ask: "What type of review? (code / artifact)"
195
203
  - Ask: "What scope?"
196
- - For code: `pNN-tNN` task / `pNN` phase / `pNN-pMM` contiguous phase range / `final` / `base_sha=SHA` / `SHA..HEAD` range
204
+ - For code: `pNN-tNN` task / `pNN` phase / `pNN-pMM` contiguous phase range / `final` / `base_sha=SHA` / `SHA..HEAD` range (brief: `pNN` or `p-revN` phase / `pNN-pMM` / `final` / `base_sha=SHA` / `SHA..HEAD`)
197
205
  - For artifact: `discovery` / `spec` / `design` (and optionally `plan`)
198
206
 
199
207
  ### Step 1.5: Resolve Target Branch and Working Directory
@@ -312,6 +320,7 @@ WORKFLOW_MODE=$(oat project status --project-path "$PROJECT_PATH" --field projec
312
320
  - `quick`: `discovery.md`, `plan.md` (`spec.md`/`design.md` optional if present)
313
321
  - `import`: `plan.md` (`references/imported-plan.md` recommended, `spec.md`/`design.md` optional)
314
322
  - `lite`: `plan.md`, `implementation.md` (`discovery.md`/`spec.md`/`design.md` are absent by design)
323
+ - `brief`: `plan.md` (the Project Brief) and `implementation.md` (the per-phase journal, which carries the `**Base:**`/`**Head:**` anchors); `discovery.md`, `spec.md`, and `design.md` are absent by design, and research under `references/` is optional
315
324
 
316
325
  **Required for artifact review:**
317
326
 
@@ -324,6 +333,7 @@ WORKFLOW_MODE=$(oat project status --project-path "$PROJECT_PATH" --field projec
324
333
  - reviewing `plan` in `spec-driven` mode requires `spec.md` + `design.md`
325
334
  - reviewing `plan` in `quick/import` mode may use `discovery.md` and/or `references/imported-plan.md` instead; lite uses the separate rule below
326
335
  - reviewing `plan` in `lite` mode requires only `plan.md`; its Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria sections are the complete upstream contract
336
+ - reviewing `plan` in `brief` mode requires only `plan.md`; the brief and `oat-project-brief/references/brief-contract.md` are the complete upstream contract. `discovery`, `spec`, and `design` are not reviewable artifacts in brief mode
327
337
 
328
338
  **If missing:** Report missing required artifacts for the current mode and stop if requirements are not met.
329
339
 
@@ -337,6 +347,268 @@ If review type is `artifact`:
337
347
 
338
348
  If review type is `code`, use the scope resolution below.
339
349
 
350
+ **Step 3.0: Brief-Mode Anchor Resolution (`brief` only)**
351
+
352
+ When `WORKFLOW_MODE` is `brief` and the review type is `code`, the review range
353
+ comes from the phase anchors recorded in the journal, not from commit-message
354
+ inference. `oat-project-brief/references/brief-contract.md` section 10 is
355
+ authoritative where this step and the contract differ. This step is inert for
356
+ every other workflow mode.
357
+
358
+ Resolution order for brief code reviews:
359
+
360
+ 1. **Explicit user input** — unchanged. A supplied `base_sha=<sha>` or
361
+ `<sha1>..<sha2>` range skips this step; record
362
+ `oat_review_scope_source: explicit`, the range base as
363
+ `oat_review_base_sha`, and as `oat_review_phase_ids` the phases whose
364
+ `(pNN-` or `(prevN-` commit labels appear in the range (labels only),
365
+ listing a `prevN` label as its phase ID `p-revN`.
366
+ 2. **Guarded re-review narrowing** (Step 3a) — unchanged in its guards, with
367
+ the brief inputs described after the script below.
368
+ 3. **Anchor resolution** for a nominal `pNN`, `p-revN`, `pNN-pMM`, or `final`
369
+ token, by the script below.
370
+ 4. **Missing anchors** widen to the entire merge-base range.
371
+ 5. **Invalid or contradictory anchors** stop and route to
372
+ `oat-project-reconcile`; never narrow silently.
373
+ 6. Otherwise the explicit-range / merge-base fallback in the priority order
374
+ below (`oat_review_scope_source: merge-base` when the user selects
375
+ `merge-base..HEAD`).
376
+
377
+ A brief code scope names phase-units only. An execution-record token
378
+ (`pNN-tNN`) is not an anchored scope: offer its phase (`pNN`) or an explicit
379
+ `<sha>^..<sha>` range built from the record's `**Commit:**` line instead.
380
+
381
+ Run the resolver in bash from the reviewed checkout (after Step 1.5) with
382
+ `PROJECT_PATH` and `SCOPE_TOKEN` set. It never edits any file. It sets
383
+ `ANCHOR_VERDICT` (`accepted | fallback | reconcile | invalid-scope`),
384
+ `ANCHOR_REASON`, `PHASE_IDS` (document order), `SCOPE_RANGE`,
385
+ `REVIEW_BASE_SHA`, `AGGREGATE_HEAD`, `SCOPE_SOURCE`, `FALLBACK_REASON`, and
386
+ `INTEGRATION_COMMITS`:
387
+
388
+ ````bash
389
+ brief_phase_ids() {
390
+ # Phase IDs of the brief in document order; fenced code is excluded.
391
+ awk '
392
+ /^[ \t]*(```|~~~)/ { fence = !fence; next }
393
+ fence { next }
394
+ /^## Phase (p[0-9]+|p-rev[0-9]+): / { id = $3; sub(/:$/, "", id); print id }
395
+ ' "$PROJECT_PATH/plan.md"
396
+ }
397
+
398
+ brief_marker() {
399
+ # brief_marker PHASE_ID Status|Base|Head: the first exact marker line under
400
+ # the journal's phase heading. Ownership ends at the next line starting with
401
+ # "#"; fenced code is excluded; a Base or Head value that is not a full SHA,
402
+ # or a Status value outside the phase statuses, is not a marker.
403
+ awk -v id="$1" -v key="$2" '
404
+ /^[ \t]*(```|~~~)/ { fence = !fence; next }
405
+ fence { next }
406
+ /^#/ { owner = (index($0, "## Phase " id ": ") == 1); next }
407
+ !owner || found { next }
408
+ index($0, "**" key ":** ") == 1 {
409
+ v = substr($0, length("**" key ":** ") + 1); sub(/[ \t]+$/, "", v)
410
+ if (key == "Status" && v !~ /^(pending|in_progress|completed|failed|extracted)$/) next
411
+ if (key != "Status" && !((length(v) == 40 || length(v) == 64) && v ~ /^[0-9a-f]+$/)) next
412
+ print v; found = 1
413
+ }
414
+ ' "$PROJECT_PATH/implementation.md"
415
+ }
416
+
417
+ brief_group() {
418
+ # brief_group PHASE_ID: 1-based index of the declared parallel group in the
419
+ # brief's single-line oat_plan_parallel_groups that contains the phase.
420
+ awk -v id="$1" '
421
+ NR == 1 && /^---[ \t]*$/ { fm = 1; next }
422
+ fm && /^---[ \t]*$/ { exit }
423
+ fm && /^oat_plan_parallel_groups:/ {
424
+ line = $0; sub(/^oat_plan_parallel_groups:[ \t]*/, "", line); sub(/[ \t]+#.*$/, "", line)
425
+ n = split(line, groups, /\][ \t]*,[ \t]*\[/)
426
+ for (i = 1; i <= n; i++) {
427
+ g = groups[i]; gsub(/[^A-Za-z0-9,-]/, "", g)
428
+ m = split(g, members, ",")
429
+ for (j = 1; j <= m; j++) if (members[j] == id) { print i; exit }
430
+ }
431
+ }
432
+ ' "$PROJECT_PATH/plan.md"
433
+ }
434
+
435
+ brief_anchor_reject() { ANCHOR_VERDICT=reconcile; ANCHOR_REASON="$1"; }
436
+
437
+ brief_resolve_anchors() {
438
+ ANCHOR_VERDICT=""; ANCHOR_REASON=""; SCOPE_SOURCE=""; FALLBACK_REASON=""
439
+ SCOPE_RANGE=""; REVIEW_BASE_SHA=""; AGGREGATE_HEAD=""; INTEGRATION_COMMITS=""
440
+ PHASE_IDS=()
441
+ local all=() id first last i start=-1 end=-1 key sha missing=0
442
+ local base head group prev_head="" prev_group="" fork=""
443
+ while IFS= read -r id; do all+=("$id"); done < <(brief_phase_ids)
444
+
445
+ # 1. Expand the requested scope to phase IDs in document order.
446
+ if [ "$SCOPE_TOKEN" = final ]; then
447
+ for id in "${all[@]}"; do
448
+ [ "$(brief_marker "$id" Status)" = completed ] && PHASE_IDS+=("$id")
449
+ done
450
+ else
451
+ first=${SCOPE_TOKEN%%-p*}; last=${SCOPE_TOKEN#"$first"}; last=${last#-}; last=${last:-$first}
452
+ for i in "${!all[@]}"; do
453
+ [ "${all[$i]}" = "$first" ] && start=$i
454
+ [ "${all[$i]}" = "$last" ] && end=$i
455
+ done
456
+ if [ "$start" -lt 0 ] || [ "$end" -lt "$start" ]; then
457
+ ANCHOR_VERDICT=invalid-scope; ANCHOR_REASON="$SCOPE_TOKEN is not a document-order phase run"; return 0
458
+ fi
459
+ for ((i = start; i <= end; i++)); do
460
+ [ "$(brief_marker "${all[$i]}" Status)" = extracted ] || PHASE_IDS+=("${all[$i]}")
461
+ done
462
+ fi
463
+ if [ "${#PHASE_IDS[@]}" -eq 0 ]; then
464
+ ANCHOR_VERDICT=invalid-scope; ANCHOR_REASON="no reviewable phase-unit in $SCOPE_TOKEN"; return 0
465
+ fi
466
+
467
+ # 2. Existence: every recorded anchor names a commit.
468
+ for id in "${PHASE_IDS[@]}"; do
469
+ for key in Base Head; do
470
+ sha=$(brief_marker "$id" "$key")
471
+ if [ -z "$sha" ]; then missing=1; continue; fi
472
+ git cat-file -e "$sha^{commit}" 2>/dev/null || { brief_anchor_reject "existence: $id $key $sha is not a commit"; return 0; }
473
+ done
474
+ done
475
+
476
+ # 3. Missing anchors widen to the whole merge-base range; (pNN- commit
477
+ # matches only label commits and never narrow it.
478
+ if [ "$missing" = 1 ]; then
479
+ MERGE_BASE=$(git merge-base origin/main HEAD 2>/dev/null || git merge-base main HEAD 2>/dev/null)
480
+ REVIEW_BASE_SHA=$MERGE_BASE
481
+ if [ -z "$REVIEW_BASE_SHA" ]; then
482
+ ANCHOR_VERDICT=invalid-scope; ANCHOR_REASON="missing anchors and no merge base"; return 0
483
+ fi
484
+ AGGREGATE_HEAD=$(git rev-parse HEAD)
485
+ SCOPE_RANGE="$REVIEW_BASE_SHA..$AGGREGATE_HEAD"
486
+ INTEGRATION_COMMITS=$(git rev-list --merges "$SCOPE_RANGE")
487
+ ANCHOR_VERDICT=fallback; SCOPE_SOURCE=merge-base-range; FALLBACK_REASON=missing-anchors
488
+ return 0
489
+ fi
490
+
491
+ # 4. Per-phase ancestry, then sequential or parallel continuity.
492
+ for id in "${PHASE_IDS[@]}"; do
493
+ base=$(brief_marker "$id" Base); head=$(brief_marker "$id" Head); group=$(brief_group "$id")
494
+ git merge-base --is-ancestor "$base" "$head" 2>/dev/null || { brief_anchor_reject "ancestry: $id base is not an ancestor of its head"; return 0; }
495
+ if [ -n "$group" ] && [ -n "$prev_head" ] && [ "$group" = "$prev_group" ]; then
496
+ [ "$base" = "$fork" ] || { brief_anchor_reject "parallel continuity: $id base is not the group fork $fork"; return 0; }
497
+ git merge-base --is-ancestor "$prev_head" "$head" 2>/dev/null || { brief_anchor_reject "parallel continuity: $id head does not follow the previous member's integration head"; return 0; }
498
+ else
499
+ [ -z "$prev_head" ] || git merge-base --is-ancestor "$prev_head" "$base" 2>/dev/null || { brief_anchor_reject "sequential continuity: $id base does not equal or descend from the previous head"; return 0; }
500
+ fork=$base
501
+ fi
502
+ prev_head=$head; prev_group=$group
503
+ done
504
+ AGGREGATE_HEAD=$prev_head
505
+
506
+ # 5. Aggregate head: the last selected head contains every selected head and
507
+ # is on the reviewed branch.
508
+ for id in "${PHASE_IDS[@]}"; do
509
+ git merge-base --is-ancestor "$(brief_marker "$id" Head)" "$AGGREGATE_HEAD" 2>/dev/null || { brief_anchor_reject "aggregate head: $id head is not contained in $AGGREGATE_HEAD"; return 0; }
510
+ done
511
+ git merge-base --is-ancestor "$AGGREGATE_HEAD" HEAD 2>/dev/null || { brief_anchor_reject "aggregate head: $AGGREGATE_HEAD is not on the reviewed branch"; return 0; }
512
+
513
+ REVIEW_BASE_SHA=$(brief_marker "${PHASE_IDS[0]}" Base)
514
+ SCOPE_RANGE="$REVIEW_BASE_SHA..$AGGREGATE_HEAD"
515
+ INTEGRATION_COMMITS=$(git rev-list --merges "$SCOPE_RANGE")
516
+ ANCHOR_VERDICT=accepted; SCOPE_SOURCE=anchors
517
+ }
518
+
519
+ brief_resolve_anchors
520
+ ````
521
+
522
+ Act on the verdict:
523
+
524
+ - `accepted`: the range is `SCOPE_RANGE` (first selected base through the
525
+ aggregate head). Coverage holds by construction: the aggregate head contains
526
+ every selected phase head, and every selected base sits inside the range or
527
+ at its start. Bookkeeping commits between sequential phases (a next base
528
+ that descends from the previous head) are inside the range.
529
+ - `fallback`: the range is the entire merge-base range `MERGE_BASE..HEAD`.
530
+ On a `manual` invocation, show it and ask the user to confirm it; `auto` and
531
+ `gate` invocations print it and continue. Commit
532
+ matches by `(pNN-` or `(prevN-` (phase `p-revN`) label which commits belong
533
+ to which phase and never
534
+ narrow the range. Record `oat_review_scope_source: merge-base-range` and
535
+ `oat_review_fallback_reason: missing-anchors`.
536
+ - `reconcile`: stop. Print
537
+ `Brief anchors are invalid or contradictory ({ANCHOR_REASON}); run oat-project-reconcile before reviewing {SCOPE_TOKEN}.`
538
+ and write no review artifact. Never fall back to a narrower range, to the
539
+ commit grep, or to `merge-base..HEAD`.
540
+ - `invalid-scope`: the token is not a document-order phase run (for example
541
+ `pMM` precedes `pNN`, an unknown ID, or `final` with no accepted phase) or no
542
+ merge base exists for the fallback. Report `ANCHOR_REASON` and ask for a
543
+ valid scope or an explicit range; for a `gate` invocation, stop.
544
+
545
+ Scope expansion: `pNN` and `p-revN` select one phase; `pNN-pMM` selects the
546
+ contiguous document-order run, excluding extracted phases, and is invalid when
547
+ `pMM` precedes `pNN`; `final` selects every accepted (`**Status:** completed`)
548
+ non-extracted phase, revision phases included. Document order, not numeric
549
+ order, governs.
550
+
551
+ **Parallel continuity.** Phases in one declared group share a fork base (each
552
+ `**Base:**` is the group's fork commit, `EXPECTED_HEAD` at group start) and
553
+ each `**Head:**` is that phase's integration merge commit on the project
554
+ branch, written at fan-in; the group's aggregate head is the last integration
555
+ merge. Integration and conflict-resolution commits are inside the range: pass
556
+ `INTEGRATION_COMMITS` (the merge commits in the range) plus any
557
+ conflict-resolution commits the fan-in record names to the reviewer as
558
+ integration commits and record them as `oat_review_integration_commits`. A
559
+ group member's per-phase review runs before fan-in, when the member has no
560
+ journal anchors yet: `oat-project-implement` supplies the range
561
+ `EXPECTED_HEAD..<worktree head from the phase report>`, reviewed in that
562
+ member's worktree, with `oat_review_requested_scope: pNN`,
563
+ `oat_review_phase_ids: [pNN]`, `oat_review_base_sha: EXPECTED_HEAD`, and
564
+ `oat_review_scope_source: anchors`. When this skill runs that review, verify
565
+ `git merge-base --is-ancestor "$EXPECTED_HEAD" <worktree head>` first (a
566
+ failure routes to `oat-project-reconcile`), use the supplied range without
567
+ running the resolver, and never record it as `explicit`. The fan-in
568
+ `**Base:**`/`**Head:**` written afterwards govern `pNN-pMM` and `final` scopes.
569
+ The resolver verifies only the shared fork base and that member heads advance
570
+ in document order; it does not enforce that a member head is a merge commit,
571
+ because Parallel Group Execution step 7 may integrate a member by cherry-pick.
572
+
573
+ A single group member reviewed after fan-in (`pNN` naming one member) resolves
574
+ to `fork..<that member's integration head>`. For every member after the first
575
+ in document order, that range also carries the earlier siblings' integration
576
+ commits and their phase commits. Prefer the group's `pNN-pMM` run, or the
577
+ pre-fan-in member range above, for that case. When a single member is
578
+ requested, list its sibling phases in the Review Scope as context so the
579
+ reviewer can attribute the sibling commits inside the range.
580
+
581
+ **Late-fix rule.** A review-fix commit may advance a phase's `**Head:**`, base
582
+ unchanged, only while no later phase in document order has a `**Base:**`. Once
583
+ a later phase has started, the correction is an appended revision phase
584
+ `## Phase p-revN:` with its own anchors and `**Corrects:** pNN`; the corrected
585
+ phase keeps its original anchors. Revision phases resolve as ordinary later
586
+ phases, so aggregate containment and sequential continuity hold for the whole
587
+ history: a head advanced after a later phase took its base makes that later
588
+ base precede the previous head, fails sequential continuity, and routes to
589
+ reconcile. A `p-revN` review re-evaluates the corrected phase's findings: name
590
+ the `**Corrects:**` phase in the Review Scope so `oat-project-review-receive`
591
+ can update that phase's review row.
592
+
593
+ **Brief inputs to Step 3a.** Run this resolver before Step 3a's candidate
594
+ lookup. A `reconcile` or `invalid-scope` verdict stops before any narrowing.
595
+ After `accepted` or `fallback`, Step 3a sets `REVIEW_HEAD` to `AGGREGATE_HEAD`
596
+ (the anchored head, not the current `HEAD`) and keeps its guards unchanged.
597
+ When it narrows, record `oat_review_scope_source: narrowed`,
598
+ `oat_review_narrowed_from: {SCOPE_RANGE before narrowing}`,
599
+ `oat_review_base_sha: {PRIOR_REVIEWED_HEAD}`, and keep `PHASE_IDS` from the
600
+ resolver.
601
+
602
+ **Brief artifact record.** Every brief code review carries, beside
603
+ `oat_review_head_sha` (the aggregate head of the reviewed range):
604
+ `oat_review_requested_scope` (the scope token as requested),
605
+ `oat_review_phase_ids` (ordered `PHASE_IDS`), `oat_review_base_sha`,
606
+ `oat_review_scope_source` (`anchors | merge-base-range | explicit | merge-base | narrowed`),
607
+ and, when they apply, `oat_review_fallback_reason`,
608
+ `oat_review_integration_commits`, and `oat_review_narrowed_from`. Step 5 passes
609
+ them to the reviewer and Step 8 writes them; `oat-project-review-receive`
610
+ preserves them.
611
+
340
612
  **Step 3a: Detect Re-Review Context**
341
613
 
342
614
  After parsing the requested scope, distinguish an explicit range override from a
@@ -349,7 +621,9 @@ For every code review, detect re-review context independently from deciding
349
621
  whether to narrow:
350
622
 
351
623
  1. Set `REVIEW_HEAD` to the full commit from
352
- `git rev-parse HEAD^{commit}`. Resolve the current lineage:
624
+ `git rev-parse HEAD^{commit}` (in brief modes, `AGGREGATE_HEAD` from Step
625
+ 3.0 when its verdict is `accepted` or `fallback`). Resolve the current
626
+ lineage:
353
627
  - `manual` and `auto` invocations use lifecycle lineage.
354
628
  - A `gate` invocation uses gate lineage qualified by its exact
355
629
  `oat_gate_target`.
@@ -422,16 +696,19 @@ narrowed range):**
422
696
  - This is the canonical scope format for checkpoint auto-reviews that need to cover multiple previously unpassed phases in one review.
423
697
  - When a phase-range token is used, treat it as a range review for artifact naming/storage, but preserve the exact `oat_review_scope` value (for example `p02-p03`) in frontmatter and plan review rows.
424
698
 
425
- 2. **Automatic phase detection (if invoked at phase boundary):**
699
+ In brief modes a nominal `pNN`, `p-revN`, `pNN-pMM`, or `final` token
700
+ resolves through Step 3.0's anchors, never through rule 2 below.
701
+
702
+ 2. **Automatic phase detection (if invoked at phase boundary; not used in brief modes):**
426
703
  - Derive current phase from plan.md + implementation.md
427
704
  - Use commit convention grep to find commits:
428
705
 
429
706
  ```bash
430
707
  # Task commits: grep for (pNN-tNN)
431
- git log --oneline --grep="\(p${PHASE}-t" HEAD~50..HEAD
708
+ git log --oneline --fixed-strings --grep="(p${PHASE}-t" --max-count=50
432
709
 
433
710
  # Phase commits: grep for (pNN-
434
- git log --oneline --grep="\(p${PHASE}-" HEAD~50..HEAD
711
+ git log --oneline --fixed-strings --grep="(p${PHASE}-" --max-count=50
435
712
  ```
436
713
 
437
714
  - For contiguous phase-range scopes (`pNN-pMM`), aggregate commit matches for each phase in the inclusive range:
@@ -439,7 +716,7 @@ narrowed range):**
439
716
  ```bash
440
717
  for PHASE_NUM in $(seq "$START_PHASE_NUM" "$END_PHASE_NUM"); do
441
718
  PHASE_ID=$(printf "p%02d" "$PHASE_NUM")
442
- git log --oneline --grep="\\(${PHASE_ID}-" HEAD~50..HEAD
719
+ git log --oneline --fixed-strings --grep="(${PHASE_ID}-" --max-count=50
443
720
  done
444
721
  ```
445
722
 
@@ -449,6 +726,11 @@ narrowed range):**
449
726
  - Provide `<sha1>..<sha2>` range
450
727
  - Confirm "review merge-base..HEAD" (all changes on branch)
451
728
 
729
+ In brief modes this fallback applies only when Step 3.0 did not resolve a
730
+ range (for example no nominal token). A user-selected `merge-base..HEAD`
731
+ records `oat_review_scope_source: merge-base`; a user-supplied base or
732
+ range records `explicit`.
733
+
452
734
  **Merge-base approach:**
453
735
 
454
736
  ```bash
@@ -509,7 +791,9 @@ case "$SCOPE_TOKEN" in
509
791
  FILES_CHANGED=$(printf "%s\n" "$PROJECT_PATH/plan.md" "$PROJECT_PATH/spec.md" "$PROJECT_PATH/design.md")
510
792
  elif [[ "$WORKFLOW_MODE" == "quick" ]]; then
511
793
  FILES_CHANGED=$(printf "%s\n" "$PROJECT_PATH/plan.md" "$PROJECT_PATH/discovery.md")
512
- elif [[ "$WORKFLOW_MODE" == "lite" ]]; then
794
+ elif [[ "$WORKFLOW_MODE" == "lite" || "$WORKFLOW_MODE" == "brief" ]]; then
795
+ # brief: the reviewer also receives oat-project-brief/references/brief-contract.md
796
+ # as the contract reference (Step 5), not as a file in scope.
513
797
  FILES_CHANGED=$(printf "%s\n" "$PROJECT_PATH/plan.md")
514
798
  else
515
799
  FILES_CHANGED=$(printf "%s\n" "$PROJECT_PATH/plan.md" "$PROJECT_PATH/references/imported-plan.md")
@@ -594,14 +878,14 @@ Build the "Review Scope" metadata for the reviewer:
594
878
 
595
879
  **Artifact Paths:**
596
880
 
597
- - Spec: {PROJECT_PATH}/spec.md (required in spec-driven mode; optional in quick/import/lite)
598
- - Design: {PROJECT_PATH}/design.md (required in spec-driven mode; optional in quick/import/lite)
881
+ - Spec: {PROJECT_PATH}/spec.md (required in spec-driven mode; optional in quick/import/lite; absent in brief)
882
+ - Design: {PROJECT_PATH}/design.md (required in spec-driven mode; optional in quick/import/lite; absent in brief)
599
883
  - Plan: {PROJECT_PATH}/plan.md
600
884
  - Implementation: {PROJECT_PATH}/implementation.md
601
885
  - Discovery: {PROJECT_PATH}/discovery.md
602
886
  - Imported Plan Reference: {PROJECT_PATH}/references/imported-plan.md (optional; import mode)
603
887
 
604
- **Tasks in Scope (code review only):** {task IDs from plan.md matching scope}
888
+ **Tasks in Scope (code review only):** {task IDs from plan.md matching scope; in brief modes, the execution-record IDs under the phases in scope in implementation.md, which label commits and never narrow the range}
605
889
 
606
890
  **Files Changed ({FILE_COUNT}):**
607
891
  {FILE_LIST}
@@ -658,6 +942,33 @@ and code-final Review Scope explicitly as:
658
942
  - Plan: `{PROJECT_PATH}/plan.md` (Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria are the requirements contract)
659
943
  - Implementation: `{PROJECT_PATH}/implementation.md`
660
944
 
945
+ For `WORKFLOW_MODE=brief`, render the artifact-path portion of every
946
+ artifact-plan and code Review Scope explicitly as:
947
+
948
+ - Discovery: not required (absent by design)
949
+ - Spec: not required (absent by design)
950
+ - Design: not required (absent by design; the brief's optional `### Design` subsection and `references/` notes are part of the brief)
951
+ - Import reference: not required
952
+ - Plan: `{PROJECT_PATH}/plan.md` (the Project Brief: Goal, Outcomes, Approach, Constraints and Out of Scope, Decisions, and the in-scope phases' `**Intent:**` and `**Exit evidence:**` are the requirements contract)
953
+ - Implementation: `{PROJECT_PATH}/implementation.md` (the per-phase journal: anchors, execution records, verification evidence)
954
+ - Brief contract: `oat-project-brief/references/brief-contract.md`
955
+
956
+ and append the brief anchor record to every brief code Review Scope:
957
+
958
+ ```markdown
959
+ **Brief Anchor Record (brief code reviews only):**
960
+
961
+ - oat_review_requested_scope: {SCOPE_TOKEN as requested}
962
+ - oat_review_phase_ids: [{PHASE_IDS in document order}]
963
+ - oat_review_base_sha: {REVIEW_BASE_SHA, full SHA}
964
+ - oat_review_head_sha: {AGGREGATE_HEAD, full SHA}
965
+ - oat_review_scope_source: {anchors|merge-base-range|explicit|merge-base|narrowed}
966
+ - oat_review_fallback_reason: {missing-anchors, or omit}
967
+ - oat_review_integration_commits: [{INTEGRATION_COMMITS plus named conflict-resolution commits, or omit}]
968
+ - oat_review_narrowed_from: {range before narrowing, or omit}
969
+ - Corrects: {pNN named by a p-revN phase's `**Corrects:**` line, or omit}
970
+ ```
971
+
661
972
  Always pass the resolved workflow mode. Never omit it and let the reviewer fall
662
973
  back to its spec-driven default.
663
974
 
@@ -987,7 +1298,7 @@ If running inline (Tier 3), execute the review and write artifact.
987
1298
  **Review checklist (from oat-reviewer):**
988
1299
 
989
1300
  1. Verify scope (don't review out-of-scope changes)
990
- 2. If code review: verify alignment to available requirements sources (`spec`/`design` for spec-driven mode; `discovery`/import reference for quick/import; plan.md Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria for lite)
1301
+ 2. If code review: verify alignment to available requirements sources (`spec`/`design` for spec-driven mode; `discovery`/import reference for quick/import; plan.md Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria for lite; the brief's Outcomes, Constraints and Out of Scope, Decisions, and the in-scope phases' Intent and Exit evidence for brief)
991
1302
  3. If code review: verify code quality (correctness, tests, security, maintainability)
992
1303
  4. If artifact review: verify completeness/clarity/readiness of the artifact and its alignment with upstream artifacts
993
1304
  5. Categorize findings (Critical/High/Medium/Low)
@@ -1031,6 +1342,14 @@ oat_gate_runtime: { configured runtime }
1031
1342
  oat_invocation_model: { configured model|provider-default|unknown }
1032
1343
  oat_invocation_reasoning_effort: { configured effort|provider-default|unknown }
1033
1344
  oat_invocation_source: { exec-target-config|unknown }
1345
+ # Brief code-review only: copy the Step 5 Brief Anchor Record verbatim.
1346
+ oat_review_requested_scope: { scope token as requested }
1347
+ oat_review_phase_ids: [{ phase IDs in document order }]
1348
+ oat_review_base_sha: { full SHA at the base of the reviewed range }
1349
+ oat_review_scope_source: { anchors|merge-base-range|explicit|merge-base|narrowed }
1350
+ oat_review_fallback_reason: { missing-anchors, only when it applies }
1351
+ oat_review_integration_commits: [{ integration commit SHAs, only when they apply }]
1352
+ oat_review_narrowed_from: { range before narrowing, only when narrowed }
1034
1353
  ---
1035
1354
 
1036
1355
  # {Code|Artifact} Review: {scope}
@@ -5,7 +5,7 @@ disable-model-invocation: false
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Glob, Grep, AskUserQuestion, Task
7
7
  metadata:
8
- version: 1.6.9
8
+ version: 1.6.10
9
9
  ---
10
10
 
11
11
  # Receive Review
@@ -385,6 +385,45 @@ Applies to `code` reviews only. (`artifact` reviews are handled via Step 2.6, th
385
385
  3. If scope is `pNN-pMM` (contiguous phase range): add fix tasks to the last phase in the range (`pMM`)
386
386
  4. If scope is `final` or SHA/range review: add fix tasks to a new "Review Fixes" phase or the last phase
387
387
 
388
+ **Brief modes (`oat_workflow_mode: brief`).** The brief never carries planned
389
+ tasks, so fix work becomes execution records in the journal and
390
+ `oat-project-brief/references/brief-contract.md` (sections 3, 7, and 10) wins
391
+ where this skill differs. Resolve the target phase and apply the late-fix rule:
392
+
393
+ 1. **Reviewed phase.** For `pNN` or `p-revN`, the reviewed phase is that
394
+ phase. For `pNN-pMM`, `final`, or an explicit SHA range, it is the last
395
+ phase in the artifact's ordered `oat_review_phase_ids`; when that field is
396
+ absent or empty, it is the last phase in document order whose journal
397
+ section has a `**Base:**`.
398
+ 2. **Late-fix rule.** If no later phase in document order has a `**Base:**`
399
+ in `implementation.md`, the fixes go under the reviewed phase, whose
400
+ journal `**Status:** completed` line is rewritten to `**Status:** in_progress`
401
+ (an `in_progress` phase stays `in_progress`). Its `**Base:**` never changes;
402
+ the fix commits advance its `**Head:**` when the phase ends again.
403
+ 3. Otherwise a later phase has started: append a revision phase with the next
404
+ unused `p-revN` ID. In `plan.md`, add it after the last phase block (before
405
+ `## Parallelism` when present) in the exact phase grammar plus the marker:
406
+
407
+ ```markdown
408
+ ## Phase p-revN: Review fixes for pNN
409
+
410
+ **Intent:** resolve {finding IDs} from reviews/archived/{REVIEW_FILENAME}
411
+ **Exit evidence:** a passing re-review of p-revN that re-evaluates pNN's findings
412
+ **Provisional:** no
413
+ **Corrects:** pNN
414
+ ```
415
+
416
+ In `implementation.md`, add the matching `## Phase p-revN: Review fixes for pNN`
417
+ section after the last phase section with `**Status:** pending` and
418
+ `**Corrects:** pNN` directly under the heading, and a Progress Overview row.
419
+ Add a pending `p-revN` `code` row to the brief's `## Reviews` table and
420
+ update the `## Implementation Complete` phase total. The corrected phase
421
+ keeps its original anchors and status.
422
+
423
+ Never write `### Task` headings into the brief, and never write `**Base:**` or
424
+ `**Head:**`: `oat-project-implement` records anchors when the phase starts and
425
+ ends.
426
+
388
427
  ### Step 4: Determine Next Task IDs
389
428
 
390
429
  Read plan.md to find the last task ID in the target phase:
@@ -414,6 +453,12 @@ Derive `TASK_PREFIX` from scope:
414
453
  - Find highest task number in target phase using the correct `TASK_PREFIX` (e.g., `prev1-t02`)
415
454
  - New tasks continue sequentially: `prev1-t03`, `prev1-t04`, etc.
416
455
 
456
+ In brief modes read the execution records under the target phase's section of
457
+ `implementation.md` instead of `plan.md`
458
+ (`^### Task ${TASK_PREFIX}-t[0-9]+:` inside that section). Record IDs take the
459
+ next free ordinal and are never reused, including failed, cancelled, and
460
+ no-change records. A new revision phase starts at `prevN-t01`.
461
+
417
462
  ### Step 5: Convert Findings to Tasks
418
463
 
419
464
  Each generated fix task initializes `TASK_OWNED_FILES=()` before its first
@@ -462,6 +507,26 @@ guard instead of the branch commit template above.
462
507
  - Prefix with `(review)` to indicate review-generated task
463
508
  - Use active verb: "Fix...", "Add...", "Update..."
464
509
 
510
+ **Brief modes:** record each Critical, High, and Medium finding (and each Low
511
+ the disposition converts) as an execution record under the target phase in
512
+ `implementation.md`, after that phase's existing records, instead of a plan
513
+ task:
514
+
515
+ ```markdown
516
+ ### Task {task_id}: (review) {Finding title}
517
+
518
+ **Status:** pending
519
+ **Source review:** reviews/archived/{REVIEW_FILENAME} ({finding IDs})
520
+
521
+ Intent: {issue description and fix guidance from the review}
522
+ Files: `{file from finding}`
523
+ Proof: `{verification command from review or standard test command}`
524
+ ```
525
+
526
+ The executor fills `**Executor:**`, the live handle, and the closing
527
+ `**Commit:**` when the work runs, and commits with `fix({task_id}): …` so the
528
+ message keeps `(pNN-tNN)`. Queued records never change phase totals.
529
+
465
530
  ### Step 6: Update Plan.md
466
531
 
467
532
  Add new tasks to plan.md in the target phase. When adding or editing tasks, preserve/restore shared `plan.md` invariants per the `oat-project-plan-writing` contract (stable task IDs, required sections, review table preservation, accurate `## Implementation Complete` totals).
@@ -484,6 +549,19 @@ Add new tasks to plan.md in the target phase. When adding or editing tasks, pres
484
549
  - Update `## Implementation Complete` totals (phase counts + total task count) so downstream PR/review summaries don’t go stale.
485
550
  - If the plan includes any phase rollups that reference task counts, update those too.
486
551
 
552
+ In brief modes `plan.md` changes only in its `## Reviews` table and, under the
553
+ late-fix rule, by an appended `## Phase p-revN:` block; there are no task
554
+ totals to update. The Reviews event update below is unchanged: the same
555
+ artifact-identified event moves to `fixes_added` with its `Reviewed Head`,
556
+ `Invocation`, and `Gate Target` provenance preserved, and the archived
557
+ artifact keeps its brief anchor record fields (`oat_review_requested_scope`,
558
+ `oat_review_phase_ids`, `oat_review_base_sha`, `oat_review_scope_source`, and
559
+ any `oat_review_fallback_reason`, `oat_review_integration_commits`, and
560
+ `oat_review_narrowed_from`) unchanged. When a `p-revN` review is received with
561
+ no fixes needed, its own event moves to `passed` and the event of the phase
562
+ named by its `**Corrects:**` line that this skill set to `fixes_added` also
563
+ moves to `passed`, citing the revision review in the implementation note.
564
+
487
565
  **Keep plan runnable:**
488
566
 
489
567
  - Do NOT leave plan.md in a state that blocks `oat-project-implement`.
@@ -563,6 +641,13 @@ After the fix tasks are complete:
563
641
  - `oat_phase_status: in_progress`
564
642
  - `oat_current_task: {first_fix_task_id}` (or next incomplete)
565
643
  - `oat_project_state_updated: "{ISO 8601 UTC timestamp}"`
644
+ - In brief modes, write the `### Review Received: {scope}` note inside the
645
+ target phase's journal section after its markers, list the queued
646
+ execution-record IDs as the new tasks, set both `oat_current_task_id` in
647
+ `implementation.md` and `oat_current_task` in `state.md` to the target
648
+ phase ID (the reviewed phase, or the new `p-revN`), and update that phase's
649
+ Progress Overview row status. The phase-unit totals change only when a
650
+ revision phase was appended.
566
651
 
567
652
  ### Step 7.5: Archive the Consumed Review Artifact
568
653
 
@@ -5,7 +5,7 @@ disable-model-invocation: true
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Bash(git:*), Glob, Grep, AskUserQuestion
7
7
  metadata:
8
- version: 1.0.5
8
+ version: 1.0.6
9
9
  ---
10
10
 
11
11
  # Project Revise
@@ -199,13 +199,30 @@ Fix tasks that edit synced artifacts use `oat project push` under the scope
199
199
  guard instead of the branch commit template above.
200
200
  ````
201
201
 
202
+ **Brief modes (`oat_workflow_mode: brief`):** the brief never carries tasks.
203
+ Insert the revision phase after the last phase block of `plan.md` (before
204
+ `## Parallelism` when present), with Intent and Exit evidence and no
205
+ `### Task` headings:
206
+
207
+ ```markdown
208
+ ## Phase p-rev{N}: Revision {N}
209
+
210
+ **Intent:** {the feedback items, one clause each} (source: inline feedback, {today})
211
+ **Exit evidence:** {verification that shows each item is addressed, and a passing review of p-rev{N}}
212
+ **Provisional:** no
213
+ ```
214
+
215
+ Add a pending `p-rev{N}` `code` row to the brief's `## Reviews` table. The
216
+ executor opens `prev{N}-tNN` execution records in `implementation.md` when the
217
+ work starts and commits them as `fix(prev{N}-tNN): …`; revise writes none.
218
+
202
219
  **Task naming:** Prefix with `(revision)` — following the `(review)` convention in review-receive.
203
220
 
204
221
  **Task IDs:** `prev{N}-t{NN}` format (e.g., `prev1-t01`, `prev1-t02`).
205
222
 
206
223
  #### 4d: Update plan.md Totals
207
224
 
208
- Update `## Implementation Complete` section to include the new revision phase and tasks in the totals.
225
+ Update `## Implementation Complete` section to include the new revision phase and tasks in the totals. In brief modes the total counts phases only.
209
226
 
210
227
  #### 4e: Update implementation.md
211
228
 
@@ -216,6 +233,12 @@ Update frontmatter to point at the first revision task so `oat-project-implement
216
233
 
217
234
  Update the Progress Overview table to include the new revision phase (e.g., add a `Phase p-rev{N}` row with task count and `in_progress` status).
218
235
 
236
+ In brief modes point the journal at the phase instead of a task: set
237
+ `oat_current_task_id: p-rev{N}`, add a `## Phase p-rev{N}: Revision {N}`
238
+ section after the last phase section with `**Status:** pending` directly under
239
+ the heading (the root writes `**Base:**` when the phase starts), and add a
240
+ `p-rev{N}` Progress Overview row with one unit, `0/1` accepted.
241
+
219
242
  Add a "Revision Received" entry:
220
243
 
221
244
  ```markdown
@@ -237,7 +260,7 @@ Add a "Revision Received" entry:
237
260
  #### 4f: Update state.md
238
261
 
239
262
  - `oat_phase_status: in_progress`
240
- - `oat_current_task: prev{N}-t01`
263
+ - `oat_current_task: prev{N}-t01` (brief modes: `p-rev{N}`)
241
264
  - `oat_project_state_updated: "{ISO 8601 UTC timestamp}"`
242
265
 
243
266
  #### 4g: Route to Implement
@@ -265,7 +288,7 @@ This is the key value revise adds: state transition management so agents know th
265
288
  - **Review artifact feedback:** Delegate to `oat-project-review-receive`
266
289
  - Delegating means loading the selected skill's current `SKILL.md` and following it, or dispatching a child that carries it, if environment supports skill chaining; otherwise tell the user which skill to run and stop. Never act from a remembered delegation outcome.
267
290
 
268
- These skills use their existing conventions: `(review)` task prefix, severity classification, standard task IDs appended to the last plan phase. This is correct — structured review feedback should go through the structured triage model.
291
+ These skills use their existing conventions: `(review)` task prefix, severity classification, standard task IDs appended to the last plan phase. This is correct — structured review feedback should go through the structured triage model. In brief modes `oat-project-review-receive` records the fixes as `(review)` execution records in the journal under its brief-mode late-fix rule, never as plan tasks.
269
292
 
270
293
  #### 5c: Post-Delegation State
271
294