@amsterdamdatalabs/enact-extensions 0.1.24 → 0.1.26
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/extensions/enact-factory/skills/autonomous-runner/SKILL.md +10 -4
- package/extensions/enact-factory/skills/drive-loop/SKILL.md +9 -4
- package/extensions/enact-factory/skills/drive-loop/references/contract-schema.md +1 -1
- package/extensions/enact-factory/skills/handoff/SKILL.md +4 -1
- package/extensions/enact-loop/skills/enact-loop/SKILL.md +11 -3
- package/package.json +1 -1
- package/scripts/version-bump.sh +22 -1
|
@@ -215,14 +215,19 @@ or return an empty session:
|
|
|
215
215
|
|
|
216
216
|
| Grader provider | Paseo flag | Notes |
|
|
217
217
|
|---|---|---|
|
|
218
|
-
| `codex` | `--mode auto` | `--mode bypass` is rejected by codex |
|
|
218
|
+
| `codex` | `--mode auto-review` | Routes the grader's eligible `on-request` approvals through codex's auto-reviewer subagent instead of BLOCKING — without it a grader can stall on an approval (e.g. a cargo/network fetch during build verification). `--mode bypass` is rejected by codex |
|
|
219
219
|
| `cursor` | default / agent | `--mode bypass` is a claude mode, NOT cursor's — previously documented wrong; cursor uses default or agent mode |
|
|
220
220
|
| `kimi` | `--mode auto` | Same as codex |
|
|
221
221
|
| `opencode` (minimax M3) | default | No special mode flag needed |
|
|
222
222
|
|
|
223
|
+
Codex mode enum (authoritative): `read-only` · `auto` · `auto-review` · `full-access`. The grader
|
|
224
|
+
stays read-only BY PROMPT; `auto-review` only governs approval handling and composes with
|
|
225
|
+
`--output-schema` verdict capture. Flip a running grader with `paseo agent mode <id> auto-review`.
|
|
226
|
+
|
|
223
227
|
**Verdict capture is STRUCTURED, not log-scraped.** Dispatch the grader with:
|
|
224
|
-
`paseo run --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
225
|
-
— stdout is the validated `{verdict, evidence}` object.
|
|
228
|
+
`paseo run --provider <graderModel> --mode auto-review --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
229
|
+
— stdout is the validated `{verdict, evidence}` object. On the codex provider, `--mode auto-review`
|
|
230
|
+
keeps on-request approvals from blocking the grader (read-only stays enforced by prompt). Recover the actual grader model and cost
|
|
226
231
|
via `paseo ls -a --label continuation=<cid> --json` then `paseo inspect <id> --json`. Watch live
|
|
227
232
|
with `paseo attach <id>` (recover the id by label first).
|
|
228
233
|
See design doc: `enact-loop/docs/design/2026-06-22-paseo-verdict-capture.md`.
|
|
@@ -243,7 +248,8 @@ lists in `FACTORY_DRIVE_DECISION_TREE.md` §4), then hand to
|
|
|
243
248
|
- `loop_start({ contract })` — the boulder activates; you cannot stop until
|
|
244
249
|
every required stage passes and every judgment stage has an independent GO.
|
|
245
250
|
- Mechanical stages → `loop_grade({ stageId })` — engine runs stage command in loop root.
|
|
246
|
-
- Judgment stages → `loop_grader_dispatch` → spawn grader on a **different model**
|
|
251
|
+
- Judgment stages → `loop_grader_dispatch` → spawn grader on a **different model**
|
|
252
|
+
(Paseo codex provider: `--mode auto-review` so on-request approvals don't block) →
|
|
247
253
|
driver relays `loop_grader_verdict` (`captureSource: "relayed"`) or grader calls directly.
|
|
248
254
|
- **No `git stash` during an active loop** — invalidates worktree fingerprints.
|
|
249
255
|
- On stall: escalate via `committee` (root-cause) or `advisor` (judgment call);
|
|
@@ -161,7 +161,7 @@ For each judgment stage:
|
|
|
161
161
|
> the factory MCP tool `factory_paseo_grader_run` runs the grader with
|
|
162
162
|
> `paseo run --output-schema --json --wait-timeout` so **stdout is the validated `{verdict,
|
|
163
163
|
> evidence}` object** — no `paseo logs | grep`. It bakes in the per-provider `--mode`
|
|
164
|
-
> (codex
|
|
164
|
+
> (codex `auto-review` so on-request approvals don't block, kimi `auto`, cursor/opencode default) and recovers the actual resolved model via
|
|
165
165
|
> `paseo ls --label` / `inspect`, which you relay as `graderModelActual` on `loop_grader_verdict`.
|
|
166
166
|
> Full design: `enact-loop/docs/design/2026-06-22-paseo-verdict-capture.md`.
|
|
167
167
|
|
|
@@ -250,11 +250,15 @@ OpenAI lineage); grade sonnet work with gpt-5.5 / opus / minimax / kimi.
|
|
|
250
250
|
|
|
251
251
|
| Provider | Paseo flag | Notes |
|
|
252
252
|
|---|---|---|
|
|
253
|
-
| `codex` | `--mode auto` | `--mode bypass` is rejected by codex |
|
|
253
|
+
| `codex` | `--mode auto-review` | Routes the grader's eligible `on-request` approvals through codex's auto-reviewer subagent instead of BLOCKING — without it a grader can stall on an approval (e.g. a cargo/network fetch during build verification). `--mode bypass` is rejected by codex |
|
|
254
254
|
| `cursor` | default / agent | `--mode bypass` is a claude mode, NOT cursor's — previously documented wrong |
|
|
255
255
|
| `kimi` | `--mode auto` | Same as codex |
|
|
256
256
|
| `opencode` (minimax M3) | default | No special mode flag needed |
|
|
257
257
|
|
|
258
|
+
Codex mode enum (authoritative): `read-only` · `auto` · `auto-review` · `full-access`. The grader
|
|
259
|
+
stays read-only BY PROMPT; `auto-review` only governs approval handling and composes with
|
|
260
|
+
`--output-schema` verdict capture. Flip a running grader with `paseo agent mode <id> auto-review`.
|
|
261
|
+
|
|
258
262
|
#### Sonnet-executor caveat
|
|
259
263
|
|
|
260
264
|
`cursor` (`cursor/claude-sonnet-4-6`) is NOT model-distinct from a sonnet executor.
|
|
@@ -264,9 +268,10 @@ escalate to opus 4.8 / gpt-5.5 for high-risk judgment. Reserve `cursor` for opus
|
|
|
264
268
|
#### Verdict capture — structured `--output-schema`, not log-scraped
|
|
265
269
|
|
|
266
270
|
Dispatch the grader with:
|
|
267
|
-
`paseo run --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
271
|
+
`paseo run --provider <graderModel> --mode auto-review --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
268
272
|
— stdout is the validated `{verdict, evidence}` object (verified on codex / cursor / opencode / kimi;
|
|
269
|
-
coexists with tool use).
|
|
273
|
+
coexists with tool use). On the codex provider, `--mode auto-review` keeps on-request approvals from
|
|
274
|
+
blocking the grader (read-only stays enforced by prompt). Recover actual grader model + cost via
|
|
270
275
|
`paseo ls -a --label continuation=<cid> --json` + `paseo inspect <id> --json`. Watch live by
|
|
271
276
|
recovering the id by label then `paseo attach <id>`.
|
|
272
277
|
Design doc: `enact-loop/docs/design/2026-06-22-paseo-verdict-capture.md`.
|
|
@@ -37,7 +37,7 @@ disclosure supplement to `SKILL.md`.
|
|
|
37
37
|
| `role` | `"architect" \| "critic" \| "code-reviewer" \| "verifier"` | yes | Determines the subagent type spawned. |
|
|
38
38
|
| `model` | string | recommended | Model ID for the grader. **Must differ from the executor model.** Cross-vendor preferred. Omit only if the harness selects automatically. |
|
|
39
39
|
| `harness` | `"paseo" \| "subagent"` | optional | How to dispatch. Default: `subagent`. Use `paseo` when the grader needs multi-step tool access. |
|
|
40
|
-
| `dispatchTool` | string | optional | Factory tool the driver uses to run a Paseo grader and capture a structured verdict — `"factory_paseo_grader_run"` (runs `paseo run --output-schema --json`, returns `{verdict, evidence}` + `graderModelActual`). Replaces `paseo logs` scraping. |
|
|
40
|
+
| `dispatchTool` | string | optional | Factory tool the driver uses to run a Paseo grader and capture a structured verdict — `"factory_paseo_grader_run"` (runs `paseo run --provider <graderModel> --mode auto-review --output-schema --json`, returns `{verdict, evidence}` + `graderModelActual`). On the codex provider `--mode auto-review` routes on-request approvals through the auto-reviewer subagent so the grader doesn't BLOCK (read-only stays enforced by prompt). Replaces `paseo logs` scraping. |
|
|
41
41
|
| `rounds` | integer | optional | Number of independent grading rounds before aggregating. Default: `1`. |
|
|
42
42
|
| `timeoutMs` | integer | optional | Grader session timeout in ms (default 30 min). Timeout → `grader-unavailable` blocker. |
|
|
43
43
|
|
|
@@ -35,7 +35,10 @@ the factory value-add the generic delegate pattern lacks.
|
|
|
35
35
|
repos, change scope, or split the item. Out-of-scope discoveries → new
|
|
36
36
|
WorkItem (the receiver follows the same rule).
|
|
37
37
|
- **The receiver still drives the loop** (its own contract + cross-vendor
|
|
38
|
-
grader). Handoff delegates the work, not the gates.
|
|
38
|
+
grader). Handoff delegates the work, not the gates. When the receiver
|
|
39
|
+
dispatches a grader via Paseo on the codex provider, it passes
|
|
40
|
+
`--mode auto-review` so the grader's on-request approvals don't block (the
|
|
41
|
+
grader stays read-only by prompt); see `drive-loop`.
|
|
39
42
|
|
|
40
43
|
## Sequence
|
|
41
44
|
|
|
@@ -72,7 +72,8 @@ identity.
|
|
|
72
72
|
|
|
73
73
|
Judgment stages must be graded by a **different model** than the executor (model-distinct, not
|
|
74
74
|
vendor/surface-distinct). The loop rejects a verdict whose grader model, session, or agent equals
|
|
75
|
-
the executor's. Graders are dispatched out-of-session via Paseo `--provider <model>`
|
|
75
|
+
the executor's. Graders are dispatched out-of-session via Paseo `--provider <model>` (use
|
|
76
|
+
`--mode auto-review` so on-request approvals don't block; see Verdict capture) for
|
|
76
77
|
cross-surface grading; in-surface graders just need a supported model that differs from the
|
|
77
78
|
executor's.
|
|
78
79
|
|
|
@@ -143,6 +144,7 @@ loop_grader_dispatch stageId=<id> [model=<grader-model>]
|
|
|
143
144
|
advancing through `fallbackModels` on re-dispatch after a spawn failure
|
|
144
145
|
- requires the resolved model to differ from the executor's (`E_NO_DIVERSITY` otherwise)
|
|
145
146
|
- launches the grader agent (read-only, same cwd) via Paseo `--provider <graderModel>`
|
|
147
|
+
(use `--mode auto-review` so on-request approvals don't block; see Verdict capture)
|
|
146
148
|
- returns the `continuationId` you must pass to step 2
|
|
147
149
|
|
|
148
150
|
**Step 2 — Record the grader's verdict** (driver-relayed is the default):
|
|
@@ -228,9 +230,15 @@ They MUST NOT call `loop_*` management tools (complete, pause, resume, retarget,
|
|
|
228
230
|
or `factory_*` tools. The runtime rejects these calls from grader sessions.
|
|
229
231
|
|
|
230
232
|
**Verdict capture is STRUCTURED, not log-scraped.** Dispatch with:
|
|
231
|
-
`paseo run --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
233
|
+
`paseo run --provider <graderModel> --mode auto-review --output-schema <verdict.json> --json --label continuation=<cid>`
|
|
232
234
|
— stdout is the validated `{verdict, evidence}` object (verified on codex / cursor / opencode / kimi;
|
|
233
|
-
coexists with tool use).
|
|
235
|
+
coexists with tool use). With the codex provider, `--mode auto-review` routes the grader's eligible
|
|
236
|
+
`on-request` approvals through codex's auto-reviewer subagent instead of BLOCKING — without it a
|
|
237
|
+
grader can stall waiting on an approval (e.g. a cargo/network fetch during build verification). The
|
|
238
|
+
grader stays read-only BY PROMPT; auto-review only governs approval handling and composes with the
|
|
239
|
+
`--output-schema` structured verdict capture. Codex mode enum (authoritative): `read-only` · `auto`
|
|
240
|
+
· `auto-review` · `full-access`. Flip a running grader with `paseo agent mode <id> auto-review`.
|
|
241
|
+
Recover actual grader model + cost via
|
|
234
242
|
`paseo ls -a --label continuation=<cid> --json` + `paseo inspect <id> --json`.
|
|
235
243
|
Watch live: recover the id by label then `paseo attach <id>`.
|
|
236
244
|
Fallback only: if structured capture is unavailable, embed evidence inline in the `evidence` field.
|
package/package.json
CHANGED
package/scripts/version-bump.sh
CHANGED
|
@@ -52,6 +52,7 @@ CURRENT_BRANCH=""
|
|
|
52
52
|
INTEGRATION_BRANCH="integration"
|
|
53
53
|
DRY_RUN=false
|
|
54
54
|
DO_PUSH=false
|
|
55
|
+
INTEGRATION_MODE=false
|
|
55
56
|
|
|
56
57
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
57
58
|
usage() {
|
|
@@ -121,6 +122,7 @@ parse_args() {
|
|
|
121
122
|
-f|--file) VERSION_FILE="${2:?'--file requires a path'}"; file_given=true; shift 2 ;;
|
|
122
123
|
-b|--branch) INTEGRATION_BRANCH="${2:?'--branch requires a name'}"; shift 2 ;;
|
|
123
124
|
--push) DO_PUSH=true; shift ;;
|
|
125
|
+
--integration) INTEGRATION_MODE=true; shift ;;
|
|
124
126
|
-n|--dry-run) DRY_RUN=true; shift ;;
|
|
125
127
|
-h|--help) usage ;;
|
|
126
128
|
*) die "Unknown option: '$1'. Run with --help." ;;
|
|
@@ -354,6 +356,19 @@ validate_branch() {
|
|
|
354
356
|
info "Detached HEAD — branch from env: ${branch}"
|
|
355
357
|
fi
|
|
356
358
|
|
|
359
|
+
# Integration mode: the bump runs on the integration build AFTER a PR merges
|
|
360
|
+
# and pushes the bump commit directly back to integration (the build service
|
|
361
|
+
# has "bypass policies when pushing"). The ***NO_CI*** commit message stops it
|
|
362
|
+
# from re-triggering. This avoids the pre-merge feature-branch bump that
|
|
363
|
+
# re-validated the PR (double pipeline run).
|
|
364
|
+
if $INTEGRATION_MODE; then
|
|
365
|
+
[[ "$branch" == "$INTEGRATION_BRANCH" ]] || \
|
|
366
|
+
die "Integration mode expects branch '${INTEGRATION_BRANCH}', currently on '${branch}'."
|
|
367
|
+
ok "On integration branch '${branch}' (integration mode — bump pushes directly)."
|
|
368
|
+
CURRENT_BRANCH="$branch"
|
|
369
|
+
return
|
|
370
|
+
fi
|
|
371
|
+
|
|
357
372
|
[[ "$branch" =~ ^(feat|fix)/ ]] || \
|
|
358
373
|
die "Expected a feat/* or fix/* branch, currently on '${branch}'. Version bump runs on feature branches before PR merge."
|
|
359
374
|
|
|
@@ -432,7 +447,13 @@ main() {
|
|
|
432
447
|
parse_args "$@"
|
|
433
448
|
resolve_manifest
|
|
434
449
|
validate_branch
|
|
435
|
-
|
|
450
|
+
if $INTEGRATION_MODE; then
|
|
451
|
+
# On integration we bump once per merge; the manual-bump guard (compare vs
|
|
452
|
+
# origin/integration) does not apply on integration itself.
|
|
453
|
+
CURRENT_VERSION="$(get_version)" || die "Cannot read current version from manifest."
|
|
454
|
+
else
|
|
455
|
+
validate_version_unchanged # exits 0 silently if version was manually bumped
|
|
456
|
+
fi
|
|
436
457
|
|
|
437
458
|
local new_version
|
|
438
459
|
new_version="$(bump_patch "$CURRENT_VERSION")"
|