From ac87e109a2ed32a18380e0548c30b59cb24a4584 Mon Sep 17 00:00:00 2001 From: Test Bot Date: Tue, 30 Jun 2026 10:26:40 +0000 Subject: [PATCH 1/2] config: add fs_enabled switch (default off) Introduce CLAYDE_FS_ENABLED so the freeshard issue-grinding loop can be toggled independently of the Pebble webhook. Defaults to False so the loop is opt-in. Covered by a config-default test. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/clayde/config.py | 1 + tests/test_config.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/clayde/config.py b/src/clayde/config.py index 60a2b66..69dc51f 100644 --- a/src/clayde/config.py +++ b/src/clayde/config.py @@ -41,6 +41,7 @@ def effective_git_name(self) -> str: # Orchestrator behaviour loop_interval_s: int = 300 implement_max_retries: int = 3 + fs_enabled: bool = False fs_reviewer: str = "max-tet" fs_parallelism: int = 1 fs_loop_interval_s: int = 120 diff --git a/tests/test_config.py b/tests/test_config.py index 2476d5b..e8f5146 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -158,3 +158,9 @@ def test_kb_path_default(): from clayde.config import Settings s = Settings(_env_file=None) assert s.kb_path == "/home/clayde/knowledge_base" + + +def test_fs_enabled_defaults_off(): + from clayde.config import Settings + s = Settings(_env_file=None) + assert s.fs_enabled is False From 04693abc2e098948defbbf4a66127401f7891348 Mon Sep 17 00:00:00 2001 From: Test Bot Date: Tue, 30 Jun 2026 10:26:40 +0000 Subject: [PATCH 2/2] orchestrator: gate freeshard loop behind fs_enabled _run_with_pebble now only schedules _freeshard_loop when settings.fs_enabled is true; the Pebble webhook server and worker always run. Logs whether the loop is enabled or disabled so the container state is visible at startup. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/clayde/orchestrator.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/clayde/orchestrator.py b/src/clayde/orchestrator.py index d8c4272..460b163 100644 --- a/src/clayde/orchestrator.py +++ b/src/clayde/orchestrator.py @@ -58,7 +58,13 @@ async def worker_task() -> None: kb_path=settings.kb_path, ) - await asyncio.gather(server.serve(), worker_task(), _freeshard_loop(settings)) + tasks = [server.serve(), worker_task()] + if settings.fs_enabled: + log.info("Freeshard loop enabled") + tasks.append(_freeshard_loop(settings)) + else: + log.info("Freeshard loop disabled (CLAYDE_FS_ENABLED not set)") + await asyncio.gather(*tasks) def run_loop():