70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
|
|
"""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())
|