"""Master controller — singleton orchestrator. Per plan v9: the master process is a singleton per (owner, repo). It: 1. Runs discovery (Forgejo poll) — Phase 1d-3 2. Drives the state machine: for each non-terminal workflow, advance one step based on the outcome of its latest completed attempt 3. Runs the reaper + pickup guard each tick 4. Performs Forgejo writes (status comments, labels, merges) — Phase 1d-3+ 5. Runs periodic reconciliation (DB↔Forgejo) — Phase 1d-3+ This package ships incrementally. Phase 1d-1 (already shipped) had the state machine + reaper + pickup guard. This Phase 1d-2 adds: - ``outcomes.py``: maps worker output_payload outcomes → state machine events (e.g., implementer outcome='resolved' → 'implementer_pushed'; outcome='rebase-failed' → 'implementer_rebase_failed'). - ``tick.py``: one tick handler — scans recently-completed attempts, applies events to their workflows, emits controller_events. """ from .outcomes import ( EventMapResult, map_outcome_to_event, ) from .tick import ( TickReport, run_tick, ) from .scheduler import ( MAX_TIER, PrefetchCallback, ScheduledAttempt, SchedulerReport, schedule_next_attempts, ) from .discovery import ( DiscoveredEntity, DiscoveryReport, ListIssuesCallback, ListPRsCallback, run_discovery, ) from .forgejo_writes import ( AddLabelCallback, GetLabelsCallback, LabelAdjustResult, ListCommentsCallback, PostCommentCallback, RemoveLabelCallback, StatusCommentResult, adjust_labels, build_marker, comment_has_fingerprint, compute_fingerprint, post_status_comment, ) from .merging import ( MAX_BACKOFF_S, MAX_MERGE_RETRIES, MergeCallback, MergeResponse, MergingHandlerReport, run_merging_tick, ) from .forgejo_http import ( ForgejoCallbacks, build_callbacks, ) from .loop import ( MasterConfig, MasterTickReport, master_main_loop, run_master_iteration, ) __all__ = [ # Discovery "DiscoveredEntity", "DiscoveryReport", "ListIssuesCallback", "ListPRsCallback", "run_discovery", # Outcome mapping "EventMapResult", "map_outcome_to_event", # Scheduler "MAX_TIER", "PrefetchCallback", "ScheduledAttempt", "SchedulerReport", "schedule_next_attempts", # Tick "TickReport", "run_tick", # Main loop "MasterConfig", "MasterTickReport", "master_main_loop", "run_master_iteration", # Forgejo writes "AddLabelCallback", "GetLabelsCallback", "LabelAdjustResult", "ListCommentsCallback", "PostCommentCallback", "RemoveLabelCallback", "StatusCommentResult", "adjust_labels", "build_marker", "comment_has_fingerprint", "compute_fingerprint", "post_status_comment", # MERGING handler "MAX_BACKOFF_S", "MAX_MERGE_RETRIES", "MergeCallback", "MergeResponse", "MergingHandlerReport", "run_merging_tick", # HTTP adapter (Forgejo wiring) "ForgejoCallbacks", "build_callbacks", ]