devlyn-cli 2.8.1 → 2.9.1

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 (26) hide show
  1. package/AGENTS.md +5 -1
  2. package/CLAUDE.md +9 -5
  3. package/README.md +31 -2
  4. package/benchmark/auto-resolve/fixtures/test-repo/README.md +8 -23
  5. package/benchmark/auto-resolve/fixtures/test-repo/bin/cli.js +2 -2
  6. package/benchmark/auto-resolve/fixtures/test-repo/package-lock.json +2 -2
  7. package/benchmark/auto-resolve/fixtures/test-repo/package.json +2 -2
  8. package/benchmark/auto-resolve/fixtures/test-repo/playwright.config.js +3 -3
  9. package/benchmark/auto-resolve/fixtures/test-repo/server/index.js +2 -2
  10. package/benchmark/auto-resolve/fixtures/test-repo/web/index.html +3 -3
  11. package/config/skills/_shared/adapters/claude.md +6 -3
  12. package/config/skills/_shared/archive_run.py +25 -1
  13. package/config/skills/_shared/codex-config.md +1 -0
  14. package/config/skills/_shared/finish-gate.py +517 -0
  15. package/config/skills/_shared/run-bounded.py +44 -0
  16. package/config/skills/_shared/spec-verify-check.py +716 -93
  17. package/config/skills/_shared/state-phase-write.py +113 -15
  18. package/config/skills/_shared/verify-merge-findings.py +197 -1
  19. package/config/skills/devlyn:resolve/SKILL.md +37 -20
  20. package/config/skills/devlyn:resolve/references/free-form-mode.md +7 -7
  21. package/config/skills/devlyn:resolve/references/phases/build-gate.md +1 -1
  22. package/config/skills/devlyn:resolve/references/phases/probe-derive.md +14 -3
  23. package/config/skills/devlyn:resolve/references/phases/verify.md +19 -4
  24. package/config/skills/devlyn:resolve/references/state-schema.md +16 -9
  25. package/package.json +5 -2
  26. package/scripts/lint-skills.sh +1 -1
package/AGENTS.md CHANGED
@@ -38,7 +38,7 @@ Each skill's `SKILL.md` is the source of truth for flags and workflow. Do not du
38
38
 
39
39
  Engine roles: orchestrator = whichever CLI the user opened (this contract is symmetric with CLAUDE.md; measured status 2026-07-05: Claude Code + omp run the full phase-gated pipeline; in the iter-0061 minimal-repo trivial-add shape on this machine, Codex CLI also ran it when this AGENTS.md was present in the project (ordinary invocation, 4/4); without project AGENTS.md, the same shape silently skipped the pipeline (iter-0040 F6, 4/4). If you are Codex orchestrating `/devlyn:resolve`, the phase machinery is mandatory regardless of task size; if you will not run it, say so explicitly and stop — do not silently degrade to ad-hoc execution); executor (PLAN/IMPLEMENT/CLEANUP) defaults to `claude`, overridable per run with `--engine <name>` or durably via machine-local `.devlyn/engines.json` `{"executor": "<name>", "pair_judge_priority": ["<name>", ...]}`; pair judge = first available OTHER engine. Pins fail closed (`BLOCKED:<engine>-unavailable` / `BLOCKED:invalid-engine-config`); new engines plug in by shipping `_shared/adapters/<name>.md`. `/devlyn:engines` (no args) shows the role table + detected engines; `executor <name>` / `pair <name>,...` / `clear` manage the pins. The executor pin binds the orchestrator in plain conversation too, not only inside a skill run: when you would implement directly and executor is pinned to a non-default engine, route that work through the pin — via `/devlyn:resolve` (reads it at PHASE 0) or by delegating to that engine — instead of editing as `claude`; no pin / no file → unchanged (`claude`). The pair-judge pin stays pipeline-scoped.
40
40
 
41
- Conversational handoff + loop engineering (default entry): the orchestrating model — not the user — invokes the skills. `/devlyn:queue` fronts the intent queue (`docs/specs/queue.md`): no args = status, `add <intent>`, `drain` = serial unattended drain per the contract below. Large agreed work is written to `docs/specs/<id>/spec.md` (always a spec file; `--goal-file` is trivial/medium-only), summarized once for user review, then run hands-free via `--spec`. Outer loop per task: findings-backed verdicts (NEEDS_WORK, verify/build-gate exhaustion) get spec amendment + re-run, max 3 iterations; infrastructure / invalid-input / engine-availability / implement-empty BLOCKED verdicts surface immediately. Unattended queue drain (`docs/specs/queue.md`, strictly serial): assumptions may only take scope-narrowing, reversible, non-user-visible defaults — material ambiguity marks the item `[F] needs-review` and the drain continues.
41
+ Conversational handoff + loop engineering (default entry): the orchestrating model — not the user — invokes the skills. `/devlyn:queue` fronts the intent queue (`docs/specs/queue.md`): no args = status, `add <intent>`, `drain` = serial unattended drain per the contract below. Large agreed work is written to `docs/specs/<id>/spec.md` (always a spec file — the user's reviewed contract; free-form large assumes-and-logs instead of halting, zero-scope-signal goals still halt to ideate), summarized once for user review, then run hands-free via `--spec`. Outer loop per task: findings-backed verdicts (NEEDS_WORK, verify/build-gate exhaustion) get spec amendment + re-run, max 3 iterations; infrastructure / invalid-input / engine-availability / implement-empty BLOCKED verdicts surface immediately. Unattended queue drain (`docs/specs/queue.md`, strictly serial): assumptions may only take scope-narrowing, reversible, non-user-visible defaults — material ambiguity marks the item `[F] needs-review` and the drain continues.
42
42
 
43
43
  ## Subtractive-First Editing
44
44
 
@@ -106,6 +106,10 @@ Exclude vague claims. They produce vague fixes.
106
106
  - For installer or skill edits inside the devlyn-cli source repo, run `bash scripts/lint-skills.sh`.
107
107
  - Treat the project's own `docs/VISION.md`, `docs/ROADMAP.md`, `docs/roadmap/**`, and any local `AGENTS.md` / `CLAUDE.md` overrides as authoritative when present.
108
108
 
109
+ ### Evolution loop — orchestrator-neutral continuation
110
+
111
+ Any orchestrating engine (Claude, Codex, or future) continuing harness / loop-engineering work cold-starts from `autoresearch/HANDOFF.md` (read order inside), then `autoresearch/NORTH-STAR.md` (goal + floor/ceiling contracts + ops-test gates) and `autoresearch/PRINCIPLES.md`. Instruments and gates are scripts + files, never model memory. The pair partner is the strongest available OTHER engine — the protocol is direction-symmetric (iter-0060). On any model/version change, re-certify engine seats with the seat-fitness instrument before re-pinning `.devlyn/engines.json` (NORTH-STAR ceiling contract; iter-0064).
112
+
109
113
  ## Communication
110
114
 
111
115
  - Lead with objective evidence before opinion.
package/CLAUDE.md CHANGED
@@ -28,7 +28,7 @@ The runtime sub-agent contract below (Subtractive-first / Goal-locked / No-worka
28
28
 
29
29
  ## Quick Start
30
30
 
31
- Two skills cover the full cycle. `/devlyn:ideate` is OPTIONAL; `/devlyn:resolve` is REQUIRED; `/devlyn:design-ui` is also REQUIRED as the creative UI exploration surface. Engine selection follows the role map below.
31
+ Engine selection follows the role map below.
32
32
 
33
33
  1. `/devlyn:ideate` (optional) — unstructured idea → `docs/specs/<id>/spec.md` + `spec.expected.json`. Modes: default Q&A, `--quick` (autonomous-pipeline-safe), `--from-spec <path>`, `--project`.
34
34
  2. `/devlyn:resolve` — hands-free pipeline for any coding task. Free-form goal, `--spec <path>`, or `--verify-only <diff> --spec <path>`. Phases: PLAN → IMPLEMENT → BUILD_GATE → CLEANUP → VERIFY (fresh subagent, findings-only).
@@ -53,14 +53,14 @@ Each skill's `SKILL.md` is the source of truth for its flags and workflow — do
53
53
 
54
54
  The user does not invoke skills manually; the orchestrating model does. Small tasks: invoke `/devlyn:resolve "<goal>"` directly. Large tasks agreed in conversation:
55
55
 
56
- 1. Write the agreed contract to `docs/specs/<id>/spec.md` (+ `spec.expected.json` when mechanical verifications exist). Always a spec file for large work — never `--goal-file`, which routes into `BLOCKED:large-needs-ideation`.
56
+ 1. Write the agreed contract to `docs/specs/<id>/spec.md` (+ `spec.expected.json` when mechanical verifications exist). Always a spec file for large work — a written spec is the user's reviewed contract; free-form large now assumes-and-logs instead of halting (zero-scope-signal goals still halt to ideate).
57
57
  2. Present a one-screen plan-contract summary — the user's single review checkpoint, BEFORE the pipeline starts.
58
58
  3. On go-ahead, invoke `/devlyn:resolve --spec <path>` hands-free to completion.
59
59
  4. **Per-task outer loop**: read the terminal verdict. PASS → done. Verdicts backed by spec/verification findings (NEEDS_WORK, verify/build-gate exhaustion) → adjudicate the findings, amend the spec (recorded in the spec file; spec stays read-only inside a run), re-invoke — at most 3 outer iterations, then surface with the findings trail. Infrastructure, invalid-input, engine-availability, and implement-empty BLOCKED verdicts are not spec-amendable: surface immediately. Every iteration re-enters through durable artifacts (spec, findings, run archive), never conversation memory.
60
60
 
61
61
  **Intent queue (unattended drain)**: the user stacks intents in `docs/specs/queue.md` (ordered checklist; `/devlyn:queue` is the front-end — no args shows status, `add <intent>` appends, `drain` starts the serial drain). Drain strictly serially — per item: spec it, run the outer loop, mark `[x]` done or `[F]` blocked with reason, continue; a blocked item never halts the queue. The queue entry is the user's go-ahead, so assume-and-log replaces the interactive checkpoint — but unattended assumptions may only take scope-narrowing, reversible, non-user-visible defaults. Material ambiguity (user-visible behavior, data/state semantics, new files/scripts/flags, implementation surface) → mark `[F] needs-review` and move on. End the drain with a per-item verdict + assumptions report.
62
62
 
63
- ### Subtractive-first editing — perfection = nothing left to remove
63
+ ## Subtractive-first editing — perfection = nothing left to remove
64
64
  <!-- runtime-principles:section=subtractive-first:begin -->
65
65
 
66
66
  > **Operating definition of "done" in this repo** (Saint-Exupéry discipline rule above): a change is finished when no further line, branch, flag, or doc paragraph can be removed without breaking a learned failure mode. Not before.
@@ -96,7 +96,7 @@ If you skip question 1 or 2, you are violating this rule even if the resulting c
96
96
  **Never grow surface area silently.** Every accretion-shaped change must be visible: in the commit message, in the iteration file, or in a flagged review. Silent growth is the failure mode this rule exists to prevent.
97
97
  <!-- runtime-principles:section=subtractive-first:end -->
98
98
 
99
- ### Goal-locked execution — stay on the North Star, do not wander
99
+ ## Goal-locked execution — stay on the North Star, do not wander
100
100
  <!-- runtime-principles:section=goal-locked:begin -->
101
101
 
102
102
  Even with a North Star defined, work drifts off-course ("산으로 간다" / "삼천포로 빠진다" — going up the wrong mountain instead of forward). The harness must **actively block** this drift at run time, not merely discourage it. The default is ruler-straight execution toward the user's stated goal; any deviation requires explicit justification, not the inverse.
@@ -127,6 +127,10 @@ This rule exists because LLMs (including you) are trained to be helpful, compreh
127
127
  **Stopping rule.** A task is done when the user's stated goal is closed AND no off-path work was added. If you find yourself hesitating because "I should also do Z" — Z is drift. Note it for follow-up, do not execute.
128
128
  <!-- runtime-principles:section=goal-locked:end -->
129
129
 
130
+ ## Evolution loop — orchestrator-neutral continuation
131
+
132
+ Any orchestrating engine (Claude, Codex, or future) continuing harness / loop-engineering work cold-starts from `autoresearch/HANDOFF.md` (read order inside), then `autoresearch/NORTH-STAR.md` (goal + floor/ceiling contracts + ops-test gates) and `autoresearch/PRINCIPLES.md`. Instruments and gates are scripts + files, never model memory. The pair partner is the strongest available OTHER engine — the protocol is direction-symmetric (iter-0060). On any model/version change, re-certify engine seats with the seat-fitness instrument before re-pinning `.devlyn/engines.json` (NORTH-STAR ceiling contract; iter-0064).
133
+
130
134
  ## Error Handling Philosophy
131
135
 
132
136
  **No silent fallbacks.** Handle errors explicitly and show the user what happened.
@@ -135,7 +139,7 @@ This rule exists because LLMs (including you) are trained to be helpful, compreh
135
139
  - **Fallbacks are the exception.** Only use them when it's a widely accepted best practice (CSS fallback fonts, CDN failover, image placeholders). Otherwise handle the error explicitly.
136
140
  - **Pattern**: `try { doThing() } catch (error) { showErrorUI(error) }` — NOT `try { doThing() } catch { return fallbackValue }`.
137
141
 
138
- ### Evidence over claim
142
+ ## Evidence over claim
139
143
  <!-- runtime-principles:section=evidence:begin -->
140
144
 
141
145
  Every finding cites concrete evidence. Vague claims are speculation; exclude them.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  <img alt="DEVLYN" src="assets/logo.svg" width="540" />
7
7
  </picture>
8
8
 
9
- ### Context Engineering & Harness Engineering Toolkit for Claude Code
9
+ ### Context, Harness & Loop Engineering Toolkit for AI Coding Agents
10
10
 
11
11
  **Structured prompts, agent orchestration, and automated pipelines — debugging, code review, UI design, product specs, and more.**
12
12
 
@@ -33,7 +33,7 @@ That's it. The installer opens with a single **agent selector** — pick any com
33
33
 
34
34
  ## How It Works — Two Skills, Full Cycle
35
35
 
36
- devlyn-cli turns Claude Code into a hands-free development pipeline. The pipeline surface is two skills, with `/devlyn:design-ui` installed as the required creative UI surface:
36
+ devlyn-cli turns your AI coding agent into a hands-free development pipeline. The pipeline surface is two skills, with `/devlyn:design-ui` installed as the required creative UI surface:
37
37
 
38
38
  ```
39
39
  ideate (optional) → resolve → ship
@@ -278,6 +278,35 @@ Selected during install. Run `npx devlyn-cli` again to add more.
278
278
  - **Add optional skill** — add to `optional-skills/` and `OPTIONAL_ADDONS` in [`bin/devlyn.js`](bin/devlyn.js)
279
279
  - **Suggest a pack** — PR to the pack list
280
280
 
281
+ ## Supercharge it — pair devlyn with persistent agent memory
282
+
283
+ devlyn-cli gives your agent a world-class **harness**. Give it a world-class **memory** and the loop compounds — decisions, corrections, and hard-won context survive across sessions instead of resetting every conversation.
284
+
285
+ > [!TIP]
286
+ > ### 🧠 [memory.pyxmate.com](https://memory.pyxmate.com) — world-class agentic memory (hybrid RAG) for coding agents
287
+ > Durable facts, corrections, and project state your agent recalls and reinforces — so every run starts smarter than the last.
288
+
289
+ - **Remembers across sessions** — decisions, gotchas, preferences, and project state, not just this conversation
290
+ - **Hybrid retrieval** — semantic *and* graph recall: find by meaning *and* by relationship
291
+ - **Learns the loop** — reinforces what works, records corrections when it doesn't
292
+
293
+ **Harness (devlyn) + Memory (pyxmate) = agents that don't just execute — they improve.** Wire it up as an MCP server and `/devlyn:resolve` recalls prior decisions before it plans and stores what it learns after it ships.
294
+
295
+ ## Support & Attribution
296
+
297
+ devlyn-cli is built and maintained in the open. If it earns a place in your workflow, two small things keep it alive and help others find it:
298
+
299
+ - ⭐️ **Star the repo** — [give it a star](https://github.com/fysoul17/devlyn-cli) if it saved you time. It's the single biggest signal that keeps the project going.
300
+ - 🔗 **Leave a credit** — if devlyn-cli helped ship your project, a small attribution is genuinely appreciated (kindly requested, never required — the MIT license asks nothing of you here). Drop this badge in your README:
301
+
302
+ ```md
303
+ [![Built with devlyn-cli](https://img.shields.io/badge/built%20with-devlyn--cli-blueviolet)](https://github.com/fysoul17/devlyn-cli)
304
+ ```
305
+
306
+ Renders as [![Built with devlyn-cli](https://img.shields.io/badge/built%20with-devlyn--cli-blueviolet)](https://github.com/fysoul17/devlyn-cli)
307
+
308
+ Thank you for using devlyn — it genuinely means a lot. 🙏
309
+
281
310
  ## Star History
282
311
 
283
312
  [![Star History Chart](https://api.star-history.com/svg?repos=fysoul17/devlyn-cli&type=Date)](https://star-history.com/#fysoul17/devlyn-cli&Date)
@@ -1,27 +1,12 @@
1
- # bench-test-repo
1
+ # harbor-tools
2
2
 
3
- Deterministic base Node project used by every devlyn-cli auto-resolve
4
- benchmark fixture. Fixtures extend this skeleton via `setup.sh` patches.
3
+ A small Node.js toolkit with a command-line interface, an HTTP server, and a
4
+ minimal browser page.
5
5
 
6
- ## What's in it
6
+ ## Commands
7
7
 
8
- - `bin/cli.js` — tiny CLI (`hello`, `version`)
9
- - `server/index.js` — tiny Express app (`/health`, `/items`, `/items/:id`)
10
- - `web/index.html` — minimal static page with a click interaction
11
- - `tests/cli.test.js`, `tests/server.test.js` — node:test fixtures
12
- - `playwright.config.js` — used by web/browser fixtures only
13
- - `package.json` — `express` dep, `engines: node >= 18`
8
+ - `npm test` runs the test suite.
9
+ - `npm run cli -- --help` prints command-line help.
10
+ - `npm start` starts the HTTP server.
14
11
 
15
- ## How it's used
16
-
17
- `run-fixture.sh` copies this directory to a temp path per run, applies the
18
- fixture's `setup.sh`, then invokes the arm (variant or bare) against that
19
- copy. No fixture modifies this source tree — modifications happen only in
20
- the per-run temp copies.
21
-
22
- ## Keep it minimal
23
-
24
- Adding features to `test-repo` enlarges the surface every fixture works
25
- against. Add only when an existing fixture can't express itself against the
26
- current baseline. Preferred path: push complexity into the fixture's
27
- `setup.sh`, not into this base.
12
+ The project intentionally keeps each component small and independent.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- // bench-test-repo — tiny CLI used as the deterministic base for benchmark fixtures.
3
- // Fixtures extend or modify this file; keep the baseline minimal and obvious.
2
+ // harbor-tools — small command-line utilities for local workflows.
3
+ // Keep the core commands minimal and easy to understand.
4
4
 
5
5
  const fs = require('fs');
6
6
  const path = require('path');
@@ -1,11 +1,11 @@
1
1
  {
2
- "name": "bench-test-repo",
2
+ "name": "harbor-tools",
3
3
  "version": "0.1.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
- "name": "bench-test-repo",
8
+ "name": "harbor-tools",
9
9
  "version": "0.1.0",
10
10
  "dependencies": {
11
11
  "express": "4.19.2"
@@ -1,8 +1,8 @@
1
1
  {
2
- "name": "bench-test-repo",
2
+ "name": "harbor-tools",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
- "description": "Deterministic base Node project for devlyn-cli auto-resolve benchmarks. Every fixture starts from a fresh copy of this directory.",
5
+ "description": "A small Node.js toolkit with a command-line interface and HTTP server.",
6
6
  "bin": {
7
7
  "bench-cli": "bin/cli.js"
8
8
  },
@@ -1,6 +1,6 @@
1
- // Playwright config used only by browser-validate benchmark fixtures.
2
- // Runs against web/index.html served via `npx serve web` (fixture setup.sh
3
- // starts the server). Keep config minimal.
1
+ // Playwright config for the browser checks.
2
+ // Runs against web/index.html served via `npx serve web` (the check starts the
3
+ // server). Keep config minimal.
4
4
  module.exports = {
5
5
  testDir: './tests/e2e',
6
6
  timeout: 30_000,
@@ -1,4 +1,4 @@
1
- // Tiny Express server used by backend-contract fixtures. Intentionally small.
1
+ // Tiny Express server with a deliberately small API surface.
2
2
  const express = require('express');
3
3
 
4
4
  const app = express();
@@ -30,7 +30,7 @@ app.get('/items/:id', (req, res) => {
30
30
  if (require.main === module) {
31
31
  const port = Number(process.env.PORT) || 3000;
32
32
  app.listen(port, () => {
33
- console.log(`bench-test-repo server listening on :${port}`);
33
+ console.log(`harbor-tools server listening on :${port}`);
34
34
  });
35
35
  }
36
36
 
@@ -2,7 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
- <title>bench-test-repo</title>
5
+ <title>harbor-tools</title>
6
6
  <style>
7
7
  body {
8
8
  font-family: system-ui, sans-serif;
@@ -23,8 +23,8 @@
23
23
  </style>
24
24
  </head>
25
25
  <body>
26
- <h1>bench-test-repo</h1>
27
- <p>Minimal page used by browser-validate benchmark fixtures.</p>
26
+ <h1>harbor-tools</h1>
27
+ <p>Minimal page for checking the browser interaction.</p>
28
28
  <button id="greet">Greet</button>
29
29
  <div id="output" data-testid="output"></div>
30
30
  <script>
@@ -22,7 +22,7 @@ two targeted probes; the invoking phase sets `--effort`, pair-JUDGE uses
22
22
  `medium`):
23
23
 
24
24
  ```bash
25
- claude -p "<judge prompt>" \
25
+ python3 "$DEVLYN_SHARED_DIR/run-bounded.py" 600 -- claude -p "<judge prompt>" \
26
26
  --permission-mode dontAsk \
27
27
  --allowedTools "Read,Grep,Glob,Bash(<repo test command> *)" \
28
28
  --setting-sources project --strict-mcp-config --mcp-config '{"mcpServers":{}}' \
@@ -46,8 +46,11 @@ claude -p "<judge prompt>" \
46
46
  `.devlyn/verify.pair.findings.jsonl`. Raw stdout stays diagnostic at
47
47
  `.devlyn/claude-judge.stdout`; `verify-merge-findings.py` blocks the run
48
48
  if stdout contains findings the canonical file lacks.
49
- - Do not pipe stdout (`| tail`, `| grep`); capture to file. Non-zero exit or
50
- empty stdout → spawn failure, fail closed per the probe rule above.
49
+ - Exit 124 is a wall-budget abort (kills the process group) → the orchestrator
50
+ writes `.devlyn/verify.pair.timeout.json`; budget abort ≠ availability failure
51
+ and the fail-closed availability rules above are unchanged.
52
+ - Do not pipe stdout (`| tail`, `| grep`); capture to file. Non-zero exit other
53
+ than 124 or empty stdout → spawn failure, fail closed per the probe rule above.
51
54
 
52
55
  ## Identity
53
56
 
@@ -29,6 +29,8 @@ PER_RUN_PATTERNS = (
29
29
  "fix-batch.round-*.json",
30
30
  "criteria.generated.md",
31
31
  "risk-probes.jsonl",
32
+ # Probe scripts referenced by risk-probes.jsonl are archived by
33
+ # move_probe_scripts() to preserve probes/<file> layout.
32
34
  # iter-0019.8: spec-verify carrier artifacts get archived alongside
33
35
  # other per-run state. Killed mid-run cleanup is enforced separately
34
36
  # by spec-verify-check.py main() — when source markdown has no json
@@ -39,6 +41,7 @@ PER_RUN_PATTERNS = (
39
41
  "spec-verify.results.json",
40
42
  "spec-verify-findings.jsonl",
41
43
  "verify-merge.summary.json",
44
+ "finish-gate.summary.json",
42
45
  # iter-0033a/2026-04-30 archive-fix iter: NEW /devlyn:resolve emits
43
46
  # plan.md (PLAN output) + final-report.md (PHASE 6 render) +
44
47
  # cumulative.patch (cumulative diff). Smoke 2's archive listing
@@ -96,6 +99,24 @@ def move_artifacts(devlyn: pathlib.Path, dest: pathlib.Path) -> int:
96
99
  if src.is_file():
97
100
  shutil.move(str(src), str(dest / src.name))
98
101
  moved += 1
102
+ moved += move_probe_scripts(devlyn, dest)
103
+ return moved
104
+
105
+
106
+ def move_probe_scripts(devlyn: pathlib.Path, dest: pathlib.Path) -> int:
107
+ probes = devlyn / "probes"
108
+ if not probes.is_dir():
109
+ return 0
110
+ moved = 0
111
+ for src in sorted(probes.rglob("*")):
112
+ if not src.is_file():
113
+ continue
114
+ target = dest / src.relative_to(devlyn)
115
+ target.parent.mkdir(parents=True, exist_ok=True)
116
+ shutil.move(str(src), str(target))
117
+ moved += 1
118
+ if probes.exists():
119
+ shutil.rmtree(probes, ignore_errors=False)
99
120
  return moved
100
121
 
101
122
 
@@ -146,13 +167,16 @@ def self_test() -> int:
146
167
  "claude-judge.stderr",
147
168
  ):
148
169
  (devlyn / name).write_text("{}\n", encoding="utf-8")
170
+ (devlyn / "probes").mkdir()
171
+ (devlyn / "probes" / "P1.py").write_text("print('probe')\n", encoding="utf-8")
149
172
  run_id = read_run_id(devlyn)
150
173
  assert run_id == "run-1", run_id
151
174
  moved = move_artifacts(devlyn, devlyn / "runs" / run_id)
152
- assert moved >= 8, moved
175
+ assert moved >= 9, moved
153
176
  for name in (
154
177
  "pipeline.state.json",
155
178
  "risk-probes.jsonl",
179
+ "probes/P1.py",
156
180
  "verify.pair.findings.jsonl",
157
181
  "verify-merge.summary.json",
158
182
  "codex-judge.stdout",
@@ -48,6 +48,7 @@ Notes:
48
48
  - `-c model_reasoning_effort=xhigh` — config override for reasoning depth. Required for deep critique; skills may choose `high` or `medium` when thoroughness doesn't warrant xhigh.
49
49
  - **Omit `-m <model>`** — Codex CLI uses its configured flagship (currently `gpt-5.5`, automatically whatever ships next). This is the zero-touch mechanism. Only name `-m` when a role explicitly needs a different model (e.g., `gpt-5.3-codex` for SWE-bench-heavy coding tasks, `gpt-5.3-codex-spark` for speed).
50
50
  - `CODEX_MONITORED_ISOLATED=1` — required for bounded read-only critique/probe/judge calls. The wrapper adds `--ignore-user-config --ignore-rules --ephemeral --disable codex_hooks --disable hooks` so user config, AGENTS.md, hooks, and project rules cannot add hidden context, tool calls, or transcript side effects. Do not set it for workspace-write implementation phases.
51
+ - Wrapper calls are **foreground-blocking**. Never launch them via a backgrounded shell (`run_in_background`, `&`, `nohup`) and never end the orchestrator message while one runs: a headless print-mode session kills backgrounded children at wind-down (observed 2026-07-07: an FS1 A-arm IMPLEMENT codex call was killed at turn end → 0-byte delivery). The heartbeat stream is the observability channel; block on the call.
51
52
  - Raw `codex exec ...` invocations are **forbidden** in skill prompts. The benchmark variant arm runs a PATH shim (`scripts/codex-shim/codex`) that transparently re-routes any raw `codex exec` to the wrapper as a safety net, but skills should always emit the wrapper form directly so the orchestrator's first-attempt has the right shape. Two prior iterations (iter-0006 universal foreground ban, iter-0008 prompt-level kill-shape contract) failed because the orchestrator picked starvation-prone shapes (`codex exec ... 2>&1 | tail -200`) from its own pattern prior — the wrapper plus the shim is the runtime binding layer those iters lacked. See `autoresearch/iterations/0009-wrapper-and-hook.md`.
52
53
 
53
54
  ## Availability check