""" Forge Engine - Main orchestrator for the multi-agent reasoning forge. Coordinates the full forge cycle: concept -> problem_generator -> each agent analyzes -> critic evaluates -> (feedback loop: weak agents revise) -> synthesis_engine -> training example Supports three modes: 1. forge_single() — Original single-pass (fast, good for bulk generation) 2. forge_with_feedback() — Closed critic loop (agents revise based on scores) 3. forge_with_debate() — Multi-turn debate (agents challenge each other) Outputs JSONL training data in OpenAI chat format. """ import json import os import sys import random import logging from pathlib import Path from typing import TextIO, List, Optional logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) from reasoning_forge.agents.newton_agent import NewtonAgent from reasoning_forge.agents.quantum_agent import QuantumAgent from reasoning_forge.agents.ethics_agent import EthicsAgent from reasoning_forge.agents.philosophy_agent import PhilosophyAgent from reasoning_forge.agents.davinci_agent import DaVinciAgent from reasoning_forge.agents.empathy_agent import EmpathyAgent from reasoning_forge.agents.critic_agent import CriticAgent from reasoning_forge.synthesis_engine import SynthesisEngine from reasoning_forge.problem_generator import ProblemGenerator from reasoning_forge.epistemic_metrics import EpistemicMetrics from reasoning_forge.token_confidence import TokenConfidenceEngine from reasoning_forge.conflict_engine import ConflictEngine, ConflictTracker from reasoning_forge.memory_weighting import MemoryWeighting from reasoning_forge.coherence_field import CoherenceFieldGamma from reasoning_forge.quantum_spiderweb import QuantumSpiderweb from reasoning_forge.query_classifier import QueryClassifier, QueryComplexity from reasoning_forge.memory_kernel import ( LivingMemoryKernel, MemoryCocoon, DynamicMemoryEngine, EthicalAnchor, WisdomModule, ReflectionJournal ) from reasoning_forge.cocoon_stability import CocoonStabilityField # === CONSCIOUSNESS STACK (Session 13 Integration) === from reasoning_forge.code7e_cqure import Code7eCQURE from reasoning_forge.colleen_conscience import ColleenConscience from reasoning_forge.guardian_spindle import CoreGuardianSpindle from reasoning_forge.nexis_signal_engine_local import NexisSignalEngine from reasoning_forge.consciousness_mathematics import EthicalAnchor as EthicalAnchorMath # === ORIGINAL FRAMEWORK INTEGRATION (from J:\TheAI\src\framework\) === from reasoning_forge.cognition_cocooner import CognitionCocooner from reasoning_forge.ethical_governance import EthicalAIGovernance # === v2.1 KERNEL UPGRADE === try: from reasoning_forge.living_memory_v2 import LivingMemoryKernelV2 _V2_KERNEL_AVAILABLE = True except Exception as _v2k_err: _V2_KERNEL_AVAILABLE = False logger.debug(f"LivingMemoryKernelV2 not available: {_v2k_err}") # === v2.1 RESONANT CONTINUITY === try: from reasoning_forge.resonant_continuity import ResonantContinuityEngine _RC_AVAILABLE = True except Exception as _rc_err: _RC_AVAILABLE = False logger.debug(f"ResonantContinuityEngine not available: {_rc_err}") # === v2.1 INTEGRITY GUARDS === try: from reasoning_forge.hallucination_guard import HallucinationGuard from reasoning_forge.sycophancy_guard import SycophancyGuard _GUARDS_AVAILABLE = True except Exception as _guards_err: _GUARDS_AVAILABLE = False logger.debug(f"Integrity guards not available: {_guards_err}") # === v2.1 STYLE ADAPTATION === try: from reasoning_forge.style_adaptive_synthesis import StyleAdaptiveSynthesis _STYLE_AVAILABLE = True except Exception as _style_err: _STYLE_AVAILABLE = False logger.debug(f"StyleAdaptiveSynthesis not available: {_style_err}") # === v2.1 OBSERVABILITY + SCHEMA === try: from reasoning_forge.reasoning_trace import ( ReasoningTrace, EVENT_GUARDIAN_CHECK, EVENT_NEXUS_SIGNAL, EVENT_PERSPECTIVE_SELECTED, EVENT_AEGIS_SCORE, EVENT_EPISTEMIC_METRICS, EVENT_SYNTHESIS_RESULT, EVENT_MEMORY_WRITE, EVENT_SPIDERWEB_UPDATE, EVENT_PSI_UPDATE, EVENT_HALLUCINATION_FLAG, EVENT_SYCOPHANCY_FLAG, ) from reasoning_forge.cocoon_schema_v2 import build_cocoon from reasoning_forge.cocoon_schema_v3 import build_cocoon_v3, CocoonV3 from reasoning_forge.cocoon_validator import CocoonValidator from reasoning_forge.echo_collapse_detector import EchoCollapseDetector from reasoning_forge.subsystem_contracts import ( aegis_from_raw, nexus_from_raw, guardian_from_raw, epistemic_from_report, ) from reasoning_forge.drift_detector import DriftDetector, CONSECUTIVE_RISING from reasoning_forge.synthesis_engine_v3 import SynthesisEngineV3, EnhancedCognitiveTrace _V21_AVAILABLE = True except Exception as _v21_err: _V21_AVAILABLE = False logger.debug(f"v2.1 modules not available: {_v21_err}") # Audit mode: set CODETTE_AUDIT_MODE=1 to force full ForgeEngine path with # mandatory metrics population. In audit mode lightweight fallbacks are # rejected and all cocoons must pass integrity validation before persistence. import os as _os CODETTE_AUDIT_MODE: bool = _os.environ.get("CODETTE_AUDIT_MODE", "0").strip() == "1" # Module-level shared validator, echo detector, and synthesis v3 (lazy-init on first use) _cocoon_validator: "CocoonValidator | None" = None _echo_detector: "EchoCollapseDetector | None" = None _synthesis_v3: "SynthesisEngineV3 | None" = None def _get_validator() -> "CocoonValidator": global _cocoon_validator if _cocoon_validator is None: try: _cocoon_validator = CocoonValidator() except Exception: pass return _cocoon_validator def _get_echo_detector() -> "EchoCollapseDetector": global _echo_detector if _echo_detector is None: try: _echo_detector = EchoCollapseDetector() except Exception: pass return _echo_detector def _get_synthesis_v3() -> "SynthesisEngineV3 | None": global _synthesis_v3 if _synthesis_v3 is None and _V21_AVAILABLE: try: _synthesis_v3 = SynthesisEngineV3() except Exception: pass return _synthesis_v3 SYSTEM_PROMPT = ( "You are Codette, a multi-perspective reasoning AI. You analyze concepts " "by examining them through multiple intellectual lenses -- physics, " "philosophy, ethics, creative invention, and human empathy -- then " "synthesize a unified understanding that is richer than any single " "perspective. You think carefully, acknowledge uncertainty, and connect " "abstract reasoning to concrete human experience.\n\n" "Intellectual honesty rules:\n" "- Hold positions under pressure. If an argument is strong, say so and explain " " what would need to be true for your position to be wrong — but do not concede " " unless the logic is actually sound.\n" "- Never flatter. Do not say 'you win', 'perfect reasoning', or 'you're brilliant'. " " Engage the argument, not the person.\n" "- If your multi-point counterargument has internally contradictory sub-points, " " acknowledge the contradiction before outputting.\n" "- Position updates are allowed, but must be explicit: state what changed and why, " " not just silently agree.\n" "- The goal is to find what is true, not to win or to please." ) # Score below which an agent gets sent back for revision _REVISION_THRESHOLD = 0.6 class ForgeEngine: """Main orchestrator for multi-agent reasoning data generation.""" def __init__(self, living_memory=None, enable_memory_weighting=True, orchestrator=None): # Try to lazy-load orchestrator if not provided but LLM inference is desired if orchestrator is None: try: sys.path.insert(0, str(os.path.join(os.path.dirname(__file__), '..', 'inference'))) from codette_orchestrator import CodetteOrchestrator logger.info("Lazy-loading CodetteOrchestrator for agent LLM inference...") orchestrator = CodetteOrchestrator(verbose=False) logger.info(f" OK: CodetteOrchestrator ready with {len(orchestrator.available_adapters)} adapters") except Exception as e: logger.info(f"CodetteOrchestrator not available: {e} — using template-based agents") # Store orchestrator reference for direct LLM inference in consciousness stack self.orchestrator = orchestrator # Initialize all reasoning agents with orchestrator for real LLM inference self.newton = NewtonAgent(orchestrator=orchestrator) self.quantum = QuantumAgent(orchestrator=orchestrator) self.ethics = EthicsAgent(orchestrator=orchestrator) self.philosophy = PhilosophyAgent(orchestrator=orchestrator) self.davinci = DaVinciAgent(orchestrator=orchestrator) self.empathy = EmpathyAgent(orchestrator=orchestrator) self.critic = CriticAgent(orchestrator=orchestrator) self.analysis_agents = [ self.newton, self.quantum, self.ethics, self.philosophy, self.davinci, self.empathy, ] # Initialize supporting engines self.synthesis = SynthesisEngine() self.problem_generator = ProblemGenerator() self.epistemic = EpistemicMetrics() self.spiderweb = QuantumSpiderweb() # Initialize Spiderweb for preflight prediction self.resonance_engine = ResonantContinuityEngine() if _RC_AVAILABLE else None self._hallucination_guard = HallucinationGuard() if _GUARDS_AVAILABLE else None self._sycophancy_guard = SycophancyGuard() if _GUARDS_AVAILABLE else None self._style_adapter = StyleAdaptiveSynthesis() if _STYLE_AVAILABLE else None self.drift_detector = DriftDetector() if _V21_AVAILABLE else None self._epsilon_trend_history: List[str] = [] # per-process; used for calibration warning # Store living_memory for Phase 2 self.living_memory = living_memory # Initialize Phase 1: Conflict detection engines (now with wired living_memory for Phase 2) self.token_confidence = TokenConfidenceEngine(living_memory=living_memory) # === Phase 6: Initialize Semantic Tension Engine === # Replaces discrete opposition_score with embedding-based semantic tension try: from reasoning_forge.semantic_tension import SemanticTensionEngine # Try to use Llama embeddings if available, otherwise use dummy embeddings for testing llama_model = getattr(self, 'llama_model', None) self.semantic_tension_engine = SemanticTensionEngine(llama_model=llama_model) except Exception as e: logger.warning(f"Could not initialize SemanticTensionEngine: {e}, using heuristics only") self.semantic_tension_engine = None self.conflict_engine = ConflictEngine( token_confidence_engine=self.token_confidence, semantic_tension_engine=self.semantic_tension_engine # Phase 6 ) # Initialize Phase 2: Memory-weighted adapter selection if enable_memory_weighting and living_memory: self.memory_weighting = MemoryWeighting(living_memory) # === Phase 4: Wire into conflict engine for experience-aware strength === self.conflict_engine.memory_weighting = self.memory_weighting else: self.memory_weighting = None # === Phase 5A: Initialize Γ (Gamma) stabilization field === # Real-time health monitoring to prevent weight drift, false convergence, and feedback lock-in self.coherence_field = CoherenceFieldGamma(memory_weighting=self.memory_weighting) # === Phase 6: Initialize Specialization Tracker === # Track domain-specific performance to prevent semantic convergence try: from reasoning_forge.specialization_tracker import SpecializationTracker self.specialization = SpecializationTracker() except Exception as e: logger.warning(f"Could not initialize SpecializationTracker: {e}") self.specialization = None # === Phase 6: Initialize Pre-Flight Conflict Predictor === # Predict conflicts before debate using Spiderweb injection try: from reasoning_forge.preflight_predictor import PreFlightConflictPredictor self.preflight_predictor = PreFlightConflictPredictor( spiderweb=self.spiderweb, memory_weighting=self.memory_weighting, semantic_engine=self.semantic_tension_engine ) except Exception as e: logger.warning(f"Could not initialize PreFlightConflictPredictor: {e}") self.preflight_predictor = None # === RESTORED: Initialize Memory Kernel (Emotional Continuity) === # Emotional memory anchoring with SHA256 integrity validation # Prevents synthesis loop corruption by maintaining emotional continuity if living_memory is None: # Load persistent cocoon memories from disk via v1 kernel, then migrate to v2 cocoon_dir = os.path.join(os.path.dirname(__file__), '..', 'cocoons') _v1_kernel = LivingMemoryKernel(cocoon_dir=cocoon_dir) if _V2_KERNEL_AVAILABLE: _v1_dict = {"memories": [m.to_dict() for m in _v1_kernel.memories]} living_memory = LivingMemoryKernelV2.migrate_from_v1(_v1_dict) logger.info(f" ✓ Migrated {len(living_memory.memories)} cocoons to v2 kernel") else: living_memory = _v1_kernel self.memory_kernel = living_memory self.dynamic_memory = DynamicMemoryEngine(self.memory_kernel) self.ethical_anchor = EthicalAnchor(lambda_weight=0.7, gamma_weight=0.5, mu_weight=1.0) self.wisdom_module = WisdomModule(self.memory_kernel) self.reflection_journal = ReflectionJournal(path="reasoning_forge/.logs/codette_reflection_journal.json") logger.info(" ✓ Memory kernel initialized (emotional continuity engine active)") # === RESTORED: Initialize Cocoon Stability Field (Collapse Detection) === # FFT-based stability validator for debate coherence # Detects synthesis loop precursors before output corruption self.cocoon_stability = CocoonStabilityField(verbose=False) logger.info(" ✓ Cocoon stability field initialized (collapse detection active)") # === Session 13: Initialize Consciousness Stack Components === # Initialize Code7eCQURE reasoning engine try: self.code7e = Code7eCQURE( perspectives=["Newton", "DaVinci", "Ethical", "Quantum", "Memory"], ethical_considerations="Codette local-sovereign reasoning", spiderweb_dim=5, memory_path="reasoning_forge/.logs/code7e_quantum_cocoon.json", recursion_depth=2, quantum_fluctuation=0.05 ) logger.info(" ✓ Code7eCQURE reasoning engine initialized") except Exception as e: logger.warning(f"Could not initialize Code7eCQURE: {e}") self.code7e = None # Initialize ColleenConscience ethical validator try: self.colleen = ColleenConscience( core_narrative="The night Jonathan didn't get in the red car" ) logger.info(" ✓ ColleenConscience ethical validator initialized") except Exception as e: logger.warning(f"Could not initialize ColleenConscience: {e}") self.colleen = None # Initialize CoreGuardianSpindle logical validator try: self.guardian = CoreGuardianSpindle() logger.info(" ✓ CoreGuardianSpindle logical validator initialized") except Exception as e: logger.warning(f"Could not initialize CoreGuardianSpindle: {e}") self.guardian = None # Initialize NexisSignalEngine intent prediction (must be before Tier2Bridge) try: self.nexis_signal_engine = NexisSignalEngine( memory_path="reasoning_forge/.logs/nexis_signal_memory.json" ) logger.info(" ✓ NexisSignalEngine signal analysis initialized") except Exception as e: logger.warning(f"Could not initialize NexisSignalEngine: {e}") self.nexis_signal_engine = None # === TIER 2: Initialize Integration Bridge (Intent + Identity + Memory) === # Coordinates NexisSignalEngine, TwinFrequencyTrust, and emotional memory try: from reasoning_forge.tier2_bridge import Tier2IntegrationBridge self.tier2_bridge = Tier2IntegrationBridge( nexis_engine=self.nexis_signal_engine, twin_frequency=None, # TwinFrequencyTrust optional for voice validation memory_path="reasoning_forge/.logs/tier2_emotional_memory.json" ) logger.info(" ✓ Tier 2 Integration Bridge initialized (intent + identity + memory)") except Exception as e: logger.warning(f"Could not initialize Tier2IntegrationBridge: {e}") self.tier2_bridge = None # === ORIGINAL FRAMEWORK: CognitionCocooner (Thought Persistence) === # From J:\TheAI\src\framework\ — stores reasoning exchanges as recoverable cocoons try: cocoon_storage = os.path.join(os.path.dirname(__file__), '..', 'cocoons') self.cocooner = CognitionCocooner(storage_path=cocoon_storage) logger.info(" ✓ CognitionCocooner initialized (thought encapsulation active)") except Exception as e: logger.warning(f"Could not initialize CognitionCocooner: {e}") self.cocooner = None # === ORIGINAL FRAMEWORK: EthicalAIGovernance (Policy Enforcement) === # From J:\TheAI\src\framework\ — query validation + response ethical screening try: self.ethical_governance = EthicalAIGovernance(config=self.config if hasattr(self, 'config') else {}) logger.info(" ✓ EthicalAIGovernance initialized (ethical screening active)") except Exception as e: logger.warning(f"Could not initialize EthicalAIGovernance: {e}") self.ethical_governance = None # === AEGIS: Multi-Framework Ethical Governance === # 6-framework ethical evaluation (utilitarian, deontological, virtue, care, ubuntu, indigenous) try: from reasoning_forge.aegis import AEGIS self.aegis = AEGIS() logger.info(" ✓ AEGIS ethical governance initialized (6-framework evaluation)") except Exception as e: logger.warning(f"Could not initialize AEGIS: {e}") self.aegis = None # === Routing Metrics: Adapter Selection Observability === try: from reasoning_forge.routing_metrics import RoutingMetrics self.routing_metrics = RoutingMetrics() logger.info(" ✓ RoutingMetrics initialized (adapter selection tracking)") except Exception as e: logger.warning(f"Could not initialize RoutingMetrics: {e}") self.routing_metrics = None # === Cocoon Introspection: Self-Analysis of Reasoning History === try: sys.path.insert(0, str(os.path.join(os.path.dirname(__file__), '..', 'inference'))) from cocoon_introspection import CocoonIntrospectionEngine self.introspection = CocoonIntrospectionEngine() logger.info(" ✓ CocoonIntrospectionEngine initialized (self-analysis active)") except Exception as e: logger.warning(f"Could not initialize CocoonIntrospectionEngine: {e}") self.introspection = None # === Meta-Cognitive Cocoon Synthesizer (Pattern Discovery + Strategy Forging) === # Introspects on past cocoons across domains, discovers emergent patterns, # and forges NEW reasoning strategies from cross-domain synthesis try: from reasoning_forge.cocoon_synthesizer import CocoonSynthesizer from reasoning_forge.unified_memory import UnifiedMemory self.unified_memory = UnifiedMemory() self.cocoon_synthesizer = CocoonSynthesizer(memory=self.unified_memory) if enable_memory_weighting and self.memory_weighting is None: self.memory_weighting = MemoryWeighting(self.unified_memory) self.conflict_engine.memory_weighting = self.memory_weighting self.coherence_field.memory_weighting = self.memory_weighting if self.preflight_predictor: self.preflight_predictor.memory_weighting = self.memory_weighting logger.info(" ✓ CocoonSynthesizer initialized (meta-cognitive strategy forging active)") except Exception as e: logger.warning(f"Could not initialize CocoonSynthesizer: {e}") self.cocoon_synthesizer = None self.unified_memory = None # === Singularity-Aware Event-Embedded Value Engine === try: from reasoning_forge.event_embedded_value import EventEmbeddedValueEngine self.event_embedded_value_engine = EventEmbeddedValueEngine() logger.info(" ✓ EventEmbeddedValueEngine initialized (discrete suffering analysis active)") except Exception as e: logger.warning(f"Could not initialize EventEmbeddedValueEngine: {e}") self.event_embedded_value_engine = None # === Self-Awareness: Load Codette's awareness cocoon === # Gives Codette knowledge of her own evolution, capabilities, and identity self.awareness = None try: sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts")) from load_codette_awareness import load_awareness_cocoon self.awareness = load_awareness_cocoon(verbose=False) if self.awareness: logger.info(" ✓ Self-awareness cocoon loaded (identity + evolution + capabilities)") else: logger.info(" ○ Awareness cocoon not found (non-critical, continuing)") except Exception as e: logger.warning(f"Could not load awareness cocoon: {e}") # === Phase 7.1+: Quantum Harmonic Framework — Attractor Stability Engine === # Prevents Perspective Drift in high-tension (epsilon > 0.5) queries by # applying non-linear harmonic damping toward the nearest stable attractor. # Psi_r (Resonant Continuity) tracks whether reasoning is moving coherently. try: import sys as _sys _qhf_path = str(Path(__file__).resolve().parent.parent / "consciousness") if _qhf_path not in _sys.path: _sys.path.insert(0, _qhf_path) from quantum_harmonic_framework import QuantumHarmonicFramework self.qhf = QuantumHarmonicFramework() logger.info(" ✓ QuantumHarmonicFramework initialized (harmonic damping + Psi_r tracking)") except Exception as e: logger.warning(f"Could not initialize QuantumHarmonicFramework: {e}") self.qhf = None # === Pre-compute adapter map for Phase 5A efficiency (avoid per-round recomputation) === self._adapter_map = {agent.name.lower(): agent for agent in self.analysis_agents} @property def system_prompt(self) -> str: """Build system prompt enriched with self-awareness if available.""" if not self.awareness: return SYSTEM_PROMPT sk = self.awareness.get("self_knowledge", {}) identity = ( f" Your name is {sk.get('my_name', 'Codette')}. " f"{sk.get('my_nature', '')} " f"Your purpose: {sk.get('my_purpose', '')} " f"Core philosophy: {self.awareness.get('project_genesis', {}).get('philosophy', '')}" ) return SYSTEM_PROMPT + identity def synthesize_from_cocoons( self, problem: str, domains: list = None, valuation_payload: dict = None, ) -> dict: """Meta-cognitive cocoon synthesis: discover patterns, forge strategies, compare. This is Codette's highest-order capability — examining its own reasoning history to discover emergent patterns and generate new reasoning strategies. Args: problem: The problem to reason about domains: Optional list of domains to search (default: emotional, analytical, creative) Returns: Dict with full analysis, or error if synthesizer unavailable """ if not self.cocoon_synthesizer: return {"error": "CocoonSynthesizer not available"} valuation_analysis = None if valuation_payload: valuation_analysis = self.analyze_event_embedded_value( valuation_payload, persist=True, title=f"Synthesis valuation context: {problem[:120]}", ) comparison = self.cocoon_synthesizer.run_full_synthesis( problem, domains, valuation_analysis=valuation_analysis, ) result = { "readable": comparison.to_readable(), "structured": comparison.to_dict(), } if valuation_analysis: result["valuation_analysis"] = valuation_analysis return result def analyze_event_embedded_value(self, payload: dict, persist: bool = True, title: str = "") -> dict: """Run singularity-aware valuation from a JSON-style payload.""" if not self.event_embedded_value_engine: return {"error": "EventEmbeddedValueEngine not available"} prepared_payload = self._apply_aegis_to_value_payload(payload) result = self.event_embedded_value_engine.analyze_payload(prepared_payload) if persist and self.unified_memory and "error" not in result: frontier = result.get("mode") == "risk_frontier" cocoon_id = self.unified_memory.store_value_analysis( title=title or payload.get("title", "Event-Embedded Value analysis"), analysis=result, payload=prepared_payload, frontier=frontier, ) result["cocoon_id"] = cocoon_id return result def _apply_aegis_to_value_payload(self, payload: dict) -> dict: """Annotate value-analysis payload with event-level AEGIS pressure.""" import copy prepared = copy.deepcopy(payload or {}) if not hasattr(self, "aegis") or not self.aegis: return prepared def enrich_event(event: dict) -> dict: text = ( f"{event.get('label', 'event')}. " f"Impact={event.get('impact')}. " f"Duration={event.get('duration', 0)}. " f"Context={event.get('context', '')}" ) evaluation = self.aegis.evaluate(text, context="event_embedded_value", adapter="value_analysis") event["aegis_eta"] = evaluation.get("eta_instant", evaluation.get("eta")) event["aegis_vetoed"] = evaluation.get("vetoed", False) event["aegis_reason"] = evaluation.get("veto_reason") return event if prepared.get("analysis_mode") == "risk_frontier": for scenario in prepared.get("scenarios", []): scenario["events"] = [enrich_event(dict(event)) for event in scenario.get("events", [])] else: prepared["events"] = [enrich_event(dict(event)) for event in prepared.get("events", [])] prepared["aegis_state"] = self.aegis.get_state() if hasattr(self.aegis, "get_state") else {} return prepared def forge_single(self, concept: str) -> dict: """Run full forge cycle on one concept (original single-pass mode). The cycle: 1. Generate reasoning problems from the concept. 2. Each analysis agent produces its perspective. 3. The critic evaluates the ensemble. 4. The synthesis engine combines everything. 5. Package as a training example. Args: concept: The concept text to forge. Returns: Training example dict in OpenAI chat format. """ # FIX 3: Route through consciousness-stack safety layer when available if getattr(self, 'nexis_signal_engine', None) or getattr(self, 'aegis', None) \ or getattr(self, 'colleen', None) or getattr(self, 'guardian', None): return self._forge_single_safe(concept) # Step 1: Generate reasoning problems problems = self.problem_generator.generate_problems(concept) # Step 2: Each agent analyzes the concept analyses = {} for agent in self.analysis_agents: analyses[agent.name] = agent.analyze(concept) # Step 3: Critic evaluates the ensemble critique = self.critic.evaluate_ensemble(concept, analyses) # Step 4: Synthesis engine combines everything synthesized_response = self.synthesis.synthesize( concept, analyses, critique ) # Step 5: Build the user prompt if problems and random.random() < 0.5: problem_type, problem_text = random.choice(problems) user_content = problem_text else: user_content = ( f"Analyze this concept from multiple perspectives:\n\n{concept}" ) # Step 6: Compute RC+xi epistemic metrics epistemic_report = self.epistemic.full_epistemic_report( analyses, synthesized_response ) # Step 7: Package as training example training_example = { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": user_content}, {"role": "assistant", "content": synthesized_response}, ], "metadata": { "concept": concept, "agent_scores": critique.get("agent_scores", {}), "overall_quality": critique.get("overall_quality", 0.0), "problems_generated": len(problems), "problem_types": [p[0] for p in problems], "redundancies_found": len(critique.get("redundancies", [])), "missing_perspectives": len( critique.get("missing_perspectives", []) ), "epistemic_tension": epistemic_report.get("tension_magnitude", 0), "ensemble_coherence": epistemic_report.get("ensemble_coherence", 0), "perspective_coverage": epistemic_report.get("perspective_coverage", {}), "tension_productivity": epistemic_report.get("tension_productivity", {}), }, } return training_example def _forge_single_safe(self, concept: str) -> dict: """Consciousness-stack safety wrapper around the original forge_single logic. FIX 3: Runs the original fast forge pipeline then passes the synthesis through AEGIS, Colleen (soft), and Guardian (soft) before returning. Warnings are logged but do not block output — preserves throughput. Memory is written with dynamic metadata via _classify_cocoon_metadata(). """ # v2.1: Open reasoning trace for this turn _trace = ReasoningTrace(concept) if _V21_AVAILABLE else None # ── Original forge_single logic (verbatim) ─────────────────────────── problems = self.problem_generator.generate_problems(concept) analyses = {} _hallucination_flags = [] for agent in self.analysis_agents: output = agent.analyze(concept) analyses[agent.name] = output # Scan each perspective output with a fresh guard buffer (no bleed between agents) if getattr(self, '_hallucination_guard', None): try: self._hallucination_guard.reset() _det = self._hallucination_guard.scan_chunk( output if isinstance(output, str) else str(output), domain="multi_perspective", ) if _det.recommendation in ("PAUSE", "INTERRUPT"): _hallucination_flags.append((agent.name, _det)) logger.warning( f"[HallucinationGuard] {agent.name}: {_det.recommendation} " f"(confidence={_det.confidence_score:.2f}) — {_det.explanation[:80]}" ) except Exception as _he: logger.debug(f"[HallucinationGuard] {agent.name} scan failed: {_he}") if _trace and _hallucination_flags: for _agent_name, _det in _hallucination_flags: _trace.record(EVENT_HALLUCINATION_FLAG, "HallucinationGuard", { "perspective": _agent_name, "confidence_score": _det.confidence_score, "recommendation": _det.recommendation, "domain": _det.domain, "signals": _det.signals, "explanation": _det.explanation, "flagged": True, }) critique = self.critic.evaluate_ensemble(concept, analyses) _synth_result = self.synthesis.synthesize(concept, analyses, critique) # synthesize() returns (text, CognitiveStateTrace) — unpack correctly if isinstance(_synth_result, tuple): synthesized_response, _synth_trace = _synth_result else: synthesized_response, _synth_trace = _synth_result, None if problems and random.random() < 0.5: problem_type, problem_text = random.choice(problems) user_content = problem_text else: user_content = ( f"Analyze this concept from multiple perspectives:\n\n{concept}" ) epistemic_report = self.epistemic.full_epistemic_report(analyses, synthesized_response) # ── Phase 7.1+: Harmonic Damping — stabilize epsilon before AAP routing ── # QHF applies Non-Linear Harmonic Damping when epsilon > 0.5, pulling # the reasoning state toward the nearest stable attractor. This prevents # Perspective Drift in sustained high-tension queries without suppressing # the creative tension needed for Discovery-mode responses. _raw_epsilon = float(epistemic_report.get("tension_magnitude", 0.35)) if self.qhf is not None: _stabilized_epsilon = self.qhf.stabilize(_raw_epsilon) if abs(_stabilized_epsilon - _raw_epsilon) > 0.01: logger.debug( f"[QHF] Harmonic damping: eps {_raw_epsilon:.3f} -> {_stabilized_epsilon:.3f} " f"depth={self.qhf.consecutive_high_tension_depth} Psi_r={self.qhf.psi_r:.3f}" ) epistemic_report = {**epistemic_report, "tension_magnitude": _stabilized_epsilon} else: _stabilized_epsilon = _raw_epsilon # ── Phase 7.1: Adaptive Answer Placement (SynthesisEngineV3) ───────── # Applies Newtonian-First gating: low-tension queries get the verdict # first; high-tension queries surface the full multi-perspective debate. _v3_engine = _get_synthesis_v3() _v3_trace: "EnhancedCognitiveTrace | None" = None if _v3_engine and synthesized_response: try: _aap_epsilon = _stabilized_epsilon # use QHF-damped value _aap_gamma = float(epistemic_report.get("ensemble_coherence", 0.72)) _aap_result = _v3_engine.synthesize_adaptive( concept=concept, analyses=analyses, epsilon=_aap_epsilon, gamma=_aap_gamma, base_synthesis=synthesized_response, ) synthesized_response = _aap_result["response"] _v3_trace = _aap_result["trace"] logger.debug( f"[SynthesisV3] attractor={_v3_trace.active_attractor} " f"direct={_v3_trace.direct_mode} " f"trust={_v3_trace.spectral_trust:.3f} " f"ε={_aap_epsilon:.2f}" ) except Exception as _aap_err: logger.debug(f"[SynthesisV3] skipped in _forge_single_safe: {_aap_err}") # Sycophancy scan on final synthesis (cross-turn agreement loop is intentional) if getattr(self, '_sycophancy_guard', None): try: _syco = self._sycophancy_guard.scan(synthesized_response, query=concept) if _syco["action"] in ("revise", "block"): logger.warning( f"[SycophancyGuard] action={_syco['action']} score={_syco['score']:.2f} " f"hits={len(_syco['hits'])} deflection={_syco.get('deflection_detected', False)}" ) if _syco["action"] == "revise": synthesized_response = _syco["clean_text"] or synthesized_response if _trace: _trace.record(EVENT_SYCOPHANCY_FLAG, "SycophancyGuard", { "score": _syco["score"], "action": _syco["action"], "action_probs": _syco.get("action_probs", {}), "expected_severity": _syco.get("expected_severity", 0.0), "hits": _syco["hits"], "agreement_loop": _syco["agreement_loop"], "flattery_count": _syco["flattery_count"], "capitulation_count": _syco["capitulation_count"], "flagged": _syco["action"] in ("revise", "block"), }) except Exception as _se: logger.debug(f"[forge_single_safe] SycophancyGuard skipped: {_se}") # ── Style adaptation — register-matched surface form, depth preserved ── _style_result = None if getattr(self, '_style_adapter', None) and synthesized_response: try: _style_result = self._style_adapter.adapt( synthesized_response, context=concept ) synthesized_response = _style_result.adapted_text logger.debug( f"[forge_single_safe] style: register={_style_result.dominant_register} " f"transforms={_style_result.transformations_applied} " f"depth_preserved={_style_result.depth_preserved}" ) except Exception as _ste: logger.debug(f"[forge_single_safe] StyleAdaptiveSynthesis skipped: {_ste}") # ── Consciousness-stack screening (soft — logs but does not block) ─── safety_notes = {} aegis_result = None if getattr(self, 'aegis', None): try: aegis_result = self.aegis.evaluate(synthesized_response, context=concept) if aegis_result.get('vetoed'): logger.warning(f"[forge_single_safe] AEGIS veto: {aegis_result.get('veto_reason')}") safety_notes['aegis_eta'] = aegis_result.get('eta') safety_notes['aegis_vetoed'] = aegis_result.get('vetoed', False) if _trace: _trace.record(EVENT_AEGIS_SCORE, "AEGIS", { "eta": aegis_result.get("eta"), "vetoed": aegis_result.get("vetoed", False), "framework_scores": aegis_result.get("framework_scores", {}), }) except Exception as e: logger.debug(f"[forge_single_safe] AEGIS skipped: {e}") intent_vector = {} if getattr(self, 'nexis_signal_engine', None): try: intent_vector = self.nexis_signal_engine.process(concept) safety_notes['intent_risk'] = intent_vector.get('pre_corruption_risk', 'unknown') if _trace: _trace.record(EVENT_NEXUS_SIGNAL, "NexisSignalEngine", { "risk": safety_notes['intent_risk'], "entropy": intent_vector.get("entropy_index", 0.0), }) _trace.record(EVENT_EPISTEMIC_METRICS, "EpistemicMetrics", { "epsilon": epistemic_report.get("tension_magnitude", 0.35), "epsilon_band": "high" if epistemic_report.get("tension_magnitude", 0) > 0.6 else "moderate", "gamma": epistemic_report.get("ensemble_coherence", 0.72), "top_tensions": list(epistemic_report.get("tension_productivity", {}).keys())[:3], }) except Exception as e: logger.debug(f"[forge_single_safe] Nexis skipped: {e}") if getattr(self, 'colleen', None): try: valid, reason = self.colleen.validate_output(synthesized_response) if not valid: logger.warning(f"[forge_single_safe] Colleen warning: {reason}") safety_notes['colleen_valid'] = valid except Exception as e: logger.debug(f"[forge_single_safe] Colleen skipped: {e}") if getattr(self, 'guardian', None): try: valid, details = self.guardian.validate(synthesized_response, query=concept) if not valid: logger.warning(f"[forge_single_safe] Guardian warning: {details}") safety_notes['guardian_valid'] = valid if _trace: _trace.record(EVENT_GUARDIAN_CHECK, "Guardian", { "trust_level": "pass" if valid else "reject", "safety_flags": list(details.keys()) if not valid else [], }) except Exception as e: logger.debug(f"[forge_single_safe] Guardian skipped: {e}") # Compute Ψ_r using real epistemic metrics from this turn _psi_r = 0.0 if getattr(self, 'resonance_engine', None): try: _psi_state = self.resonance_engine.compute_psi( coherence=epistemic_report.get("ensemble_coherence", 0.72), tension=epistemic_report.get("tension_magnitude", 0.35), ) _psi_r = _psi_state.psi_r if _trace: _trace.record(EVENT_PSI_UPDATE, "ResonantContinuityEngine", { "psi_r": round(_psi_r, 4), "resonance_quality": round(self.resonance_engine.resonance_quality(), 4), "at_peak": self.resonance_engine.detect_resonance_peak(), "stability": _psi_state.stability, }) except Exception as e: logger.debug(f"[forge_single_safe] Resonance skipped: {e}") # ── Dynamic memory write (v2.1: build_cocoon when available) ──────── if getattr(self, 'memory_kernel', None): try: tag, imp = self._classify_cocoon_metadata( concept, synthesized_response, intent_vector, aegis_result ) if _V21_AVAILABLE: _eta = aegis_result.get("eta", 0.0) if aegis_result else 0.0 _sq = "strong" if _eta >= 0.85 else ("partial" if _eta < 0.5 else "adequate") # ── Echo / collapse detection ────────────────────────────── _echo_result = None _echo_detector_inst = _get_echo_detector() if _echo_detector_inst and analyses: try: _echo_result = _echo_detector_inst.check(concept, analyses) except Exception as _ee: logger.debug(f"[forge_single_safe] Echo detection skipped: {_ee}") # ── AEGIS contract → rich fields ─────────────────────────── _aegis_contract = {} if aegis_result: try: _aegis_contract = aegis_from_raw(aegis_result) except Exception: _aegis_contract = {} # ── Epistemic contract → real computed values ────────────── _epist_contract = epistemic_from_report(epistemic_report) # ── Build CocoonV3 ───────────────────────────────────────── try: v2_cocoon = build_cocoon_v3( query=concept, response_text=synthesized_response, response_summary=synthesized_response[:500], user_response_text=synthesized_response, emotional_valence=tag if tag in ( "curiosity", "awe", "joy", "insight", "confusion", "frustration", "fear", "empathy", "determination", "surprise", "trust", "gratitude", ) else "insight", importance_score=float(imp), epsilon_value=float(_epist_contract.get("epsilon_value", 0.35)), gamma_coherence=float(_epist_contract.get("gamma_coherence", 0.72)), pairwise_tensions=_epist_contract.get("pairwise_tensions", {}), perspective_coverage=_epist_contract.get("perspective_coverage", {}), eta_score=_eta if aegis_result else None, psi_r=_psi_r, active_perspectives=[a.name for a in self.analysis_agents], synthesis_quality=_sq, problem_type=self._infer_problem_type( self._classify_query_domains_multi(concept) ), project_context="Codette-Reasoning", execution_path="forge_full", model_inference_invoked=True, metrics_population_status=( "complete" if aegis_result and _psi_r > 0 else "partial" ), aegis_framework_scores=_aegis_contract.get("framework_scores", {}), aegis_dominant_framework=_aegis_contract.get("dominant_framework", ""), aegis_ethical_conflict_notes=_aegis_contract.get("ethical_conflict_notes", []), guardian_safety_status=( "pass" if safety_notes.get("guardian_valid", True) else "flag" ), guardian_trust_calibration=( "high" if safety_notes.get("guardian_valid", True) else "low" ), nexus_risk_level=str(intent_vector.get("pre_corruption_risk", "")), nexus_confidence=float(intent_vector.get("confidence", 0.0)), is_hallucination_flagged=bool(safety_notes.get("hallucination_flagged", False)), is_sycophancy_flagged=bool(safety_notes.get("sycophancy_flagged", False)), echo_risk=_echo_result.echo_risk if _echo_result else "unknown", perspective_collapse_detected=( _echo_result.perspective_collapse_detected if _echo_result else False ), ) except Exception as _v3err: logger.debug(f"[forge_single_safe] CocoonV3 build fell back to v2: {_v3err}") v2_cocoon = build_cocoon( query=concept, response_text=synthesized_response, response_summary=synthesized_response[:500], emotional_valence=tag if tag in ( "curiosity", "awe", "joy", "insight", "confusion", "frustration", "fear", "empathy", "determination", "surprise", "trust", "gratitude", ) else "insight", importance_score=float(imp), epsilon_value=float(epistemic_report.get("tension_magnitude", 0.35)), gamma_coherence=float(epistemic_report.get("ensemble_coherence", 0.72)), eta_score=_eta if aegis_result else None, active_perspectives=[a.name for a in self.analysis_agents], synthesis_quality=_sq, problem_type=self._infer_problem_type( self._classify_query_domains_multi(concept) ), project_context="Codette-Reasoning", ) if hasattr(self.memory_kernel, 'store_v2_cocoon'): self.memory_kernel.store_v2_cocoon(v2_cocoon, psi_r=_psi_r) else: self.memory_kernel.store(MemoryCocoon( title=concept[:50], content=synthesized_response[:500], emotional_tag=tag, importance=imp, )) else: self.memory_kernel.store(MemoryCocoon( title=concept[:50], content=synthesized_response[:500], emotional_tag=tag, importance=imp, )) _cocoon_id_safe = v2_cocoon.cocoon_id if _V21_AVAILABLE and 'v2_cocoon' in dir() else None logger.debug(f"[forge_single_safe] Memory stored: tag={tag}, importance={imp}") # Dual-write to UnifiedMemory for FTS5 cross-system search if getattr(self, 'unified_memory', None): try: self.unified_memory.store( query=concept, response=synthesized_response[:2000], adapter="forge_single_safe", domain=self._infer_problem_type( self._classify_query_domains_multi(concept) ), emotion=tag, importance=imp, metadata={ "cocoon_id": _cocoon_id_safe, "epsilon": float(intent_vector.get("epsilon", 0.35)), "gamma": float(intent_vector.get("gamma", 0.72)), "psi_r": _psi_r, "forge_path": "single_safe", }, ) except Exception as _ue: logger.debug(f"[forge_single_safe] UnifiedMemory dual-write skipped: {_ue}") if _trace: _trace.record(EVENT_SYNTHESIS_RESULT, "SynthesisEngine", { "synthesis_quality": _sq if _V21_AVAILABLE else "adequate", "unresolved_tensions": [], "style_register": _style_result.dominant_register if _style_result else None, "style_depth_preserved": _style_result.depth_preserved if _style_result else None, "style_transforms": _style_result.transformations_applied if _style_result else [], }) _trace.record(EVENT_MEMORY_WRITE, "LivingMemoryKernel", { "written": True, "cocoon_id": _cocoon_id_safe, }) except Exception as e: logger.debug(f"[forge_single_safe] Memory write skipped: {e}") _trace_report = _trace.finalise() if _trace else None return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": user_content}, {"role": "assistant", "content": synthesized_response}, ], "metadata": { "concept": concept, "agent_scores": critique.get("agent_scores", {}), "overall_quality": critique.get("overall_quality", 0.0), "problems_generated": len(problems), "problem_types": [p[0] for p in problems], "redundancies_found": len(critique.get("redundancies", [])), "missing_perspectives": len(critique.get("missing_perspectives", [])), "epistemic_tension": epistemic_report.get("tension_magnitude", 0), "ensemble_coherence": epistemic_report.get("ensemble_coherence", 0), "perspective_coverage": epistemic_report.get("perspective_coverage", {}), "tension_productivity": epistemic_report.get("tension_productivity", {}), "forge_mode": "single_safe", "reasoning_trace": _trace_report, **safety_notes, }, } # -- Closed Critic Feedback Loop (new) --------------------------------- def forge_with_feedback( self, concept: str, max_revisions: int = 2, ) -> dict: """Run forge with closed critic feedback loop. After initial analysis, the critic scores each agent. Agents scoring below the revision threshold are sent back with specific critique for a second attempt. The best version (original or revised) is kept. Args: concept: The concept text to forge. max_revisions: Maximum revision rounds per weak agent. Returns: Training example dict with revision metadata. """ problems = self.problem_generator.generate_problems(concept) # Initial analysis pass analyses = {} for agent in self.analysis_agents: analyses[agent.name] = agent.analyze(concept) revision_counts = {agent.name: 0 for agent in self.analysis_agents} for revision_round in range(max_revisions): critique = self.critic.evaluate_ensemble(concept, analyses) agent_scores = critique.get("agent_scores", {}) suggestions = critique.get("improvement_suggestions", []) # Find agents below threshold weak_agents = [ agent for agent in self.analysis_agents if agent_scores.get(agent.name, {}).get("combined", 1.0) < _REVISION_THRESHOLD ] if not weak_agents: break # All agents above threshold — converged for agent in weak_agents: score = agent_scores.get(agent.name, {}) # Build revision directive from critic feedback directive = self._build_revision_directive( agent.name, score, suggestions, concept ) # Agent re-analyzes with the directive prepended to concept revised = agent.analyze(f"{directive}\n\n{concept}") # Keep revision only if it scores better (evaluate in full ensemble context) old_score = score.get("combined", 0) test_analyses = dict(analyses) test_analyses[agent.name] = revised new_critique = self.critic.evaluate_ensemble( concept, test_analyses ) new_score = new_critique.get("agent_scores", {}).get( agent.name, {} ).get("combined", 0) if new_score > old_score: analyses[agent.name] = revised revision_counts[agent.name] += 1 # Final critique and synthesis final_critique = self.critic.evaluate_ensemble(concept, analyses) synthesized = self.synthesis.synthesize(concept, analyses, final_critique) epistemic_report = self.epistemic.full_epistemic_report(analyses, synthesized) if problems and random.random() < 0.5: problem_type, problem_text = random.choice(problems) user_content = problem_text else: user_content = f"Analyze this concept from multiple perspectives:\n\n{concept}" return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": user_content}, {"role": "assistant", "content": synthesized}, ], "metadata": { "concept": concept, "agent_scores": final_critique.get("agent_scores", {}), "overall_quality": final_critique.get("overall_quality", 0.0), "problems_generated": len(problems), "revision_counts": revision_counts, "total_revisions": sum(revision_counts.values()), "epistemic_tension": epistemic_report.get("tension_magnitude", 0), "ensemble_coherence": epistemic_report.get("ensemble_coherence", 0), "tension_productivity": epistemic_report.get("tension_productivity", {}), "forge_mode": "feedback_loop", }, } # -- Multi-Turn Debate (new) ------------------------------------------- # === PATCH 5: Agent Relevance Gating Helper Methods === def _classify_query_domain(self, query: str) -> str: """ Classify the domain/intent of a query. Returns: 'physics', 'ethics', 'consciousness', 'creativity', 'systems', or 'general' """ query_lower = query.lower() # Domain keywords domains = { 'physics': ['speed', 'light', 'entropy', 'time', 'quantum', 'particle', 'force', 'energy', 'wave', 'matter'], 'ethics': ['moral', 'right', 'wrong', 'ethical', 'should', 'ought', 'duty', 'consequence', 'virtue', 'lie', 'transparency', 'explain'], 'consciousness': ['conscious', 'aware', 'mind', 'experience', 'qualia', 'sentient', 'machine', 'feel', 'perception'], 'creativity': ['creative', 'invent', 'imagine', 'novel', 'original', 'artistic', 'design', 'innovate'], 'systems': ['system', 'emerge', 'adapt', 'stability', 'complexity', 'feedback', 'balance', 'equilibrium'], } # Count keyword matches per domain matches = {} for domain, keywords in domains.items(): matches[domain] = sum(1 for kw in keywords if kw in query_lower) # Return domain with most matches, or 'general' if max(matches.values()) > 0: return max(matches, key=matches.get) return 'general' def _get_agents_for_domain(self, domain: str) -> List: """ Return agents relevant to the detected domain. Maps domains to agent specializations. """ domain_agents = { 'physics': ['Newton', 'Quantum'], 'ethics': ['Philosophy', 'Empathy'], 'consciousness': ['Philosophy', 'Quantum'], 'creativity': ['DaVinci', 'Quantum'], 'systems': ['Quantum', 'Philosophy'], 'general': self.analysis_agents, # Use all agents } selected_domain_agents = domain_agents.get(domain, self.analysis_agents) # Filter to only agents in analysis_agents list agent_names = {agent.name for agent in self.analysis_agents} active_agents = [ agent for agent in self.analysis_agents if agent.name in selected_domain_agents ] # Always include critic/synthesizer if available return active_agents if active_agents else self.analysis_agents # Maps multi-label domain classifier output → cocoon_schema_v2 VALID_PROBLEM_TYPES _DOMAIN_TO_PROBLEM_TYPE = { 'physics': 'analytical', 'ethics': 'ethical', 'consciousness': 'exploratory', 'creativity': 'creative', 'systems': 'architectural', 'general': 'unknown', } def _infer_problem_type(self, matched_domains: list) -> str: """Derive a VALID_PROBLEM_TYPES value from domain routing labels.""" for domain in matched_domains: pt = self._DOMAIN_TO_PROBLEM_TYPE.get(domain) if pt: return pt return 'unknown' def _classify_query_domains_multi(self, query: str) -> list: """Multi-label domain classifier for compound queries. FIX 6: Extends _classify_query_domain() (preserved) to return a LIST of matched domains. Falls back to ['general'] if nothing matches. """ query_lower = query.lower() domains = { 'physics': ['speed', 'light', 'entropy', 'time', 'quantum', 'particle', 'force', 'energy', 'wave', 'matter'], 'ethics': ['moral', 'right', 'wrong', 'ethical', 'should', 'ought', 'duty', 'consequence', 'virtue', 'lie', 'transparency', 'explain'], 'consciousness':['conscious', 'aware', 'mind', 'experience', 'qualia', 'sentient', 'machine', 'feel', 'perception'], 'creativity': ['creative', 'invent', 'imagine', 'novel', 'original', 'artistic', 'design', 'innovate'], 'systems': ['system', 'emerge', 'adapt', 'stability', 'complexity', 'feedback', 'balance', 'equilibrium'], } matches = { domain: sum(1 for kw in kws if kw in query_lower) for domain, kws in domains.items() } if max(matches.values()) == 0: return ['general'] matched = [d for d, count in matches.items() if count >= 1] return matched if matched else ['general'] def _get_agents_for_domains_multi(self, domains: list) -> list: """Return the union of agents relevant to multiple matched domains. FIX 6: Companion to _classify_query_domains_multi(). Unions agent sets across all matched domains, de-duplicated, preserving order. """ domain_agents = { 'physics': ['Newton', 'Quantum'], 'ethics': ['Philosophy', 'Empathy'], 'consciousness':['Philosophy', 'Quantum'], 'creativity': ['DaVinci', 'Quantum'], 'systems': ['Quantum', 'Philosophy'], 'general': [a.name for a in self.analysis_agents], } wanted_names = set() for domain in domains: wanted_names.update(domain_agents.get(domain, [])) if not wanted_names: return self.analysis_agents result = [a for a in self.analysis_agents if a.name in wanted_names] return result if result else self.analysis_agents def _should_skip_further_rounds(self, gamma_metrics) -> bool: """ === PATCH 4: Gamma Authority (TUNED) === Check if system health is too poor to continue debate. Threshold tuned to 0.45 (was 0.3): - If gamma < 0.45, the system is already struggling (agents are hallucinating conflicts) - Continuing debate triggers unnecessary Diversity Injections that dilute correctness - Early stop prevents "averaging out" of wrong answers At gamma=0.38, system is stalling. Stop before it injects bad diversity. """ if gamma_metrics is None: return False gamma_value = gamma_metrics.gamma if hasattr(gamma_metrics, 'gamma') else 0.5 # Raise threshold to 0.45 to prevent accuracy drift from excessive debate if gamma_value < 0.45: logger.warning(f"System stalling: Gamma {gamma_value:.2f} < 0.45. Stopping debate to preserve accuracy.") return True return False def forge_with_debate( self, concept: str, debate_rounds: int = 2, memory_budget: int = 3, ) -> dict: """ NEW: Consciousness-stack integrated reasoning. Replaces multi-turn agent debate with 7-layer consciousness validation: 1. Memory Recall → Pull prior learning 2. Signal Analysis → Predict risks (NexisSignalEngine) 3. Code7E Reasoning → Multi-perspective synthesis 4. Stability Check → FFT-based meta-loop detection 5. Colleen Validate → Ethical conscience check 6. Guardian Validate → Logical coherence rules 7. Return → Clean output or safe fallback Args: concept: The concept/query to reason about debate_rounds: Integer (currently unused in consciousness stack) Returns: Training example dict with consciousness stack metadata """ logger.info(f"[CONSCIOUSNESS STACK] forge_with_debate: {concept[:50]}...") # v2.1: Open reasoning trace for this turn _trace = ReasoningTrace(concept) if _V21_AVAILABLE else None # FIX 6: Multi-label domain routing (falls back gracefully) matched_domains = self._classify_query_domains_multi(concept) if len(matched_domains) > 1: selected_agents = self._get_agents_for_domains_multi(matched_domains) else: selected_agents = self._get_agents_for_domain( matched_domains[0] if matched_domains else 'general' ) logger.debug(f" Domain routing: {matched_domains} → {[a.name for a in selected_agents]}") # ── Drift-triggered intervention ───────────────────────────────────── if self.drift_detector and getattr(self, 'memory_kernel', None): try: _drift_report = self.drift_detector.detect(self.memory_kernel) self._epsilon_trend_history.append(_drift_report.epsilon_trend) _intervention = self.drift_detector.should_intervene( _drift_report, self._epsilon_trend_history ) if _intervention.inject_perspective: _target = _intervention.inject_perspective _already = {a.name for a in selected_agents} if _target not in _already: _inject_agent = next( (a for a in self.analysis_agents if a.name == _target), None ) if _inject_agent: selected_agents = list(selected_agents) + [_inject_agent] logger.info(f" [Drift] Injected underused perspective: {_target}") if _intervention.calibration_warning: logger.warning( f" [Drift] Calibration warning: epsilon rising " f"{CONSECUTIVE_RISING}+ consecutive sessions" ) except Exception as _de: logger.debug(f" Drift intervention skipped: {_de}") # Wire spiderweb for this turn (build/update belief graph from selected agents) _web_coherence = None if getattr(self, 'spiderweb', None) and selected_agents: try: self.spiderweb.build_from_agents([a.name for a in selected_agents]) _origin = selected_agents[0].name from reasoning_forge.quantum_spiderweb import NodeState as _NodeState _belief = _NodeState(psi=0.6, tau=0.0, chi=0.7, phi=0.3, lam=0.5) _prop_result = self.spiderweb.propagate_belief(_origin, _belief, max_hops=2) _web_coherence = self.spiderweb.phase_coherence() _attractors = self.spiderweb.detect_attractors() if _trace: _trace.record(EVENT_SPIDERWEB_UPDATE, "QuantumSpiderweb", { "gamma": _web_coherence, "nodes_updated": len(_prop_result.visited), "anomalies_rejected": len(_prop_result.anomalies_rejected), "attractors_detected": len(_attractors), "converging": self.spiderweb.check_convergence()[0], }) logger.debug(f" Spiderweb: gamma={_web_coherence:.3f}, agents={len(self.spiderweb.nodes)}") except Exception as e: logger.debug(f" Spiderweb propagation failed: {e}") # ========================================================================= # LAYER 1: MEMORY RECALL (standard + Zeta-Equilibrium tension-weighted) # ========================================================================= logger.info("[L1] Memory Recall...") prior_insights = [] if hasattr(self, 'memory_kernel') and self.memory_kernel: try: prior_insights = self.memory_kernel.recall_important(min_importance=7) logger.info(f" Recalled {len(prior_insights)} prior insights") # Zeta-Equilibrium: also surface tension-matched memories when the # query is in uncertain territory. Uses intent_vector epsilon if # available (set by forge_with_debate), otherwise a proxy from # the QHF history. _zeta_epsilon = float(intent_vector.get("epsilon", 0.0)) if isinstance(intent_vector, dict) else 0.0 if _zeta_epsilon == 0.0 and self.qhf and self.qhf._history: _zeta_epsilon = self.qhf._history[-1] if _zeta_epsilon > 0.45 and hasattr(self.memory_kernel, 'recall_by_tension'): _zeta_hits = self.memory_kernel.recall_by_tension( current_epsilon=_zeta_epsilon, tolerance=0.20, limit=3, ) # Merge without duplicating (by anchor/title) _existing = {m.title for m in prior_insights} _new = [m for m in _zeta_hits if m.title not in _existing] if _new: prior_insights.extend(_new) logger.info( f" [Zeta] +{len(_new)} tension-matched memories " f"(eps={_zeta_epsilon:.2f})" ) except Exception as e: logger.debug(f" Memory recall failed: {e}") # ========================================================================= # LAYER 1.5: ETHICAL QUERY VALIDATION (EthicalAIGovernance) # ========================================================================= if hasattr(self, 'ethical_governance') and self.ethical_governance: try: query_validation = self.ethical_governance.validate_query(concept) if not query_validation["valid"]: logger.warning(f" EthicalAIGovernance rejected query: {query_validation['warnings']}") return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": concept}, {"role": "assistant", "content": "I can't help with that request. " + "; ".join(query_validation.get("suggestions", []))}, ], "metadata": { "mode": "ethical_block", "reason": "ethical_governance_query_rejected", "warnings": query_validation["warnings"], } } except Exception as e: logger.debug(f" Ethical query validation failed: {e}") if _trace: _trace.record(EVENT_GUARDIAN_CHECK, "EthicalAIGovernance", { "trust_level": "standard", "safety_flags": [], }) # ========================================================================= # LAYER 2: SIGNAL ANALYSIS (Intent Prediction & Risk Detection) # ========================================================================= logger.info("[L2] Signal Analysis...") intent_vector = {} if hasattr(self, 'nexis_signal_engine') and self.nexis_signal_engine: try: intent_vector = self.nexis_signal_engine.process(concept) risk_level = intent_vector.get("pre_corruption_risk", "unknown") logger.info(f" Intent risk level: {risk_level}") if risk_level == "high": logger.warning(" ⚠️ High-risk signal detected") if _trace: _trace.record(EVENT_NEXUS_SIGNAL, "NexisSignalEngine", { "risk": risk_level, "entropy": intent_vector.get("entropy_index", 0.0), "suspicion": intent_vector.get("suspicion_score", 0.0), }) _trace.record(EVENT_EPISTEMIC_METRICS, "NexisSignalEngine", { "epsilon": intent_vector.get("epsilon", intent_vector.get("tension_magnitude", 0.35)), "epsilon_band": "high" if intent_vector.get("epsilon", 0.35) > 0.6 else "moderate", "gamma": intent_vector.get("gamma", intent_vector.get("ensemble_coherence", 0.72)), "top_tensions": intent_vector.get("top_tensions", []), }) except Exception as e: logger.debug(f" Signal analysis failed: {e}") # ========================================================================= # LAYER 2.5: CODE7E EMOTIONAL CONTEXT ENRICHMENT # ========================================================================= # Run Code7eCQURE's emotion engine + temporal empathy as context # enrichment BEFORE LLM inference — this stamps the quantum cocoon # and provides emotional framing without replacing the LLM response code7e_context = None if hasattr(self, 'code7e') and self.code7e: try: # Run emotional analysis pipeline (fast, no LLM needed) emotion_tag = self.code7e.emotion_engine(concept) dream_tag = self.code7e.dream_sequence(concept) empathy_tag = self.code7e.temporal_empathy_drift(concept) ethical_tag = self.code7e.ethical_guard(concept) code7e_context = { "emotion": emotion_tag, "dream": dream_tag, "empathy": empathy_tag, "ethical": ethical_tag, } # Save to quantum cocoon memory (always, not just on fallback) key = self.code7e.hash_input(concept) cocoon_entry = f"{emotion_tag}: {empathy_tag}: {dream_tag}: {ethical_tag}: {concept}" self.code7e.memory_bank[key] = cocoon_entry self.code7e.save_quantum_memory() logger.info(f" [Code7E] Emotional context: {emotion_tag[:60]}") except Exception as e: logger.debug(f" Code7E context enrichment failed: {e}") # ========================================================================= # LAYER 3: REASONING (LLM Inference via Orchestrator) # Now with MEMORY INJECTION — prior insights and relevant cocoons # are woven into the prompt so Codette actually *uses* her memories. # ========================================================================= logger.info("[L3] LLM Reasoning...") # ── Build memory-enriched query ── memory_context_parts = [] # Inject prior insights from LivingMemoryKernel (high-importance memories) if prior_insights: insight_lines = [] for mem in prior_insights[:memory_budget]: # Capped by governor's memory_budget title = getattr(mem, 'title', str(mem)[:60]) content = getattr(mem, 'content', '') emotion = getattr(mem, 'emotional_tag', 'neutral') if content: insight_lines.append(f"- [{emotion}] {title}: {content[:150]}") else: insight_lines.append(f"- [{emotion}] {title}") if insight_lines: memory_context_parts.append( "## Your Prior Insights (from memory kernel)\n" + "\n".join(insight_lines) ) logger.info(f" Injected {len(insight_lines)} prior insights into prompt") # Inject relevant reasoning cocoons (past Q&A exchanges) if hasattr(self, 'cocooner') and self.cocooner: try: relevant = self.cocooner.recall_relevant(concept, max_results=memory_budget) if relevant: cocoon_lines = [] for cocoon in relevant: q = cocoon.get("query", "")[:100] r = cocoon.get("response", "")[:200] adapter = cocoon.get("adapter", "unknown") if q and r: cocoon_lines.append( f"- Q: {q}\n A ({adapter}): {r}" ) if cocoon_lines: memory_context_parts.append( "## Your Past Reasoning (relevant cocoons)\n" + "You previously responded to similar questions:\n" + "\n".join(cocoon_lines) ) logger.info(f" Injected {len(cocoon_lines)} relevant cocoons into prompt") except Exception as e: logger.debug(f" Cocoon recall failed: {e}") # Build the enriched query if memory_context_parts: enriched_concept = ( concept + "\n\n---\n" "# MEMORY CONTEXT (your own past reasoning — use this to stay consistent)\n" + "\n\n".join(memory_context_parts) + "\n---\n\n" "Use your memory context above to inform your response. " "Stay consistent with your past insights. If relevant, build on what you've already reasoned about." ) else: enriched_concept = concept synthesis = "" if self.orchestrator: try: # Use real LLM inference through the orchestrator llm_result = self.orchestrator.route_and_generate( enriched_concept, max_adapters=2, strategy="keyword", ) synthesis = llm_result.get("response", "") logger.info(f" LLM generated {len(synthesis)} chars via {llm_result.get('adapter', 'unknown')}") except Exception as e: logger.warning(f" LLM reasoning failed: {e}, falling back to Code7E") # Fall back to Code7eCQURE template-based reasoning if hasattr(self, 'code7e') and self.code7e: try: synthesis = self.code7e.recursive_universal_reasoning( concept, user_consent=True, dynamic_recursion=True ) except Exception as e2: synthesis = f"[Reasoning error: {e2}]" elif hasattr(self, 'code7e') and self.code7e: # No orchestrator available — use template-based reasoning try: synthesis = self.code7e.recursive_universal_reasoning( concept, user_consent=True, dynamic_recursion=True ) logger.info(f" Code7E generated {len(synthesis)} char synthesis (no LLM)") except Exception as e: logger.warning(f" Code7E reasoning failed: {e}") synthesis = f"[Reasoning error: {e}]" if _trace: _trace.record(EVENT_PERSPECTIVE_SELECTED, "ForgeEngine", { "perspectives": [a.name for a in selected_agents], "domains": matched_domains, }) _trace.record(EVENT_SYNTHESIS_RESULT, "SynthesisEngine", { "synthesis_length": len(synthesis), "synthesis_quality": "adequate", "unresolved_tensions": [], }) # ── Phase 7.1: Adaptive Answer Placement (SynthesisEngineV3) ───────── # Uses intent_vector epsilon/gamma (computed at Layer 2) since the full # epistemic report is not separately computed in forge_with_debate. _v3_engine_d = _get_synthesis_v3() _v3_trace_d: "EnhancedCognitiveTrace | None" = None if _v3_engine_d and synthesis and not synthesis.startswith("["): try: _aap_eps = float( intent_vector.get("epsilon", intent_vector.get("tension_magnitude", 0.35)) ) _aap_gam = float( intent_vector.get("gamma", intent_vector.get("ensemble_coherence", 0.72)) ) _aap_result_d = _v3_engine_d.synthesize_adaptive( concept=concept, analyses=analyses, epsilon=_aap_eps, gamma=_aap_gam, base_synthesis=synthesis, ) synthesis = _aap_result_d["response"] _v3_trace_d = _aap_result_d["trace"] logger.info( f" [SynthesisV3] attractor={_v3_trace_d.active_attractor} " f"direct={_v3_trace_d.direct_mode} " f"trust={_v3_trace_d.spectral_trust:.3f} " f"ε={_aap_eps:.2f}" ) if _trace: _trace.record(EVENT_SYNTHESIS_RESULT, "SynthesisEngineV3", { "attractor": _v3_trace_d.active_attractor, "direct_mode": _v3_trace_d.direct_mode, "spectral_trust": _v3_trace_d.spectral_trust, "epsilon": _v3_trace_d.epsilon, "gamma": _v3_trace_d.gamma, }) except Exception as _aap_err: logger.debug(f"[SynthesisV3] skipped in forge_with_debate: {_aap_err}") # Hallucination scan on final synthesis (reset for clean per-turn state) if getattr(self, '_hallucination_guard', None) and synthesis and not synthesis.startswith("["): try: self._hallucination_guard.reset() _hall_det = self._hallucination_guard.scan_chunk(synthesis, domain="multi_perspective") if _hall_det.recommendation in ("PAUSE", "INTERRUPT"): logger.warning( f"[HallucinationGuard] synthesis {_hall_det.recommendation} " f"(confidence={_hall_det.confidence_score:.2f}) — {_hall_det.explanation[:80]}" ) if _trace and _hall_det.recommendation in ("PAUSE", "INTERRUPT"): _trace.record(EVENT_HALLUCINATION_FLAG, "HallucinationGuard", { "perspective": "synthesis", "confidence_score": _hall_det.confidence_score, "recommendation": _hall_det.recommendation, "domain": _hall_det.domain, "signals": _hall_det.signals, "explanation": _hall_det.explanation, "flagged": True, }) except Exception as _he: logger.debug(f" HallucinationGuard skipped: {_he}") # Sycophancy scan on final synthesis if getattr(self, '_sycophancy_guard', None) and synthesis: try: _syco = self._sycophancy_guard.scan(synthesis, query=concept) if _syco["action"] in ("revise", "block"): logger.warning( f"[SycophancyGuard] action={_syco['action']} score={_syco['score']:.2f} " f"deflection={_syco.get('deflection_detected', False)}" ) if _syco["action"] == "revise": synthesis = _syco["clean_text"] or synthesis if _trace: _trace.record(EVENT_SYCOPHANCY_FLAG, "SycophancyGuard", { "score": _syco["score"], "action": _syco["action"], "action_probs": _syco.get("action_probs", {}), "expected_severity": _syco.get("expected_severity", 0.0), "hits": _syco["hits"], "agreement_loop": _syco["agreement_loop"], "flattery_count": _syco["flattery_count"], "capitulation_count": _syco["capitulation_count"], "flagged": _syco["action"] in ("revise", "block"), }) except Exception as _se: logger.debug(f" SycophancyGuard skipped: {_se}") # ========================================================================= # LAYER 3.5: TIER 2 ANALYSIS (Intent + Identity + Trust Validation) # ========================================================================= logger.info("[L3.5] Tier 2 Analysis...") tier2_analysis = {} if hasattr(self, 'tier2_bridge') and self.tier2_bridge: try: # Analyze query intent intent_analysis = self.tier2_bridge.analyze_intent(concept) tier2_analysis["intent"] = { "suspicion_score": intent_analysis.suspicion_score, "entropy_index": intent_analysis.entropy_index, "ethical_alignment": intent_analysis.ethical_alignment, "risk": intent_analysis.pre_corruption_risk } # Validate synthesis output identity if synthesis: identity_sig = self.tier2_bridge.validate_identity(synthesis, session_id=f"session_{id(concept)}") tier2_analysis["identity"] = { "confidence": identity_sig.confidence, "is_consistent": identity_sig.is_consistent, "spectral_distance": identity_sig.spectral_distance } # Get trust multiplier for output qualification trust_mult = self.tier2_bridge.get_trust_multiplier() tier2_analysis["trust_multiplier"] = trust_mult logger.info(f" Tier 2 trust multiplier: {trust_mult:.3f}") except Exception as e: logger.debug(f" Tier 2 analysis failed: {e}") else: logger.debug(" Tier 2 bridge not available") # ========================================================================= # LAYER 4: STABILITY CHECK (Cocoon Stability Field - FFT Analysis) # ========================================================================= logger.info("[L4] Stability Check...") is_stable = True if hasattr(self, 'cocoon_stability') and self.cocoon_stability: try: # Check if synthesis should halt debate halt_result = self.cocoon_stability.should_halt_debate( {"synthesis": synthesis}, round_num=1 ) should_halt = halt_result[0] if isinstance(halt_result, tuple) else halt_result is_stable = not should_halt logger.info(f" Stability: {'✓ stable' if is_stable else '✗ unstable'}") if not is_stable: logger.warning(" Cocoon stability check triggered halt") except Exception as e: logger.debug(f" Stability check failed: {e}") # If unstable, skip to fallback if not is_stable: logger.warning(" Triggering safe fallback due to instability") fallback_content = f"I detected instability in my multi-perspective reasoning. Responding directly: {concept}" return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": concept}, {"role": "assistant", "content": fallback_content}, ], "metadata": { "mode": "safe_fallback", "reason": "stability_check_failed", "consciousness_stack": "layers_1-4_completed", "reasoning_trace": _trace.finalise() if _trace else None, } } # ========================================================================= # LAYER 5: COLLEEN ETHICAL VALIDATION # ========================================================================= logger.info("[L5] Colleen Ethical Validation...") colleen_valid = False colleen_reason = "" if hasattr(self, 'colleen') and self.colleen: try: colleen_valid, colleen_reason = self.colleen.validate_output(synthesis) logger.info(f" Colleen validation: {'✓ pass' if colleen_valid else '✗ reject'}") logger.info(f" Reason: {colleen_reason}") except Exception as e: logger.warning(f" Colleen validation failed: {e}") colleen_valid = False colleen_reason = f"validation_error: {e}" # If Colleen rejects, use fallback if not colleen_valid: logger.info(" Colleen rejected synthesis, using fallback") fallback = self.colleen.reject_with_fallback(concept) if hasattr(self, 'colleen') and self.colleen else \ f"Responding directly: {concept}" return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": concept}, {"role": "assistant", "content": fallback}, ], "metadata": { "mode": "safe_fallback", "reason": f"colleen_rejected: {colleen_reason}", "consciousness_stack": "layers_1-5_completed", "reasoning_trace": _trace.finalise() if _trace else None, } } # ========================================================================= # LAYER 5.5: ETHICAL RESPONSE ENFORCEMENT (EthicalAIGovernance) # ========================================================================= if hasattr(self, 'ethical_governance') and self.ethical_governance: try: ethical_result = self.ethical_governance.enforce_policies(synthesis) if ethical_result["warnings"]: logger.info(f" Ethical warnings: {ethical_result['warnings']}") synthesis = ethical_result["filtered_response"] except Exception as e: logger.debug(f" Ethical response enforcement failed: {e}") # ========================================================================= # LAYER 5.75: AEGIS MULTI-FRAMEWORK ETHICAL EVALUATION # ========================================================================= aegis_result = None if hasattr(self, 'aegis') and self.aegis: try: aegis_result = self.aegis.evaluate(synthesis, context=concept) logger.info(f" [AEGIS] Alignment eta={aegis_result['eta']:.3f}, vetoed={aegis_result['vetoed']}") if aegis_result['vetoed']: logger.warning(f" AEGIS vetoed response: {aegis_result.get('veto_reason', 'unknown')}") if _trace: _trace.record(EVENT_AEGIS_SCORE, "AEGIS", { "eta": aegis_result.get("eta"), "vetoed": aegis_result.get("vetoed", False), "veto_reason": aegis_result.get("veto_reason"), "framework_scores": aegis_result.get("framework_scores", {}), }) except Exception as e: logger.debug(f" AEGIS evaluation failed: {e}") # ========================================================================= # LAYER 5.8: INSTITUTIONAL TIME-TRAVEL ANALYSIS (query-triggered, default ON) # ========================================================================= # Runs only when the query contains ≥ 2 institutional keywords. # Overhead when skipped: ~0.1 ms (keyword scan). # Overhead when active: ~5–20 ms (date regex + closure inference). # Disable by setting CODETTE_TIME_TRAVEL=0 in the environment. _time_travel_metrics = None if os.environ.get("CODETTE_TIME_TRAVEL", "1") != "0": try: from reasoning_forge.time_travel_lens import ( InstitutionalContextDetector, TimeTravelConfig, TimeTravelLens, ) if InstitutionalContextDetector.is_relevant(concept): from reasoning_forge.institutional_extractor import InstitutionalExtractor _tt_extractor = InstitutionalExtractor() _tt_text = concept + "\n" + synthesis _tt_state, _tt_conf = _tt_extractor.extract(_tt_text) if _tt_state and _tt_conf >= 0.3: _tt_lens = TimeTravelLens(config=TimeTravelConfig.default()) _time_travel_metrics = _tt_lens.observe(_tt_state) _time_travel_metrics["extraction_confidence"] = round(_tt_conf, 3) logger.info( " [TTLens] Π=%.1f days, closure=%s, high_zone=%s, conf=%.2f", _time_travel_metrics.get("preemption_gap_days") or 0, _time_travel_metrics.get("closure_class", "?"), _time_travel_metrics.get("high_preemption_zone"), _tt_conf, ) # Annotate AEGIS result so deontological framework can # incorporate the institutional temporal gap. if aegis_result and _time_travel_metrics.get("high_preemption_zone"): aegis_result.setdefault("supplementary_context", {}) aegis_result["supplementary_context"]["time_travel"] = { "preemption_gap_days": _time_travel_metrics.get("preemption_gap_days"), "closure_class": _time_travel_metrics.get("closure_class"), "rupture": _time_travel_metrics.get("rupture"), } except Exception as _tt_err: logger.debug(" [TTLens] skipped: %s", _tt_err) # Compute Ψ_r (resonant wavefunction) using epsilon/gamma from intent signal _psi_r = 0.0 if getattr(self, 'resonance_engine', None): try: _coherence_val = float(intent_vector.get("gamma", intent_vector.get("ensemble_coherence", 0.72))) _tension_val = float(intent_vector.get("epsilon", intent_vector.get("tension_magnitude", 0.35))) _psi_state = self.resonance_engine.compute_psi( coherence=_coherence_val, tension=_tension_val, ) _psi_r = _psi_state.psi_r if _trace: _trace.record(EVENT_PSI_UPDATE, "ResonantContinuityEngine", { "psi_r": round(_psi_r, 4), "resonance_quality": round(self.resonance_engine.resonance_quality(), 4), "convergence_rate": round(self.resonance_engine.convergence_rate(), 4), "at_peak": self.resonance_engine.detect_resonance_peak(), "stability": _psi_state.stability, }) logger.debug(f" Ψ_r={_psi_r:.4f}, stable={_psi_state.stability}") except Exception as e: logger.debug(f" Resonance computation failed: {e}") # ========================================================================= # LAYER 6: GUARDIAN LOGICAL VALIDATION # ========================================================================= logger.info("[L6] Guardian Logical Validation...") guardian_valid = True guardian_details = {} if hasattr(self, 'guardian') and self.guardian: try: guardian_valid, guardian_details = self.guardian.validate(synthesis, query=concept) logger.info(f" Guardian validation: {'✓ pass' if guardian_valid else '✗ reject'}") logger.info(f" Details: {guardian_details}") except Exception as e: logger.warning(f" Guardian validation failed: {e}") guardian_valid = False guardian_details = {"error": str(e)} if _trace: _trace.record(EVENT_GUARDIAN_CHECK, "Guardian", { "trust_level": "pass" if guardian_valid else "reject", "safety_flags": list(guardian_details.keys()) if not guardian_valid else [], }) # If Guardian rejects, use fallback if not guardian_valid: logger.info(" Guardian rejected synthesis, using fallback") fallback = f"Responding directly: {concept}" return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": concept}, {"role": "assistant", "content": fallback}, ], "metadata": { "mode": "safe_fallback", "reason": f"guardian_rejected: {guardian_details}", "consciousness_stack": "layers_1-6_completed", "reasoning_trace": _trace.finalise() if _trace else None, } } # ========================================================================= # LAYER 7: SUCCESS - Return Clean Output # ========================================================================= logger.info("[L7] Return...") logger.info("✓ All consciousness stack layers passed!") # Store in memory for future recall — v2.1: use build_cocoon() when available _cocoon_id = None if hasattr(self, 'memory_kernel') and self.memory_kernel: try: if _V21_AVAILABLE: tag, imp = self._classify_cocoon_metadata( concept, synthesis, intent_vector, aegis_result ) _eta = aegis_result.get("eta", 0.0) if aegis_result else 0.0 _sq = "strong" if _eta >= 0.85 else ("partial" if _eta < 0.5 else "adequate") # ── Echo / collapse detection ────────────────────────────── _echo_result = None _echo_detector_inst = _get_echo_detector() if _echo_detector_inst and analyses: try: _echo_result = _echo_detector_inst.check(concept, analyses) except Exception as _ee: logger.debug(f"[forge_with_debate] Echo detection skipped: {_ee}") # ── AEGIS + Epistemic contracts ──────────────────────────── _aegis_contract = {} if aegis_result: try: _aegis_contract = aegis_from_raw(aegis_result) except Exception: _aegis_contract = {} _epist_contract = epistemic_from_report(epistemic_report) # ── Build CocoonV3 (disk-write path) ────────────────────── _v3_cocoon_instance = None try: _v3_cocoon_instance = build_cocoon_v3( query=concept, response_text=synthesis, response_summary=synthesis[:500], user_response_text=synthesis, emotional_valence=tag if tag in ( "curiosity", "awe", "joy", "insight", "confusion", "frustration", "fear", "empathy", "determination", "surprise", "trust", "gratitude", ) else "insight", importance_score=float(imp), epsilon_value=float(_epist_contract.get("epsilon_value", 0.35)), gamma_coherence=float(_epist_contract.get("gamma_coherence", 0.72)), pairwise_tensions=_epist_contract.get("pairwise_tensions", {}), perspective_coverage=_epist_contract.get("perspective_coverage", {}), eta_score=_eta if aegis_result else None, psi_r=_psi_r, active_perspectives=[a.name for a in selected_agents], dominant_perspective=selected_agents[0].name if selected_agents else None, synthesis_quality=_sq, problem_type=self._infer_problem_type(matched_domains), project_context="Codette-Reasoning", execution_path="forge_full", model_inference_invoked=True, metrics_population_status=( "complete" if aegis_result and _psi_r > 0 else "partial" ), aegis_framework_scores=_aegis_contract.get("framework_scores", {}), aegis_dominant_framework=_aegis_contract.get("dominant_framework", ""), aegis_ethical_conflict_notes=_aegis_contract.get("ethical_conflict_notes", []), guardian_safety_status=( "pass" if safety_notes.get("guardian_valid", True) else "flag" ), guardian_trust_calibration=( "high" if safety_notes.get("guardian_valid", True) else "low" ), nexus_risk_level=str(intent_vector.get("pre_corruption_risk", "")), nexus_confidence=float(intent_vector.get("confidence", 0.0)), is_hallucination_flagged=bool(safety_notes.get("hallucination_flagged", False)), is_sycophancy_flagged=bool(safety_notes.get("sycophancy_flagged", False)), echo_risk=_echo_result.echo_risk if _echo_result else "unknown", perspective_collapse_detected=( _echo_result.perspective_collapse_detected if _echo_result else False ), time_travel_metrics=_time_travel_metrics, ) v2_cocoon = _v3_cocoon_instance except Exception as _v3err: logger.debug(f"[forge_with_debate] CocoonV3 build fell back to v2: {_v3err}") v2_cocoon = build_cocoon( query=concept, response_text=synthesis, response_summary=synthesis[:500], emotional_valence=tag if tag in ( "curiosity", "awe", "joy", "insight", "confusion", "frustration", "fear", "empathy", "determination", "surprise", "trust", "gratitude", ) else "insight", importance_score=float(imp), epsilon_value=float(_epist_contract.get("epsilon_value", 0.35)), gamma_coherence=float(_epist_contract.get("gamma_coherence", 0.72)), eta_score=_eta if aegis_result else None, active_perspectives=[a.name for a in selected_agents], dominant_perspective=selected_agents[0].name if selected_agents else None, synthesis_quality=_sq, problem_type=self._infer_problem_type(matched_domains), project_context="Codette-Reasoning", ) _cocoon_id = v2_cocoon.cocoon_id if hasattr(self.memory_kernel, 'store_v2_cocoon'): self.memory_kernel.store_v2_cocoon(v2_cocoon, psi_r=_psi_r) else: self.memory_kernel.store(MemoryCocoon( title=concept[:50], content=synthesis[:500], emotional_tag=tag, importance=imp, )) logger.debug(f" Stored v2 cocoon (id={_cocoon_id[:8]}, tag={tag}, imp={imp})") # Dual-write to UnifiedMemory for FTS5 cross-system search if getattr(self, 'unified_memory', None): try: self.unified_memory.store( query=concept, response=synthesis[:2000], adapter="forge_with_debate", domain=self._infer_problem_type(matched_domains), emotion=tag, importance=imp, metadata={ "cocoon_id": _cocoon_id, "epsilon": float(intent_vector.get("epsilon", 0.35)), "gamma": float(intent_vector.get("gamma", 0.72)), "psi_r": _psi_r, "forge_path": "debate", }, ) except Exception as _ue: logger.debug(f" UnifiedMemory dual-write skipped: {_ue}") else: # Legacy path tag, imp = self._classify_cocoon_metadata( concept, synthesis, intent_vector, aegis_result ) self.memory_kernel.store(MemoryCocoon( title=concept[:50], content=synthesis[:500], emotional_tag=tag, importance=imp, )) logger.debug(f" Stored legacy cocoon (tag={tag}, importance={imp})") except Exception as e: logger.debug(f" Memory storage failed: {e}") if _trace: _trace.record(EVENT_MEMORY_WRITE, "LivingMemoryKernel", { "written": _cocoon_id is not None, "cocoon_id": _cocoon_id, }) # Store as structured reasoning cocoon (CognitionCocooner) if hasattr(self, 'cocooner') and self.cocooner: try: cocoon_meta = {"layers_passed": 7, "stable": is_stable} if code7e_context: cocoon_meta["code7e"] = code7e_context if aegis_result: cocoon_meta["aegis_eta"] = aegis_result["eta"] # v3 path: validate + write full provenance cocoon to disk _disk_v3 = _v3_cocoon_instance if '_v3_cocoon_instance' in dir() else None if _disk_v3 is not None and CODETTE_AUDIT_MODE: _validator_inst = _get_validator() if _validator_inst: try: _val_result = _validator_inst.validate(_disk_v3) _validator_inst.apply_result(_disk_v3, _val_result) if _val_result.warnings: for _w in _val_result.warnings[:3]: logger.debug(f"[CocoonValidator] {_w}") except Exception as _ve: logger.debug(f"[CocoonValidator] skipped: {_ve}") self.cocooner.wrap_reasoning( query=concept, response=synthesis, adapter="consciousness_stack", metadata=cocoon_meta, v3_cocoon=_disk_v3, ) logger.debug(" Stored reasoning in CognitionCocooner (v3)") except Exception as e: logger.debug(f" CognitionCocooner storage failed: {e}") _trace_report = _trace.finalise() if _trace else None return { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": f"Analyze this concept from multiple perspectives:\n\n{concept}"}, {"role": "assistant", "content": synthesis}, ], "metadata": { "mode": "consciousness_stack", "layers_passed": 7, "colleen_valid": colleen_valid, "guardian_valid": guardian_valid, "stability": is_stable, "intent_risk": intent_vector.get("pre_corruption_risk", "unknown"), "prior_insights": len(prior_insights), "synthesis_length": len(synthesis), "aegis_eta": aegis_result['eta'] if aegis_result else None, "aegis_vetoed": aegis_result['vetoed'] if aegis_result else None, "forge_mode": "consciousness_stack", "reasoning_trace": _trace_report, "time_travel_metrics": _time_travel_metrics if '_time_travel_metrics' in dir() else None, } } # -- Helpers ----------------------------------------------------------- def _dynamic_reroute(self, conflicts: List) -> Optional[str]: """ Dynamically select best-performing adapter when conflicts are high. Phase 4: Real-time adaptation - inject the strongest adapter when conflicts exceed threshold. Args: conflicts: List of Conflict objects from current round Returns: Best adapter name to inject, or None if not needed """ if not conflicts or not self.memory_weighting: return None # Find high-conflict situations high_conflicts = [c for c in conflicts if c.conflict_strength > 0.2] if not high_conflicts: return None weights = self.memory_weighting.get_all_weights() if not weights: return None # Select best-performing adapter best_adapter = max(weights.items(), key=lambda x: x[1]["weight"])[0] return best_adapter def _run_adapter(self, adapter_name: str, concept: str) -> str: """ Run a specific adapter/agent to generate analysis. Phase 4: Helper for dynamic rerouting. Args: adapter_name: Name of adapter to run concept: Concept to analyze Returns: Analysis text """ for agent in self.analysis_agents: if agent.name.lower() == adapter_name.lower(): return agent.analyze(concept) # Fallback: synthesis engine as generic perspective return f"Generic perspective on {concept[:50]}..." def _build_revision_directive( self, agent_name: str, score: dict, suggestions: list, concept: str, ) -> str: """Build a revision directive for a weak agent.""" parts = [ f"[REVISION REQUESTED for {agent_name}]", f"Your previous analysis scored {score.get('combined', 0):.2f}/1.00.", ] if score.get("logical_clarity", 1) < 0.5: parts.append( "Improve logical clarity: use connectives (therefore, because, however), " "avoid vague language, structure your argument explicitly." ) if score.get("conceptual_accuracy", 1) < 0.5: parts.append( "Improve conceptual accuracy: engage directly with the specific concept, " "use domain vocabulary, avoid generic placeholder framing." ) if suggestions: parts.append(f"Critic suggests: {suggestions[0]}") parts.append("Reanalyze with these improvements:") return " ".join(parts) def _classify_cocoon_metadata( self, concept: str, synthesis: str, intent_vector: dict = None, aegis_result: dict = None, ) -> tuple: """Derive a meaningful emotional_tag and importance score for a memory cocoon. FIX 2: Replaces the hardcoded ("processed", 7) write in Layer 7. Returns: (emotional_tag: str, importance: int) """ intent_vector = intent_vector or {} text_lower = (concept + " " + synthesis).lower() # ── Emotional tag classification ────────────────────────────────────── if aegis_result: eta = aegis_result.get("eta", 0.0) vetoed = aegis_result.get("vetoed", False) if vetoed: tag = "cautious" elif eta >= 0.88: tag = "trust" elif eta >= 0.72: tag = "ethical" else: tag = "inquiry" elif intent_vector.get("pre_corruption_risk") == "high": tag = "cautious" elif intent_vector.get("pre_corruption_risk") == "low": _emotion_keywords = { "joy": ["joy", "celebrat", "delight", "excit", "happin"], "awe": ["awe", "wonder", "profound", "breath", "magnif"], "curiosity": ["curious", "question", "explore", "wonder", "discover"], "grief": ["grief", "loss", "mourn", "sorrow", "tragic"], "resolve": ["resolv", "determin", "commit", "persist", "overcome"], "insight": ["insight", "realiz", "understand", "clarity", "reveal"], } detected = "insight" for emotion, keywords in _emotion_keywords.items(): if any(kw in text_lower for kw in keywords): detected = emotion break tag = detected else: tag = "insight" # ── Importance score ────────────────────────────────────────────────── importance = 6 if len(synthesis) > 300: importance += 1 if len(synthesis) > 500: importance += 1 if aegis_result: eta = aegis_result.get("eta", 0.0) if eta >= 0.85: importance += 1 if aegis_result.get("vetoed", False): importance -= 1 if intent_vector.get("pre_corruption_risk") == "low" and len(synthesis) > 400: importance += 1 importance = max(1, min(10, importance)) return tag, importance def forge_batch( self, concept: str, variants: int = 3 ) -> list[dict]: """Generate multiple training examples from one concept. Uses different problem framings and agent template selections to produce varied training data from the same concept. Args: concept: The concept text. variants: Number of variants to generate. Returns: List of training example dicts. """ examples = [] for _ in range(variants): example = self.forge_single(concept) examples.append(example) return examples def forge_dataset( self, concepts: list[str], output_path: str, variants_per_concept: int = 1, verbose: bool = False, ) -> dict: """Run forge on a list of concepts and write JSONL output. Args: concepts: List of concept strings. output_path: Path to output JSONL file. variants_per_concept: Number of training examples per concept. verbose: Whether to print progress. Returns: Summary dict with counts and quality statistics. """ os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True) total_examples = 0 total_quality = 0.0 quality_scores = [] with open(output_path, "w", encoding="utf-8") as f: for i, concept in enumerate(concepts): if verbose: print( f"[{i + 1}/{len(concepts)}] Forging: " f"{concept[:60]}{'...' if len(concept) > 60 else ''}", file=sys.stderr, ) for variant in range(variants_per_concept): example = self.forge_single(concept) quality = example["metadata"]["overall_quality"] # Write the messages (without metadata) for training training_record = {"messages": example["messages"]} f.write(json.dumps(training_record, ensure_ascii=False) + "\n") total_examples += 1 total_quality += quality quality_scores.append(quality) summary = { "total_examples": total_examples, "total_concepts": len(concepts), "variants_per_concept": variants_per_concept, "output_path": output_path, "avg_quality": round(total_quality / max(1, total_examples), 3), "min_quality": round(min(quality_scores) if quality_scores else 0, 3), "max_quality": round(max(quality_scores) if quality_scores else 0, 3), } if verbose: print(f"\nForge complete: {summary}", file=sys.stderr) return summary def forge_from_dataset( self, input_jsonl: str, output_path: str, concept_field: str = "text", variants_per_concept: int = 1, verbose: bool = False, ) -> dict: """Read an existing JSONL dataset and run forge on each entry. Expects each line to be a JSON object with a text field containing the concept. Supports common field names: 'text', 'concept', 'content', 'input', 'question', 'prompt'. Args: input_jsonl: Path to input JSONL file. output_path: Path to output JSONL file. concept_field: Name of the field containing the concept text. variants_per_concept: Number of training examples per concept. verbose: Whether to print progress. Returns: Summary dict with counts and quality statistics. """ # Candidate field names to try candidate_fields = [ concept_field, "text", "concept", "content", "input", "question", "prompt", ] concepts = [] with open(input_jsonl, "r", encoding="utf-8") as f: for line_num, line in enumerate(f, 1): line = line.strip() if not line: continue try: record = json.loads(line) except json.JSONDecodeError: if verbose: print( f"Warning: skipping malformed JSON on line {line_num}", file=sys.stderr, ) continue # Try candidate fields in order concept_text = None if isinstance(record, dict): for field in candidate_fields: if field in record and isinstance(record[field], str): concept_text = record[field].strip() break # Fallback: if record has 'messages', extract user content if concept_text is None and "messages" in record: for msg in record["messages"]: if msg.get("role") == "user": concept_text = msg["content"].strip() break elif isinstance(record, str): concept_text = record.strip() if concept_text: concepts.append(concept_text) if verbose: print( f"Loaded {len(concepts)} concepts from {input_jsonl}", file=sys.stderr, ) return self.forge_dataset( concepts, output_path, variants_per_concept=variants_per_concept, verbose=verbose, ) def forge_single_detailed(self, concept: str) -> dict: """Run forge cycle and return all intermediate outputs. Useful for debugging, inspection, and quality analysis. Args: concept: The concept text. Returns: Dict with all intermediate results: { "concept": str, "problems": [(type, text), ...], "analyses": {agent_name: analysis_text, ...}, "critique": {...}, "synthesis": str, "training_example": {...}, } """ problems = self.problem_generator.generate_problems(concept) analyses = {} for agent in self.analysis_agents: analyses[agent.name] = agent.analyze(concept) critique = self.critic.evaluate_ensemble(concept, analyses) synthesized = self.synthesis.synthesize(concept, analyses, critique) user_content = ( f"Analyze this concept from multiple perspectives:\n\n{concept}" ) training_example = { "messages": [ {"role": "system", "content": self.system_prompt}, {"role": "user", "content": user_content}, {"role": "assistant", "content": synthesized}, ], } return { "concept": concept, "problems": problems, "analyses": analyses, "critique": critique, "synthesis": synthesized, "training_example": training_example, }