@open-agent-toolkit/cli 0.2.23 → 0.2.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/assets/agents/oat-reviewer.md +12 -1
  2. package/assets/docs/cli-utilities/configuration.md +2 -4
  3. package/assets/docs/cli-utilities/workflow-gates.md +27 -3
  4. package/assets/docs/reference/cli-reference.md +1 -1
  5. package/assets/docs/workflows/projects/reviews.md +19 -10
  6. package/assets/public-package-versions.json +4 -4
  7. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +3 -3
  8. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +3 -3
  9. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  10. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +3 -3
  11. package/assets/skills/oat-project-implement/references/phase-execution.md +29 -0
  12. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +3 -3
  13. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +3 -3
  14. package/assets/skills/oat-project-review-provide/SKILL.md +124 -26
  15. package/assets/skills/oat-project-review-provide-remote/SKILL.md +64 -15
  16. package/assets/skills/oat-project-review-receive/SKILL.md +21 -1
  17. package/assets/skills/oat-project-review-receive-remote/SKILL.md +39 -2
  18. package/assets/skills/oat-review-provide-remote/SKILL.md +55 -12
  19. package/assets/templates/plan.md +13 -7
  20. package/dist/commands/config/index.js +8 -8
  21. package/dist/commands/gate/child-process.d.ts +32 -0
  22. package/dist/commands/gate/child-process.d.ts.map +1 -0
  23. package/dist/commands/gate/child-process.js +210 -0
  24. package/dist/commands/gate/index.d.ts +2 -31
  25. package/dist/commands/gate/index.d.ts.map +1 -1
  26. package/dist/commands/gate/index.js +24 -150
  27. package/dist/commands/review/latest.d.ts.map +1 -1
  28. package/dist/commands/review/latest.js +22 -9
  29. package/dist/config/resolve.js +1 -1
  30. package/dist/review-remote/body-builder.d.ts +12 -3
  31. package/dist/review-remote/body-builder.d.ts.map +1 -1
  32. package/dist/review-remote/body-builder.js +11 -0
  33. package/dist/review-remote/marker-parser.d.ts +8 -3
  34. package/dist/review-remote/marker-parser.d.ts.map +1 -1
  35. package/dist/review-remote/marker-parser.js +13 -2
  36. package/dist/review-remote/narrowing.d.ts +44 -8
  37. package/dist/review-remote/narrowing.d.ts.map +1 -1
  38. package/dist/review-remote/narrowing.js +106 -10
  39. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-receive-remote
3
- version: 1.4.2
3
+ version: 1.5.0
4
4
  description: Use when processing GitHub PR review comments within project context. Fetches PR comments, creates plan tasks, and updates project artifacts.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -115,6 +115,33 @@ Confirm resolved PR number with user.
115
115
  npx agent-reviews --json --unresolved --pr <N>
116
116
  ```
117
117
 
118
+ Resolve provenance from the GitHub review event that produced the fetched
119
+ feedback, not from the PR's current head. Parse its OAT marker block when
120
+ present:
121
+
122
+ - accept `oat_review_head_sha` only as a full 40-character hexadecimal SHA;
123
+ - preserve `oat_review_invocation` as the invocation kind;
124
+ - preserve `oat_gate_target` only for a gate invocation.
125
+
126
+ If the source review is legacy, multiple source reviews disagree, or the
127
+ lineage cannot be associated with this receive event, leave the corresponding
128
+ ledger cells unknown (`-`). Never infer lineage from the reviewer identity or
129
+ substitute the current PR head for the commit that was actually reviewed.
130
+
131
+ **Reviews ledger write contract (all receive paths):**
132
+
133
+ - Resolve `Scope`, `Type`, `Status`, `Date`, `Artifact`, `Reviewed Head`,
134
+ `Invocation`, and `Gate Target` by header name before mutating a row; never
135
+ use fixed cell positions.
136
+ - If the Reviews table has only the legacy five columns, add `Reviewed Head`,
137
+ `Invocation`, and `Gate Target` to its header and separator and pad every
138
+ existing row with `-`. In an already widened table, pad a shorter row with
139
+ `-` through the current header width before mutation.
140
+ - Mutate only the event selected by the event-identity rules below. Preserve
141
+ every unknown column in its original position and every existing known value
142
+ unless the operation explicitly advances that cell. Never truncate a row to
143
+ five, eight, or any other assumed width.
144
+
118
145
  If no unresolved comments:
119
146
 
120
147
  1. Create a UTC timestamp and event-distinct filename:
@@ -125,10 +152,14 @@ If no unresolved comments:
125
152
  remain in top-level `reviews/`.
126
153
  3. Record the clean result as a `passed` Reviews event whose event identity
127
154
  combines `Scope`, `Type`, and artifact filename:
155
+ - Apply the Reviews ledger write contract above before claiming, appending,
156
+ or mutating the event.
128
157
  - Claim only an unbound `pending` placeholder with matching Scope + Type and
129
158
  Artifact `-`; otherwise append a distinct row.
130
159
  - Set Date and Artifact to this clean event. Advance only this event and
131
160
  never mutate another row by scope alone.
161
+ - Populate `Reviewed Head`, `Invocation`, and `Gate Target` only from the
162
+ validated source-review provenance above; use `-` when it is unknown.
132
163
  4. Commit `plan.md` and the clean review artifact atomically with
133
164
  `chore(oat): record clean remote review (pr-#<N>)`. Do not stop with
134
165
  uncommitted bookkeeping.
@@ -176,7 +207,8 @@ For each converted finding:
176
207
  ### Step 6: Update Project Artifacts
177
208
 
178
209
  Before changing the ledger, write an event-distinct review artifact containing
179
- the PR number, fetch timestamp, normalized findings, and dispositions:
210
+ the PR number, fetch timestamp, normalized findings, dispositions, and any
211
+ validated source-review head/invocation/gate-target provenance:
180
212
  `reviews/archived/remote-pr-<N>-review-YYYY-MM-DDTHHMMSSZ.md`. Remote receive
181
213
  fully dispositions the event as `passed` or `fixes_added`, so the artifact is
182
214
  consumed immediately and belongs in `reviews/archived/`, not top-level
@@ -198,11 +230,16 @@ Update `plan.md`:
198
230
  - status `passed` when no actionable findings remain
199
231
  - date set to today
200
232
  - artifact `reviews/archived/remote-pr-<N>-review-YYYY-MM-DDTHHMMSSZ.md`
233
+ - reviewed head set to the validated full source-review SHA, or `-`
234
+ - invocation set to the source-review invocation kind, or `-`
235
+ - gate target set only for a gate source review, or `-`
201
236
  - Claim an unbound `pending` placeholder only when its Scope + Type matches and
202
237
  its Artifact is `-`; otherwise append the event. Later mutations select it by
203
238
  Scope + Type + artifact filename, never by scope or `github-pr #<N>` alone.
204
239
  - Never move an event status backward or overwrite an earlier event from the
205
240
  same PR.
241
+ - Apply the Reviews ledger write contract above before claiming, appending, or
242
+ mutating the event.
206
243
  - Update `## Implementation Complete` totals.
207
244
 
208
245
  Update `implementation.md`:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-review-provide-remote
3
- version: 1.0.3
3
+ version: 1.1.0
4
4
  description: Use when reviewing a GitHub PR opened on another machine and posting findings back as a single PR review, outside any OAT project context. Fetches the PR via gh, reviews it, and posts via gh api.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -77,7 +77,7 @@ oat-review-provide-remote [--pr <N>] [--no-checkout] [--narrow|--no-narrow]
77
77
 
78
78
  - `--pr <N>`: target PR number. When omitted, auto-detect from the current branch.
79
79
  - `--no-checkout`: skip the ephemeral worktree and review from `gh pr diff` only (degraded context).
80
- - `--narrow` / `--no-narrow`: force or forbid re-review narrowing against a prior provide-remote review. When neither is passed, honor `workflow.autoNarrowReReviewScope` (no prompt when `true`; confirm prompt otherwise).
80
+ - `--narrow` / `--no-narrow`: force or forbid re-review narrowing against a prior ad-hoc provide-remote review. `--narrow` takes precedence over the configured preference; `--no-narrow` forces full scope. When neither is passed, honor `workflow.autoNarrowReReviewScope`: unset and `true` narrow automatically, while only `false` forces full scope. This path never prompts for a narrowing decision.
81
81
 
82
82
  Inputs are CLI-style args parsed from `$ARGUMENTS`. No file inputs. No file outputs on this machine.
83
83
 
@@ -143,26 +143,63 @@ gh pr view "$PR" --json title,body,headRefOid,baseRefName,state
143
143
 
144
144
  ### Step 3: Detect Prior Reviews + Narrow Scope
145
145
 
146
- List prior PR reviews and parse each body's marker block. Filter to reviews where `oat_provide_remote: true` AND `oat_review_scope == "ad-hoc"` AND no `oat_project` key — project-rail markers are ignored by the ad-hoc filter.
146
+ Resolve preference and per-invocation flags before candidate enumeration:
147
+
148
+ 1. `--no-narrow` forces full PR scope with reason `narrowing-disabled` and skips `gh api` review enumeration entirely.
149
+ 2. `--narrow` forces a narrowing attempt even when the configured preference is `false`.
150
+ 3. With neither flag, unset and `true` attempt narrowing; only `false` forces full PR scope with reason `narrowing-disabled` and skips `gh api` review enumeration entirely.
151
+
152
+ Only when narrowing will be attempted, list prior PR reviews and parse each body's GitHub review marker block. Capture command status and stderr separately:
147
153
 
148
154
  ```bash
149
- gh api "/repos/{owner}/{repo}/pulls/$PR/reviews"
155
+ REVIEWS_ERROR_FILE=""
156
+ REVIEWS_DIAGNOSTIC=""
157
+ REVIEWS_DISCOVERY_OK=false
158
+
159
+ if ! REVIEWS_ERROR_FILE=$(mktemp "${TMPDIR:-/tmp}/oat-review-errors.XXXXXX"); then
160
+ REVIEWS_DIAGNOSTIC="diagnostic-file-unavailable: unable to create a temporary stderr file"
161
+ elif REVIEWS_JSON=$(gh api "/repos/{owner}/{repo}/pulls/$PR/reviews" 2>"$REVIEWS_ERROR_FILE"); then
162
+ REVIEWS_DISCOVERY_OK=true
163
+ rm -f -- "$REVIEWS_ERROR_FILE"
164
+ REVIEWS_ERROR_FILE=""
165
+ else
166
+ REVIEWS_DIAGNOSTIC=$(dd if="$REVIEWS_ERROR_FILE" bs=500 count=1 2>/dev/null)
167
+ rm -f -- "$REVIEWS_ERROR_FILE"
168
+ REVIEWS_ERROR_FILE=""
169
+ fi
150
170
  ```
151
171
 
152
- Take the most recent matching review (by submitted timestamp). Before narrowing to `<prior_sha>..<HEAD>`, run the stale-SHA guard (design.md Error Handling Stale prior-review SHA):
172
+ Do not run `gh api` when diagnostic-file creation fails. Treat that failure, a nonzero `gh api` result, or a response-level enumeration/parsing failure as discovery failure. Before removing the diagnostic file, preserve at most 500 bytes from stderr. If response parsing later fails, set `REVIEWS_DISCOVERY_OK=false` and put at most 500 characters of the parse error in `REVIEWS_DIAGNOSTIC`. Apply the forced/automatic policy below whenever `REVIEWS_DISCOVERY_OK=false`. Do not treat individual irrelevant or lineage-ineligible marker blocks as response-level failure.
173
+
174
+ - With forced `--narrow`, discovery failure is a hard error with reason `prior-reviews-unavailable`; report the diagnostic and stop instead of pretending to narrow.
175
+ - On the automatic path, discovery failure fails open to full PR scope with stable reason `prior-reviews-unavailable` plus the diagnostic detail, then continues to review the full PR diff.
176
+
177
+ After successful enumeration, candidate discovery belongs to this rail: use only marker blocks where `oat_provide_remote: true`, `oat_review_scope == "ad-hoc"`, no `oat_project` key is present, and the invocation is in the ad-hoc lifecycle lineage (`manual` or `auto`). Project-rail, gate, and invocation-less or unknown legacy markers remain unknown and ineligible. This rail has no project-plan or local lifecycle Reviews-table fallback.
178
+
179
+ Take the most recent eligible marker by submitted timestamp. Candidate discovery and marker provenance remain rail-specific; only after this rail supplies that candidate apply the shared guard, fallback, and classification semantics mirrored by `packages/cli/src/review-remote/narrowing.ts`. When no eligible marker supplies a full 40-character hexadecimal `oat_review_head_sha`, use full PR scope with reason `no-prior-review`. Do not run Git guards for an invalid candidate.
180
+
181
+ Before accepting `<prior_sha>..<PR_HEAD_SHA>`, run the stale-SHA guard (design.md → Error Handling → Stale prior-review SHA):
153
182
 
154
183
  Run the guard in the available git context `$GIT_CTX` — `$EPHEMERAL_PATH` in rich-context (checkout) mode, or `$REPO_ROOT` in diff-only mode (where no worktree exists):
155
184
 
156
185
  1. **Existence:** `git -C "$GIT_CTX" cat-file -e <prior_sha>` (diff-only mode: `git -C "$REPO_ROOT" fetch origin <prior_sha>:refs/oat-prior-review` first, then re-check; if that fetch fails, fall back to full PR scope).
157
186
  2. **Ancestry:** `git -C "$GIT_CTX" merge-base --is-ancestor <prior_sha> "$PR_HEAD_SHA"`.
158
187
 
159
- Guard outcomes:
188
+ Guard outcomes and reasons:
160
189
 
161
- - Both pass -> narrow to `<prior_sha>..<HEAD>`.
162
- - Either fails -> fall back to full PR scope and warn that the prior SHA is unreachable (likely rebase/force-push).
190
+ - Both pass -> narrow to exactly `<prior_sha>..<PR_HEAD_SHA>` with reason `narrowed from guarded prior reviewed head`.
191
+ - Object missing or fetch failure -> fall back to full PR scope with reason `stale-sha` and detail `prior-commit-missing`.
192
+ - Ancestry failure -> fall back to full PR scope with reason `stale-sha` and detail `prior-commit-not-ancestor`.
163
193
  - `--narrow` set AND guard fails -> hard error; surface unreachability and stop.
164
- - `workflow.autoNarrowReReviewScope == true` -> never prompt; guard failure auto-falls back to full scope with the warning as the auto-fallback notice.
165
- - No matching prior review -> use full PR diff.
194
+ - The automatic path fails open for every candidate or guard failure and preserves the applicable reason.
195
+
196
+ When a guarded narrow range is accepted, enumerate its changed files with `git diff --name-only "<prior_sha>..<PR_HEAD_SHA>"` and classify it for reporting:
197
+
198
+ - `empty`: no changed files.
199
+ - `substantive`: any non-empty range. The ad-hoc rail has no active project prefix, so it cannot classify a range as `bookkeeping-only`.
200
+ - If changed-file enumeration fails, conservatively classify as `substantive` and add `changed-files-unavailable` to the reason.
201
+
202
+ The shared vocabulary remains `empty`, `bookkeeping-only`, or `substantive`; `bookkeeping-only` is reachable only on a project rail with an exact active-project prefix. Classification is reporting-only: it never skips, gates, or shortens the review. Print one narrowing resolution line containing the resolved full-scope or narrow range, classification when narrowed, and the explicit reason. Do not print another narrowing prompt or decision line elsewhere.
166
203
 
167
204
  ### Step 4: Run the Review (Inline)
168
205
 
@@ -233,6 +270,9 @@ Posting failure handling (design.md → Error Handling → Posting failures): on
233
270
  Always release the ephemeral worktree in a `finally`, even when review or posting fails:
234
271
 
235
272
  ```bash
273
+ if [[ -n "${REVIEWS_ERROR_FILE:-}" ]]; then
274
+ rm -f -- "$REVIEWS_ERROR_FILE"
275
+ fi
236
276
  git -C "$REPO_ROOT" worktree remove --force "$EPHEMERAL_PATH" || git -C "$REPO_ROOT" worktree prune
237
277
  rm -rf "$EPHEMERAL_PATH"
238
278
  ```
@@ -252,7 +292,7 @@ At completion, report:
252
292
 
253
293
  - PR number and HEAD SHA reviewed.
254
294
  - Read mode (worktree checkout vs diff-only).
255
- - Narrowing decision (full scope vs `<prior_sha>..<HEAD>`, and why).
295
+ - Narrowing decision (full scope vs `<prior_sha>..<PR_HEAD_SHA>`), reporting-only classification when narrowed, and the explicit reason.
256
296
  - Severity counts and total findings.
257
297
  - Inline-comment count posted vs findings downgraded to the body (out-of-diff).
258
298
  - Verdict (`REQUEST_CHANGES` or `COMMENT`).
@@ -263,7 +303,10 @@ At completion, report:
263
303
 
264
304
  - PR scope resolved and confirmed.
265
305
  - PR content acquired via ephemeral worktree (or diff-only fallback) without mutating the caller's working tree.
266
- - Prior provide-remote reviews detected; re-review narrowing applied only after the stale-SHA guard passes.
306
+ - Prior ad-hoc GitHub markers detected and restricted to the ad-hoc lifecycle lineage; project and gate markers are ineligible, and no project-plan or local Reviews-table fallback is used.
307
+ - Re-review narrowing applies only after the full-SHA, existence, and ancestry guards pass, with explicit fail-open reasons.
308
+ - Unset and `true` narrow automatically, only `false` forces full scope, per-invocation flags retain precedence, and no narrowing prompt remains.
309
+ - Narrowed ranges are classified as `empty` or `substantive` for reporting only; changed-file enumeration failure conservatively reports `substantive`.
267
310
  - Findings produced with consistent 4-tier severities and file:line references.
268
311
  - Inline comments mapped to in-diff positions; out-of-diff findings downgraded to the body, never dropped.
269
312
  - Posted-review body carries the marker block first, correct severity counts, and the minor-fix nudge when minors are present.
@@ -168,13 +168,19 @@ git commit -m "feat(p01-t02): {description}"
168
168
 
169
169
  {Keep both code + artifact rows below. Add additional code rows (p03, p04, etc.) as needed, but do not delete `spec`/`design`.}
170
170
 
171
- | Scope | Type | Status | Date | Artifact |
172
- | ------ | -------- | ------- | ---- | -------- |
173
- | p01 | code | pending | - | - |
174
- | p02 | code | pending | - | - |
175
- | final | code | pending | - | - |
176
- | spec | artifact | pending | - | - |
177
- | design | artifact | pending | - | - |
171
+ | Scope | Type | Status | Date | Artifact | Reviewed Head | Invocation | Gate Target |
172
+ | ------ | -------- | ------- | ---- | -------- | ------------- | ---------- | ----------- |
173
+ | p01 | code | pending | - | - | - | - | - |
174
+ | p02 | code | pending | - | - | - | - | - |
175
+ | final | code | pending | - | - | - | - | - |
176
+ | spec | artifact | pending | - | - | - | - | - |
177
+ | design | artifact | pending | - | - | - | - | - |
178
+
179
+ For code-review events, `Reviewed Head` is the full 40-character SHA at the
180
+ head of the reviewed range. `Invocation` records `manual`, `auto`, or `gate`;
181
+ `Gate Target` is populated only for gate events. Legacy five-column rows remain
182
+ valid. Writers must preserve every existing row and every unknown trailing
183
+ cell; never truncate a widened row back to five columns.
178
184
 
179
185
  **Status values:** `pending` → `received` → `fixes_added` → `fixes_completed` → `passed`
180
186
 
@@ -508,7 +508,7 @@ const CONFIG_CATALOG = [
508
508
  defaultValue: 'unset',
509
509
  mutability: 'read/write',
510
510
  owningCommand: 'oat config set workflow.hillCheckpointDefault <value>',
511
- description: 'Default HiLL checkpoint behavior in oat-project-implement: "every" pauses after every phase, "final" pauses only after the last phase. When unset, the skill prompts. Resolution: env > local > shared > user > default.',
511
+ description: 'Default HiLL checkpoint behavior in oat-project-implement: "every" pauses after every phase, "final" pauses only after the last phase. When unset, the skill prompts. Resolution: local > shared > user > default.',
512
512
  },
513
513
  {
514
514
  key: 'workflow.archiveOnComplete',
@@ -519,7 +519,7 @@ const CONFIG_CATALOG = [
519
519
  defaultValue: 'unset',
520
520
  mutability: 'read/write',
521
521
  owningCommand: 'oat config set workflow.archiveOnComplete <true|false>',
522
- description: 'Skip the "Archive after completion?" prompt in oat-project-complete. When unset, the skill prompts. Resolution: env > local > shared > user > default.',
522
+ description: 'Skip the "Archive after completion?" prompt in oat-project-complete. When unset, the skill prompts. Resolution: local > shared > user > default.',
523
523
  },
524
524
  {
525
525
  key: 'workflow.createPrOnComplete',
@@ -530,7 +530,7 @@ const CONFIG_CATALOG = [
530
530
  defaultValue: 'unset',
531
531
  mutability: 'read/write',
532
532
  owningCommand: 'oat config set workflow.createPrOnComplete <true|false>',
533
- description: 'Skip the "Open a PR?" prompt in oat-project-complete. When true, completion auto-triggers PR creation. Resolution: env > local > shared > user > default.',
533
+ description: 'Skip the "Open a PR?" prompt in oat-project-complete. When true, completion auto-triggers PR creation. Resolution: local > shared > user > default.',
534
534
  },
535
535
  {
536
536
  key: 'workflow.postImplementSequence',
@@ -541,7 +541,7 @@ const CONFIG_CATALOG = [
541
541
  defaultValue: 'unset',
542
542
  mutability: 'read/write',
543
543
  owningCommand: "oat config set workflow.postImplementSequence '<legacy-or-json>'",
544
- description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution: env > local > shared > user > default.',
544
+ description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution: local > shared > user > default.',
545
545
  },
546
546
  {
547
547
  key: 'workflow.reviewExecutionModel',
@@ -552,7 +552,7 @@ const CONFIG_CATALOG = [
552
552
  defaultValue: 'unset',
553
553
  mutability: 'read/write',
554
554
  owningCommand: 'oat config set workflow.reviewExecutionModel <value>',
555
- description: 'Default execution model for the final review step in oat-project-implement: "subagent" dispatches a review subagent, "inline" runs the review in-context, "fresh-session" prints guidance for running the review in a separate session (with an escape hatch to subagent/inline). When unset, the skill prompts. Resolution: env > local > shared > user > default.',
555
+ description: 'Default execution model for the final review step in oat-project-implement: "subagent" dispatches a review subagent, "inline" runs the review in-context, "fresh-session" prints guidance for running the review in a separate session (with an escape hatch to subagent/inline). When unset, the skill prompts. Resolution: local > shared > user > default.',
556
556
  },
557
557
  {
558
558
  key: 'workflow.autoReviewAtHillCheckpoints',
@@ -563,7 +563,7 @@ const CONFIG_CATALOG = [
563
563
  defaultValue: 'unset',
564
564
  mutability: 'read/write',
565
565
  owningCommand: 'oat config set workflow.autoReviewAtHillCheckpoints <true|false>',
566
- description: 'Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase oat-reviewer gates. When unset, the skill prompts. Resolution: env > local > shared > user > legacy autoReviewAtCheckpoints > default.',
566
+ description: 'Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase oat-reviewer gates. When unset, the skill prompts. Resolution: local > shared > user > legacy autoReviewAtCheckpoints > default.',
567
567
  },
568
568
  {
569
569
  key: 'workflow.autoNarrowReReviewScope',
@@ -571,10 +571,10 @@ const CONFIG_CATALOG = [
571
571
  file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
572
572
  scope: 'workflow',
573
573
  type: 'boolean',
574
- defaultValue: 'unset',
574
+ defaultValue: 'true',
575
575
  mutability: 'read/write',
576
576
  owningCommand: 'oat config set workflow.autoNarrowReReviewScope <true|false>',
577
- description: 'Auto-narrow re-review scope to fix-task commits in oat-project-review-provide when re-reviewing completed fix tasks. Has no effect on initial reviews (there is nothing to narrow to). When unset, the skill prompts. Resolution: env > local > shared > user > default.',
577
+ description: 'Automatically narrows re-review scope to changes since the prior same-lineage review. Narrowing is enabled by default; false opts out to full scope. Has no effect on initial reviews (there is nothing to narrow to). Resolution: local > shared > user > default.',
578
578
  },
579
579
  {
580
580
  key: 'workflow.autoArtifactReview.plan',
@@ -0,0 +1,32 @@
1
+ import type { GateActivityEvidence, GateActivityProbe, GateActivityProbeStatus } from './activity-probes.js';
2
+ export interface ProcessRunOptions {
3
+ activityProbe?: GateActivityProbe;
4
+ cwd: string;
5
+ env: NodeJS.ProcessEnv;
6
+ livenessIntervalMs?: number;
7
+ onLiveness?: (snapshot: GateLivenessSnapshot) => void;
8
+ purpose: 'host-detection' | 'availability' | 'execute';
9
+ stdin: 'ignore' | 'inherit';
10
+ stdio: 'ignore' | 'inherit' | 'pipe';
11
+ stdoutDestination?: 'stdout' | 'stderr';
12
+ timeoutMs: number;
13
+ }
14
+ export interface ProcessRunResult {
15
+ activityEvidence?: GateActivityEvidence;
16
+ exitCode: number;
17
+ refusal?: string;
18
+ stderrBytes: number;
19
+ stdoutBytes: number;
20
+ timedOut?: boolean;
21
+ }
22
+ export interface GateLivenessSnapshot {
23
+ elapsedMs: number;
24
+ hardBudgetMs: number;
25
+ idleMs: number;
26
+ processAlive: boolean;
27
+ activityProbeStatus?: GateActivityProbeStatus;
28
+ lastActivityEvidence?: GateActivityEvidence;
29
+ }
30
+ export declare function runChildProcess(command: string, args: string[], options: ProcessRunOptions): Promise<ProcessRunResult>;
31
+ export declare function extractStructuredRefusal(output: string): string | undefined;
32
+ //# sourceMappingURL=child-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-process.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/child-process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACtD,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;IACvD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAgN3B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3E"}
@@ -0,0 +1,210 @@
1
+ import { spawn } from 'node:child_process';
2
+ // Keep these safety bounds fixed rather than environment-tunable. In particular,
3
+ // changing the force-kill fallback would alter the hard-timeout contract.
4
+ // Revisit the observation grace only if field evidence shows large transcript
5
+ // directories routinely exceed it.
6
+ const FORCE_KILL_GRACE_MS = 5_000;
7
+ const ACTIVITY_OBSERVATION_GRACE_MS = 1_000;
8
+ export async function runChildProcess(command, args, options) {
9
+ return new Promise((resolve, reject) => {
10
+ let timedOut = false;
11
+ let suppressLiveness = false;
12
+ let killTimeout = null;
13
+ let stderrBytes = 0;
14
+ let stdoutBytes = 0;
15
+ let refusal;
16
+ let stdoutLineBuffer = '';
17
+ let stderrLineBuffer = '';
18
+ let latestActivityEvidence;
19
+ let latestActivityProbeStatus;
20
+ let activityObservationSequence = 0;
21
+ let latestActivityEvidenceSequence = 0;
22
+ let livenessProbePending = false;
23
+ let pendingPeriodicObservation;
24
+ let finalActivityObservation;
25
+ const startedAt = Date.now();
26
+ let lastActivityAt = startedAt;
27
+ const child = spawn(command, args, {
28
+ cwd: options.cwd,
29
+ env: options.env,
30
+ stdio: options.stdio === 'pipe'
31
+ ? [options.stdin, 'pipe', 'pipe']
32
+ : options.stdio,
33
+ });
34
+ const recordActivity = () => {
35
+ lastActivityAt = Date.now();
36
+ };
37
+ const scanChunk = (buffer, chunk) => {
38
+ const combined = buffer + chunk.toString('utf8');
39
+ const lines = combined.split('\n');
40
+ const remainder = lines.pop() ?? '';
41
+ if (!refusal) {
42
+ for (const line of lines) {
43
+ refusal = extractStructuredRefusal(line.replace(/\r$/, ''));
44
+ if (refusal) {
45
+ break;
46
+ }
47
+ }
48
+ }
49
+ return remainder;
50
+ };
51
+ child.stdout?.on('data', (chunk) => {
52
+ stdoutBytes += chunk.byteLength;
53
+ stdoutLineBuffer = scanChunk(stdoutLineBuffer, chunk);
54
+ recordActivity();
55
+ const destination = options.stdoutDestination === 'stderr'
56
+ ? process.stderr
57
+ : process.stdout;
58
+ destination.write(chunk);
59
+ });
60
+ child.stderr?.on('data', (chunk) => {
61
+ stderrBytes += chunk.byteLength;
62
+ stderrLineBuffer = scanChunk(stderrLineBuffer, chunk);
63
+ recordActivity();
64
+ process.stderr.write(chunk);
65
+ });
66
+ const processAlive = () => {
67
+ if (child.pid === undefined)
68
+ return false;
69
+ try {
70
+ process.kill(child.pid, 0);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ };
77
+ const observeActivity = async (observedAt) => {
78
+ if (!options.activityProbe)
79
+ return undefined;
80
+ const sequence = ++activityObservationSequence;
81
+ try {
82
+ const activityProbeStatus = await options.activityProbe.observe(observedAt);
83
+ const evidence = activityProbeStatus.evidence;
84
+ if (evidence && sequence > latestActivityEvidenceSequence) {
85
+ latestActivityEvidence = evidence;
86
+ latestActivityEvidenceSequence = sequence;
87
+ }
88
+ return activityProbeStatus;
89
+ }
90
+ catch {
91
+ // Activity evidence is diagnostic only. Preserve the last valid sample.
92
+ return undefined;
93
+ }
94
+ };
95
+ const settleWithinActivityGrace = (observation) => new Promise((resolveObservation) => {
96
+ // Keep this timer referenced so a closed child cannot end the process
97
+ // before the bounded diagnostic observation settles.
98
+ const graceTimeout = setTimeout(resolveObservation, ACTIVITY_OBSERVATION_GRACE_MS);
99
+ const settle = () => {
100
+ clearTimeout(graceTimeout);
101
+ resolveObservation();
102
+ };
103
+ void observation.then(settle, settle);
104
+ });
105
+ const livenessInterval = options.onLiveness && options.livenessIntervalMs
106
+ ? setInterval(() => {
107
+ if (livenessProbePending)
108
+ return;
109
+ livenessProbePending = true;
110
+ const now = Date.now();
111
+ const observation = (async () => {
112
+ const activityProbeStatus = await observeActivity(now);
113
+ if (activityProbeStatus) {
114
+ latestActivityProbeStatus = activityProbeStatus;
115
+ }
116
+ if (suppressLiveness)
117
+ return;
118
+ options.onLiveness?.({
119
+ elapsedMs: now - startedAt,
120
+ hardBudgetMs: options.timeoutMs,
121
+ idleMs: now - lastActivityAt,
122
+ processAlive: processAlive(),
123
+ ...(latestActivityProbeStatus
124
+ ? { activityProbeStatus: latestActivityProbeStatus }
125
+ : {}),
126
+ ...(latestActivityEvidence
127
+ ? { lastActivityEvidence: latestActivityEvidence }
128
+ : {}),
129
+ });
130
+ })();
131
+ pendingPeriodicObservation = observation;
132
+ const clearPending = () => {
133
+ if (pendingPeriodicObservation === observation) {
134
+ pendingPeriodicObservation = undefined;
135
+ }
136
+ livenessProbePending = false;
137
+ };
138
+ void observation.then(clearPending, clearPending);
139
+ }, options.livenessIntervalMs)
140
+ : null;
141
+ livenessInterval?.unref();
142
+ const timeout = setTimeout(() => {
143
+ timedOut = true;
144
+ suppressLiveness = true;
145
+ if (livenessInterval) {
146
+ clearInterval(livenessInterval);
147
+ }
148
+ child.kill('SIGTERM');
149
+ killTimeout = setTimeout(() => {
150
+ child.kill('SIGKILL');
151
+ }, FORCE_KILL_GRACE_MS);
152
+ killTimeout.unref();
153
+ finalActivityObservation = observeActivity(Date.now());
154
+ }, options.timeoutMs);
155
+ timeout.unref();
156
+ child.on('error', (error) => {
157
+ clearTimeout(timeout);
158
+ if (livenessInterval) {
159
+ clearInterval(livenessInterval);
160
+ }
161
+ if (killTimeout) {
162
+ clearTimeout(killTimeout);
163
+ }
164
+ reject(error);
165
+ });
166
+ child.on('close', (code) => {
167
+ suppressLiveness = true;
168
+ clearTimeout(timeout);
169
+ if (livenessInterval) {
170
+ clearInterval(livenessInterval);
171
+ }
172
+ if (killTimeout) {
173
+ clearTimeout(killTimeout);
174
+ }
175
+ void (async () => {
176
+ if (finalActivityObservation) {
177
+ const periodicObservation = pendingPeriodicObservation;
178
+ const finalThenFallback = finalActivityObservation.then(async (activityProbeStatus) => {
179
+ if (!activityProbeStatus?.evidence && periodicObservation) {
180
+ await periodicObservation;
181
+ }
182
+ });
183
+ await settleWithinActivityGrace(finalThenFallback);
184
+ }
185
+ else if (pendingPeriodicObservation) {
186
+ // Preserve evidence already in flight on a normal close. This can add
187
+ // up to the bounded grace to an otherwise successful execution.
188
+ await settleWithinActivityGrace(pendingPeriodicObservation);
189
+ }
190
+ refusal ??=
191
+ extractStructuredRefusal(stdoutLineBuffer.replace(/\r$/, '')) ??
192
+ extractStructuredRefusal(stderrLineBuffer.replace(/\r$/, ''));
193
+ resolve({
194
+ ...(latestActivityEvidence
195
+ ? { activityEvidence: latestActivityEvidence }
196
+ : {}),
197
+ exitCode: timedOut ? 124 : (code ?? 1),
198
+ ...(refusal ? { refusal } : {}),
199
+ stderrBytes,
200
+ stdoutBytes,
201
+ ...(timedOut ? { timedOut: true } : {}),
202
+ });
203
+ })();
204
+ });
205
+ });
206
+ }
207
+ export function extractStructuredRefusal(output) {
208
+ const match = output.match(/^OAT_GATE_REFUSAL: (.*)$/m);
209
+ return match?.[1]?.replace(/\r$/, '');
210
+ }
@@ -5,8 +5,9 @@ import { type ResolvedConfig } from '../../config/resolve.js';
5
5
  import { type ModelFamily } from '../../providers/identity/family.js';
6
6
  import { type IdentityConfidence, type IdentityProvenance } from '../../providers/identity/provenance.js';
7
7
  import { Command } from 'commander';
8
- import { createGateActivityProbe, type GateActivityEvidence, type GateActivityProbe, type GateActivityProbeStatus } from './activity-probes.js';
8
+ import { createGateActivityProbe } from './activity-probes.js';
9
9
  import { createBranchLocalGateCli, currentGateCliLaunch, readGateRouteReceipt, removeBranchLocalGateCli } from './branch-local-cli.js';
10
+ import { type ProcessRunOptions, type ProcessRunResult } from './child-process.js';
10
11
  import { parseReviewGateVerdict } from './review-verdict.js';
11
12
  interface GateCommandDependencies {
12
13
  buildCommandContext: (options: GlobalOptions) => CommandContext;
@@ -31,36 +32,6 @@ interface GateCommandDependencies {
31
32
  removeGateRunMarker: (path: string, warn: (message: string) => void) => Promise<void>;
32
33
  writeDiagnostic: (message: string) => void;
33
34
  }
34
- interface ProcessRunOptions {
35
- activityProbe?: GateActivityProbe;
36
- cwd: string;
37
- env: NodeJS.ProcessEnv;
38
- livenessIntervalMs?: number;
39
- onLiveness?: (snapshot: GateLivenessSnapshot) => void;
40
- purpose: 'host-detection' | 'availability' | 'execute';
41
- stdin: 'ignore' | 'inherit';
42
- stdio: 'ignore' | 'inherit' | 'pipe';
43
- stdoutDestination?: 'stdout' | 'stderr';
44
- timeoutMs: number;
45
- }
46
- interface ProcessRunResult {
47
- activityEvidence?: GateActivityEvidence;
48
- activityProbeStatus?: GateActivityProbeStatus;
49
- capturedOutput?: string;
50
- exitCode: number;
51
- refusal?: string;
52
- stderrBytes: number;
53
- stdoutBytes: number;
54
- timedOut?: boolean;
55
- }
56
- interface GateLivenessSnapshot {
57
- elapsedMs: number;
58
- hardBudgetMs: number;
59
- idleMs: number;
60
- processAlive: boolean;
61
- activityProbeStatus?: GateActivityProbeStatus;
62
- lastActivityEvidence?: GateActivityEvidence;
63
- }
64
35
  type GateTimeoutSource = 'cli' | 'target' | 'config' | 'env' | 'scope-default' | 'default';
65
36
  interface GateRunMarker {
66
37
  runId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"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"}