Status. Proposed design only. Nothing in this vault is DG client approval. No application, service or test has been executed; every scenario is Not executed. Fees and dates are open.

Versions, approvals and state transitions

Source: architecture rev 3 p. 6; TDD workshop (rev 1.1).

Two independent things are shown separately: the candidate revision’s review states, and the live-version pointer. Editing never takes the live opportunity out of service.

flowchart LR
  subgraph REV[Candidate revision - review states]
    D[Draft candidate] --> S[Submitted exact version]
    S --> AP[Approved candidate]
    S --> RT[Returned for correction]
    RT --> D
  end
  subgraph LIVE[Live-version pointer]
    V1[V1 live]
    V2[V2 live]
  end
  V1 -. stays live while a candidate is reviewed .- S
  AP -->|publish of the approved candidate only| V2
flowchart LR
  NP[Not published] -->|approved version published| LV[Live]
  LV -->|pause| PA[Paused]
  LV -->|close| CL[Closed]

Pause and close are a separate lifecycle, independent of revision review. Reopen and resubmit transitions are not drawn because they are undecided (Q04, Q05); the diagram implements no undefined transition.

  • Every sensitive update carries the expected record version; stale writes get a safe conflict and the last approved content stays (T14, T15).
  • Editing after approval invalidates that approval; a formal submission binds the approved version and actor authority (T13).
  • Material revision (offers, needs, geography, terms, disclosure): V1 stays live while V2 is reviewed, and the live-version pointer moves only when the approved V2 is published; after approval new viewers see V2; each existing EOI keeps V1 and gets its own safe change notice. A meaning-neutral typo needs no material-change alert but still creates a version and needs approval (T21, T22, Q06).
  • Self-approval: an entitled owner/admin may approve their own exact version with audit. Contributors cannot. Four-eyes configuration is outside Balanced (T13, Q02).

Lifecycle matrix (proposed, Q04):

OperationLivePausedClosed
Start new question threadAllowed if entitledBlockedBlocked
Reply to existing question threadAllowed if entitledAllowed both partiesAllowed both parties (read-only only by explicit DG change to A07)
Submit new interestAllowed if entitledBlockedBlocked
Accept pending interestAllowed if entitledAllowed if entitledBlocked
Use existing accepted discussionAllowedAllowedAllowed
Pending interest displayCurrent stateCurrent state”Closed” in-app, no new email event
Reopen / resubmit terminal attemptDG transition neededDG transition neededDG transition needed

Races (T18, T19, T23): accept versus withdraw is one serialised transition; the loser gets a safe “state changed” conflict. Idempotency binds actor, command, attempt, key and payload; authorise before replaying any stored result. Decline is terminal for that attempt; resubmission needs an explicit Q05 transition.