- runAgentSession gains an inactivity watchdog (execution.inactivityTimeoutMs,
default 0 = off): when no session event arrives within the window, the
session is aborted (agent abort + bash subprocess kill) with a clear
"inactivity timeout" error
- agent sessions persist to .ralpi/sessions/*.jsonl; resume reopens the
JSONL via SessionManager.open so an interrupted task continues with its
prior conversation instead of restarting from scratch
- progress.json tracks sessionFile per task (persisted at session creation,
so kill/reload mid-run is resumable); the first attempt after resume
reuses it, failover retries stay fresh; corrupt/missing files fall back
to a fresh session with a warning
- bump version to 0.6.0
Emit a ### Changed Files Markdown table (| File | +/− | Type | rows plus
total added/removed) ahead of the raw diff in both committed and
uncommitted review prompts, parsed from the diff via the shared
parseDiff engine. Add an ### Excluded Files (n) section listing filtered
noise (path, +/− counts, reason), and replace byte-truncation of oversized
diffs with a file-list + read instruction when the cleaned diff exceeds
50KB or touches more than 20 files.
Also: distinguish diff-computation failure from genuinely no changes in the
review loop (tri-state result, never treats a broken base ref as a clean
verified task), map critical→blocker in finding severity parsing, inject a
per-review custom focus/instructions section from config, and make the
noise-filter ignore rules project-configurable via review.extraIgnorePatterns
and review.ignorePaths. Add same-model retry before cycling to the next
model in task/follow-up/fix sessions.
The resume prompt counted total/completed from progress.tasks, which only
records TOUCHED tasks (started/completed/failed) — never-started tasks were
silently missing, and file-checkbox completions weren't counted unless
markCompleted had run. With e.g. 10 tasks where 3 completed and 5 untouched,
it showed 3/5 done instead of 3/10 done.
- add countPRDResumeStats (src/utils.ts): total from parseTaskFile of the
PRD source; completed = progress completions ∪ PRD checkbox completions,
deduped by task id; failed from progress. Falls back to touched-task
counts when the source file is missing/unparseable.
- selectPRDToResume (index.ts) uses the helper instead of Object.keys().
- tests/resume-stats.test.ts: 4 regression tests.
Includes pre-existing uncommitted changes: index.ts tab-reformat (matches
src/ style) and package.json version bump 0.4.2 -> 0.4.3.
getCommitRangeDiff and getLatestCommitDiff had maxBuffer set to 1MB.
When a task produced a larger diff (common for 10+ minute tasks),
execSync threw, the catch block returned null, and the review loop
broke immediately with no message — reviews were silently skipped for
larger tasks while smaller tasks reviewed fine.
- Increase maxBuffer to 10MB in both functions (the review prompt
builder already truncates to MAX_DIFF_BYTES = 50KB before sending
to the model, so the full diff in memory is fine)
- Add a diagnostic sendChatMessage when the review loop is skipped
(baseRef undefined or no diff), so silent skips are visible
Previous flow reviewed uncommitted changes, so when a task agent
self-committed its work the review was silently skipped (no uncommitted
changes → review loop body never entered). This caused reviews to fire
inconsistently across tasks.
New review-gated flow (when autoReview is on):
1. Execute task
2. Ensure committed — commit session fallback when the agent didn't
self-commit (handles both self-commit and no-commit agents)
3. Review the COMPLETE task diff (baseRef..HEAD) captured before
execution, so the reviewer sees all commits not just the latest
4. On fail → re-execute with feedback → commit → re-review (same
baseRef, so reviewer sees complete state including fixes)
5. On pass → merge worktree (all changes already committed)
Commit is now mandated when autoReview is on (autoCommit forced true,
not asked at startup). autoCommit only asked when autoReview is off.
Add captureGitHead + getCommitRangeDiff helpers to utils.ts. Switch
review prompt from buildReviewPromptUncommitted to buildReviewPrompt
(reviewing committed changes, not uncommitted).
ralpi's runAgentSession was letting createAgentSession create a fresh
ModelRuntime from models.json only. This excluded extension-registered
providers like neuralwatt, whose streamSimple wrapper handles:
- 429 rate-limit header parsing (concurrent/TPM/admission/RPM)
- Rate-limit error normalization for Pi's retry logic
- Context-overflow error normalization
Without the wrapper, neuralwatt rate-limit and context-overflow errors
surfaced as raw unrecoverable errors instead of being retried by Pi's
built-in retry. Now passes ctx.modelRegistry.runtime (the underlying
ModelRuntime) through to createAgentSession.
- Cap commit diffs in review/commit prompts at 50KB to prevent
context window overflow on follow-up sessions
- Skip skills catalog (noSkills) in commit/review follow-up sessions
for leaner context
- Wire Pi's SettingsManager into runAgentSession so Pi's built-in
retry (exponential backoff, provider retry) applies to ralpi
sessions — removes ralpi's duplicate manual retry loop
- Remove maxRetries/retryDelayMs from ralpi config; rely on Pi's
retry.* settings (with manual override support)
- Remove retries field from progress.json and incrementRetry() from
ProgressTracker
- Add model failover to follow-up sessions (commit/review cycle
through the model pool on connection errors)
- Namespace reflection files by PRD key under
.ralpi/reflections/<prdKey>/ so task sets don't overwrite each
other
- Skip loop-startup prompts for config fields explicitly set in YAML
- Remove (default) annotations from loop options prompts
- Default commitTimeoutMs/reviewTimeoutMs to 0 (inherit Pi defaults)
- Persist loop-active state for widget re-instantiation after session reload
- Add YAML task file parsing and update support via yaml library
- Auto-update PRD source file checkboxes on task status changes
- Add batchRender callback for real-time parallel widget animation
- Normalize tabs-to-spaces indentation across source files
- Use padStart(2, '0') for ID formatting instead of hardcoded prefix
- Enable parallel execution for single-task DAG batches
- DAG-based task execution with dependency resolution
- Persistent progress tracking in .ralph/progress.json
- Reflection system for cross-task context
- Support for Fio README, checkbox, and YAML formats
- Retry with exponential backoff
- Parallel batch execution