Question Lifecyclequestion
Lifecycle state machine for Question nodes. Questions are discovery items that produce evidence feeding Decisions (Scope v2 §0.1, §0.3). Reviewer may bounce an Answered question back to InProgress for rework before lock.
- Node type
Question- Initial state
Open- Terminal states
Locked
Full machine
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://gcc.bootminds.com/ontology/state-machines/question.json",
"title": "Question Lifecycle",
"description": "Lifecycle state machine for Question nodes. Questions are discovery items that produce evidence feeding Decisions (Scope v2 §0.1, §0.3). Reviewer may bounce an Answered question back to InProgress for rework before lock.",
"node_type": "Question",
"initial_state": "Open",
"terminal_states": [
"Locked"
],
"states": {
"Open": {
"description": "Question has been authored (typically by pack ingestion or a Programme Lead) and is awaiting a contributor to pick it up. No work yet collected."
},
"InProgress": {
"description": "A contributor has claimed the question and is collecting evidence / drafting an answer. Drafts and partial responses may exist but no answer has been submitted for review."
},
"Answered": {
"description": "An answer has been submitted with cited evidence. Awaiting reviewer sign-off."
},
"Reviewed": {
"description": "Reviewer has signed off on the answer. Awaiting lock by the decision_maker or rework decision."
},
"Locked": {
"description": "Question is locked as the canonical answer for this engagement. Terminal: no further transitions in normal flow. Subsequent corrections require a new question or supersession."
}
},
"transitions": [
{
"from": "Open",
"to": "InProgress",
"trigger_event": "QuestionInProgress",
"requires_role": "contributor",
"requires_events": [],
"guard_description": "A stakeholder with the 'contributor' role on this Question (typically a Client Stakeholder responsible for the relevant workstream) picks it up. The contributor edge MUST be active (not terminated) at transition time."
},
{
"from": "InProgress",
"to": "Answered",
"trigger_event": "QuestionAnswered",
"requires_role": "contributor",
"requires_events": [],
"guard_description": "The contributor submits an answer with cited evidence. The Question MUST have at least one Answer child (cardinality enforced in edge-types.json). The submitting actor MUST hold the 'contributor' role on this Question."
},
{
"from": "Answered",
"to": "Reviewed",
"trigger_event": "QuestionReviewed",
"requires_role": "reviewer",
"requires_events": [],
"guard_description": "Reviewer signs off on the submitted answer. The actor MUST hold the 'reviewer' role on this Question; an answer's submitter cannot review their own answer (segregation enforced at the role-edge level, not redundantly here)."
},
{
"from": "Reviewed",
"to": "InProgress",
"trigger_event": "QuestionInProgress",
"requires_role": "reviewer",
"requires_events": [],
"guard_description": "Rework loop: the reviewer (post-sign-off) determines the answer needs revision and bounces it back. Distinct from the Open->InProgress transition by from-state. Resetting to InProgress preserves the existing Answer history but invalidates the prior review."
},
{
"from": "Reviewed",
"to": "Locked",
"trigger_event": "QuestionLocked",
"requires_role": "decision_maker",
"requires_events": [],
"guard_description": "Decision-maker (the single accountable D for this Question per RACI) locks the answer as canonical. Locking a Question is a lighter-weight act than locking a Decision: it does not trigger a Memory Event capture flow, since the answer's provenance is already carried by its citation set."
}
],
"x-decisions-surfaced": [
"Reviewed -> Locked requires 'decision_maker' rather than 'approver'. Rationale: Questions are an evidence primitive, not a governance gate; the accountable D for the Question (typically the same person who owns the parent workstream) is the right authority to lock its canonical answer. Reserving 'approver' for Decisions and Gates keeps RACI semantics legible: approver = escalation gate on a governance commitment; decision_maker = single accountable owner. If a tenant configures multi-approver flows for Questions in future packs, the registry can be extended; the default ships as decision_maker."
]
}