Files
g3/g3-plan/completed_todo_2025-12-10_16-55-05.md
Jochen b3ac7746b9 Preserve planner history ordering and add regression guardrails
Ensure planner writes GIT COMMIT entry before invoking git commit.
Keep history entry even when git commit fails, matching summary text.
Document invariant in code comment above write_git_commit call.
Add lightweight test to assert history write precedes git::commit using
test doubles instead of a real git repository.
Investigate git history to find regression and its prior fix, and
record a short root-cause summary outside the codebase.
Reference completed_requirements_2025-12-10_16-55-05.md for details.
Reference completed_todo_2025-12-10_16-55-05.md for task tracking.
2025-12-10 16:55:24 +11:00

58 lines
2.8 KiB
Markdown

## Planner History Handling - Ensure GIT COMMIT Entry Precedes Commit
- [x] Investigation Phase
- [x] Search git history for changes to `stage_and_commit()` function
- [x] Identify commit that introduced the bug (history write AFTER commit)
- [x] Identify commit that fixed the bug (history write BEFORE commit)
- [x] Document findings in summary paragraph
- [x] Verify Current Implementation
- [x] Review current `stage_and_commit()` ordering in planner.rs
- [x] Verify history::write_git_commit is called before git::commit
- [x] Check if there are any other code paths that perform commits
- [x] Add Guardrails
- [x] Add explicit comment above write_git_commit explaining ordering requirement
- [x] Create test to verify history write happens before commit
- [x] Add test with mocked git failure to ensure history entry persists
- [x] Testing
- [x] Write unit test for commit ordering invariant
- [x] Test with intentional git failure scenario
- [x] Verify history entry appears even when commit fails
- [x] Documentation
- [x] Update planner.rs with inline comments
- [x] Document the invariant in code comments
- [x] Create final summary with git history findings
## Investigation Summary
Commit ff8b3e7c7b3bf89c140d24b6f59e443a4f9db0d8 (2025-12-09) initially implemented
planning mode with the history write AFTER the git commit. Commit 633da0d8a685f462c4a74fb5f7b63e4de50596bf
(also 2025-12-09, later the same day) corrected this by moving the history write BEFORE
the commit, with the comment "Log commit to history BEFORE making the commit (provides
audit trail even if commit fails)". The current HEAD maintains this correct ordering.
## Root Cause Analysis
The bug was introduced during the initial implementation of planning mode. The original code
placed the history write after the git commit, which meant that if the commit failed (e.g.,
due to git configuration errors, network issues, or missing staged files), no audit trail
would exist in planner_history.txt. This was quickly identified and fixed the same day.
The fix could potentially be undone during future refactoring if developers are not aware
of the critical ordering requirement. This is why we have added:
1. Comprehensive inline documentation explaining the invariant
2. Historical context in comments referencing the original bug
3. A comprehensive test suite that validates the ordering under various failure scenarios
4. Clear warnings against moving the history write after the commit
## Implementation Complete
All tasks completed successfully:
- Enhanced comments in planner.rs with CRITICAL INVARIANT documentation
- Created comprehensive test suite (5 tests, all passing)
- Tests cover: empty staging, successful commits, failed commits, multiple entries, format validation
- Ordering invariant is now explicitly documented and tested