feat: migrate loop state to .agent/loop-state and enhance re-anchor#65
feat: migrate loop state to .agent/loop-state and enhance re-anchor#65marcusquinn merged 2 commits intomainfrom
Conversation
BREAKING CHANGE: Loop state files moved from .claude/ to .agent/loop-state/ - Migrate state directory from .claude/ to .agent/loop-state/ - Add backward compatibility to check both old and new locations - Enhance loop_generate_reanchor() with single-task extraction (Loom's pin concept) - Add Linkage section to plans-template.md for spec-as-lookup-table pattern - Update all documentation to reflect new paths
WalkthroughMigration of loop state storage from Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @marcusquinn, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request refactors the internal state management for agent loops by moving state files to a new, more conventional directory structure. It also introduces a significant enhancement to the re-anchoring mechanism, guiding the agent to focus on a single, specific task per iteration, thereby improving efficiency and reducing context loss. Additionally, it integrates a new pattern for linking documentation to code, which is designed to enhance AI's ability to accurately reference relevant information. Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Jan 12 15:55:44 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
There was a problem hiding this comment.
Code Review
This pull request successfully migrates the loop state directory from .claude/ to the more conventional .agent/loop-state/, a good move for framework alignment. The inclusion of backward compatibility checks is thoughtful and ensures a smooth transition for existing loops. The enhancement to loop_generate_reanchor() to focus on a single task is a great improvement for reducing context drift in long-running operations.
My review focuses on improving code clarity and reducing duplication. I've noticed that the logic for finding the correct state file (checking new and legacy paths) is repeated across several shell scripts. While the implementation is correct, it can be hard to read and maintain. I've suggested refactoring these blocks to use more standard control structures for better readability and recommended centralizing this logic into a common helper function to reduce code duplication.
| [[ -f "$v2_state" ]] && active_v2_state="$v2_state" | ||
| [[ -z "$active_v2_state" && -f "$v2_state_legacy" ]] && active_v2_state="$v2_state_legacy" | ||
| [[ -f "$legacy_state" ]] && active_legacy_state="$legacy_state" | ||
| [[ -z "$active_legacy_state" && -f "$legacy_state_old" ]] && active_legacy_state="$legacy_state_old" |
There was a problem hiding this comment.
This logic to determine the active state file is a bit difficult to read due to the chained logical operators. Using a standard if/elif structure would improve readability and maintainability.
Additionally, this pattern of finding the correct state file by checking multiple locations is repeated in check_other_loops within this file, and also in session-review-helper.sh and worktree-sessions.sh. To avoid code duplication, consider creating a shared helper function in loop-common.sh that can be used across all these scripts.
| [[ -f "$v2_state" ]] && active_v2_state="$v2_state" | |
| [[ -z "$active_v2_state" && -f "$v2_state_legacy" ]] && active_v2_state="$v2_state_legacy" | |
| [[ -f "$legacy_state" ]] && active_legacy_state="$legacy_state" | |
| [[ -z "$active_legacy_state" && -f "$legacy_state_old" ]] && active_legacy_state="$legacy_state_old" | |
| if [[ -f "$v2_state" ]]; then | |
| active_v2_state="$v2_state" | |
| elif [[ -f "$v2_state_legacy" ]]; then | |
| active_v2_state="$v2_state_legacy" | |
| fi | |
| if [[ -f "$legacy_state" ]]; then | |
| active_legacy_state="$legacy_state" | |
| elif [[ -f "$legacy_state_old" ]]; then | |
| active_legacy_state="$legacy_state_old" | |
| fi |
| if [[ -f "$v2_state" ]]; then | ||
| iteration=$(jq -r '.iteration // 0' "$v2_state" 2>/dev/null || echo "?") | ||
| elif [[ -f "$v2_state_legacy" ]]; then | ||
| iteration=$(jq -r '.iteration // 0' "$v2_state_legacy" 2>/dev/null || echo "?") | ||
| elif [[ -f "$legacy_state" ]]; then | ||
| iteration=$(grep '^iteration:' "$legacy_state" | sed 's/iteration: *//') | ||
| elif [[ -f "$legacy_state_old" ]]; then | ||
| iteration=$(grep '^iteration:' "$legacy_state_old" | sed 's/iteration: *//') | ||
| fi |
There was a problem hiding this comment.
This long if/elif chain for finding the iteration number can be made more structured and readable by using loops to iterate through the possible state file locations. This approach is also more scalable if more legacy paths need to be checked in the future.
| if [[ -f "$v2_state" ]]; then | |
| iteration=$(jq -r '.iteration // 0' "$v2_state" 2>/dev/null || echo "?") | |
| elif [[ -f "$v2_state_legacy" ]]; then | |
| iteration=$(jq -r '.iteration // 0' "$v2_state_legacy" 2>/dev/null || echo "?") | |
| elif [[ -f "$legacy_state" ]]; then | |
| iteration=$(grep '^iteration:' "$legacy_state" | sed 's/iteration: *//') | |
| elif [[ -f "$legacy_state_old" ]]; then | |
| iteration=$(grep '^iteration:' "$legacy_state_old" | sed 's/iteration: *//') | |
| fi | |
| for f in "$v2_state" "$v2_state_legacy"; do | |
| if [[ -f "$f" ]]; then | |
| iteration=$(jq -r '.iteration // 0' "$f" 2>/dev/null || echo "?") | |
| break | |
| fi | |
| done | |
| if [[ "$iteration" == "?" ]]; then | |
| for f in "$legacy_state" "$legacy_state_old"; do | |
| if [[ -f "$f" ]]; then | |
| iteration=$(grep '^iteration:' "$f" | sed 's/iteration: *//') | |
| break | |
| fi | |
| done | |
| fi |
| [[ -f "$ralph_file" ]] && active_file="$ralph_file" | ||
| [[ -z "$active_file" && -f "$ralph_file_legacy" ]] && active_file="$ralph_file_legacy" |
There was a problem hiding this comment.
This logic to determine the active state file uses chained logical operators which can be hard to read. A standard if/elif structure would be more explicit and improve readability. This logic is also duplicated in other scripts; consider creating a common helper function to centralize it.
| [[ -f "$ralph_file" ]] && active_file="$ralph_file" | |
| [[ -z "$active_file" && -f "$ralph_file_legacy" ]] && active_file="$ralph_file_legacy" | |
| if [[ -f "$ralph_file" ]]; then | |
| active_file="$ralph_file" | |
| elif [[ -f "$ralph_file_legacy" ]]; then | |
| active_file="$ralph_file_legacy" | |
| fi |
| [[ -f "$state_file" ]] && active_file="$state_file" | ||
| [[ -z "$active_file" && -f "$state_file_legacy" ]] && active_file="$state_file_legacy" |
There was a problem hiding this comment.
This logic to determine the active state file uses chained logical operators which can be hard to read. A standard if/elif structure would be more explicit and improve readability. This logic is also duplicated in other scripts; consider creating a common helper function to centralize it.
| [[ -f "$state_file" ]] && active_file="$state_file" | |
| [[ -z "$active_file" && -f "$state_file_legacy" ]] && active_file="$state_file_legacy" | |
| if [[ -f "$state_file" ]]; then | |
| active_file="$state_file" | |
| elif [[ -f "$state_file_legacy" ]]; then | |
| active_file="$state_file_legacy" | |
| fi |
🤖 Augment PR SummarySummary: Migrates loop state storage from Changes:
Technical Notes: This is a breaking path change, but the scripts attempt a transition period by checking both directories when reading existing state. 🤖 Was this summary useful? React with 👍 or 👎 |
| if [[ -f "TODO.md" ]]; then | ||
| # Get first unchecked task from In Progress section, or first from Backlog | ||
| next_task=$(awk ' | ||
| /^## In Progress/,/^##/ { if (/^- \[ \]/) { print; exit } } |
| # Check if task is complete | ||
| if [[ -f ".claude/ralph-loop.local.md" ]]; then | ||
| # Check if task is complete (check both new and legacy locations) | ||
| if [[ -f ".agent/loop-state/ralph-loop.local.md" ]] || [[ -f ".claude/ralph-loop.local.md" ]]; then |
There was a problem hiding this comment.
|
|
||
| # Also cancel any sub-loops | ||
| # Also cancel any sub-loops (both new and legacy locations) | ||
| rm -f ".agent/loop-state/ralph-loop.local.md" 2>/dev/null |
- Add loop_generate_guardrails() to transform failures into actionable signs - Include guardrails section in re-anchor prompt (limited to 5 most recent) - Enhance loop_should_block() with gutter warning at 80% threshold - Update ralph-loop.md with Agrim Singh's philosophical framing: - Context pollution prevention (why fresh sessions matter) - Progress persists, failures don't (externalize state) - Guardrails: same mistake never happens twice Based on analysis from @agrimsingh's 'ralph for idiots' explanation.
|
🔍 Code Quality Report�[0;35m[MONITOR]�[0m Code Review Monitoring Report �[0;34m[INFO]�[0m Latest Quality Status: �[0;34m[INFO]�[0m Recent monitoring activity: 📈 Current Quality Metrics
Generated on: Mon Jan 12 16:53:40 UTC 2026 Generated by AI DevOps Framework Code Review Monitoring |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (4)
.agent/scripts/full-loop-helper.sh (1)
43-49: Consider removing or usingLEGACY_STATE_FILE.The static analysis correctly identifies that
LEGACY_STATE_FILEis defined but never used. Thermcommands on lines 647-648 use hardcoded paths instead. Either use the constant or remove it to eliminate dead code.♻️ Option 1: Use the constant
- rm -f ".claude/ralph-loop.local.md" 2>/dev/null - rm -f ".claude/quality-loop.local.md" 2>/dev/null + rm -f "$LEGACY_STATE_FILE" 2>/dev/null + rm -f "${LEGACY_STATE_DIR}/ralph-loop.local.md" 2>/dev/null + rm -f "${LEGACY_STATE_DIR}/quality-loop.local.md" 2>/dev/null♻️ Option 2: Remove unused constant
# Legacy state directory (for backward compatibility during migration) -# shellcheck disable=SC2034 # Defined for documentation, used in cancel checks readonly LEGACY_STATE_DIR=".claude" -readonly LEGACY_STATE_FILE="${LEGACY_STATE_DIR}/full-loop.local.md".agent/scripts/worktree-sessions.sh (1)
118-120: Consider removing unusedstarted_atextraction.The
started_atvariable is extracted on line 120 but never used in the function's output (lines 122-126). This appears to be dead code.♻️ Suggested cleanup
iteration=$(grep '^iteration:' "$active_file" 2>/dev/null | sed 's/iteration: *//') max_iterations=$(grep '^max_iterations:' "$active_file" 2>/dev/null | sed 's/max_iterations: *//') - started_at=$(grep '^started_at:' "$active_file" 2>/dev/null | sed 's/started_at: *//' | sed 's/^"\(.*\)"$/\1/').agent/scripts/quality-loop-helper.sh (2)
267-271: Temp file not cleaned up on sed failure.If
sedfails (e.g., invalid regex or disk full), the script exits due toset -ebut leaves the temp file orphaned. Consider adding error handling or using a trap for cleanup.🛠️ Suggested improvement
update_state() { local field="$1" local value="$2" if [[ ! -f "$STATE_FILE" ]]; then return 1 fi local temp_file="${STATE_FILE}.tmp.$$" - sed "s/^${field}: .*/${field}: ${value}/" "$STATE_FILE" > "$temp_file" - mv "$temp_file" "$STATE_FILE" + if sed "s/^${field}: .*/${field}: ${value}/" "$STATE_FILE" > "$temp_file"; then + mv "$temp_file" "$STATE_FILE" + else + rm -f "$temp_file" + print_error "Failed to update state field: $field" + return 1 + fi return 0 }
231-231: Outdated comment references old state path.The side-effect documentation still mentions
.claude/quality-loop.local.mdbut the actual path is now${STATE_DIR}/quality-loop.local.md(.agent/loop-state/quality-loop.local.md).📝 Suggested fix
-# Side effects: Creates .claude/quality-loop.local.md +# Side effects: Creates ${STATE_DIR}/quality-loop.local.md
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
.agent/scripts/commands/full-loop.md.agent/scripts/commands/postflight-loop.md.agent/scripts/full-loop-helper.sh.agent/scripts/generate-opencode-commands.sh.agent/scripts/loop-common.sh.agent/scripts/quality-loop-helper.sh.agent/scripts/ralph-loop-helper.sh.agent/scripts/session-review-helper.sh.agent/scripts/worktree-sessions.sh.agent/templates/plans-template.md.agent/workflows/ralph-loop.md.agent/workflows/session-review.md.gitignore
🧰 Additional context used
📓 Path-based instructions (1)
.agent/scripts/*.sh
⚙️ CodeRabbit configuration file
.agent/scripts/*.sh: Automation scripts - focus on:
- Reliability and robustness
- Clear logging and feedback
- Proper exit codes
- Error recovery mechanisms
Files:
.agent/scripts/quality-loop-helper.sh.agent/scripts/worktree-sessions.sh.agent/scripts/generate-opencode-commands.sh.agent/scripts/session-review-helper.sh.agent/scripts/full-loop-helper.sh.agent/scripts/ralph-loop-helper.sh.agent/scripts/loop-common.sh
🧠 Learnings (3)
📚 Learning: 2026-01-06T15:57:56.007Z
Learnt from: CR
Repo: marcusquinn/aidevops PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-06T15:57:56.007Z
Learning: Applies to **/.agent/scripts/linters-local.sh : Run quality checks before committing using .agent/scripts/linters-local.sh
Applied to files:
.agent/scripts/quality-loop-helper.sh.agent/workflows/session-review.md
📚 Learning: 2025-12-22T01:24:53.937Z
Learnt from: CR
Repo: marcusquinn/aidevops PR: 0
File: templates/home/AGENTS.md:0-0
Timestamp: 2025-12-22T01:24:53.937Z
Learning: Follow all security protocols and working directory specifications defined in ~/Git/aidevops/AGENTS.md
Applied to files:
.agent/scripts/quality-loop-helper.sh.agent/scripts/full-loop-helper.sh.agent/workflows/ralph-loop.md
📚 Learning: 2025-12-22T01:24:53.937Z
Learnt from: CR
Repo: marcusquinn/aidevops PR: 0
File: templates/home/AGENTS.md:0-0
Timestamp: 2025-12-22T01:24:53.937Z
Learning: Use only the specified working directories: ~/.aidevops/.agent-workspace/work/[project]/ for work files, ~/.aidevops/.agent-workspace/tmp/ for temporary files, and ~/.aidevops/.agent-workspace/memory/ for persistent memory
Applied to files:
.agent/scripts/quality-loop-helper.sh.gitignore.agent/scripts/full-loop-helper.sh
🪛 GitHub Check: Codacy Static Code Analysis
.agent/scripts/full-loop-helper.sh
[warning] 49-49: .agent/scripts/full-loop-helper.sh#L49
LEGACY_STATE_FILE appears unused. Verify use (or export if used externally).
🪛 LanguageTool
.agent/templates/plans-template.md
[grammar] ~39-~39: Ensure spelling is correct
Context: ...te with synonyms - Points to exact file hunks for context - Prevents AI from inventin...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (30)
.agent/templates/plans-template.md (3)
22-22: LGTM! Clear and concise format addition.The Linkage item is well-integrated into the format list and appropriately cross-references the detailed section below.
28-41: Excellent addition for reducing AI hallucination and improving search accuracy.The Linkage section provides a clear, actionable pattern for maintaining explicit file:line anchors. The table format is intuitive, and the benefits are well-articulated. This aligns perfectly with the goal of reducing context drift in iterative loops.
Note: The static analysis tool flagged "inventin" on line 39, but this is a false positive—the actual word "inventing" is correctly spelled.
83-88: LGTM! Template section is well-structured.The Linkage section in the template provides clear example placeholders that guide users on how to populate the lookup table. The consistency between the documentation and template ensures the pattern will be properly adopted.
.gitignore (1)
187-189: LGTM! Clean migration of loop state ignore rule.The new
.agent/loop-state/ignore rule is correctly formatted and properly documented. The old.claude/path (line 182) remains ignored for backward compatibility during the transition, which aligns with the PR's migration strategy..agent/scripts/commands/full-loop.md (1)
66-66: LGTM!Documentation correctly updated to reflect the new state-tracking path
.agent/loop-state/full-loop.local.md, consistent with the migration objective..agent/scripts/commands/postflight-loop.md (1)
74-74: LGTM!Documentation properly updated to the new state-tracking path
.agent/loop-state/quality-loop.local.md..agent/scripts/generate-opencode-commands.sh (1)
1138-1138: LGTM!Generated command documentation correctly references the new state file location
.agent/loop-state/ralph-loop.local.md..agent/workflows/session-review.md (1)
73-75: LGTM!Dual-location compatibility is well-implemented with the location-first approach: new path
.agent/loop-state/ralph-loop.local.mdis checked before falling back to legacy.claude/ralph-loop.local.md. Comment clearly documents the intent..agent/scripts/ralph-loop-helper.sh (3)
45-52: LGTM!State directory constants are well-defined with proper
readonlydeclarations. Theshellcheck disable=SC2034is appropriate sinceRALPH_LEGACY_STATE_FILEis documented for use by sourcing scripts during the transition period.
588-629: Thorough dual-location compatibility in status display.The four-way state file detection covers all migration scenarios well. The preference order (new v2 → legacy v2 → new legacy → old legacy) ensures smooth transition while preserving backward compatibility.
660-679: LGTM!Dual-location detection in
check_other_loopsis consistent withshow_status_all. The cascading fallback logic correctly handles all four state file variants..agent/scripts/loop-common.sh (4)
26-33: LGTM!State directory constants properly migrated with the legacy path preserved for backward compatibility. The
SC2034disable is appropriate for the exported constant.
257-302: Well-designed guardrails system with robust error handling.The function gracefully handles missing memory helper, empty results, and parse errors. The jq transformation with
//fallbacks ensures resilience. Good defensive coding pattern for an automation script.
338-352: Good implementation of the "pin" concept.The single-task extraction from
TODO.mdusing awk is clean and correctly prioritizes In Progress over Backlog. The2>/dev/nullensures graceful handling of malformed files.
624-631: Helpful gutter detection with actionable guidance.The 80% warning threshold provides early indication before blocking. The suggestions (different approach, smaller scope, human review) give users clear options when iteration isn't converging.
.agent/scripts/full-loop-helper.sh (2)
563-567: LGTM!Dual-location check in
cmd_resumecorrectly handles the transition period by checking both new and legacy Ralph loop state files before proceeding.
644-648: LGTM!Comprehensive cleanup removes state files from both new and legacy locations. The
2>/dev/nullappropriately suppresses errors for non-existent files..agent/scripts/session-review-helper.sh (1)
92-108: LGTM! Clean dual-location fallback implementation.The backward compatibility logic correctly prioritizes the new
.agent/loop-state/path while gracefully falling back to the legacy.claude/location. The pattern of using anactive_fileintermediate variable makes the intent clear and keeps the subsequent reads DRY.Minor observation: The
|| echo "0"and|| echo "unlimited"fallbacks on lines 102-103 provide sensible defaults if the grep fails, maintaining robustness..agent/scripts/worktree-sessions.sh (1)
105-130: LGTM! Consistent dual-location pattern with session-review-helper.sh.The implementation mirrors the approach in
session-review-helper.sh, maintaining consistency across the codebase. The logic correctly checks the new location first, then falls back to legacy..agent/workflows/ralph-loop.md (4)
162-174: LGTM! State file documentation updated correctly.The documentation now correctly references the new
.agent/loop-state/ralph-loop.local.mdpath, aligning with the script changes across the PR.
315-362: Excellent documentation of the guardrails philosophy.The new sections on Context Pollution Prevention (lines 315-331), Progress Persistence (lines 333-343), and Guardrails (lines 345-362) provide valuable insight into why Ralph works the way it does. The table comparing context vs files/git is particularly effective at conveying the core insight.
The guardrail example clearly demonstrates the append-only lesson pattern, which should help users understand and extend the system.
404-413: LGTM! Monitoring commands updated consistently.All three monitoring examples now reference the new
.agent/loop-state/path. This is the correct approach for documentation - guide users toward the canonical new location while scripts handle backward compatibility internally.
694-706: LGTM! Full loop state management paths updated.The state management documentation for the full development loop correctly references
.agent/loop-state/full-loop.local.md, maintaining consistency with the Ralph loop state path migration..agent/scripts/quality-loop-helper.sh (7)
676-689: LGTM — Cross-platform date parsing with sensible fallbacks.The dual-path approach (macOS
date -j -fwith Linuxdate -dfallback) and the final|| echo "0"fallback ensures robust handling across platforms without breaking the loop on parse failures. Well implemented.
44-44: LGTM — Stale threshold constant well-integrated.The
DEFAULT_REVIEW_STALE_THRESHOLDis properly defined and used as the default parameter incheck_and_trigger_review(). The 5-minute threshold is reasonable for detecting stale CodeRabbit reviews after a push.
412-424: LGTM — Secretlint integration looks correct.The quoted glob pattern
"**/*"is passed directly to secretlint which handles glob expansion internally. The error suppression with2>/dev/nulland graceful skip when not installed follows good defensive patterns.
34-35: LGTM — State directory migration implemented cleanly.The migration from
.claudeto.agent/loop-stateis straightforward andSTATE_FILEcorrectly derives from the newSTATE_DIR. This aligns with the PR's stated breaking change.
933-944: LGTM — Duration parsing is user-friendly with clear fallback behavior.The regex-based parsing of
Nm,Nh,Ns, and raw seconds with a helpful warning for unrecognized formats demonstrates good UX. Continuing with the default rather than failing is appropriate for a monitoring utility.
296-308: LGTM — Iteration increment handles edge cases correctly.The numeric validation with regex
^[0-9]+$and fallback to0ensures robustness when state is corrupted or missing. Clean implementation.
37-40: Remove unusedLEGACY_STATE_DIRconstant — it's defined but never referenced in this script.The
LEGACY_STATE_DIRconstant is marked with a shellcheck disable for documentation purposes, but unlikefull-loop-helper.shandralph-loop-helper.sh, this script doesn't implement backward compatibility checks. Functions likecreate_state(),get_state_field(), andshow_status()don't attempt to read from the legacy.claude/quality-loop.local.mdlocation. Either implement the fallback checks to use this constant, or remove it to reduce confusion.Likely an incorrect or invalid review comment.



Summary
.claude/to.agent/loop-state/(BREAKING CHANGE)loop_generate_reanchor()with single-task extraction (Loom's "pin" concept)plans-template.mdfor spec-as-lookup-table patternChanges
State Directory Migration
.claude/→.agent/loop-state/aligns with our framework conventionsloop-common.sh,ralph-loop-helper.sh,full-loop-helper.sh,quality-loop-helper.sh.gitignoreupdated to include new pathRe-anchor Enhancement
loop_generate_reanchor()now extracts single next task from TODO.mdPlans Template
Breaking Change
Loop state files moved from
.claude/to.agent/loop-state/. Existing loops will continue to work due to backward compatibility checks, but new loops will use the new location.Testing
Summary by CodeRabbit
Release Notes
New Features
Improvements
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.