- **Restore 82 completed tasks** from tasks/complete/ back to tasks/ top level (all <7 days old per the cleanup policy; premature bulk archive was fixed). - **Dashboard: fix scroll-reset on auto-refresh** — renderBoard rebuilds the board via innerHTML every 2s, destroying each column-body's scrollTop. Now snapshots column-body scrollTop + board.scrollLeft + view.scrollTop before rebuild and restores after (matched by PHASE_GROUPS index). - **Dashboard UI additions** (pre-existing unstaged work): approval section cards, transition buttons, inline artifact editor (textarea for writing missing SPEC/VERDICT/etc from the detail modal). - **Bind ornith as Implement model** — config.md: Model explicit to omlx/Ornith-1.0-35B-4bit-mlx, context window 32768. Interactive autopilot already used ornith via opencode default; now explicit. - **Fix cleanup stub** — automaton-cleanup.sh had a stale --project arg pointing at a pytest temp dir (test isolation leak). Rewired to point at ~/.automaton. - **Fix plist-isolation test** — test asserted host plist doesn't exist, but a real install creates it. Now snapshots mtime before run, asserts unchanged after (only a write during the test counts as bleed). - **New Playwright smoke test** (tests/test_dashboard_ui.py) — 2 tests: board renders tasks, column scroll survives auto-refresh tick. Verified the test fails without the scroll fix (scrollTop resets to 0). Skipped via importorskip when playwright is absent (main CI stays green). - **Clarify SI loop scope in README** — new-project onboarding section documents the framework-scoped self-improvement loop and options (leave/pause/create project loop). - **CHANGELOG** documents all changes including the known model-divergence gap (mde tasks marked complete but per-role model binding was never implemented).
2.2 KiB
CODE_REVIEW: move-completed-tasks-to-complete-folder
Reviewed Files
scripts/status.py--_task_dirfallback (lines 246-249),cmd_transitionmove (lines 601-610)tests/test_move_completed.py-- 9 testsCHANGELOG.md-- task 9 entry
Findings
1. _task_dir fallback
The fallback checks base / "complete" / task_name when base / task_name doesn't exist. This is correct. The regular path takes priority over the completed path, so active tasks are always found first. Subtask paths (with "/") are not checked against the completed dir -- this is acceptable because subtasks are always parented to active tasks and are never completed independently.
Verdict: PASS
2. cmd_transition move
The move logic:
- Computes
tasks_root = task_path.parent-- this istasks/for a regular task - Creates
complete_dir = tasks_root / "complete"-- creates if missing - Refuses if
destalready exists - Renames
task_pathtodest
One edge case: if a task is human_intervention → complete, _auto_update_verdict_on_complete modifies VERDICT.md in task_path before the rename. The modified file is then moved to the completed location. Correct.
Verdict: PASS
3. Test coverage
9 tests cover:
_task_dirregular, fallback, and preference (3 tests)_all_task_dirsexclusion (1 test)- Directory move, creation, create-task refusal, transition refusal, state read (5 tests)
Verdict: PASS
4. Edge cases
--auditon completed tasks: Not affected because_all_task_dirsdoesn't scantasks/complete/.- Loop-owned tasks: If a loop's
current_taskpoints to a completed task, the audit at line 954 checks_task_dir(ltask, args.project).exists()which will find the completed task via fallback. Correct. --transitionfrom complete:LEGAL_TRANSITIONS.get("complete", [])returns[], so any transition is refused.--create-taskwith completed name:_task_dirfinds the completed path,task_path.exists()returns True, and the error is printed. Correct.
Verdict: PASS
Summary
All 4 review areas pass. The implementation is minimal, correct, and well-tested. 9 new tests. Full suite: 433 passed.
Overall verdict: APPROVED