@open-agent-toolkit/cli 0.3.15 → 0.3.17
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/NOTICES.md +48 -0
- package/assets/agents/oat-phase-implementer.md +26 -6
- package/assets/agents/oat-reviewer.md +51 -1
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/contributing/documentation.md +4 -0
- package/assets/docs/contributing/skills.md +3 -1
- package/assets/docs/getting-started/bootstrap.md +1 -1
- package/assets/docs/getting-started/index.md +0 -4
- package/assets/docs/getting-started/tool-packs.md +0 -7
- package/assets/docs/provider-sync/commands.md +21 -0
- package/assets/docs/reference/cli-reference.md +44 -2
- package/assets/docs/reference/config-and-local-state.md +11 -2
- package/assets/docs/reference/configuration.md +10 -2
- package/assets/docs/reference/project-artifacts.md +43 -8
- package/assets/docs/skills/index.md +1 -0
- package/assets/docs/skills/recon.md +8 -5
- package/assets/docs/skills/repo-improve.md +9 -7
- package/assets/docs/workflows/advanced/autonomy.md +50 -0
- package/assets/docs/workflows/advanced/workflow-gates.md +109 -10
- package/assets/docs/workflows/approvals-and-automation.md +3 -1
- package/assets/docs/workflows/backlog-and-planning/backlog-lifecycle.md +25 -24
- package/assets/docs/workflows/backlog-and-planning/remote-project-management.md +0 -7
- package/assets/docs/workflows/ideas/lifecycle.md +2 -7
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +62 -1
- package/assets/docs/workflows/projects/execution/implementation-execution.md +23 -3
- package/assets/docs/workflows/projects/execution/project-log.md +6 -0
- package/assets/docs/workflows/projects/lifecycle.md +7 -0
- package/assets/docs/workflows/projects/reviews/index.md +63 -1
- package/assets/docs/workflows/projects/reviews/review-flavors.md +8 -0
- package/assets/docs/workflows/waves/wave-workflows.md +11 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +14 -4
- package/assets/skills/oat-brainstorm/SKILL.md +17 -13
- package/assets/skills/oat-docs-apply/SKILL.md +13 -3
- package/assets/skills/oat-doctor/SKILL.md +11 -1
- package/assets/skills/oat-explainer-kit/SKILL.md +1 -1
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +6 -3
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +28 -3
- package/assets/skills/oat-project-autonomous/SKILL.md +60 -5
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +210 -165
- package/assets/skills/oat-project-capture/SKILL.md +7 -3
- package/assets/skills/oat-project-complete/SKILL.md +39 -34
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +106 -28
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +30 -3
- package/assets/skills/oat-project-complete-auto/SKILL.md +388 -0
- package/assets/skills/oat-project-design/SKILL.md +12 -9
- package/assets/skills/oat-project-discover/SKILL.md +8 -4
- package/assets/skills/oat-project-document/SKILL.md +14 -5
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/SKILL.md +6 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +34 -7
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +38 -6
- package/assets/skills/oat-project-import-plan/SKILL.md +20 -6
- package/assets/skills/oat-project-lite/SKILL.md +7 -5
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-new/SKILL.md +6 -2
- package/assets/skills/oat-project-next/SKILL.md +19 -2
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-plan/SKILL.md +14 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +4 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-progress/SKILL.md +27 -1
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +7 -3
- package/assets/skills/oat-project-quick-start/SKILL.md +47 -14
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-quick-start/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +8 -4
- package/assets/skills/oat-project-retro/SKILL.md +1 -1
- package/assets/skills/oat-project-retro/references/apply-procedure.md +6 -6
- package/assets/skills/oat-project-retro-file/SKILL.md +7 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +23 -4
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +19 -1
- package/assets/skills/oat-project-review-receive/SKILL.md +57 -14
- package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +7 -3
- package/assets/skills/oat-project-revise/SKILL.md +13 -5
- package/assets/skills/oat-project-spec/SKILL.md +8 -4
- package/assets/skills/oat-project-summary/SKILL.md +11 -7
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +54 -20
- package/assets/skills/oat-repo-knowledge-index/scripts/refresh-owned.mjs +118 -0
- package/assets/skills/oat-review-provide/SKILL.md +7 -3
- package/assets/skills/oat-review-receive-remote/SKILL.md +14 -4
- package/assets/skills/oat-wave-execute/SKILL.md +72 -38
- package/assets/skills/oat-wave-execute/assets/wrapper-plan-template.md +16 -2
- package/assets/skills/oat-wave-program/SKILL.md +15 -6
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +45 -17
- package/assets/skills/oat-wrap-up/SKILL.md +9 -3
- package/assets/skills/oat-wrap-up/references/report-template.md +1 -1
- package/assets/skills/recon/SKILL.md +1 -1
- package/assets/skills/recon/references/packet-contract.md +18 -3
- package/assets/skills/recon/scripts/lib/contracts.mjs +16 -2
- package/assets/skills/recon/scripts/reconcile-ledger.mjs +20 -10
- package/assets/skills/recon/scripts/render-packet.mjs +31 -3
- package/assets/skills/recon/scripts/validate-packet.mjs +5 -5
- package/assets/templates/pjm-agents.md +38 -8
- package/assets/templates/repo-agents.md +5 -0
- package/assets/templates/repo-readme.md +5 -0
- package/assets/templates/state.md +7 -0
- package/dist/commands/backlog/archive.d.ts +3 -0
- package/dist/commands/backlog/archive.d.ts.map +1 -1
- package/dist/commands/backlog/archive.js +63 -26
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +3 -0
- package/dist/commands/backlog/rewrite-references.d.ts +5 -0
- package/dist/commands/backlog/rewrite-references.d.ts.map +1 -1
- package/dist/commands/backlog/rewrite-references.js +39 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +13 -0
- package/dist/commands/gate/index.d.ts +5 -0
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +270 -9
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +1 -0
- package/dist/commands/internal/commit-paths.d.ts +3 -0
- package/dist/commands/internal/commit-paths.d.ts.map +1 -0
- package/dist/commands/internal/commit-paths.js +31 -0
- package/dist/commands/internal/index.d.ts.map +1 -1
- package/dist/commands/internal/index.js +2 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +37 -8
- package/dist/commands/project/archive/archive-utils.d.ts +6 -3
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +510 -104
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +1 -0
- package/dist/commands/project/log/append.d.ts +2 -3
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +55 -101
- package/dist/commands/project/migrate/index.d.ts +1 -2
- package/dist/commands/project/migrate/index.d.ts.map +1 -1
- package/dist/commands/project/migrate/index.js +8 -2
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +4 -4
- package/dist/commands/project/promote/promote.d.ts +8 -0
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +37 -6
- package/dist/commands/project/status.d.ts.map +1 -1
- package/dist/commands/project/status.js +3 -0
- package/dist/commands/project/sync/ref-sync.d.ts +12 -1
- package/dist/commands/project/sync/ref-sync.d.ts.map +1 -1
- package/dist/commands/project/sync/ref-sync.js +347 -23
- package/dist/commands/shared/exact-path-commit.d.ts +32 -0
- package/dist/commands/shared/exact-path-commit.d.ts.map +1 -0
- package/dist/commands/shared/exact-path-commit.js +691 -0
- 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 +1 -1
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +87 -8
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +31 -5
- package/dist/commands/sync/dry-run.d.ts.map +1 -1
- package/dist/commands/sync/dry-run.js +28 -11
- package/dist/commands/sync/sync.utils.d.ts +13 -0
- package/dist/commands/sync/sync.utils.d.ts.map +1 -1
- package/dist/commands/sync/sync.utils.js +21 -1
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +1 -0
- package/dist/config/oat-config.d.ts +1 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +3 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +1 -0
- package/dist/drift/detector.js +6 -6
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +87 -2
- package/dist/engine/engine.types.d.ts +10 -1
- package/dist/engine/engine.types.d.ts.map +1 -1
- package/dist/engine/engine.types.js +4 -0
- package/dist/engine/execute-plan.d.ts.map +1 -1
- package/dist/engine/execute-plan.js +42 -5
- package/dist/engine/managed-copy-hash.d.ts +4 -3
- package/dist/engine/managed-copy-hash.d.ts.map +1 -1
- package/dist/engine/managed-copy-hash.js +4 -3
- package/dist/fs/assets.d.ts.map +1 -1
- package/dist/fs/assets.js +7 -1
- package/dist/manifest/hash.d.ts +8 -10
- package/dist/manifest/hash.d.ts.map +1 -1
- package/dist/ui/output.js +1 -1
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +151 -11
- package/package.json +3 -2
|
@@ -3,15 +3,19 @@ name: oat-project-review-receive
|
|
|
3
3
|
description: Use when the user explicitly asks to receive review findings for an OAT project — e.g. "receive review", "process review", "process the project review", or confirms a previously offered review-receive step. Do NOT auto-invoke merely because a review file exists. Resolves the latest review and offers before acting.
|
|
4
4
|
disable-model-invocation: false
|
|
5
5
|
user-invocable: true
|
|
6
|
-
allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Glob, Grep, AskUserQuestion
|
|
6
|
+
allowed-tools: Read, Write, Bash(git:*), Bash(oat:*), Glob, Grep, AskUserQuestion, Task
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.6.
|
|
8
|
+
version: 1.6.9
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Receive Review
|
|
12
12
|
|
|
13
13
|
Process review findings into actionable plan tasks and guide gap closure execution.
|
|
14
14
|
|
|
15
|
+
## Hook-safe exact-path commits
|
|
16
|
+
|
|
17
|
+
Before a parent-branch commit, verify `oat internal commit-paths --help` succeeds. If unavailable, stop and update the OAT CLI; never fall back to a staged-index or pathspec-only commit. Set `COMMIT_IDENTITY` to a unique operation/artifact identity before the first attempt and retain it for every retry; use a new identity for a new operation. Pass only the exact produced file list, including tracked removals and both names of a rename. A blocked/failed result stops the workflow; retain its receipt and follow its diagnostics. Hooks remain enabled. Synced project artifacts continue through `oat project push`.
|
|
18
|
+
|
|
15
19
|
## Purpose
|
|
16
20
|
|
|
17
21
|
Turn review output into plan changes and a clear next action. This closes the feedback loop between reviewing and fixing.
|
|
@@ -412,6 +416,11 @@ Derive `TASK_PREFIX` from scope:
|
|
|
412
416
|
|
|
413
417
|
### Step 5: Convert Findings to Tasks
|
|
414
418
|
|
|
419
|
+
Each generated fix task initializes `TASK_OWNED_FILES=()` before its first
|
|
420
|
+
edit and appends the exact files at their producers, including removals and
|
|
421
|
+
both rename sides. Carry that task-owned list and stable request/task identity
|
|
422
|
+
into its Commit step; never infer ownership from the staged index.
|
|
423
|
+
|
|
415
424
|
**For each Critical, High, and Medium finding (default):**
|
|
416
425
|
|
|
417
426
|
Create a plan task entry:
|
|
@@ -440,8 +449,8 @@ Expected: {expected outcome}
|
|
|
440
449
|
**Step 4: Commit**
|
|
441
450
|
|
|
442
451
|
```bash
|
|
443
|
-
|
|
444
|
-
|
|
452
|
+
OWNED_COMMIT_PATHS=("${TASK_OWNED_FILES[@]}")
|
|
453
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-review-receive:{task_id}" --message "fix({task_id}): {description}" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
445
454
|
```
|
|
446
455
|
|
|
447
456
|
Fix tasks that edit synced artifacts use `oat project push` under the scope
|
|
@@ -560,8 +569,17 @@ After the fix tasks are complete:
|
|
|
560
569
|
After plan/implementation/state updates reference the archived location, move the processed review artifact into the local-only history directory:
|
|
561
570
|
|
|
562
571
|
```bash
|
|
572
|
+
REVIEW_ARCHIVE_PATHS=()
|
|
573
|
+
# Record a tracked source deletion before the move; an untracked source has no
|
|
574
|
+
# deletion to commit. The destination is included only when it is not ignored.
|
|
575
|
+
if git --literal-pathspecs ls-files --error-unmatch -- "$REVIEW_PATH" >/dev/null 2>&1; then
|
|
576
|
+
REVIEW_ARCHIVE_PATHS+=("$REVIEW_PATH")
|
|
577
|
+
fi
|
|
563
578
|
mkdir -p "$ARCHIVED_REVIEW_DIR"
|
|
564
|
-
mv "$REVIEW_PATH" "$ARCHIVED_REVIEW_PATH"
|
|
579
|
+
mv "$REVIEW_PATH" "$ARCHIVED_REVIEW_PATH" || exit 1
|
|
580
|
+
if ! git check-ignore -q -- "$ARCHIVED_REVIEW_PATH"; then
|
|
581
|
+
REVIEW_ARCHIVE_PATHS+=("$ARCHIVED_REVIEW_PATH")
|
|
582
|
+
fi
|
|
565
583
|
```
|
|
566
584
|
|
|
567
585
|
Rules:
|
|
@@ -582,12 +600,10 @@ PROJECT_SCOPE=$(oat project scope "$PROJECT_PATH" --format value) || { echo "oat
|
|
|
582
600
|
if [ "$PROJECT_SCOPE" = "synced" ]; then
|
|
583
601
|
oat project push "$PROJECT_PATH" --message "chore(oat): record review findings and add fix tasks ({scope})" || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
584
602
|
else
|
|
585
|
-
|
|
586
|
-
#
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
git add "$PROJECT_PATH/reviews/"
|
|
590
|
-
git diff --cached --quiet || git commit -m "chore(oat): record review findings and add fix tasks ({scope})"
|
|
603
|
+
OWNED_COMMIT_PATHS=("$PROJECT_PATH/plan.md" "$PROJECT_PATH/implementation.md" "$PROJECT_PATH/state.md")
|
|
604
|
+
# Consume the exact producer list retained from the Step 7.5 archive move.
|
|
605
|
+
OWNED_COMMIT_PATHS+=("${REVIEW_ARCHIVE_PATHS[@]}")
|
|
606
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-review-receive:2" --message "chore(oat): record review findings and add fix tasks ({scope})" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
591
607
|
fi
|
|
592
608
|
```
|
|
593
609
|
|
|
@@ -595,7 +611,7 @@ Do not use `git add -A` or glob patterns that reach outside `"$PROJECT_PATH/revi
|
|
|
595
611
|
|
|
596
612
|
If the project itself is still untracked because earlier lifecycle steps never committed the initial artifact set, widen this bookkeeping commit to include the untracked core project artifacts (`discovery.md`, `spec.md`, `design.md`, `plan.md`, `implementation.md`, `state.md`). Do not stage `.oat/state.md`; it is generated dashboard state and normally gitignored. Do not leave the project tree partially tracked after receive-review finishes.
|
|
597
613
|
|
|
598
|
-
**Note on archived review paths:** When `reviews/archived/` matches a `localPaths` pattern
|
|
614
|
+
**Note on archived review paths:** Retain `REVIEW_ARCHIVE_PATHS` across a retry. When `reviews/archived/` matches a `localPaths` pattern, include the old tracked review path only; when the destination is tracked, include both rename sides. Do not pass the reviews directory or ignored destination to the helper. A resumed operation uses the retained producer list and identity so the helper can verify a previously committed removal.
|
|
599
615
|
|
|
600
616
|
**Worktree handling:** If the project was resolved via a worktree in Step 0, run the git commands scoped to the worktree (`git -C "$WORKTREE_PATH" ...`) so the commit lands on the worktree branch.
|
|
601
617
|
|
|
@@ -603,28 +619,46 @@ If the project itself is still untracked because earlier lifecycle steps never c
|
|
|
603
619
|
|
|
604
620
|
**Bounded loop protection:**
|
|
605
621
|
|
|
606
|
-
Count how many review cycles have occurred for this scope. Exclude gate-originated artifacts (`oat_review_invocation: gate`): the cap measures failed fix cycles of the standard review loop, not artifact volume, and phase gate re-runs are governed by the phase review gate flow in `oat-project-implement`, not by this cap.
|
|
622
|
+
Count how many review cycles have occurred for this scope. Exclude gate-originated artifacts (`oat_review_invocation: gate`): the cap measures failed fix cycles of the standard review loop, not artifact volume, and phase gate re-runs are governed by the phase review gate flow in `oat-project-implement`, not by this cap. Saved complexity reports (`complexity-<scope>-*.md` under `reviews/archived/`) name the scope but are not review cycles, so the count skips them too.
|
|
607
623
|
|
|
608
624
|
```bash
|
|
609
625
|
{
|
|
610
626
|
find "$PROJECT_PATH/reviews" -maxdepth 1 -type f -name "*$SCOPE_TOKEN*.md" 2>/dev/null
|
|
611
627
|
find "$PROJECT_PATH/reviews/archived" -maxdepth 1 -type f -name "*$SCOPE_TOKEN*.md" 2>/dev/null
|
|
612
628
|
} | while IFS= read -r artifact; do
|
|
629
|
+
case "$(basename "$artifact")" in complexity-*) continue ;; esac
|
|
613
630
|
grep -q "oat_review_invocation: gate" "$artifact" || echo "$artifact"
|
|
614
631
|
done | wc -l
|
|
615
632
|
```
|
|
616
633
|
|
|
617
634
|
**If 3 or more cycles:**
|
|
618
635
|
|
|
636
|
+
Before showing the menu, dispatch the complexity review that
|
|
637
|
+
`references/docs/complexity-review-fallback.md` defines for this scope's
|
|
638
|
+
exhausted loop, then show its decision message with the menu below; under
|
|
639
|
+
`OAT_AUTONOMOUS=1`, put the same content in the boundary report instead.
|
|
640
|
+
Record the operator's choice with the report path in `implementation.md`.
|
|
641
|
+
Agents never select the disposition. The loop history in the brief includes
|
|
642
|
+
this scope's gate-originated artifacts even though the count excludes them. To
|
|
643
|
+
launch the review, load the current `oat-project-dispatch-subagents/SKILL.md`
|
|
644
|
+
and follow it, resolving the route as that doc's "Routing outside implement"
|
|
645
|
+
section describes; inside an implement run, the implement route applies. A
|
|
646
|
+
receive re-entered at the cap with no new review round since the scope's newest
|
|
647
|
+
complexity report reuses that report instead of dispatching another.
|
|
648
|
+
|
|
619
649
|
```
|
|
620
650
|
⚠️ Review cycle limit reached (3 cycles).
|
|
621
651
|
|
|
622
652
|
This scope has been reviewed {N} times. Further automated review cycles are blocked.
|
|
623
653
|
|
|
654
|
+
Complexity review: {verdict}; recommended disposition: {recommended disposition}
|
|
655
|
+
Report: {report path}
|
|
656
|
+
|
|
624
657
|
Options:
|
|
625
658
|
1. Review findings manually and decide which to address
|
|
626
659
|
2. Proceed to PR with current state
|
|
627
660
|
3. Request explicit user override to continue
|
|
661
|
+
4. Simplify: apply the complexity review's accepted simplifications, then review again
|
|
628
662
|
|
|
629
663
|
Choose an option:
|
|
630
664
|
```
|
|
@@ -747,8 +781,17 @@ For `artifact` reviews, do not route to implementation tasks. After user-approve
|
|
|
747
781
|
**Archive the consumed review artifact (same as Step 7.5):**
|
|
748
782
|
|
|
749
783
|
```bash
|
|
784
|
+
REVIEW_ARCHIVE_PATHS=()
|
|
785
|
+
# Record a tracked source deletion before the move; an untracked source has no
|
|
786
|
+
# deletion to commit. The destination is included only when it is not ignored.
|
|
787
|
+
if git --literal-pathspecs ls-files --error-unmatch -- "$REVIEW_PATH" >/dev/null 2>&1; then
|
|
788
|
+
REVIEW_ARCHIVE_PATHS+=("$REVIEW_PATH")
|
|
789
|
+
fi
|
|
750
790
|
mkdir -p "$ARCHIVED_REVIEW_DIR"
|
|
751
|
-
mv "$REVIEW_PATH" "$ARCHIVED_REVIEW_PATH"
|
|
791
|
+
mv "$REVIEW_PATH" "$ARCHIVED_REVIEW_PATH" || exit 1
|
|
792
|
+
if ! git check-ignore -q -- "$ARCHIVED_REVIEW_PATH"; then
|
|
793
|
+
REVIEW_ARCHIVE_PATHS+=("$ARCHIVED_REVIEW_PATH")
|
|
794
|
+
fi
|
|
752
795
|
```
|
|
753
796
|
|
|
754
797
|
- Before the move, use the Step 1 `REVIEW_FILENAME` for every artifact-review reference or event identity written by the approved edits.
|
package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Complexity Review at Budget Exhaustion
|
|
2
|
+
|
|
3
|
+
When a review or gate budget runs out, the loop has stopped converging, and
|
|
4
|
+
another round of the same review is unlikely to change that. Before asking the
|
|
5
|
+
operator how to proceed, the root dispatches one complexity review and shows its
|
|
6
|
+
result together with the reasons the loop stopped. The review asks whether the
|
|
7
|
+
reviewed work, or the machinery the findings keep demanding, earns its cost
|
|
8
|
+
against the contract; it is not another correctness review.
|
|
9
|
+
|
|
10
|
+
This document is read by two parties: the root (the orchestrating agent that
|
|
11
|
+
owns the exhausted loop) and the reviewer subagent it dispatches.
|
|
12
|
+
|
|
13
|
+
## When
|
|
14
|
+
|
|
15
|
+
Each owning skill points here at its exhaustion point:
|
|
16
|
+
|
|
17
|
+
| Exhaustion point | Owning skill and step |
|
|
18
|
+
| ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
19
|
+
| Root-owned phase review still has Critical/High findings at the orchestration limit | `oat-project-implement`, `references/phase-execution.md`, Bounded Fix and Re-Review Loop |
|
|
20
|
+
| Optional phase review gate still blocks at the orchestration limit | `oat-project-implement`, `references/phase-execution.md`, Optional External Phase Review Gate |
|
|
21
|
+
| Final review reaches the three-cycle review cap | `oat-project-implement`, `references/completion-and-closeout.md`, Step 13 |
|
|
22
|
+
| Implementation exit gate ends in `block` at `maxAttempts` | `oat-project-implement`, `references/completion-and-closeout.md`, Step 14 |
|
|
23
|
+
| A review scope reaches the three-cycle review cap | `oat-project-review-receive`, Step 8 |
|
|
24
|
+
| Quick-start plan gate (`QS-12`) ends in `block` at `maxAttempts` | `oat-project-quick-start`, Gate Execution step 6 |
|
|
25
|
+
|
|
26
|
+
These are budget exhaustions only. A single `prompt` failure, a `warn`
|
|
27
|
+
outcome, and launch, transport, or runtime failures that consume no attempt do
|
|
28
|
+
not trigger the review.
|
|
29
|
+
|
|
30
|
+
One exhausted loop gets one review. Before dispatching, look for an existing
|
|
31
|
+
report for the scope and reuse the newest
|
|
32
|
+
`reviews/archived/complexity-<scope>-*.md` when it is newer than every review
|
|
33
|
+
artifact of that scope: its filename timestamp is at or after the newest of
|
|
34
|
+
their `oat_generated_at` values, compared at seconds precision. Among reports
|
|
35
|
+
from the same second, the highest collision suffix is the newest. A legacy
|
|
36
|
+
minute-precision name (`YYYY-MM-DDTHHMMZ`) reads as second `00`, which errs
|
|
37
|
+
toward a fresh review. For example, a report saved as
|
|
38
|
+
`complexity-p03-2026-10-02T183045Z.md` is newer than a review generated at
|
|
39
|
+
`2026-10-02T18:30:20Z` and older than one generated at `2026-10-02T18:30:50Z`,
|
|
40
|
+
an order minute precision could not establish. Dispatch again only when a new
|
|
41
|
+
review round has landed since that report. The rule covers a re-entered review-receive at the cap, the
|
|
42
|
+
final review cap reached through review-receive Step 8, and a phase scope that
|
|
43
|
+
reaches both the receive cap and the implement retry limit.
|
|
44
|
+
|
|
45
|
+
The operator can ask for the same review at any other time. There is no
|
|
46
|
+
automatic early trigger.
|
|
47
|
+
|
|
48
|
+
## Probe
|
|
49
|
+
|
|
50
|
+
The operator may have the full `complexity-review` skill installed. Probe these
|
|
51
|
+
paths in order and bind the first that exists:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
COMPLEXITY_REVIEW_SKILL=""
|
|
55
|
+
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || true)
|
|
56
|
+
for candidate in \
|
|
57
|
+
"${HOME:-}/.agents/skills/complexity-review/SKILL.md" \
|
|
58
|
+
"${HOME:-}/.claude/skills/complexity-review/SKILL.md" \
|
|
59
|
+
"${REPO_ROOT:+$REPO_ROOT/.agents/skills/complexity-review/SKILL.md}"; do
|
|
60
|
+
[ -n "$candidate" ] && [ -f "$candidate" ] || continue
|
|
61
|
+
COMPLEXITY_REVIEW_SKILL="$candidate"
|
|
62
|
+
break
|
|
63
|
+
done
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- **Found:** the reviewer subagent reads that `SKILL.md` and the references it
|
|
67
|
+
links, and follows them as a document. The skill is not model-invocable, so
|
|
68
|
+
never launch it as a skill. Interactive questions are forbidden: where the
|
|
69
|
+
skill would ask, the reviewer states the gap, labels the contract inferred,
|
|
70
|
+
and marks the verdict provisional. It ignores any `--out` destination and
|
|
71
|
+
returns the report inline. It then adds the OAT sections below.
|
|
72
|
+
- **Not found:** the reviewer follows the condensed method below, then adds the
|
|
73
|
+
OAT sections.
|
|
74
|
+
|
|
75
|
+
Report which path ran in the report's first line, for example
|
|
76
|
+
`Method: installed complexity-review (<path>)` or `Method: OAT condensed`.
|
|
77
|
+
|
|
78
|
+
## Dispatch
|
|
79
|
+
|
|
80
|
+
The root dispatches exactly one read-only reviewer-class subagent through
|
|
81
|
+
`oat-project-dispatch-subagents`, at the reviewer ceiling already resolved for
|
|
82
|
+
the exhausted loop. The reviewer:
|
|
83
|
+
|
|
84
|
+
- writes nothing, commits nothing, and launches nothing;
|
|
85
|
+
- reads committed content (`git show <rev>:<path>`, `git diff <range>`) rather
|
|
86
|
+
than the working tree whenever another writer may own the worktree; and
|
|
87
|
+
- returns the full report inline to the root.
|
|
88
|
+
|
|
89
|
+
The brief names the scope:
|
|
90
|
+
|
|
91
|
+
- **Reviewed target:** the phase commit range, the final implementation range,
|
|
92
|
+
or the plan bundle (`plan.md` with the discovery, design, and spec it was
|
|
93
|
+
built from).
|
|
94
|
+
- **Contract sources:** the backlog items the project closes, `discovery.md`,
|
|
95
|
+
`spec.md`, `design.md`, and the relevant records under
|
|
96
|
+
`.oat/repo/reference/decisions/`. A plan cannot justify its own machinery, so
|
|
97
|
+
the contract comes from these sources, not from the reviewed plan.
|
|
98
|
+
- **Loop history:** every review artifact of the exhausted loop, active and
|
|
99
|
+
archived, gate artifacts included, plus the dispositions recorded for them
|
|
100
|
+
in `implementation.md` or `plan.md`.
|
|
101
|
+
|
|
102
|
+
### Routing outside implement
|
|
103
|
+
|
|
104
|
+
Inside an `oat-project-implement` run, the root already loaded its dispatch
|
|
105
|
+
contract and resolved the reviewer route, and both apply here. When the
|
|
106
|
+
exhausted loop belongs to `oat-project-quick-start` or to a standalone
|
|
107
|
+
`oat-project-review-receive` run, resolve them before the launch:
|
|
108
|
+
|
|
109
|
+
1. Independently probe each required `<name>/SKILL.md` in order:
|
|
110
|
+
`${SKILL_DIR}/..` from this loaded owning skill, `${HOME}/.agents/skills`,
|
|
111
|
+
then `<repo-root>/.agents/skills`. Bind each first match to its own root:
|
|
112
|
+
`${PROJECT_DISPATCH_SKILLS_ROOT}` for `oat-project-dispatch-subagents` and
|
|
113
|
+
`${DISPATCH_SKILLS_ROOT}` for `oat-dispatch-subagents`; never rely on ambient
|
|
114
|
+
discovery. On a miss, name the skill and give its recovery
|
|
115
|
+
command, then continue with
|
|
116
|
+
`Complexity review unavailable: <skill> not installed`:
|
|
117
|
+
- `oat-project-dispatch-subagents`:
|
|
118
|
+
`oat tools install workflows --scope <user|project>`;
|
|
119
|
+
- `oat-dispatch-subagents`:
|
|
120
|
+
`oat tools install utility --scope <user|project>`.
|
|
121
|
+
2. Read `${PROJECT_DISPATCH_SKILLS_ROOT}/oat-project-dispatch-subagents/SKILL.md`,
|
|
122
|
+
then `${DISPATCH_SKILLS_ROOT}/oat-dispatch-subagents/SKILL.md`, and follow them.
|
|
123
|
+
3. When no reviewer ceiling was resolved for this loop, resolve one with
|
|
124
|
+
`oat project dispatch-ceiling resolve --provider "$ACTIVE_PROVIDER" --role reviewer --json`
|
|
125
|
+
and launch at that ceiling.
|
|
126
|
+
|
|
127
|
+
When no reviewer route is available, the root says so in the decision message
|
|
128
|
+
(`Complexity review unavailable: <reason>`) and presents the decision with the
|
|
129
|
+
loop-stop reasons alone. It never substitutes a weaker reviewer class and never
|
|
130
|
+
blocks the decision on the missing review.
|
|
131
|
+
|
|
132
|
+
## Condensed method
|
|
133
|
+
|
|
134
|
+
Generated artifacts are cheap; owned complexity is not. Each piece of
|
|
135
|
+
machinery must earn its cost for this contract. The simplest solution is the
|
|
136
|
+
one with the lowest total lifecycle cost that still meets the contract and
|
|
137
|
+
still proves that it works, not the one with the fewest lines.
|
|
138
|
+
|
|
139
|
+
1. **Restate the contract** in four lines, from the contract sources:
|
|
140
|
+
- Outcome: what was asked for, in the requester's terms.
|
|
141
|
+
- Hard constraints: limits the requester or the repository imposes.
|
|
142
|
+
- Acceptance criteria: how the requester would know it is done.
|
|
143
|
+
- Minimum proof: the smallest evidence that the outcome is achieved.
|
|
144
|
+
|
|
145
|
+
Separate requirements from implementation choices treated as requirements.
|
|
146
|
+
Verify mechanically enforced constraints in source, validators, tests, or
|
|
147
|
+
tool behavior rather than in descriptive prose. When the originating request
|
|
148
|
+
is missing or ambiguous, label the contract inferred, cite each inference,
|
|
149
|
+
and mark the verdict provisional. When sources conflict, report the
|
|
150
|
+
conflict instead of picking the one that justifies the machinery.
|
|
151
|
+
|
|
152
|
+
2. **Establish the simplest viable baseline:** the least complex version that
|
|
153
|
+
satisfies the contract and its minimum proof. It is the reference point every
|
|
154
|
+
additional piece of machinery must beat, not automatically the
|
|
155
|
+
recommendation.
|
|
156
|
+
|
|
157
|
+
3. **Inventory the machinery.** Consider schemas and intermediate
|
|
158
|
+
representations; scripts and generated output; tests, fixtures, and
|
|
159
|
+
snapshots; validation and repair loops; multiple agents or passes; state
|
|
160
|
+
machines, phases, and resumable sessions; abstractions and plugin seams;
|
|
161
|
+
configuration, persistence, and caching; duplicated documentation; and
|
|
162
|
+
process ceremony (planning documents, review passes, phase gates). Report
|
|
163
|
+
only material items, and judge the system as a whole: ten individually
|
|
164
|
+
defensible additions can still be indefensible together.
|
|
165
|
+
|
|
166
|
+
4. **Apply the deletion test** to each item: what outcome does it support, what
|
|
167
|
+
concrete failure occurs without it, is that failure observed or merely
|
|
168
|
+
imaginable, can a smaller mechanism address it, how would we know it helped,
|
|
169
|
+
what does it cost to own, and what would adding it later cost? Grade the
|
|
170
|
+
evidence as **hard requirement**, **observed**, **strongly inferred**,
|
|
171
|
+
**speculative**, or **unsupported**, and recommend **Keep**, **Simplify**,
|
|
172
|
+
**Defer** (with an observable reintroduction trigger), or **Delete**. If an
|
|
173
|
+
item can be deleted, deferred, or substantially simplified while the
|
|
174
|
+
contract and its proof stay intact, it should be. A hard requirement, a
|
|
175
|
+
credible threat model, an irreversible interface, or a low-frequency
|
|
176
|
+
high-impact risk can justify a mechanism before any failure.
|
|
177
|
+
|
|
178
|
+
5. **Build the ledger before the verdict:**
|
|
179
|
+
|
|
180
|
+
| Item | Claimed value | Evidence | Lifecycle cost | Recommendation |
|
|
181
|
+
| ------------------- | ------------- | ------------------------------- | -------------- | -------------------------------- |
|
|
182
|
+
| {file or component} | … | {evidence grade, with citation} | … | Keep / Simplify / Defer / Delete |
|
|
183
|
+
|
|
184
|
+
Cite a file and line, a section, a commit, a run, or a short quote from the
|
|
185
|
+
request. "Best practice" and "consistency with siblings" belong in Claimed
|
|
186
|
+
value, never in Evidence.
|
|
187
|
+
|
|
188
|
+
6. **Assign the verdict:** `Deletion-rule compliant` when every item is Keep or
|
|
189
|
+
a trivial wording-only Simplify; `Partially compliant` when the central
|
|
190
|
+
approach is right and the overshoot is peripheral; `Not compliant` when the
|
|
191
|
+
central approach itself fails the deletion test. Append `, provisional`
|
|
192
|
+
whenever the contract was inferred.
|
|
193
|
+
|
|
194
|
+
Report sections: Verdict, Contract, Simplest viable solution, and Complexity
|
|
195
|
+
ledger always; Proposed changes, Risks of simplifying, Reintroduction triggers,
|
|
196
|
+
and Out of lane only when they have content.
|
|
197
|
+
|
|
198
|
+
**Stance: skeptical, not reflexively minimalist.** Do not remove complexity
|
|
199
|
+
that satisfies a hard requirement, do not trade clear code for a clever
|
|
200
|
+
abstraction, do not recommend a large rewrite to remove a minor burden, and do
|
|
201
|
+
not increase net machinery. Sunk cost is irrelevant; removal and migration cost
|
|
202
|
+
are not. Grade necessity, not correctness: correctness, security, or staleness
|
|
203
|
+
findings noticed in passing go under Out of lane, one line each, and are not
|
|
204
|
+
investigated.
|
|
205
|
+
|
|
206
|
+
## OAT sections
|
|
207
|
+
|
|
208
|
+
Both paths add these sections to the report:
|
|
209
|
+
|
|
210
|
+
- **REQUIRES-OPERATOR:** mark each ledger row that only the operator can settle
|
|
211
|
+
(a contract question, a scope or product call, accepting a risk) with
|
|
212
|
+
`REQUIRES-OPERATOR` and state the question in plain terms.
|
|
213
|
+
- **Open findings:** classify each finding still open in the exhausted loop as
|
|
214
|
+
`accepted-requirement` (the contract requires it), `regression` (the change
|
|
215
|
+
broke something that worked), or `new-hardening` (a new demand beyond the
|
|
216
|
+
contract). Call out recurring families: the same kind of finding returning
|
|
217
|
+
across rounds.
|
|
218
|
+
- **Dissolvable findings:** list the open findings that a recommended Simplify,
|
|
219
|
+
Defer, or Delete would dissolve.
|
|
220
|
+
- **Recommended disposition:** one of `extra cycles` (more fix and review
|
|
221
|
+
rounds), `proceed with override` (accept the residual findings and continue),
|
|
222
|
+
`corrective revision` (rework within the current approach), or `simplify`
|
|
223
|
+
(apply the ledger's simplifications, then review again), with a one-sentence
|
|
224
|
+
rationale. This is a recommendation only.
|
|
225
|
+
|
|
226
|
+
## Decision message and record
|
|
227
|
+
|
|
228
|
+
The root, never the reviewer:
|
|
229
|
+
|
|
230
|
+
1. Saves the returned report verbatim at
|
|
231
|
+
`$PROJECT_PATH/reviews/archived/complexity-<scope>-<YYYY-MM-DDTHHMMSSZ>.md`,
|
|
232
|
+
beside the loop's archived review artifacts, with the UTC timestamp from
|
|
233
|
+
`date -u +%Y-%m-%dT%H%M%SZ`. When that path already exists, append `-2`,
|
|
234
|
+
then `-3`, and so on before `.md` until the path is free. It is not a review event: it
|
|
235
|
+
carries no `oat_review_*` or `oat_generated_at` frontmatter, has no `plan.md`
|
|
236
|
+
Reviews row, and stays out of the top-level `reviews/` directory, where
|
|
237
|
+
routers would read it as an unprocessed review. Write it only while no
|
|
238
|
+
dispatched child owns the worktree; when `reviews/archived/` is tracked,
|
|
239
|
+
commit it with the decision bookkeeping.
|
|
240
|
+
2. Shows one decision message containing:
|
|
241
|
+
- why the loop stopped: the budget, the count reached, and the findings still
|
|
242
|
+
blocking;
|
|
243
|
+
- the verdict and the ledger highlights;
|
|
244
|
+
- the dissolvable findings;
|
|
245
|
+
- each REQUIRES-OPERATOR item, in plain terms;
|
|
246
|
+
- the recommended disposition;
|
|
247
|
+
- the dispositions on offer: the owning step's existing options plus
|
|
248
|
+
`simplify`; and
|
|
249
|
+
- the report path.
|
|
250
|
+
3. Records the operator's choice in `implementation.md` with the date, the
|
|
251
|
+
scope, the exhaustion point, the verdict, the chosen disposition, and the
|
|
252
|
+
report path.
|
|
253
|
+
|
|
254
|
+
Agents never select the disposition, including the recommended one. Under
|
|
255
|
+
`OAT_AUTONOMOUS=1` the run stops at its boundary report, and that report
|
|
256
|
+
includes the same decision-message content; no disposition is chosen or
|
|
257
|
+
recorded on the operator's behalf. The operator's choice is recorded when the
|
|
258
|
+
run resumes.
|
|
259
|
+
|
|
260
|
+
A `simplify` choice routes the accepted ledger changes through the owning
|
|
261
|
+
skill's normal revision path (fix tasks for a code scope, plan edits for a plan
|
|
262
|
+
bundle), followed by a fresh review of the revised work.
|
|
@@ -5,13 +5,17 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.5.
|
|
8
|
+
version: 1.5.4
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Project Remote Review Receive
|
|
12
12
|
|
|
13
13
|
Fetch unresolved GitHub PR feedback and convert it into review-fix tasks inside the active OAT project.
|
|
14
14
|
|
|
15
|
+
## Hook-safe exact-path commits
|
|
16
|
+
|
|
17
|
+
Before a parent-branch commit, verify `oat internal commit-paths --help` succeeds. If unavailable, stop and update the OAT CLI; never fall back to a staged-index or pathspec-only commit. Set `COMMIT_IDENTITY` to a unique operation/artifact identity before the first attempt and retain it for every retry; use a new identity for a new operation. Pass only the exact produced file list, including tracked removals and both names of a rename. A blocked/failed result stops the workflow; retain its receipt and follow its diagnostics. Hooks remain enabled. Synced project artifacts continue through `oat project push`.
|
|
18
|
+
|
|
15
19
|
## Prerequisites
|
|
16
20
|
|
|
17
21
|
- Active OAT project with `plan.md` and `implementation.md`.
|
|
@@ -273,8 +277,8 @@ PROJECT_SCOPE=$(oat project scope "$PROJECT_PATH" --format value) || { echo "oat
|
|
|
273
277
|
if [ "$PROJECT_SCOPE" = "synced" ]; then
|
|
274
278
|
oat project push "$PROJECT_PATH" --message "chore(oat): record remote review findings and add fix tasks (pr-#$PR_NUMBER)" || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
275
279
|
else
|
|
276
|
-
|
|
277
|
-
|
|
280
|
+
OWNED_COMMIT_PATHS=("$PROJECT_PATH/plan.md" "$PROJECT_PATH/implementation.md" "$PROJECT_PATH/state.md" "$REMOTE_REVIEW_PATH")
|
|
281
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-review-receive-remote:1" --message "chore(oat): record remote review findings and add fix tasks (pr-#$PR_NUMBER)" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
278
282
|
fi
|
|
279
283
|
```
|
|
280
284
|
|
|
@@ -5,13 +5,17 @@ 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.5
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Project Revise
|
|
12
12
|
|
|
13
13
|
Accept post-PR human feedback and create revision tasks without starting a new project.
|
|
14
14
|
|
|
15
|
+
## Hook-safe exact-path commits
|
|
16
|
+
|
|
17
|
+
Before a parent-branch commit, verify `oat internal commit-paths --help` succeeds. If unavailable, stop and update the OAT CLI; never fall back to a staged-index or pathspec-only commit. Set `COMMIT_IDENTITY` to a unique operation/artifact identity before the first attempt and retain it for every retry; use a new identity for a new operation. Pass only the exact produced file list, including tracked removals and both names of a rename. A blocked/failed result stops the workflow; retain its receipt and follow its diagnostics. Hooks remain enabled. Synced project artifacts continue through `oat project push`.
|
|
18
|
+
|
|
15
19
|
## Purpose
|
|
16
20
|
|
|
17
21
|
Provide a clean re-entry point for post-PR feedback. Routes inline feedback, GitHub PR comments, or review artifacts into revision tasks, manages state transitions (`pr_open` ↔ `in_progress`), and ensures agents understand the project is in revision mode — not done.
|
|
@@ -174,6 +178,10 @@ Source: inline feedback ({today})
|
|
|
174
178
|
|
|
175
179
|
- Modify: `{file}`
|
|
176
180
|
|
|
181
|
+
Before the first edit, initialize `TASK_OWNED_FILES=()` and append each exact
|
|
182
|
+
created, modified or removed file at its producer, including both rename sides.
|
|
183
|
+
Retain the task list and its unique task identity for commit/retry.
|
|
184
|
+
|
|
177
185
|
**Step 1:** {What to change}
|
|
178
186
|
|
|
179
187
|
**Step 2: Verify**
|
|
@@ -183,8 +191,8 @@ Expected: {expected outcome}
|
|
|
183
191
|
**Step 3: Commit**
|
|
184
192
|
|
|
185
193
|
```bash
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
OWNED_COMMIT_PATHS=("${TASK_OWNED_FILES[@]}")
|
|
195
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-revise:prev{N}-t01" --message "fix(prev{N}-t01): {description}" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
188
196
|
```
|
|
189
197
|
|
|
190
198
|
Fix tasks that edit synced artifacts use `oat project push` under the scope
|
|
@@ -277,8 +285,8 @@ PROJECT_SCOPE=$(oat project scope "$PROJECT_PATH" --format value) || { echo "oat
|
|
|
277
285
|
if [ "$PROJECT_SCOPE" = "synced" ]; then
|
|
278
286
|
oat project push "$PROJECT_PATH" --message "chore(oat): create revision tasks for {project-name}" || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
279
287
|
else
|
|
280
|
-
|
|
281
|
-
|
|
288
|
+
OWNED_COMMIT_PATHS=("$PROJECT_PATH/plan.md" "$PROJECT_PATH/implementation.md" "$PROJECT_PATH/state.md")
|
|
289
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-revise:2" --message "chore(oat): create revision tasks for {project-name}" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
282
290
|
fi
|
|
283
291
|
```
|
|
284
292
|
|
|
@@ -5,13 +5,17 @@ disable-model-invocation: true
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Bash(git:*), Bash(oat template:*), Glob, Grep, AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 2.0.
|
|
8
|
+
version: 2.0.5
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Specification Phase
|
|
12
12
|
|
|
13
13
|
Transform discovery insights into a formal specification with detailed requirements and acceptance criteria.
|
|
14
14
|
|
|
15
|
+
## Hook-safe exact-path commits
|
|
16
|
+
|
|
17
|
+
Before a parent-branch commit, verify `oat internal commit-paths --help` succeeds. If unavailable, stop and update the OAT CLI; never fall back to a staged-index or pathspec-only commit. Set `COMMIT_IDENTITY` to a unique operation/artifact identity before the first attempt and retain it for every retry; use a new identity for a new operation. Pass only the exact produced file list, including tracked removals and both names of a rename. A blocked/failed result stops the workflow; retain its receipt and follow its diagnostics. Hooks remain enabled. Synced project artifacts continue through `oat project push`.
|
|
18
|
+
|
|
15
19
|
## Prerequisites
|
|
16
20
|
|
|
17
21
|
**Required:** Complete discovery document. If missing, run the `oat-project-discover` skill first.
|
|
@@ -450,14 +454,14 @@ Requirements:
|
|
|
450
454
|
Ready for design phase" || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
451
455
|
else
|
|
452
456
|
PROJECT_OUTPUT_PATHS=("$PROJECT_PATH/spec.md" "$PROJECT_PATH/state.md")
|
|
453
|
-
|
|
454
|
-
|
|
457
|
+
OWNED_COMMIT_PATHS=("${PROJECT_OUTPUT_PATHS[@]}")
|
|
458
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-spec:1" --message "docs: complete specification for {project-name}
|
|
455
459
|
|
|
456
460
|
Requirements:
|
|
457
461
|
- {N} functional requirements (P0: {n}, P1: {n}, P2: {n})
|
|
458
462
|
- {N} non-functional requirements (P0: {n}, P1: {n}, P2: {n})
|
|
459
463
|
|
|
460
|
-
Ready for design phase"
|
|
464
|
+
Ready for design phase" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
461
465
|
fi
|
|
462
466
|
```
|
|
463
467
|
|
|
@@ -5,13 +5,17 @@ disable-model-invocation: false
|
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools: Read, Write, Bash(git:*), Bash(jq:*), Bash(oat config:*), Bash(oat decision:*), Bash(oat pjm:*), Bash(oat project log:*), Bash(oat project push:*), Bash(oat project scope:*), Bash(oat template:*), Bash(oat tools:*), Glob, Grep, AskUserQuestion
|
|
7
7
|
metadata:
|
|
8
|
-
version: 1.5.
|
|
8
|
+
version: 1.5.8
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Project Summary
|
|
12
12
|
|
|
13
13
|
Generate a durable project summary artifact from project lifecycle artifacts.
|
|
14
14
|
|
|
15
|
+
## Hook-safe exact-path commits
|
|
16
|
+
|
|
17
|
+
Before a parent-branch commit, verify `oat internal commit-paths --help` succeeds. If unavailable, stop and update the OAT CLI; never fall back to a staged-index or pathspec-only commit. Set `COMMIT_IDENTITY` to a unique operation/artifact identity before the first attempt and retain it for every retry; use a new identity for a new operation. Pass only the exact produced file list, including tracked removals and both names of a rename. A blocked/failed result stops the workflow; retain its receipt and follow its diagnostics. Hooks remain enabled. Synced project artifacts continue through `oat project push`.
|
|
18
|
+
|
|
15
19
|
## Purpose
|
|
16
20
|
|
|
17
21
|
Produce a `summary.md` that serves as institutional memory — capturing what was built, why decisions were made, what tradeoffs occurred, and what follow-up work was identified. This artifact is distinct from the PR description: summary.md is reflective and thorough; PR descriptions are reviewer-oriented and actionable.
|
|
@@ -566,7 +570,7 @@ fi
|
|
|
566
570
|
|
|
567
571
|
PARENT_DURABILITY_COMMIT=""
|
|
568
572
|
if [ "$PROJECT_SCOPE" = "synced" ] && [ "${#PARENT_OUTPUT_PATHS[@]}" -gt 0 ]; then
|
|
569
|
-
|
|
573
|
+
OWNED_COMMIT_PATHS=("${PARENT_OUTPUT_PATHS[@]}")
|
|
570
574
|
if [ "$PROJECT_LOG_LEDGER_APPENDED" = "true" ] && [ "$DECISION_INDEX_CHANGED" = "true" ]; then
|
|
571
575
|
PARENT_COMMIT_MESSAGE="docs: update project log ledger and decisions for {project-name}"
|
|
572
576
|
elif [ "$PROJECT_LOG_LEDGER_APPENDED" = "true" ]; then
|
|
@@ -574,7 +578,7 @@ if [ "$PROJECT_SCOPE" = "synced" ] && [ "${#PARENT_OUTPUT_PATHS[@]}" -gt 0 ]; th
|
|
|
574
578
|
else
|
|
575
579
|
PARENT_COMMIT_MESSAGE="docs: promote summary decisions for {project-name}"
|
|
576
580
|
fi
|
|
577
|
-
|
|
581
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-summary:1" --message "$PARENT_COMMIT_MESSAGE" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
578
582
|
PARENT_DURABILITY_COMMIT=$(git rev-parse HEAD)
|
|
579
583
|
PARENT_COMMIT_PATHS=$(git diff-tree --no-commit-id --name-only -r "$PARENT_DURABILITY_COMMIT")
|
|
580
584
|
# Inspect the complete output and require exact set equality with the
|
|
@@ -609,8 +613,8 @@ else
|
|
|
609
613
|
if [ "${#PARENT_OUTPUT_PATHS[@]}" -gt 0 ]; then
|
|
610
614
|
PROJECT_OUTPUT_PATHS+=("${PARENT_OUTPUT_PATHS[@]}")
|
|
611
615
|
fi
|
|
612
|
-
|
|
613
|
-
|
|
616
|
+
OWNED_COMMIT_PATHS=("${PROJECT_OUTPUT_PATHS[@]}")
|
|
617
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-summary:2" --message "docs: generate summary for {project-name}" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
614
618
|
SUMMARY_COMMIT_SHA=$(git rev-parse HEAD)
|
|
615
619
|
fi
|
|
616
620
|
|
|
@@ -639,8 +643,8 @@ if [ "$PROJECT_SCOPE" = "synced" ]; then
|
|
|
639
643
|
SUMMARY_PUSH=$(oat project push "$PROJECT_PATH" --message "docs: update summary for {project-name}" --json) || { echo "oat: project push failed; run oat project pull, resolve the reported state, and retry" >&2; exit 1; }
|
|
640
644
|
SUMMARY_COMMIT_SHA=$(parse_synced_push_receipt "$SUMMARY_PUSH") || { printf '%s\n' "$SUMMARY_PUSH" >&2; echo "Recovery: run oat project pull \"$PROJECT_PATH\", resolve conflicts, then retry this push." >&2; exit 1; }
|
|
641
645
|
else
|
|
642
|
-
|
|
643
|
-
|
|
646
|
+
OWNED_COMMIT_PATHS=("${PROJECT_OUTPUT_PATHS[@]}")
|
|
647
|
+
oat internal commit-paths --identity "${COMMIT_IDENTITY:?set once and retain for retries}:oat-project-summary:3" --message "docs: update summary for {project-name}" -- "${OWNED_COMMIT_PATHS[@]}" || exit 1
|
|
644
648
|
SUMMARY_COMMIT_SHA=$(git rev-parse HEAD)
|
|
645
649
|
fi
|
|
646
650
|
```
|