@open-agent-toolkit/cli 0.3.17 → 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.
- package/assets/agents/oat-phase-implementer.md +81 -3
- package/assets/agents/oat-reviewer.md +15 -5
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/reference/cli-reference.md +8 -5
- package/assets/docs/reference/oat-directory-structure.md +1 -0
- package/assets/docs/reference/project-artifacts.md +17 -1
- package/assets/docs/reference/project-state-machine.md +19 -4
- package/assets/docs/skills/brainstorm.md +2 -1
- package/assets/docs/skills/index.md +1 -0
- package/assets/docs/workflows/advanced/autonomy.md +9 -1
- package/assets/docs/workflows/advanced/workflow-gates.md +11 -6
- package/assets/docs/workflows/approvals-and-automation.md +13 -8
- package/assets/docs/workflows/choose-workflow.md +16 -8
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +8 -3
- package/assets/docs/workflows/projects/closeout/pr-flow.md +2 -0
- package/assets/docs/workflows/projects/execution/execution-skills.md +14 -2
- package/assets/docs/workflows/projects/execution/implementation-execution.md +15 -0
- package/assets/docs/workflows/projects/execution/picking-up-projects.md +10 -1
- package/assets/docs/workflows/projects/execution/project-log.md +22 -0
- package/assets/docs/workflows/projects/lifecycle.md +73 -9
- package/assets/docs/workflows/projects/planning/hill-checkpoints.md +18 -1
- package/assets/docs/workflows/projects/planning/planning-skills.md +11 -10
- package/assets/docs/workflows/projects/planning/starting-projects.md +92 -20
- package/assets/docs/workflows/projects/reviews/index.md +15 -2
- package/assets/docs/workflows/projects/reviews/review-flavors.md +5 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +33 -9
- package/assets/skills/oat-brainstorm/references/destinations.md +9 -4
- package/assets/skills/oat-docs/SKILL.md +9 -4
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +14 -8
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +17 -2
- package/assets/skills/oat-project-brief/SKILL.md +592 -0
- package/assets/skills/oat-project-brief/references/brief-contract.md +294 -0
- package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +393 -0
- package/assets/skills/oat-project-brief/references/docs/gate-approval-record.md +84 -0
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +7 -2
- package/assets/skills/oat-project-discover/SKILL.md +3 -2
- package/assets/skills/oat-project-dispatch-subagents/SKILL.md +9 -1
- package/assets/skills/oat-project-document/SKILL.md +11 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +40 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +166 -1
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +97 -3
- package/assets/skills/oat-project-import-plan/SKILL.md +5 -1
- package/assets/skills/oat-project-lite/SKILL.md +4 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-new/SKILL.md +5 -1
- package/assets/skills/oat-project-next/SKILL.md +31 -4
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-plan/SKILL.md +12 -2
- package/assets/skills/oat-project-plan-writing/SKILL.md +6 -4
- package/assets/skills/oat-project-pr-final/SKILL.md +15 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-pr-progress/SKILL.md +31 -4
- package/assets/skills/oat-project-progress/SKILL.md +30 -8
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
- package/assets/skills/oat-project-quick-start/SKILL.md +60 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +17 -2
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +4 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +65 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +331 -12
- package/assets/skills/oat-project-review-receive/SKILL.md +86 -1
- package/assets/skills/oat-project-revise/SKILL.md +27 -4
- package/assets/skills/oat-project-summary/SKILL.md +95 -2
- package/assets/skills/oat-wave-execute/SKILL.md +3 -2
- package/assets/templates/implementation-brief.md +165 -0
- package/assets/templates/plan-brief.md +140 -0
- package/assets/templates/plan.md +1 -1
- package/assets/templates/state.md +8 -2
- package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -1
- package/dist/commands/init/tools/shared/skill-script-references.js +8 -1
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +70 -10
- package/dist/commands/project/new/scaffold.d.ts +1 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +35 -7
- package/dist/commands/project/promote/promote.d.ts +32 -1
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +562 -5
- package/dist/commands/project/validate-plan/frontmatter.d.ts +12 -0
- package/dist/commands/project/validate-plan/frontmatter.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/frontmatter.js +27 -0
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +52 -18
- package/dist/commands/project/validate-plan/profiles.d.ts +54 -0
- package/dist/commands/project/validate-plan/profiles.d.ts.map +1 -0
- package/dist/commands/project/validate-plan/profiles.js +269 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts +3 -19
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/validate-plan.js +5 -82
- package/dist/commands/shared/agents-md-lock.d.ts +3 -0
- package/dist/commands/shared/agents-md-lock.d.ts.map +1 -0
- package/dist/commands/shared/agents-md-lock.js +130 -0
- package/dist/commands/shared/agents-md.d.ts.map +1 -1
- package/dist/commands/shared/agents-md.js +26 -8
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +1 -0
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +51 -2
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +3 -0
- 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.
|
|
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}
|
|
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
|
-
|
|
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="
|
|
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="
|
|
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="
|
|
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.
|
|
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.
|
|
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
|
|