Assync Synthesis Engine¶
Purpose¶
Deterministically combine structured run reports, normalized findings, and
evidence into one SynthesisResult — no LLM is involved; identical
inputs always produce identical output regardless of input ordering
(synthesis/engine.py::synthesize, verified in
tests/test_synthesis.py::test_deterministic_regardless_of_input_order).
The 14 Ordered Rules (synthesis/rules.py)¶
- Verified evidence outranks unsupported opinion.
FRESH_EVIDENCEoutranksHISTORICAL_EVIDENCEfor current-state claims.INFERREDclaims may not override verified evidence.UNVERIFIEDclaims must be reported as unresolved.- Blocking security or governance findings override majority approval.
- Critical findings require a human decision.
- Missing mandatory evidence prevents completion.
- Conflicting recommendations must be surfaced, not averaged away.
- Human authorization overrides AI recommendation.
- No synthesis result may grant its own authorization.
- Separation-of-duty violations block progression.
- A failed mandatory run blocks synthesis completion.
- Optional run failures may be reported without blocking when policy permits.
COMMIT_GO,PUSH_GO,MERGE_GO, andRELEASE_GOmust never be inferred.
Every rule maps to a concrete check in engine.py; rule 14 is additionally
asserted at the end of synthesize() and unit-tested directly
(test_never_recommends_commit_push_merge_release).
Evidence-Strength Bookkeeping (rules 1–4)¶
A finding with no evidence_ids is reported in unsupported_claims. A
finding whose evidence is entirely INFERRED/UNVERIFIED/BLOCKED is
flagged as unable to override verified evidence — it is never silently
dropped, only labeled. EvidenceClassification.BLOCKED here means
verification could not be completed — a distinct concept from mission
runtime state BLOCKED; see security-model.md for why these
intentionally share one literal value.
Overall Recommendation (priority order)¶
blockers present → BLOCK
conflicting recommendations → REQUEST_CHANGES
any REQUEST_CHANGES/BLOCK/ABORT among runs → REQUEST_CHANGES
any NO_OPINION among runs → NO_OPINION
all runs APPROVE → APPROVE
mixed APPROVE/APPROVE_WITH_CONDITIONS → APPROVE_WITH_CONDITIONS
Recommended Next Authorization (rules 9, 10, 14)¶
Synthesis only ever recommends — it never calls
authorization/service.py itself. If human decisions or blockers exist,
it recommends DECISION_GO. Otherwise it recommends REVIEW_GO (on
approval) or ANALYSIS_GO (on missing evidence). It is structurally
incapable of recommending COMMIT_GO, PUSH_GO, MERGE_GO, or
RELEASE_GO — those four are excluded from every branch and asserted
absent before the function returns.
Finding Normalization (findings/normalization.py)¶
Deterministic, not semantic: findings are merged only when they share the
exact (category, normalized_title) key. When uncertain, findings are
kept separate — no opaque similarity scoring exists in this MVP.
MVP Limitations¶
- Evidence-classification precedence (rules 1–4) is currently applied
per-finding, not used to resolve two findings that directly contradict
each other with different evidence strength — that remains a documented
gap for the
contradictionmock scenario, which synthesis currently surfaces viaconflictsrather than auto-resolving.