run_full_cycle crashes on filtered ideas — add null check and tests
src/project_forge/cron/scheduler.py:run_full_cycle (line 259) calls generate_and_store() then immediately passes its return value to create_github_issue_for_idea() and scaffold_project() without checking for None. generate_and_store() explicitly returns None on four paths: quality review failure (line 146), dedup gate (line 159), router discard (line 177), and router contribute (line 190). Every filtered idea triggers an AttributeError that swallows the exception in the outer try/except of generate_and_store's callers. The fix is a single early-return guard after the generate_and_store call in run_full_cycle, mirroring the pattern already used inside generate_and_store itself.
Feasibility: 0.95
MVP Scope: Edit src/project_forge/cron/scheduler.py: add if idea is None: return None after the generate_and_store call at line 262. Create tests/test_scheduler.py: test that run_full_cycle returns None gracefully when generate_and_store returns None (mock generate_and_store), and test the happy path where an idea passes through to issue creation.
run_full_cycle crashes on filtered ideas — add null check and tests
src/project_forge/cron/scheduler.py:run_full_cycle (line 259) calls generate_and_store() then immediately passes its return value to create_github_issue_for_idea() and scaffold_project() without checking for None. generate_and_store() explicitly returns None on four paths: quality review failure (line 146), dedup gate (line 159), router discard (line 177), and router contribute (line 190). Every filtered idea triggers an AttributeError that swallows the exception in the outer try/except of generate_and_store's callers. The fix is a single early-return guard after the generate_and_store call in run_full_cycle, mirroring the pattern already used inside generate_and_store itself.
Feasibility: 0.95
MVP Scope: Edit src/project_forge/cron/scheduler.py: add
if idea is None: return Noneafter the generate_and_store call at line 262. Create tests/test_scheduler.py: test that run_full_cycle returns None gracefully when generate_and_store returns None (mock generate_and_store), and test the happy path where an idea passes through to issue creation.