DL-342
The forge state-transition write op is a parallel-arm pair (TransitionIssueState / TransitionPullRequestState on forge.Provider, transition_issue_state / transition_pull_request_state on ForgeCallRequest) over a portable {open, closed} core plus per-provider refinements carried in one TransitionState input (close_reason for GitHub issues, workflow_state for Linear). Every mismatch fails LOUD and in-band as invalid_argument before any provider call: a refinement the target provider cannot express, an unknown or ambiguous Linear state name, a named state whose type contradicts the portable target, and — per the OQ-2 ruling — a default resolution finding MORE THAN ONE candidate state, which names the candidates and demands an explicit workflow_state rather than taking a positional guess. Defaulting happens only where the target is unambiguous (default-close resolves against completed, never canceled). The Linear PR half returns ErrUnsupported (Linear is issues-only). Transitions are NOT F3-deduped and NOT DL-055-recorded — not the comment arm’s reason (a comment has no representable coordinate) but because a transition targets a coordinate whose row is a write-once authorship fact whose client_request_id backs the create’s F3 memo, so routing a transition through the record path would overwrite it. Amends DL-241’s tool count by citation (twelve tools, rule unchanged).
Status: Active (Matt, 2026-09-07)
Record: ../../server/compass-forge-state-transition/design.md