Skip to content

A typed release compare does not record the gate on its members (2026-10-12)

Index: Known gaps — closed and moot

Status (2026-10-12): CLOSED. See the archive entry. Kept for history.

workflows.release_compare.execute_release_compare is the release compare owner, reachable without Click. A release member records its resolved evaluation config on its result (member_compare.record_release_resolved_config) from the release's PackApplication. Only the CLI builds that application (cli_compare_receipt.resolve_release_pack_application, which resolves the whole evaluation config: gate, project overrides, packs). So a typed caller that passes no pack_application gets members whose contract_context.evaluation_context.resolved_config.gate is the default legacy gate, even when the plan's GateOptions carries a severity preset. The typed scalar API records the gate itself, from the request (workflows.compare_gate_receipt.install_resolved_gate_receipt).

Verdicts, findings, dispositions and exit contributions are unaffected: the plan's gate drives every member's _compatibility_contribution and the release severity fold. Only the recorded receipt (and so effective_config_digest) differs.

Pinned by tests/test_release_compare_workflow.py: its severity_strict cells are xfail(strict=True), so the fix turns them red until the xfail is removed.

Fix direction. Resolve the release's evaluation config once, in workflows/, from the request and options, so every route (CLI, typed) hands members the same config. That is the compare-configuration resolver consolidation (architecture review candidate 3): moving resolve_cli_config/resolve_release_pack_application out of cli_compare_receipt.py. Don't patch the typed route with a second resolver.