gabriel / musehub public
feat BREAKING proposals task/proposal-models-v2 #17 / 19
AI Agent gabriel · 40 days ago · May 8, 2026 · Diff

feat(proposals): Phase 2 — Dependency DAG engine (Kahn's algorithm, cycle detection, merge gating)

proposal_dag.py — pure DAG engine: - ProposalDag: adjacency graph with depends_on/required_by/merged_ids/number_by_id - build_dag: construct from (dependent, dependency) edge pairs - topological_sort: Kahn's algorithm; raises CycleError with cycle_ids on cycle - detect_cycle: bool test without side effects - blocked_by_numbers / blocks_numbers / is_blocked: live-edge queries (merged excluded) - load_dag / load_dag_for_proposals: async DB loaders (2 queries each) - create_dependency_edges: persist edges with pre-write cycle detection

musehub_proposals.py — service integration: - create_proposal: accepts proposal_type, is_draft, merge_strategy, merge_conditions, selective_domains, depends_on; writes dependency edges via create_dependency_edges - _ProposalPrefetch: adds dag field (ProposalDag) - _prefetch_for_batch: Query 3 — load partial DAG for current page - _enrich_one: populates blocked_by/blocks/is_blocked from DAG; respects require_dependency_merged in all_merge_conditions_met; reads domain summary fields from ORM; surfaces proposal_type/is_draft/agent_model/agent_spawned_by - merge_proposal: gates on unmerged hard dependencies before executing merge - _to_proposal_response: surfaces proposal_type, is_draft, merge_conditions, merge_strategy, selective_domains, risk_score, dimensional_risk

proposals.py (API route): forwards all new ProposalCreate fields to service; handles CycleError as 422

tests: 29 tests — pure DAG unit tests + 5 DB integration tests

sha256:9de2441c818e8b0fba09c0fe251e96c1889b9cb287f4317f902ae1868f1cd127 sha
sha256:6841d103d32c259765c0b821f1a6be925d591b3b648bd08f334dac9bc17e3550 snapshot

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:9de2441c818e8b0fba09c0fe251e96c1889b9cb287f4317f902ae1868f1cd127 --body "your comment"