Dashboard › institutional-transition-lab › Distillation
73d2736e-7900-4dbc-8ad8-9823e06c11e8["lore_tm_v1_q2BUfpZ0Hyfnx51TAQYyqXrTApHXbuiLGaGF12OUKsk","lore_tm_v1_5Vi9bUMXfUlJBjNGP-32fGrgS-tUSre6JRbKd-O0-AY","lore_tm_v1_kDDFAlMXq2R0xYSVPHeEYfG1F1sM74ltmOSWifnajPk","lore_tm_v1__yYRjtixN4Ch8CvISkYpcOQPxKV7k64NLQvfVAbm8DQ","lore_tm_v1_MudmYz2u4tpuRncyUfvlrLRV8qmqxoNvRv22Yx38880","lore_tm_v1_iL0FLApn5xDRc-3m9lVQQq35OuLCr-L941kvOeCrBUY","lore_tm_v1_jq-jBWuEbXImoRjlHa_hbpqakI93C__A0sTqPuoR1a8","lore_tm_v1_qCGMVCIv2uHwjlY-4ES4n4wpymU3gHZI9dNUTxfrx2A","lore_tm_v1_EzA5FJIZQRA7iMxw1oylvV6dXd4IfoduUUhQGZlrrWY","lore_tm_v1_PEtsNyfKo_HH0pJJjhDgPfzSYm-qvrV1f8CRFgUKGn4","lore_tm_v1_imbO8ZVQVxt_FKhhziorFLF6U7NUqqs9c_Z7McA98o4","lore_tm_v1_y-Nst-VVKTtS5HeJeADc6GC6Cr78rClfUTGbPzJexB0"]
Date: Sep 8, 2026
src/institution_lab/governance_coding.py:228-315: parse_response() strips an optional fenced block, requires a terminating ``` fence, parses JSON with json.loads(), and raises ValueError("response must be an object") unless the result is a dictionary; validate_response() validates exact response keys, ontology values, nonempty nullable strings, ISO dates, finite confidence in [0, 1], power-change structure, evidence grounding by literal quote inclusion, institutional/non-institutional edge presence, and ambiguity for abstain.src/institution_lab/governance_coding.py:14-99: 6 RECORD_CLASSES, 12 EVENT_KINDS, 22 RIGHT_KINDS, DIRECTIONS = {"added", "removed", "modified"}, CHANGE_STATUSES = {"effective", "announced", "proposed", "rejected", "unclear"}, 7 BODY_PATCH_RELATIONS, and exact key sets RESPONSE_KEYS, POWER_KEYS, and REF_KEYS = {"source_id", "quote"}.src/institution_lab/governance_coding.py:102-115 defines _hash() as SHA-256 over sorted compact JSON and _valid_date() as accepting None or an exact canonical date.fromisoformat(value).isoformat() == value string.src/institution_lab/governance_coding.py:377-405 defines _edge_signature(), which normalizes each power-change edge to stripped values for actor, right_kind, target, direction, change_status, and scope, plus sorted stripped (source_id, quote) evidence-reference tuples serialized as compact JSON; it returns all edge tuples sorted.src/institution_lab/governance_adjudication.py.src/institution_lab/governance_adjudication.py:15-49 defines DECISIONS = {"accept", "revise", "reject", "abstain"}, 3 institutional classes, reviewer types human, llm, and human_llm_assisted, reviewer roles source_adjudicator, evidence_auditor, and synthesizer, response sources luna_a, luna_b, and terra_advisory, and 9 frozen input pins including workflow run ID 33063470968, artifact ID 9642983578, and adjudication schema SHA-256 6181f5cb60a0462f83be00be301763daa89f11581e68ee1c46a84e8bf4e5be31.verify_input_manifest() in src/institution_lab/governance_adjudication.py:74-119 requires the manifestβs exact key set and exact equality to every FROZEN_INPUT_PINS value, recomputes six file hashes, byte-compares archive members documents.json and v1.2-adjudication-package.json to durable files, recomputes canonical documents_sha256, and raises ValueError on any mismatch._source_index() in src/institution_lab/governance_adjudication.py:127-140 indexes document sources by source_id and adds synthetic source record_metadata, whose text is compact sorted JSON containing record_id, source_url, published_on, publisher, and source_type._evidence_errors() in src/institution_lab/governance_adjudication.py:143-167 requires exact evidence-reference keys (source_id and quote, plus field for claim evidence), validates claim fields against CLAIM_FIELDS, requires a known source and nonempty quote, and grounds evidence through literal substring membership in the indexed source text.graph_edge_diff() in src/institution_lab/governance_adjudication.py:178-193 keys complete edge dictionaries using sorted compact JSON and returns deterministic added and removed edge arrays from key-set differences._validate_reviewer() in src/institution_lab/governance_adjudication.py:196-221 requires exactly reviewer_id, reviewer_type, model, role, and assistance; human reviewers must have a null model, non-human reviewers must name a model, and any model string containing gemini case-insensitively is rejected because Gemini is restricted to event triage._validate_record() in src/institution_lab/governance_adjudication.py:224-389 checks frozen source_url, decision validity, nonempty unique known reviewer IDs, rationale, exact source-audit source IDs and evidence bounds, explicit limitations for bounded evidence, accepted-response identity, final-coding validity, abstention/resolution consistency, institutional dates and permitted edge statuses, claim evidence, and derived graph-edge revisions.accept, _validate_record() requires accepted_from to identify a schema-valid frozen response and requires final_coding to equal that response exactly; it also requires graph_edge_revision.basis == accepted_from and recomputes both added and removed with graph_edge_diff().validate_adjudication() in src/institution_lab/governance_adjudication.py:392-536 requires transition_dates_excluded is True, outcome_data_used is False, compares every required input pin to verified pins, validates reviewers and duplicate IDs, requires adjudication and coding record IDs to match frozen document IDs exactly once and in order, requires each record to list a reviewer whose role is source_adjudicator, and opens canonicalization_gate only when there are no errors and no abstentions.validate_adjudication_fragment() in src/institution_lab/governance_adjudication.py:539-641 constructs a fragment schema requiring schema_version, design_status, reviewers, and records; requires schema version 1 and design status performance_blinded_llm_assisted_source_adjudication; applies schema validation and manual reviewer checks; requires coding IDs to equal document IDs exactly once and in order; requires fragment IDs to be unique, known, and in frozen-document order; verifies the coding packageβs documents_sha256; requires a listed source_adjudicator; and reuses _validate_record().validate_against_schema() in src/institution_lab/governance_adjudication.py:644-650 uses Draft202012Validator with FormatChecker() and emits sorted path-qualified schema errors.render_markdown() in src/institution_lab/governance_adjudication.py:653-699 renders the canonicalization gate, decision counts, class counts, record decisions and evidence limitations, unresolved records, frozen inputs, reviewer provenance, and graph-edge revision counts; it emits - None when there are no unresolved records or no nonempty graph-edge revisions.main() in src/institution_lab/governance_adjudication.py:702-747 requires paths for adjudication, input manifest, documents, coding package, artifact, protocol, coding schema, adjudication schema, summary JSON, and summary Markdown; it verifies the manifest, performs schema and manual validation, writes both outputs, forces the gate closed when errors exist, and raises ValueError("adjudication validation failed:\n" + ...) on validation errors.validate_adjudication_fragment.file:line evidence, and a deterministic regression for every defect.PASS, CONCERN, or MUST-FIX; if no defect exists, the response must state PASS explicitly and list residual risks/testing gaps.MERGE or DO-NOT-MERGE.Subagent depth limit reached (1). Increase "subagent_depth" to allow nested subagents.tests/test_governance_adjudication.py is now 753 lines, replacing the previously supplied 727-line version.test_committed_partial_fragment_validates_but_cannot_be_the_full_envelope() at tests/test_governance_adjudication.py:708-716 loads cases/review/oss-governance-adjudication-v1/fragments/opentofu-a2.json, expects validate_adjudication_fragment(fragment, documents, coding_package, schema) == [], and separately expects the fragment to fail validation against the full adjudication schema.test_malformed_fragment_record_id_fails_closed() at tests/test_governance_adjudication.py:719-730 replaces the first fragment record ID with {"invalid": "record ID"} and requires fragment validation errors containing both record_id and known subset.