pgbus 0.19.4 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +97 -7
  4. data/Rakefile +6 -1
  5. data/app/controllers/pgbus/dashboard_controller.rb +2 -0
  6. data/app/controllers/pgbus/workflow_definitions_controller.rb +28 -0
  7. data/app/controllers/pgbus/workflows_controller.rb +197 -0
  8. data/app/frontend/pgbus/modules/charts.js +148 -4
  9. data/app/frontend/pgbus/modules/charts.min.js +1 -1
  10. data/app/frontend/pgbus/modules/charts.min.js.map +1 -1
  11. data/app/frontend/pgbus/style.css +1 -1
  12. data/app/helpers/pgbus/button_helper.rb +4 -2
  13. data/app/helpers/pgbus/workflow_insights_helper.rb +129 -0
  14. data/app/helpers/pgbus/workflows_helper.rb +165 -0
  15. data/app/models/pgbus/blocked_execution.rb +12 -0
  16. data/app/models/pgbus/uniqueness_key.rb +88 -3
  17. data/app/models/pgbus/workflow_entry.rb +172 -0
  18. data/app/models/pgbus/workflow_event.rb +43 -0
  19. data/app/models/pgbus/workflow_signal.rb +77 -0
  20. data/app/models/pgbus/workflow_step.rb +149 -0
  21. data/app/views/layouts/pgbus/application.html.erb +2 -0
  22. data/app/views/pgbus/dashboard/_stats_cards.html.erb +17 -0
  23. data/app/views/pgbus/workflows/_actions.html.erb +59 -0
  24. data/app/views/pgbus/workflows/_events_table.html.erb +24 -0
  25. data/app/views/pgbus/workflows/_filters.html.erb +29 -0
  26. data/app/views/pgbus/workflows/_signal_form.html.erb +31 -0
  27. data/app/views/pgbus/workflows/_signals_table.html.erb +40 -0
  28. data/app/views/pgbus/workflows/_status_filter.html.erb +12 -0
  29. data/app/views/pgbus/workflows/_steps_table.html.erb +79 -0
  30. data/app/views/pgbus/workflows/_timeline.html.erb +49 -0
  31. data/app/views/pgbus/workflows/_workflows_table.html.erb +59 -0
  32. data/app/views/pgbus/workflows/attention.html.erb +88 -0
  33. data/app/views/pgbus/workflows/definitions/_by_revision.html.erb +52 -0
  34. data/app/views/pgbus/workflows/definitions/_duration_table.html.erb +18 -0
  35. data/app/views/pgbus/workflows/definitions/_funnel.html.erb +49 -0
  36. data/app/views/pgbus/workflows/definitions/_pipeline.html.erb +16 -0
  37. data/app/views/pgbus/workflows/definitions/_step_card.html.erb +31 -0
  38. data/app/views/pgbus/workflows/definitions/_throughput_table.html.erb +32 -0
  39. data/app/views/pgbus/workflows/definitions/_window.html.erb +17 -0
  40. data/app/views/pgbus/workflows/definitions/index.html.erb +71 -0
  41. data/app/views/pgbus/workflows/definitions/not_found.html.erb +5 -0
  42. data/app/views/pgbus/workflows/definitions/show.html.erb +80 -0
  43. data/app/views/pgbus/workflows/index.html.erb +15 -0
  44. data/app/views/pgbus/workflows/not_found.html.erb +5 -0
  45. data/app/views/pgbus/workflows/show.html.erb +93 -0
  46. data/config/i18n-tasks.yml +6 -0
  47. data/config/locales/da.yml +445 -0
  48. data/config/locales/de.yml +445 -0
  49. data/config/locales/en.yml +445 -0
  50. data/config/locales/es.yml +445 -0
  51. data/config/locales/fi.yml +445 -0
  52. data/config/locales/fr.yml +445 -0
  53. data/config/locales/it.yml +445 -0
  54. data/config/locales/ja.yml +445 -0
  55. data/config/locales/nb.yml +445 -0
  56. data/config/locales/nl.yml +445 -0
  57. data/config/locales/pt.yml +445 -0
  58. data/config/locales/sv.yml +445 -0
  59. data/config/routes.rb +26 -0
  60. data/lib/generators/pgbus/add_workflow_signals_generator.rb +56 -0
  61. data/lib/generators/pgbus/add_workflows_generator.rb +54 -0
  62. data/lib/generators/pgbus/templates/add_workflow_signals.rb.erb +51 -0
  63. data/lib/generators/pgbus/templates/add_workflows.rb.erb +150 -0
  64. data/lib/generators/pgbus/templates/migration.rb.erb +127 -0
  65. data/lib/pgbus/active_job/adapter.rb +81 -3
  66. data/lib/pgbus/active_job/delivery.rb +63 -0
  67. data/lib/pgbus/active_job/executor.rb +20 -8
  68. data/lib/pgbus/concurrency/blocked_execution.rb +14 -6
  69. data/lib/pgbus/configuration/workflow_settings.rb +99 -0
  70. data/lib/pgbus/configuration.rb +64 -4
  71. data/lib/pgbus/dead_letter_header.rb +9 -1
  72. data/lib/pgbus/generators/migration_detector.rb +40 -0
  73. data/lib/pgbus/instrumentation.rb +33 -0
  74. data/lib/pgbus/integrations/appsignal/dashboard.json +157 -1
  75. data/lib/pgbus/integrations/appsignal/subscriber.rb +16 -1
  76. data/lib/pgbus/mcp/rack_app.rb +7 -2
  77. data/lib/pgbus/mcp/runner.rb +2 -1
  78. data/lib/pgbus/mcp/serialization.rb +25 -0
  79. data/lib/pgbus/mcp/server.rb +53 -10
  80. data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +1 -10
  81. data/lib/pgbus/mcp/tools/workflow_cancel_tool.rb +23 -0
  82. data/lib/pgbus/mcp/tools/workflow_definitions_tool.rb +36 -0
  83. data/lib/pgbus/mcp/tools/workflow_detail_tool.rb +38 -0
  84. data/lib/pgbus/mcp/tools/workflow_resume_at_tool.rb +32 -0
  85. data/lib/pgbus/mcp/tools/workflow_resume_tool.rb +24 -0
  86. data/lib/pgbus/mcp/tools/workflow_run_now_tool.rb +23 -0
  87. data/lib/pgbus/mcp/tools/workflow_signal_tool.rb +77 -0
  88. data/lib/pgbus/mcp/tools/workflow_skip_step_tool.rb +23 -0
  89. data/lib/pgbus/mcp/tools/workflow_stats_tool.rb +42 -0
  90. data/lib/pgbus/mcp/tools/workflows_attention_tool.rb +42 -0
  91. data/lib/pgbus/mcp/tools/workflows_tool.rb +60 -0
  92. data/lib/pgbus/mcp/workflow_insights_payload.rb +15 -0
  93. data/lib/pgbus/mcp/workflow_payloads.rb +53 -0
  94. data/lib/pgbus/mcp/write_tool.rb +134 -0
  95. data/lib/pgbus/mcp.rb +15 -0
  96. data/lib/pgbus/metrics/backends/statsd.rb +6 -0
  97. data/lib/pgbus/metrics/subscriber.rb +14 -1
  98. data/lib/pgbus/metrics/workflow_metrics.rb +75 -0
  99. data/lib/pgbus/process/consumer.rb +2 -1
  100. data/lib/pgbus/process/dispatcher.rb +39 -3
  101. data/lib/pgbus/process/worker.rb +10 -1
  102. data/lib/pgbus/recurring/schedule.rb +1 -1
  103. data/lib/pgbus/streams/presence.rb +65 -36
  104. data/lib/pgbus/uniqueness.rb +23 -6
  105. data/lib/pgbus/version.rb +1 -1
  106. data/lib/pgbus/web/data_source/workflow_actions.rb +109 -0
  107. data/lib/pgbus/web/data_source/workflow_insights.rb +99 -0
  108. data/lib/pgbus/web/data_source/workflow_list.rb +291 -0
  109. data/lib/pgbus/web/data_source.rb +126 -15
  110. data/lib/pgbus/web/workflow_action_plan.rb +62 -0
  111. data/lib/pgbus/web/workflow_insights_queries.rb +250 -0
  112. data/lib/pgbus/web/workflow_insights_report.rb +171 -0
  113. data/lib/pgbus/web/workflow_payload.rb +36 -0
  114. data/lib/pgbus/web/workflow_query.rb +82 -0
  115. data/lib/pgbus/web/workflow_state.rb +89 -0
  116. data/lib/pgbus/web/workflow_timeline.rb +130 -0
  117. data/lib/pgbus/web/workflow_window.rb +51 -0
  118. data/lib/pgbus/workflow/batch_finished_job.rb +21 -0
  119. data/lib/pgbus/workflow/dsl.rb +105 -0
  120. data/lib/pgbus/workflow/error_capture.rb +63 -0
  121. data/lib/pgbus/workflow/exception_policy.rb +170 -0
  122. data/lib/pgbus/workflow/fan_out.rb +157 -0
  123. data/lib/pgbus/workflow/fan_out_definition.rb +41 -0
  124. data/lib/pgbus/workflow/flow_control.rb +94 -0
  125. data/lib/pgbus/workflow/instance.rb +183 -0
  126. data/lib/pgbus/workflow/outside_verbs.rb +138 -0
  127. data/lib/pgbus/workflow/payload.rb +53 -0
  128. data/lib/pgbus/workflow/registry.rb +53 -0
  129. data/lib/pgbus/workflow/removed_step.rb +14 -0
  130. data/lib/pgbus/workflow/runner.rb +218 -0
  131. data/lib/pgbus/workflow/signal_matcher.rb +53 -0
  132. data/lib/pgbus/workflow/signals.rb +132 -0
  133. data/lib/pgbus/workflow/states.rb +119 -0
  134. data/lib/pgbus/workflow/step_context.rb +58 -0
  135. data/lib/pgbus/workflow/step_definition.rb +133 -0
  136. data/lib/pgbus/workflow/step_execution.rb +242 -0
  137. data/lib/pgbus/workflow/step_job.rb +28 -0
  138. data/lib/pgbus/workflow/step_outcome.rb +151 -0
  139. data/lib/pgbus/workflow/steps.rb +103 -0
  140. data/lib/pgbus/workflow/sweep.rb +156 -0
  141. data/lib/pgbus/workflow/test_helpers.rb +152 -0
  142. data/lib/pgbus/workflow/wait_timeout.rb +94 -0
  143. data/lib/pgbus/workflow/waiting.rb +82 -0
  144. data/lib/pgbus/workflow.rb +183 -0
  145. data/sig/pgbus/configuration.rbs +23 -0
  146. metadata +92 -1
@@ -140,6 +140,11 @@ en:
140
140
  throughput: Throughput
141
141
  throughput_detail: jobs/min over the last %{minutes} min
142
142
  throughput_unavailable: needs job stats (rails g pgbus:add_job_stats)
143
+ workflows: Workflows
144
+ workflows_attention:
145
+ one: "%{count} needs attention"
146
+ other: "%{count} need attention"
147
+ workflows_detail: ongoing (%{paused} paused)
143
148
  verdict:
144
149
  links:
145
150
  dlq: Dead letters
@@ -723,6 +728,7 @@ en:
723
728
  processes: Processes
724
729
  queues: Queues
725
730
  recurring: Recurring
731
+ workflows: Workflows
726
732
  return_to_app: Back to app
727
733
  title: Pgbus Dashboard
728
734
  toggle_dark_mode: Toggle dark mode
@@ -1023,3 +1029,442 @@ en:
1023
1029
  disabled: Task disabled
1024
1030
  enabled: Task enabled
1025
1031
  failed: Failed to toggle task
1032
+ workflow_insights:
1033
+ back_to_classes: All workflow classes
1034
+ back_to_runs: All workflow runs
1035
+ bad_request: 'Bad request: %{reason}'
1036
+ capped: 'Capped at workflow_retention (%{retention}): finished and cancelled runs older than that are deleted.'
1037
+ few_samples:
1038
+ one: n=%{count}, few samples
1039
+ other: n=%{count}, few samples
1040
+ index:
1041
+ description: 'How each workflow class did over %{window}: the runs going on now, the runs that ended, and how long a run takes end to end.'
1042
+ empty_hint: 'Define a Pgbus::Workflow subclass and start a run: YourWorkflow.start!(subject, **arguments).'
1043
+ empty_title: No workflow class has run yet.
1044
+ headers:
1045
+ attention: Need attention
1046
+ cancelled: Cancelled
1047
+ duration_p50: Duration p50
1048
+ duration_p95: Duration p95
1049
+ finished: Finished
1050
+ ongoing: Ongoing
1051
+ paused: Paused
1052
+ workflow_class: Workflow class
1053
+ title: Workflow insights
1054
+ links:
1055
+ at_step: "%{status} runs at %{step}"
1056
+ attention: runs of %{workflow} that need attention
1057
+ cancelled: runs of %{workflow} cancelled in the window
1058
+ cancelled_bucket: runs cancelled in this period
1059
+ finished: runs of %{workflow} that finished in the window
1060
+ finished_bucket: runs finished in this period
1061
+ ongoing: ongoing runs of %{workflow}
1062
+ paused: paused runs of %{workflow}
1063
+ started: runs of %{workflow} started in the window
1064
+ started_bucket: runs started in this period
1065
+ not_found:
1066
+ hint: No Pgbus::Workflow subclass and no run is called %{workflow} (or reading it failed, see the log).
1067
+ title: Unknown workflow class
1068
+ not_loaded: Definition not loaded
1069
+ not_loaded_hint: 'This class does not load in this app any more: its steps come from its runs'' rows, in the order the runs reached them.'
1070
+ percentile: "%{name} %{value}"
1071
+ removed_in_flight:
1072
+ one: "%{count} run on removed step %{step}"
1073
+ other: "%{count} runs on removed step %{step}"
1074
+ show:
1075
+ by_revision:
1076
+ all_steps: All steps
1077
+ caption: 'The same numbers for the last five app revisions that finished an attempt in the window, newest first: a regression after a deploy shows as a row.'
1078
+ empty: No attempt in this window recorded an app revision (config.app_revision).
1079
+ headers:
1080
+ attempts: Attempts
1081
+ failed: Failed
1082
+ reattempted: Reattempted
1083
+ revision: Revision
1084
+ run_time: Run time
1085
+ skipped: Skipped
1086
+ step: Step
1087
+ seen_html: seen %{from} to %{to}
1088
+ title: By app revision
1089
+ worse: up from %{rate} on %{revision}
1090
+ charts:
1091
+ durations:
1092
+ between: "%{from}–%{to}"
1093
+ caption:
1094
+ one: How long the %{count} run that finished in the window took, from start to finish.
1095
+ other: How long the %{count} runs that finished in the window took, from start to finish.
1096
+ headers:
1097
+ range: Duration
1098
+ runs: Runs
1099
+ over: "%{from} or more"
1100
+ title: End-to-end duration
1101
+ under: under %{to}
1102
+ series:
1103
+ cancelled: Cancelled
1104
+ finished: Finished
1105
+ runs: Runs
1106
+ started: Started
1107
+ throughput:
1108
+ caption: 'Runs started, finished and cancelled per %{bucket} over %{window}: %{started} started, %{finished} finished, %{cancelled} cancelled.'
1109
+ headers:
1110
+ cancelled: Cancelled
1111
+ finished: Finished
1112
+ from: From
1113
+ started: Started
1114
+ title: Runs per %{bucket}
1115
+ description: 'Over %{window}: where its runs are now, how each step performs, and where runs stop.'
1116
+ funnel:
1117
+ caption:
1118
+ one: 'Of the %{count} run started in the window: how many reached each step, and where it is now.'
1119
+ other: 'Of the %{count} runs started in the window: how many reached each step, and where each one is now.'
1120
+ empty: No run started in this window.
1121
+ headers:
1122
+ now_here: Now at this step
1123
+ reached: Reached
1124
+ share: Of started
1125
+ step: Step
1126
+ here:
1127
+ cancelled:
1128
+ one: "%{count} cancelled"
1129
+ other: "%{count} cancelled"
1130
+ finished:
1131
+ one: "%{count} finished"
1132
+ other: "%{count} finished"
1133
+ paused:
1134
+ one: "%{count} paused"
1135
+ other: "%{count} paused"
1136
+ performing:
1137
+ one: "%{count} running"
1138
+ other: "%{count} running"
1139
+ ready:
1140
+ one: "%{count} scheduled"
1141
+ other: "%{count} scheduled"
1142
+ waiting:
1143
+ one: "%{count} waiting"
1144
+ other: "%{count} waiting"
1145
+ title: Funnel
1146
+ pipeline:
1147
+ attempts:
1148
+ one: "%{count} attempt"
1149
+ other: "%{count} attempts"
1150
+ caption: 'Each step in order: the runs sitting at it now, and how its attempts that finished in the window did.'
1151
+ empty: 'No step yet: no run of this class has a step in the window and none is going on.'
1152
+ failed: Failed
1153
+ kinds:
1154
+ fan_out: Fan-out
1155
+ removed: Removed
1156
+ signal: Waits for a signal
1157
+ undeclared: Not in the definition
1158
+ live:
1159
+ paused: Paused
1160
+ performing: Running
1161
+ ready: Scheduled
1162
+ waiting: Waiting
1163
+ now_label: Runs at this step now
1164
+ pickup: Pickup
1165
+ reattempted: Reattempted
1166
+ run_time: Run time
1167
+ skipped: Skipped
1168
+ step_link: Ongoing runs at %{step}
1169
+ title: Pipeline
1170
+ window_label: Attempts that finished in the window
1171
+ summary:
1172
+ attention: Need attention
1173
+ cancelled: Cancelled
1174
+ duration: Duration p50
1175
+ finished: Finished
1176
+ ongoing: Ongoing
1177
+ started: Started
1178
+ window_label: Time window
1179
+ windows:
1180
+ 1h: the last hour
1181
+ 24h: the last 24 hours
1182
+ 30d: the last 30 days
1183
+ 7d: the last 7 days
1184
+ workflows:
1185
+ actions:
1186
+ bulk_cancel: Cancel all
1187
+ bulk_resume: Resume all
1188
+ cancel: Cancel
1189
+ rerun: Rerun
1190
+ resume: Resume
1191
+ resume_at: Resume at step
1192
+ run_now: Run now
1193
+ signal: Send signal
1194
+ skip_step: Skip step
1195
+ attempt: attempt %{attempt}
1196
+ attention:
1197
+ at_step_html: at %{step}
1198
+ back: "← Workflows"
1199
+ cancel_all:
1200
+ one: Cancel all %{count}
1201
+ other: Cancel all %{count}
1202
+ confirm:
1203
+ cancel:
1204
+ one: Cancel the run stuck at %{step}?
1205
+ other: Cancel all %{count} runs stuck at %{step}?
1206
+ cancel_error:
1207
+ one: Cancel the run stuck at %{step} on %{error}?
1208
+ other: Cancel all %{count} runs stuck at %{step} on %{error}?
1209
+ resume:
1210
+ one: Resume the run paused at %{step}?
1211
+ other: Resume all %{count} runs paused at %{step}?
1212
+ resume_error:
1213
+ one: Resume the run paused at %{step} on %{error}?
1214
+ other: Resume all %{count} runs paused at %{step} on %{error}?
1215
+ description: Ongoing runs that wait on a person, grouped by what stopped them. Once the cause is fixed, act on the whole group.
1216
+ empty_hint: No ongoing run is paused, stalled, overdue or waiting past workflow_waiting_visibility_threshold.
1217
+ empty_title: Nothing needs attention.
1218
+ first_seen_html: first %{time}
1219
+ headers:
1220
+ actions: Actions
1221
+ reason: Reason
1222
+ runs: Runs
1223
+ seen: Seen
1224
+ workflow: Workflow
1225
+ last_seen_html: last %{time}
1226
+ only_class_html: "%{workflow} only."
1227
+ reasons:
1228
+ overdue: 'Overdue: due, but not picked up'
1229
+ paused_error: Paused on an error
1230
+ paused_manual: Paused by hand
1231
+ stalled: 'Stalled: its worker stopped responding'
1232
+ waiting_overdue: Waiting too long
1233
+ resume_all:
1234
+ one: Resume all %{count}
1235
+ other: Resume all %{count}
1236
+ show_all: Show every class
1237
+ show_runs: Show runs
1238
+ title: Needs attention
1239
+ audit:
1240
+ by: "%{event} by %{actor}"
1241
+ empty: No events recorded.
1242
+ headers:
1243
+ what: What happened
1244
+ when: When
1245
+ title: Audit trail
1246
+ with_reason: "%{sentence}: %{reason}"
1247
+ with_step: "%{sentence} (%{step} #%{attempt})"
1248
+ bad_request: 'Bad request: %{reason}'
1249
+ confirm:
1250
+ cancel: Cancel this workflow? Its open steps are cancelled and it does not run again.
1251
+ rerun: Start this workflow again as a new run, with the same subject and arguments?
1252
+ resume: Resume this workflow?
1253
+ resume_at: Resume this workflow at the chosen step? Its open steps are cancelled first.
1254
+ run_now: Run the scheduled step now instead of waiting?
1255
+ signal: Send this signal to the workflow?
1256
+ skip_step: Skip the step this workflow waits on and move to the next one?
1257
+ events:
1258
+ cancelled: Cancelled
1259
+ fan_out_finished: Fan-out finished
1260
+ fan_out_opened: Fan-out opened
1261
+ finished: Finished
1262
+ late_completion_ignored: Late completion ignored
1263
+ paused: Paused
1264
+ rerun: Rerun
1265
+ rescheduled: Rescheduled
1266
+ resumed: Resumed
1267
+ run_now: Run now
1268
+ signal_claimed: Signal claimed
1269
+ signal_received: Signal received
1270
+ stall_detected: Stall detected
1271
+ started: Started
1272
+ step_completed: Step completed
1273
+ step_failed: Step failed
1274
+ step_reattempted: Step reattempted
1275
+ step_scheduled: Step scheduled
1276
+ step_skipped: Step skipped
1277
+ step_started: Step started
1278
+ step_waiting: Step waiting
1279
+ wait_timed_out: Wait timed out
1280
+ filters:
1281
+ apply: Apply filters
1282
+ clear: Clear
1283
+ created_from: Created from
1284
+ created_to: Created to
1285
+ ended_from: Ended from
1286
+ ended_to: Ended to
1287
+ error_class: Error class
1288
+ step: Current step
1289
+ subject_id: Subject ID
1290
+ subject_type: Subject type
1291
+ workflow_class: Workflow class
1292
+ workflow_id: Workflow ID
1293
+ flash:
1294
+ bad_group: That group is not valid.
1295
+ bulk_cancel:
1296
+ one: Cancelled %{count}.
1297
+ other: Cancelled %{count}.
1298
+ bulk_cancel_skipped: Cancelled %{count}; %{skipped} had already moved on.
1299
+ bulk_failed: "%{count} could not be changed: %{reason}"
1300
+ bulk_more: 'More runs may be waiting: press again for the next %{cap}.'
1301
+ bulk_resume:
1302
+ one: Resumed %{count}.
1303
+ other: Resumed %{count}.
1304
+ bulk_resume_skipped: Resumed %{count}; %{skipped} had already moved on.
1305
+ cancel: Workflow cancelled.
1306
+ choose_step: Choose a step to resume at.
1307
+ failed:
1308
+ not_allowed: 'Not done: the run is %{status} now.'
1309
+ not_found: That workflow no longer exists.
1310
+ other: "%{action} failed: %{reason}"
1311
+ payload_not_object: 'Not sent: the payload is not a JSON object.'
1312
+ payload_too_large: 'Not sent: the payload is over %{limit} bytes.'
1313
+ rerun: Started a new run.
1314
+ resume: Workflow resumed.
1315
+ resume_at: Workflow resumed at %{step}.
1316
+ run_now: The scheduled step runs now.
1317
+ signal: Signal %{name} sent.
1318
+ signal_duplicate: Signal %{name} was already delivered with this key; nothing new was sent.
1319
+ signal_name_missing: 'Not sent: the signal needs a name.'
1320
+ skip_step: Step skipped.
1321
+ headers:
1322
+ current_step: Current step
1323
+ last_activity: Last activity
1324
+ started: Started
1325
+ status: Status
1326
+ subject: Subject
1327
+ workflow: Workflow
1328
+ index:
1329
+ attention_link:
1330
+ one: Needs attention (%{count})
1331
+ other: Needs attention (%{count})
1332
+ description: 'Durable multi-step runs: what each one is doing and what happens next.'
1333
+ empty_hint: Pick another status or clear the filters. A run starts with YourWorkflow.start!(subject, **arguments).
1334
+ empty_title: No workflows match.
1335
+ insights_link: Insights by class
1336
+ status_label: Filter by status
1337
+ title: Workflows
1338
+ next:
1339
+ cancelled_html: Cancelled %{ago}.
1340
+ due_html: 'Ready: %{step} was due %{ago} and waits for a worker.'
1341
+ finished_html: Finished %{ago}.
1342
+ overdue_html: 'Overdue: %{step} was due %{ago}; the sweep sends it again.'
1343
+ paused_error_html: 'Paused on %{step}: %{error} — resume or cancel.'
1344
+ paused_manual_html: Paused on %{step} — resume or cancel.
1345
+ performing_attempt_html: Performing %{step} (attempt %{attempt}).
1346
+ performing_html: Performing %{step}.
1347
+ ready_html: 'Ready: %{step} runs next.'
1348
+ scheduled_html: 'Scheduled: %{step} runs %{time}.'
1349
+ unknown_html: 'Status: %{status}.'
1350
+ waiting_batch_html: Waiting for batch %{batch} (%{done} of %{total} jobs done).
1351
+ waiting_signal_html: Waiting for signal %{signal} since %{ago}.
1352
+ waiting_signal_late_html: Waiting for signal %{signal} since %{ago} (late since %{late}). The next late notice goes out %{time}.
1353
+ waiting_signal_notify_html: Waiting for signal %{signal} since %{ago}. A late notice goes out %{time}, and the wait goes on.
1354
+ waiting_signal_timeout_html: Waiting for signal %{signal} since %{ago}. The wait times out %{time}.
1355
+ waiting_step_html: Waiting on %{step}.
1356
+ not_found:
1357
+ hint: It may have finished and been removed after workflow_retention, or the database could not be read (see the log).
1358
+ title: Workflow not found
1359
+ outcomes:
1360
+ cancelled: cancelled
1361
+ completed: completed
1362
+ finished_early: finished the run early
1363
+ paused: paused the run
1364
+ reattempted: reattempted
1365
+ skipped: skipped
1366
+ resume:
1367
+ carry_on: 'Resume: carry on with %{step}'
1368
+ continue: 'Resume: continue with %{step}'
1369
+ finish: 'Resume: finish the run'
1370
+ resend: 'Resume: send %{step} again'
1371
+ retry: 'Resume: retry %{step}'
1372
+ rewait: 'Resume: wait again on %{step}'
1373
+ show:
1374
+ actions: Actions
1375
+ arguments: Arguments
1376
+ back: "← Workflows"
1377
+ cancelled_at: Cancelled
1378
+ class_missing: "%{workflow_class} is not loaded in this process: the run can still be cancelled, but not resumed."
1379
+ definition_outdated: 'This run started on an older definition of %{workflow_class}: its steps have changed since it started.'
1380
+ details: Details
1381
+ finished_at: Finished
1382
+ no_arguments: This run has no arguments.
1383
+ paused_at: Paused
1384
+ reason_hint: Recorded on the audit trail, next to who did it.
1385
+ reason_label: Reason (optional)
1386
+ rerun_of: Rerun of
1387
+ reruns: Rerun as
1388
+ resume_at_label: Step to resume at
1389
+ signal:
1390
+ hint: A step waiting for it wakes at once; otherwise it waits, pending, until a step takes it.
1391
+ name: Signal name
1392
+ payload: Payload (JSON)
1393
+ send: Send signal
1394
+ title: Send a signal
1395
+ signal_statuses:
1396
+ claimed: Claimed
1397
+ consumed: Consumed
1398
+ pending: Pending
1399
+ signals:
1400
+ empty: No signals delivered to this run.
1401
+ headers:
1402
+ claimed: Claimed
1403
+ consumed: Consumed
1404
+ idempotency_key: Idempotency key
1405
+ name: Signal
1406
+ received: Received
1407
+ status: Status
1408
+ payload: Payload
1409
+ title: Signals
1410
+ statuses:
1411
+ cancelled: Cancelled
1412
+ finished: Finished
1413
+ gone: gone
1414
+ paused: Paused
1415
+ performing: Performing
1416
+ ready: Ready
1417
+ scheduled: Scheduled
1418
+ waiting: Waiting
1419
+ step_statuses:
1420
+ cancelled: Cancelled
1421
+ completed: Completed
1422
+ failed: Failed
1423
+ in_progress: Running
1424
+ scheduled: Scheduled
1425
+ skipped: Skipped
1426
+ waiting: Waiting
1427
+ steps:
1428
+ batch: batch %{batch}
1429
+ caused_by: Caused by %{error}
1430
+ empty: No attempts yet.
1431
+ headers:
1432
+ finished: Finished
1433
+ queued: Queued
1434
+ ran: Ran
1435
+ scheduled: Scheduled
1436
+ started: Started
1437
+ status: Status
1438
+ step: Step
1439
+ waited: Waited
1440
+ worker: Worker
1441
+ revision: revision %{revision}
1442
+ show_backtrace: Show backtrace
1443
+ title: Attempts
1444
+ waiting_for: then waiting %{duration}
1445
+ waits_for_html: waits for %{signal}
1446
+ tabs:
1447
+ all: All
1448
+ cancelled: Cancelled
1449
+ finished: Finished
1450
+ ongoing: Ongoing
1451
+ paused: Paused
1452
+ performing: Performing
1453
+ ready: Ready
1454
+ waiting: Waiting
1455
+ timeline:
1456
+ caption: 'Each attempt, oldest at the top: waited (its wait), queued (due, not yet picked up), ran (coloured by how it ended) and waiting (for a signal or its batch), with the pauses on their own row. The attempts table below lists the same durations. A dashed line marks each time a wait passed its deadline.'
1457
+ empty: No attempts yet.
1458
+ paused_period_html: Paused at %{from} for %{duration}
1459
+ paused_row: Paused
1460
+ series:
1461
+ paused: Paused
1462
+ queued: Queued
1463
+ ran_cancelled: Ran, cancelled
1464
+ ran_failed: Ran, failed
1465
+ ran_ok: Ran
1466
+ ran_open: Running
1467
+ waited: Waited
1468
+ waiting: Waiting
1469
+ title: Timeline
1470
+ wait_timeout_html: "%{step}'s wait passed its deadline at %{time} (on_timeout: %{action})."