@ai-dev-methodologies/rlp-desk 0.15.5 → 0.15.6

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/CHANGELOG.md CHANGED
@@ -11,6 +11,22 @@ For pre-v0.15.4 versions, refer to `git log` and individual GitHub release notes
11
11
  - Post-v0.15.6: remove `RLP_LIFECYCLE_METRICS` flag entirely (per plan v3 ADR follow-ups).
12
12
  - Phase D.1 (handoff documents) + Phase D.2 (per-stage agent role specialization) — both deferred per `docs/plans/v0.15.4-release-runbook.md` §7.6.
13
13
 
14
+ ## [0.15.6] — 2026-06-18
15
+
16
+ Patch: CI/test integrity, a codex command-builder security fix, and documentation reconciliation.
17
+
18
+ ### Fixed
19
+ - **Codex worker command no longer passes model/reasoning unquoted.** `buildCodexCmd` now shell-quotes the model and reasoning values (parity with the claude path), closing a shell-injection / argument-splitting hazard when operator-supplied flags reach the shell via tmux send-keys.
20
+ - **Docs now describe the correct execution modes.** The README "execution modes" section conflated the slash-command default (`--mode native`, `Agent()`-based) with the deprecated `--mode agent` (Node CLI). It is rewritten to the accurate three-mode model: `--mode tmux` is the canonical/recommended path, `--mode native` is the default companion for short/interactive use, `--mode agent` is deprecated.
21
+ - **Docs now point to the correct scaffold path.** Getting-started and README referenced the pre-v0.13.0 `.claude/ralph-desk/` project-local path; corrected to `.rlp-desk/` (the global install path `~/.claude/ralph-desk/` is unchanged).
22
+
23
+ ### Changed
24
+ - **CI now runs the behavioral test suites.** A new CI job runs `test:node` + `test:zsh` (previously CI ran only the existence-grep fast gate). First rollout is non-blocking to inventory CI-only flakiness before being made blocking.
25
+ - **The full SV gate verifies the source tree.** `sv-gate:full`'s real-campaign E2E now targets the in-repo `src/` leader (and the correct `.rlp-desk/` sentinel paths) instead of the installed copy, so the gate validates the code being merged.
26
+
27
+ ### Added
28
+ - **ADR-001 (Leader Consolidation).** Records the decision to make `--mode tmux` the canonical production leader, deprecate the `--mode agent` Node-CLI entry point on a dated schedule, and retain `--mode native` as a second-class companion. (Internal; not shipped in the tarball.)
29
+
14
30
  ## [0.15.5] — 2026-06-17
15
31
 
16
32
  Patch: fixes surfaced by a fresh-context live dogfood of the tmux and agent run modes, plus packaging hygiene.
package/README.md CHANGED
@@ -275,45 +275,48 @@ The brainstorm phase evaluates complexity (US count, file scope, logic, dependen
275
275
 
276
276
  ## Execution Modes
277
277
 
278
- RLP Desk supports two execution modes. Both honor the same governance protocol.
279
-
280
- > **v0.14.0 status:** `--mode tmux` (zsh-backed) is the **stable, production** path
281
- > with the full safety net (heartbeat, copy-mode guard, prompt-stall timeout,
282
- > no-progress detection, claude model upgrade chain). `--mode agent` is **alpha**
283
- > and ships without those features — the runner emits a stderr warning when
284
- > agent mode is invoked. For long campaigns and BOS-style autonomous loops,
285
- > use `--mode tmux`.
278
+ RLP Desk has three execution modes, all honoring the same governance protocol. **`--mode tmux` is the canonical, recommended path for any real campaign** (see [ADR-001](docs/plans/adr-001-leader-consolidation.md)).
279
+
280
+ > **Mode status:**
281
+ > - **`--mode tmux`** (zsh-backed) — **stable / production / canonical.** Full safety net (heartbeat,
282
+ > copy-mode guard, prompt-stall timeout, no-progress detection, model upgrade chain). Use this for
283
+ > long campaigns and autonomous loops.
284
+ > - **`--mode native`** (the slash-command **default**) the current Claude Code session is the Leader,
285
+ > dispatching via `Agent()`. Works anywhere (no tmux), good for short/interactive use, but is a
286
+ > second-class companion: no iteration watchdog, turn-based pauses possible. Not for long unattended runs.
287
+ > - **`--mode agent`** (direct Node CLI) — **deprecated alpha**, on a removal schedule (ADR-001). Prints a
288
+ > SCHEDULED-REMOVAL banner. Do not use for new work; prefer `--mode tmux`.
286
289
 
287
290
  ### Environment Compatibility
288
291
 
289
- | Environment | Agent Mode (alpha) | Tmux Mode (stable) |
290
- |-------------|--------------------|--------------------|
291
- | Claude Code (any terminal) | **Works** | Requires tmux |
292
- | Inside tmux session | **Works** | **Works** — panes split in current window |
293
- | Outside tmux session | **Works** | **Rejected** — "start tmux first" |
292
+ | Environment | Native (default) | Tmux (canonical) | Agent (deprecated) |
293
+ |-------------|------------------|------------------|--------------------|
294
+ | Claude Code (any terminal) | **Works** | Requires tmux | Works |
295
+ | Inside tmux session | **Works** | **Works** — panes split in current window | Works |
296
+ | Outside tmux session | **Works** | **Rejected** — "start tmux first" | Works |
294
297
 
295
298
  ### Choosing Your Mode
296
299
 
297
300
  | Need | Use |
298
301
  |------|-----|
299
- | Production / autonomous campaigns | `--mode tmux` (stable) |
300
- | Long campaigns, CI, overnight runs | `--mode tmux` (stable) |
301
- | Quick interactive exploration inside Claude Code | `--mode agent` (alpha Node-native) |
302
+ | Production / autonomous / overnight / CI campaigns | `--mode tmux` (canonical) |
303
+ | Quick interactive exploration, no tmux available | `--mode native` (default) |
304
+ | (legacy direct-Node-CLI workflows) | `--mode agent` — deprecated; migrate to `--mode tmux` |
302
305
 
303
- ### Agent Mode (default) — "Smart Mode"
306
+ ### Native Mode (slash-command default) — "Smart Mode"
304
307
 
305
308
  ```
306
- /rlp-desk run calculator
309
+ /rlp-desk run calculator # defaults to --mode native
307
310
  ```
308
311
 
309
312
  The current Claude Code session acts as the Leader, dispatching Workers and Verifiers via `Agent()`. The Leader is an LLM that dynamically routes models and reasons about context.
310
313
 
311
314
  - Works anywhere — no tmux required
312
315
  - Dynamic model routing — Leader upgrades models on failure
313
-
314
- **Known limitation:** Agent mode runs inside Claude Code's turn-based request-response model. If the LLM outputs text without a tool call, the turn terminates and the loop pauses until the user sends "continue." This is a platform constraint — the protocol mitigates it but cannot guarantee 100% uninterrupted execution. For guaranteed autonomous loops, use tmux mode.
315
316
  - Fix Loop — extracts verifier issues and feeds them back to the next worker
316
- - Best for interactive development
317
+ - Best for short, interactive development
318
+
319
+ **Known limitation:** Native mode runs inside Claude Code's turn-based request-response model. If the LLM outputs text without a tool call, the turn terminates and the loop pauses until the user sends "continue." This is a platform constraint — the protocol mitigates it but cannot guarantee 100% uninterrupted execution. **For guaranteed autonomous loops, use `--mode tmux`.**
317
320
 
318
321
  ### Tmux Mode — "Lean Mode"
319
322
 
@@ -456,7 +459,7 @@ Each conflict is logged as a JSONL entry in `logs/<slug>/conflict-log.jsonl`:
456
459
  After the campaign, review the conflict log to identify systemic issues:
457
460
 
458
461
  ```bash
459
- cat .claude/ralph-desk/logs/<slug>/conflict-log.jsonl | jq .
462
+ cat .rlp-desk/logs/<slug>/conflict-log.jsonl | jq .
460
463
  ```
461
464
 
462
465
  Common patterns:
@@ -471,20 +474,20 @@ After `init`, your project gets this scaffold:
471
474
  ```
472
475
  your-project/
473
476
  ├── .claude/
474
- ├── settings.local.json # rlp-desk permissions (auto-added by init)
475
- └── ralph-desk/
476
- ├── prompts/
477
- ├── <slug>.worker.prompt.md
478
- └── <slug>.verifier.prompt.md
479
- ├── context/
480
- └── <slug>-latest.md
481
- ├── memos/
482
- └── <slug>-memory.md
483
- ├── plans/
484
- ├── prd-<slug>.md
485
- └── test-spec-<slug>.md
486
- └── logs/<slug>/
487
- └── status.json
477
+ └── settings.local.json # rlp-desk permissions (auto-added by init)
478
+ └── .rlp-desk/ # scaffold (v0.13.0+; was .claude/ralph-desk/)
479
+ ├── prompts/
480
+ │ ├── <slug>.worker.prompt.md
481
+ │ └── <slug>.verifier.prompt.md
482
+ ├── context/
483
+ │ └── <slug>-latest.md
484
+ ├── memos/
485
+ │ └── <slug>-memory.md
486
+ ├── plans/
487
+ │ ├── prd-<slug>.md
488
+ │ └── test-spec-<slug>.md
489
+ └── logs/<slug>/
490
+ └── status.json
488
491
  ```
489
492
 
490
493
  ### Local Settings
@@ -495,15 +498,15 @@ your-project/
495
498
  {
496
499
  "permissions": {
497
500
  "allow": [
498
- "Read(.claude/ralph-desk/**)",
499
- "Edit(.claude/ralph-desk/**)",
500
- "Write(.claude/ralph-desk/**)"
501
+ "Read(.rlp-desk/**)",
502
+ "Edit(.rlp-desk/**)",
503
+ "Write(.rlp-desk/**)"
501
504
  ]
502
505
  }
503
506
  }
504
507
  ```
505
508
 
506
- **Why:** Claude Code treats `.claude/` files as sensitive and prompts for confirmation on each access, even with `--dangerously-skip-permissions`. Without these permissions, Worker and Verifier agents are blocked by interactive prompts during automated loop execution.
509
+ **Why:** Since v0.13.0 the scaffold lives at `.rlp-desk/` (outside `.claude/`), so Claude Code's `.claude/` sensitive-file gate no longer blocks Worker/Verifier writes. These explicit `.rlp-desk/**` permissions are a belt-and-suspenders helper that keeps automated loop execution prompt-free.
507
510
 
508
511
  **Note:** `settings.local.json` is local to your machine and is not committed to git. If the file already exists, permissions are merged without overwriting your existing settings.
509
512
 
@@ -64,7 +64,7 @@ On approval, brainstorm offers to run `init` automatically.
64
64
  This creates the scaffold:
65
65
 
66
66
  ```
67
- .claude/ralph-desk/
67
+ .rlp-desk/
68
68
  ├── prompts/
69
69
  │ ├── loop-test.worker.prompt.md
70
70
  │ └── loop-test.verifier.prompt.md
@@ -78,9 +78,12 @@ This creates the scaffold:
78
78
  └── logs/loop-test/
79
79
  ```
80
80
 
81
+ > Since v0.13.0 the scaffold lives at the project-local `.rlp-desk/` (not `.claude/ralph-desk/`),
82
+ > so Claude Code's `.claude/` sensitive-file gate no longer blocks Worker/Verifier writes.
83
+
81
84
  ## Step 5: Customize the PRD
82
85
 
83
- Edit `.claude/ralph-desk/plans/prd-loop-test.md` to define your user stories and acceptance criteria. See [`examples/calculator/`](../examples/calculator/.claude/ralph-desk/plans/prd-loop-test.md) for a complete example.
86
+ Edit `.rlp-desk/plans/prd-loop-test.md` to define your user stories and acceptance criteria. See [`examples/calculator/`](../examples/calculator/.claude/ralph-desk/plans/prd-loop-test.md) for a complete example.
84
87
 
85
88
  Key sections:
86
89
  - **User Stories** with Given/When/Then acceptance criteria, Task Type, and Risk Level
@@ -91,7 +94,7 @@ Key sections:
91
94
 
92
95
  ## Step 6: Define the Test Spec
93
96
 
94
- Edit `.claude/ralph-desk/plans/test-spec-loop-test.md` to specify verification commands:
97
+ Edit `.rlp-desk/plans/test-spec-loop-test.md` to specify verification commands:
95
98
 
96
99
  ```markdown
97
100
  ## Verification Commands
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-dev-methodologies/rlp-desk",
3
- "version": "0.15.5",
3
+ "version": "0.15.6",
4
4
  "description": "Fresh-context iterative loops for Claude Code — autonomous task completion with independent verification",
5
5
  "scripts": {
6
6
  "postinstall": "node scripts/postinstall.js",
@@ -72,14 +72,17 @@ export function buildClaudeCmd(mode, model, options = {}) {
72
72
  export function buildCodexCmd(mode, model, options = {}) {
73
73
  assertTuiMode(mode, 'buildCodexCmd');
74
74
 
75
+ // GAP-2 (audit): shell-quote model + reasoning for parity with buildClaudeCmd.
76
+ // The command string is delivered to a shell (tmux send-keys), so unquoted
77
+ // operator-supplied values were a shell-injection / arg-splitting hazard.
75
78
  const parts = [
76
79
  CODEX_BIN,
77
80
  '-m',
78
- model,
81
+ shellQuote(model),
79
82
  ];
80
83
 
81
84
  if (options.reasoning !== undefined) {
82
- parts.push('-c', `model_reasoning_effort="${options.reasoning}"`);
85
+ parts.push('-c', shellQuote(`model_reasoning_effort="${options.reasoning}"`));
83
86
  }
84
87
 
85
88
  parts.push('--disable', 'plugins', '--dangerously-bypass-approvals-and-sandbox');