Pipelines & gates
K3Gates live on TRANSITIONS (stage_gates: from → to, gate_expr, allow_roles) — advance_stage() evaluates the predicates and, on refusal, names exactly which ones failed.
Stages and gates are DATA, but changes ship as audited migrations — this is a viewer, not a settings editor. Custom status editors rot (teardown verdict).
Roofing — Insurance · 13 stages · 12 transitions
Roofing| Transition | gate_expr — required predicates | allow_roles | Backward | Jobs at gate |
|---|---|---|---|---|
| 1→2 Lead › Inspection owner: Rep |
| reprep_manageradmin | reason required role-gated · ledgered | — |
| 2→3 Inspection › Claim filed owner: Rep |
| reprep_manageradmin | reason required role-gated · ledgered | J-1054 |
| 3→4 Claim filed › Adjuster meeting owner: Rep |
| reprep_manageradmin | reason required role-gated · ledgered | — |
| 4→5 Adjuster meeting › Carrier decision owner: Rep |
| reprep_manageradmin | reason required role-gated · ledgered | — |
| 5→6 Carrier decision › Contract signed owner: Rep/Kareem |
| reprep_manageroffice_opsadmin | reason required role-gated · ledgered | J-1043 |
| 6→7 Contract signed › Supplementing owner: Closer |
| reprep_manageradmin | reason required role-gated · ledgered | — |
| 7→8 Supplementing › Production prep owner: Kareem |
| office_opsadmin | reason required role-gated · ledgered | — |
| 8→9 Production prep › Scheduled owner: Corey/Ethan |
| office_opsadmin | reason required role-gated · ledgered | J-1042 |
| 9→10 Scheduled › Installed owner: Ops |
| office_opsadmin | reason required role-gated · ledgered | — |
| 10→11 Installed › QC / punch owner: Waylon/subs |
| office_opsadmin | reason required role-gated · ledgered | — |
| 11→12 QC / punch › Invoiced → Paid owner: Ops |
| office_opsadmin | reason required role-gated · ledgered | — |
| 12→13 Invoiced → Paid › Closed owner: Rachel |
| ar_apadmin | reason required role-gated · ledgered | J-1052 |
Backward moves (to → from) are real life: always allowed to the listed roles, but ledgered with a required reason (MD§5) — never silent. “Jobs at gate” = jobs currently sitting at the from-stage, held by these predicates.
Want a stage or gate changed? It's a migration PR with a reason and an approver — the change lands in the ledger like everything else. Boards over this data live in the console (D1).