agent_panel: alerts use the macro persona's verdict; all 4 takes still logged

agent_panel.verdict_source defaults to "macro": the macro take's stance is the
verdict, the synthesizer call is skipped (4 LLM calls per panel instead of 5);
"chair" restores the four-voice consensus + OPPOSE guard. Verdict source is
cached per mode and logged (panel_verdict_source). 406 tests.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FC4s6VCURFte4dub4xKxYL
This commit is contained in:
Harwinder Sekhon
2026-09-03 21:16:45 -04:00
parent d681027b20
commit b8f903ad0e
9 changed files with 175 additions and 26 deletions
+6 -2
View File
@@ -169,6 +169,7 @@ _ADDITIVE_SIGNAL_COLS = (
("bar_range_median", "REAL"),
("scan_kind", "TEXT"),
("config_fingerprint", "TEXT"),
("panel_verdict_source", "TEXT"),
)
# Read-side compatibility view `signals_with_news`: legacy rows keep
@@ -779,6 +780,7 @@ class SignalLogger:
created_at: Optional[str] = None,
cache_status: Optional[str] = None,
payload_hash: Optional[str] = None,
verdict_source: Optional[str] = None,
) -> None:
"""Fill panel provenance; seeds an outcome only for rows that
log() did not already seed (rows written by an older process)."""
@@ -804,11 +806,12 @@ class SignalLogger:
" panel_created_at=COALESCE(?, panel_created_at),"
" panel_cache_status=COALESCE(?, panel_cache_status),"
" panel_payload_hash=COALESCE(?, panel_payload_hash),"
" panel_verdict_source=COALESCE(?, panel_verdict_source),"
" advisory_outcome_status=COALESCE(advisory_outcome_status, ?),"
" advisory_outcome_json=COALESCE(advisory_outcome_json, ?)"
" WHERE id=?",
(verdict, confidence, rationale, takes_json,
created_at, cache_status, payload_hash,
created_at, cache_status, payload_hash, verdict_source,
advisory_status, advisory_json, rowid))
self._conn.commit()
@@ -1205,7 +1208,8 @@ def log_panel_update(report: Any) -> None:
_dumps(getattr(report, "panel_takes", None) or []),
created_at=getattr(report, "panel_created_at", "") or None,
cache_status=getattr(report, "panel_cache_status", "") or None,
payload_hash=getattr(report, "panel_payload_hash", "") or None)
payload_hash=getattr(report, "panel_payload_hash", "") or None,
verdict_source=getattr(report, "panel_verdict_source", "") or None)
except Exception:
logger.warning("signal_log: failed to persist panel verdict",
exc_info=True)