Files
lucidia-core/duet/arbiter.py
Alexa Louise 6afdb4b148 Initial extraction from blackroad-prism-console
Lucidia Core - AI reasoning engines for specialized domains:
- Physicist (867 lines) - energy modeling, force calculations
- Mathematician (760 lines) - symbolic computation, proofs
- Geologist (654 lines) - terrain modeling, stratigraphy
- Engineer (599 lines) - structural analysis, optimization
- Painter (583 lines) - visual generation, graphics
- Chemist (569 lines) - molecular analysis, reactions
- Analyst (505 lines) - pattern recognition, insights
- Plus: architect, researcher, mediator, speaker, poet, navigator

Features:
- FastAPI wrapper with REST endpoints for each agent
- CLI with `lucidia list`, `lucidia run`, `lucidia api`
- Codex YAML configurations for agent personalities
- Quantum engine extensions

12,512 lines of Python across 91 files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 08:00:53 -06:00

52 lines
1.7 KiB
Python

"""Decision logic for Lucidia reasoning duet rounds."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Literal
from .validator import ValidationResult
Decision = Literal["accept", "revise", "reject"]
Winner = Literal["LLM", "Ψ′"]
@dataclass
class ArbiterDecision:
decision: Decision
winner: Winner
reasons: list[str]
def to_payload(self) -> dict[str, object]:
return {
"decision": self.decision,
"winner": self.winner,
"reasons": list(self.reasons),
}
def decide(validation: ValidationResult) -> ArbiterDecision:
"""Derive an arbiter decision from a validation result."""
reasons: list[str] = []
if not validation.logic_chain_valid or validation.contradictions or validation.banned_fallbacks_detected:
if not validation.logic_chain_valid:
reasons.append("logic_chain_invalid")
if validation.contradictions:
reasons.append("contradictions")
if validation.banned_fallbacks_detected:
reasons.append("banned_fallbacks")
return ArbiterDecision(decision="reject", winner="Ψ′", reasons=reasons or ["validation_failure"])
if validation.missing_premises or validation.missing_compliance_steps:
if validation.missing_premises:
reasons.append("missing_premises")
if validation.missing_compliance_steps:
reasons.append("missing_compliance_steps")
return ArbiterDecision(decision="revise", winner="Ψ′", reasons=reasons)
return ArbiterDecision(decision="accept", winner="LLM", reasons=["passes_all_checks"])
__all__ = ["ArbiterDecision", "decide"]