debate_close_topic
- Category: debate
- Access: write
- Audience: advanced (ordinary users do not normally call this directly)
Purpose
Closes a topic through the same authoritative transition path as debate_state, with identical gating, Q/A checks, and retirement. Kept so existing close call sites keep working.
Arguments
Required: topic_id, role, new_state.
Optional: reason.
-
topic_id: existing debate topic. -
role. Note: Must be a declared role whose binding the caller owns; no star or conductor exception. -
new_state. Note: One of INIT, ACTIVE, RESOLVED, ARCHIVED; only forward lifecycle moves are valid. -
reason. Note: Recorded inside the synthetic STATE message body.
Result
Same shape as debate_state: old_state, new_state, ts, blocking_questions, transition_msg_id, body, retired_bindings, and retired_worker_claims.
Boundaries
Identical authority to debate_state: owned binding on the named role, uniform denial for unknown or unowned positions, and the same [DEFERRED: resolution-equivalence.
Lifecycle / side effects
Shares the transition unit with debate_state: STATE message plus binding retirement succeed or fail together with an audit/history event. No separate close semantics exist.
Errors
Same vocabulary as debate_state: uniform not-found for unknown/unowned, illegal-transition rejection, and open-question blocks carrying the blocking list.
Example
{
"new_state": "ARCHIVED",
"reason": "Work complete",
"role": "CONDUCTOR",
"topic_id": "<uuid>"
}
Result shape:
{
"blocking_questions": [],
"new_state": "ARCHIVED",
"old_state": "RESOLVED",
"transition_msg_id": "<uuid>",
"ts": "<iso-8601>"
}