fix(dream): gate periodic commits on content changes

This commit is contained in:
Xubin Ren
2026-07-11 11:16:59 +08:00
parent 9adcd3d923
commit c111aaa7ee
3 changed files with 47 additions and 55 deletions
-47
View File
@@ -654,53 +654,6 @@ class TestDreamCommitMessage:
== "dream: x\n\nSOUL.md: +1 -0"
)
def test_productive_gate_skips_commit_when_no_content_change(self, tmp_path):
"""When no content files changed, there should be no auto_commit.
In the old code, auto_commit ran unconditionally
in the finally block; now it only runs when productive is True."""
from unittest.mock import MagicMock
store = MemoryStore(tmp_path)
store.write_soul("# Soul")
store.write_memory("# Memory")
store.git.init()
store.git.auto_commit("initial")
assert store.dream_content_diff() == ""
original = store.git.auto_commit
store.git.auto_commit = MagicMock(wraps=original)
# Exact productive gate pattern from the cron handler (commands.py):
diff_body = store.dream_content_diff()
productive = bool(diff_body) # git is initialized
if productive and store.git.is_initialized():
store.git.auto_commit("dream: periodic memory consolidation")
store.git.auto_commit.assert_not_called()
def test_productive_gate_allows_commit_on_content_change(self, tmp_path):
"""The productive gate must perform auto_commit when content files changed."""
from unittest.mock import MagicMock
store = MemoryStore(tmp_path)
store.write_soul("# Soul")
store.write_memory("# Memory")
store.git.init()
store.git.auto_commit("initial")
store.write_memory("# Memory\n- Research notes")
original = store.git.auto_commit
store.git.auto_commit = MagicMock(wraps=original)
diff_body = store.dream_content_diff()
productive = bool(diff_body)
if productive and store.git.is_initialized():
store.git.auto_commit("dream: periodic memory consolidation")
store.git.auto_commit.assert_called_once()
class TestDreamContentDiff:
"""The ground-truth signal that gates cursor advance and commit messages."""
+30
View File
@@ -155,6 +155,36 @@ def test_disabled_dream_cursor_only_advances_when_behind(tmp_path) -> None:
assert store.get_last_dream_cursor() == 10
def test_commit_dream_changes_skips_noop_run(tmp_path) -> None:
store = MemoryStore(tmp_path)
store.write_soul("# Soul")
store.write_memory("# Memory")
store.git.init()
store.git.auto_commit("initial")
store.git.auto_commit = MagicMock(wraps=store.git.auto_commit)
assert cli_commands._commit_dream_changes(store) is None
store.git.auto_commit.assert_not_called()
def test_commit_dream_changes_commits_real_edits(tmp_path) -> None:
store = MemoryStore(tmp_path)
store.write_soul("# Soul")
store.write_memory("# Memory")
store.git.init()
store.git.auto_commit("initial")
store.write_memory("# Memory\n- Research notes")
store.git.auto_commit = MagicMock(wraps=store.git.auto_commit)
sha = cli_commands._commit_dream_changes(store)
assert sha is not None
store.git.auto_commit.assert_called_once()
message = store.git.auto_commit.call_args.args[0]
assert message.startswith("dream: periodic memory consolidation\n\n")
assert "Research notes" in message
@pytest.fixture
def mock_paths():
"""Mock config/workspace paths for test isolation."""