Dashboard › institutional-transition-lab › Distillation
82602ebb-fbdf-4e1f-8fc5-553354b3898e["lore_tm_v1_5TuY3vLE0ZKSp_a0TvfLdpNf38O3LKQc6ihtED7lhX0","lore_tm_v1_nEt7FCzq_bzvQZFpnNNJ5d0mhGvruEDBIe-AC8PQ0lc","lore_tm_v1_4-BEUIA65KsMHcis4zS_CX4ZL-6J7fVcOVkEFl8uDT0","lore_tm_v1_GSlPWMkEdWQLxp90u5-czxLmx6k1o6upBwBcnPGKjGA","lore_tm_v1_YVHal67CBcWpFjUoc5YIJ7sPqzRU5Hjc0cNgoqxwMIk","lore_tm_v1_BIdpTUK5LsIi62DToeTiogvNdW2u8_5GWv1DuEbGFdM","lore_tm_v1_yIwqZhuU2tP5JIMyU0o39yx9YgeIuusVXeh76VO6GLY"]
Date: Sep 9, 2026
/home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py, including REVIEWER_ROLES = {"source_adjudicator", "evidence_auditor", "synthesizer"}, reviewer validation around lines 320β340, duplicate reviewer-ID checks around lines 542β549 and 694β701, and per-record source_adjudicator requirements around lines 593β599 and 752β758.source_id matches across schema/governance-adjudication-v1.schema.json and schema/governance-coding-v1.schema.json; both schemas require non-empty string source_id values in evidence references._source_index() in /home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py lines 247β260 builds a dictionary from each sourceβs source_id to its string text, then unconditionally sets sources["record_metadata"] to compact, sorted JSON containing record_id, source_url, published_on, publisher, and source_type._evidence_errors() in /home/byk/Code/institutional-transition-lab/src/institution_lab/governance_adjudication.py lines 263β287 requires evidence references to contain exactly {"source_id", "quote"} or, for claims, exactly {"source_id", "quote", "field"}; claim fields must be in CLAIM_FIELDS, source IDs must resolve in the frozen source index, and quotes must be non-empty substrings of the selected source text._response_for() lines 290β295 returns a response only when the named coding result is a dictionary with schema_valid is True and its response is a dictionary.graph_edge_diff() lines 302β313 compares baseline and final power_changes using canonical JSON edge keys from _edge_key(), returning deterministically sorted added and removed arrays._validate_reviewer() lines 316β341 requires exactly reviewer_id, reviewer_type, model, role, and assistance; IDs and assistance must be non-empty strings, roles/types must be allowed, human reviewers must have model=None, non-human reviewers must name a non-empty model, and any model string containing gemini case-insensitively is rejected because Gemini is restricted to event triage._validate_record() lines 344β509 requires a matching frozen source_url; a valid decision; a non-empty, unique array of known reviewer_ids; a non-empty rationale; and a source_audit that confirms source-first inspection and exactly matches the frozen documentβs ordered source IDs and evidence_bounds._validate_record() means any of: source_text_truncated is True, files_listing_complete is False, patch_selection_truncated is True, or integer patch_unavailable_count > 0; such records require non-empty evidence_limitations._validate_record(): accept requires accepted_from in RESPONSE_SOURCES and final_coding exactly equal to that frozen valid response; only accept may set accepted_from; accept, revise, and reject require runtime-valid final_coding; abstain requires both null final_coding and a non-empty unresolved_reason; resolved decisions require null unresolved_reason and may not use final class abstain; reject must resolve to a non-institutional class._validate_record(): effective_institutional_change requires effective_on and permits only edge status effective; announced_institutional_change requires announced_on, forbids effective_on, and permits only announced; proposal_only forbids effective_on and permits proposed, rejected, or unclear._validate_record() checks every claim_evidence_refs entry through _evidence_errors() and, for institutional final codings, requires each non-null field in CLAIM_FIELDS to be represented by at least one reference whose field matches; the presence check is field-based after individual reference grounding._validate_record(): abstain requires null graph_edge_revision; every resolved decision requires an object; basis must be a response source or None; an accepted recordβs basis must equal accepted_from; and added/removed must exactly equal graph_edge_diff(_response_for(coding_record, basis), final_coding).validate_adjudication() lines 512β656 requires transition_dates_excluded is True, outcome_data_used is False, all required input pins to match verified pins, and the coding packageβs documents_sha256 to equal canonical_sha256(documents).validate_adjudication() requires a non-empty reviewer array, validates each reviewer, rejects duplicate reviewer IDs, and requires every adjudication record to list at least one reviewer whose declared role is source_adjudicator.record_id before validating matched adjudication records.validate_adjudication() summary includes exact record_count, sorted decision_counts, sorted class_counts, unresolved_record_ids, per-record decisions and reviewer/evidence-limitation data, flattened graph_edge_revisions, and reviewer provenance. canonicalization_gate is "closed" when there are any errors or unresolved abstentions, otherwise "open".validate_adjudication_fragment() lines 659β767 constructs a restricted fragment schema requiring schema_version=1, design_status="performance_blinded_llm_assisted_source_adjudication", and non-empty reviewer and record arrays; it repeats runtime reviewer and record validation.canonical_sha256(documents).validate_against_schema() lines 770β775 uses Draft202012Validator with FormatChecker() and emits sorted errors formatted as schema <path>: <message>.validate_response() in /home/byk/Code/institutional-transition-lab/src/institution_lab/governance_coding.py lines 268β302 builds source_map directly from all dictionary sources without requiring string IDs/text during construction; evidence later counts as grounded only if the selected source text is a string and the non-empty quote occurs within it.tests/test_governance_adjudication.py, graph revision coverage includes fixtures around lines 275β276, 320, 365, 469, 523β524, and 581β582; the accepted-basis mismatch test around lines 452β456; and summary assertion around lines 1020β1021 expecting [{"record_id": "example-1", "basis": "luna_a", "added": [], "removed": []}].tests/test_governance_adjudication.py include test_input_manifest_rejects_self_consistent_substitute, test_input_manifest_rejects_changed_file_bytes, test_input_manifest_rejects_files_not_from_pinned_artifact, test_cli_rejects_output_aliases_to_frozen_inputs, test_cli_rejects_aliased_outputs, test_cli_rejects_duplicate_manifest_keys, test_input_manifest_rejects_non_object, test_input_manifest_rejects_duplicate_artifact_members, test_input_manifest_rejects_excessive_artifact_member_count, test_regular_file_reader_rejects_fifo_without_blocking, and test_canonical_sha256_rejects_non_finite_numbers.tests/test_model_policy.py::test_policy_rejects_scope_drift; tests/test_source_retrieval.py::test_rejects_outcome_derived_protocol_fields and test_rejects_embedded_search_qualifiers; tests/test_robustness.py::test_rejects_a_candidate_inside_the_project_warmup; tests/test_phases.py::test_rejects_nonpositive_values_on_log_scale; tests/test_llm_event_probe.py::test_rejects_hallucinated_evidence, test_rejects_label_leakage_in_model_documents, and test_rejects_missing_model_input_allowlist_audit; tests/test_llm_benchmark_subset.py::test_rejects_unknown_subset_document; and tests/test_llm_benchmark_gate.py::test_rejects_unexpected_configuration.