This is my Trac Ticket Workflow. I will work on making a visualization to explain what is happening here (the complexity was too much for Trac’s workflow visualizer), but I will go ahead and post in the hopes that it is useful.

awaiting_evidence = reviewing,reopened,new,failed_testing,in_dev -> awaiting_evidence
awaiting_evidence.name = Awaiting Evidence
awaiting_evidence.operations = leave_status
awaiting_evidence.permissions = TICKET_ADMIN

failed_testing = testing -> failed_testing
failed_testing.name = Proposed solution did not pass testing
failed_testing.operations = del_owner
failed_testing.permission = TICKET_APPEND

impossible = new,reopened,reviewing,pending_others,failed_testing,in_dev -> impossible
impossible.default = -1
impossible.name = Impossible to complete
impossible.operations = leave_status
impossible.permissions = TICKET_ADMIN

in_dev = reviewing,failed_testing,pending_others,awaiting_evidence,new -> in_dev
in_dev.name = In development
in_dev.operations = set_owner_to_self
in_dev.permission = TICKET_ADMIN

leave_status = * -> *
leave_status.default = 20
leave_status.name = Leave ticket status untouched
leave_status.permission = TICKET_APPEND

passed_testing = testing -> passed_testing
passed_testing.name = Proposed solution passed testing
passed_testing.operations = del_owner
passed_testing.permission = TICKET_APPEND

pending_others = new,reopened,reviewing,impossible,in_dev -> pending_others
pending_others.name = Pending other department(s) for information/resolution
pending_others.operations = leave_status
pending_others.permissions = TICKET_ADMIN

pending_push = passed_testing,in_dev -> pending_push
pending_push.name = Pending push to production
pending_push.operations = leave_status
pending_push.permission = TICKET_ADMIN

reassign.operations = set_owner
reassign.permissions = TICKET_ADMIN

reassign_reviewing = reviewing,in_dev -> *
reassign_reviewing.name = Reassign
reassign_reviewing.operations = set_owner
reassign_reviewing.permissions = TICKET_ADMIN

reassign_testing = testing -> testing
reassign_testing.name = Reassign
reassign_testing.operations = set_owner
reassign_testing.permissions = TICKET_APPEND

reopen = closed -> reopened
reopen.name = Reopen closed ticket
reopen.operations = del_resolution
reopen.permissions = TICKET_CREATE

resolve = new,reopened,in_dev,reviewing,impossible,pending_others,pending_push,testing,passed_testing,awaiting_evidence -> closed
resolve.default = 19
resolve.name = Resolve ticket
resolve.operations = set_resolution,set_owner_to_self
resolve.permissions = TICKET_ADMIN

review = new,reopened,impossible,pending_others,failed_testing,awaiting_evidence,pending_push -> reviewing
review.name = Reviewing ticket
review.operations = set_owner
review.permissions = TICKET_ADMIN

testing = new,reviewing,in_dev -> testing
testing.name = Pending testing from issue reporter
testing.operations = set_owner_to_reporter
testing.permissions = TICKET_ADMIN
0