aucourt-ingest/aucourt_ingest/jury/personas.py

70 lines
2.4 KiB
Python
Raw Normal View History

"""Juror persona definitions with graph traversal configuration.
Each persona defines which graph nodes/edges/chunks are relevant to their
deliberation perspective, ensuring they see only information appropriate to
their role. The RULED_INADMISSIBLE wall is enforced for all personas.
"""
from __future__ import annotations
from aucourt_ingest.models import JurorPersona
# Default token budget per juror context assembly
DEFAULT_TOKEN_BUDGET = 4000
PERSONAS: dict[str, JurorPersona] = {
"nurse": JurorPersona(
name="nurse",
anchor_nodes=["Witness[role=expert]", "Exhibit[category=medical]"],
edge_types=["GAVE_TESTIMONY", "DESCRIBED_IN", "CORROBORATES"],
chunk_types=["testimony", "exhibit"],
exclude_edges=["RULED_INADMISSIBLE"],
),
"accountant": JurorPersona(
name="accountant",
anchor_nodes=["Exhibit[category=financial]", "Witness[role=expert]"],
edge_types=["DESCRIBED_IN", "HAS_RULING"],
chunk_types=["exhibit", "ruling"],
exclude_edges=["RULED_INADMISSIBLE"],
),
"skeptic": JurorPersona(
name="skeptic",
anchor_nodes=["Timeline", "Witness"],
edge_types=["CONTRADICTS", "HAS_RULING", "GAVE_TESTIMONY"],
chunk_types=["testimony", "ruling"],
exclude_edges=["RULED_INADMISSIBLE"],
),
"ex_cop": JurorPersona(
name="ex_cop",
anchor_nodes=["Ruling", "Exhibit[category=forensic]"],
edge_types=["HAS_RULING", "DESCRIBED_IN", "CORROBORATES"],
chunk_types=["ruling", "exhibit", "judgment"],
exclude_edges=["RULED_INADMISSIBLE"],
),
"empath": JurorPersona(
name="empath",
anchor_nodes=["Witness[role=prosecution]", "Witness[role=accused]"],
edge_types=["GAVE_TESTIMONY", "CORROBORATES", "CONTRADICTS"],
chunk_types=["testimony", "closing"],
exclude_edges=["RULED_INADMISSIBLE"],
),
"foreman": JurorPersona(
name="foreman",
anchor_nodes=["Charge", "Ruling", "Judge"],
edge_types=["CHARGED_WITH", "HAS_RULING", "HEARD_BY"],
chunk_types=["opening", "judgment", "sentence"],
exclude_edges=["RULED_INADMISSIBLE"],
),
}
def get_persona(name: str) -> JurorPersona:
"""Look up a persona by name. Raises KeyError if not found."""
return PERSONAS[name]
def all_persona_names() -> list[str]:
"""Return list of all defined persona names."""
return list(PERSONAS.keys())