pgbus 0.19.3 → 0.20.0

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +104 -9
  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 +130 -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/workflow_entry.rb +172 -0
  16. data/app/models/pgbus/workflow_event.rb +43 -0
  17. data/app/models/pgbus/workflow_signal.rb +77 -0
  18. data/app/models/pgbus/workflow_step.rb +142 -0
  19. data/app/views/layouts/pgbus/application.html.erb +2 -0
  20. data/app/views/pgbus/dashboard/_stats_cards.html.erb +17 -0
  21. data/app/views/pgbus/workflows/_actions.html.erb +59 -0
  22. data/app/views/pgbus/workflows/_events_table.html.erb +24 -0
  23. data/app/views/pgbus/workflows/_filters.html.erb +29 -0
  24. data/app/views/pgbus/workflows/_signal_form.html.erb +31 -0
  25. data/app/views/pgbus/workflows/_signals_table.html.erb +40 -0
  26. data/app/views/pgbus/workflows/_status_filter.html.erb +12 -0
  27. data/app/views/pgbus/workflows/_steps_table.html.erb +79 -0
  28. data/app/views/pgbus/workflows/_timeline.html.erb +39 -0
  29. data/app/views/pgbus/workflows/_workflows_table.html.erb +59 -0
  30. data/app/views/pgbus/workflows/attention.html.erb +88 -0
  31. data/app/views/pgbus/workflows/definitions/_by_revision.html.erb +52 -0
  32. data/app/views/pgbus/workflows/definitions/_duration_table.html.erb +18 -0
  33. data/app/views/pgbus/workflows/definitions/_funnel.html.erb +49 -0
  34. data/app/views/pgbus/workflows/definitions/_pipeline.html.erb +16 -0
  35. data/app/views/pgbus/workflows/definitions/_step_card.html.erb +31 -0
  36. data/app/views/pgbus/workflows/definitions/_throughput_table.html.erb +32 -0
  37. data/app/views/pgbus/workflows/definitions/_window.html.erb +17 -0
  38. data/app/views/pgbus/workflows/definitions/index.html.erb +71 -0
  39. data/app/views/pgbus/workflows/definitions/not_found.html.erb +5 -0
  40. data/app/views/pgbus/workflows/definitions/show.html.erb +80 -0
  41. data/app/views/pgbus/workflows/index.html.erb +15 -0
  42. data/app/views/pgbus/workflows/not_found.html.erb +5 -0
  43. data/app/views/pgbus/workflows/show.html.erb +93 -0
  44. data/config/i18n-tasks.yml +6 -0
  45. data/config/locales/da.yml +442 -0
  46. data/config/locales/de.yml +442 -0
  47. data/config/locales/en.yml +442 -0
  48. data/config/locales/es.yml +442 -0
  49. data/config/locales/fi.yml +442 -0
  50. data/config/locales/fr.yml +442 -0
  51. data/config/locales/it.yml +442 -0
  52. data/config/locales/ja.yml +442 -0
  53. data/config/locales/nb.yml +442 -0
  54. data/config/locales/nl.yml +442 -0
  55. data/config/locales/pt.yml +442 -0
  56. data/config/locales/sv.yml +442 -0
  57. data/config/routes.rb +26 -0
  58. data/lib/generators/pgbus/add_workflow_signals_generator.rb +56 -0
  59. data/lib/generators/pgbus/add_workflows_generator.rb +54 -0
  60. data/lib/generators/pgbus/templates/add_workflow_signals.rb.erb +51 -0
  61. data/lib/generators/pgbus/templates/add_workflows.rb.erb +150 -0
  62. data/lib/generators/pgbus/templates/migration.rb.erb +127 -0
  63. data/lib/pgbus/active_job/adapter.rb +67 -26
  64. data/lib/pgbus/active_job/batch_id.rb +23 -1
  65. data/lib/pgbus/active_job/delivery.rb +49 -0
  66. data/lib/pgbus/active_job/executor.rb +3 -1
  67. data/lib/pgbus/batch/builder.rb +1 -0
  68. data/lib/pgbus/batch.rb +35 -3
  69. data/lib/pgbus/configuration/workflow_settings.rb +99 -0
  70. data/lib/pgbus/configuration.rb +21 -3
  71. data/lib/pgbus/generators/migration_detector.rb +40 -0
  72. data/lib/pgbus/instrumentation.rb +32 -0
  73. data/lib/pgbus/integrations/appsignal/dashboard.json +128 -1
  74. data/lib/pgbus/integrations/appsignal/event_span.rb +43 -0
  75. data/lib/pgbus/integrations/appsignal/job_span.rb +47 -0
  76. data/lib/pgbus/integrations/appsignal/span_subscriber.rb +128 -0
  77. data/lib/pgbus/integrations/appsignal/subscriber.rb +50 -100
  78. data/lib/pgbus/mcp/rack_app.rb +7 -2
  79. data/lib/pgbus/mcp/runner.rb +2 -1
  80. data/lib/pgbus/mcp/serialization.rb +25 -0
  81. data/lib/pgbus/mcp/server.rb +53 -10
  82. data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +1 -10
  83. data/lib/pgbus/mcp/tools/workflow_cancel_tool.rb +23 -0
  84. data/lib/pgbus/mcp/tools/workflow_definitions_tool.rb +36 -0
  85. data/lib/pgbus/mcp/tools/workflow_detail_tool.rb +38 -0
  86. data/lib/pgbus/mcp/tools/workflow_resume_at_tool.rb +32 -0
  87. data/lib/pgbus/mcp/tools/workflow_resume_tool.rb +24 -0
  88. data/lib/pgbus/mcp/tools/workflow_run_now_tool.rb +23 -0
  89. data/lib/pgbus/mcp/tools/workflow_signal_tool.rb +77 -0
  90. data/lib/pgbus/mcp/tools/workflow_skip_step_tool.rb +23 -0
  91. data/lib/pgbus/mcp/tools/workflow_stats_tool.rb +42 -0
  92. data/lib/pgbus/mcp/tools/workflows_attention_tool.rb +42 -0
  93. data/lib/pgbus/mcp/tools/workflows_tool.rb +60 -0
  94. data/lib/pgbus/mcp/workflow_insights_payload.rb +15 -0
  95. data/lib/pgbus/mcp/workflow_payloads.rb +53 -0
  96. data/lib/pgbus/mcp/write_tool.rb +134 -0
  97. data/lib/pgbus/mcp.rb +15 -0
  98. data/lib/pgbus/metrics/backends/statsd.rb +6 -0
  99. data/lib/pgbus/metrics/subscriber.rb +14 -1
  100. data/lib/pgbus/metrics/workflow_metrics.rb +65 -0
  101. data/lib/pgbus/process/dispatcher.rb +26 -0
  102. data/lib/pgbus/version.rb +1 -1
  103. data/lib/pgbus/web/data_source/workflow_actions.rb +109 -0
  104. data/lib/pgbus/web/data_source/workflow_insights.rb +99 -0
  105. data/lib/pgbus/web/data_source/workflow_list.rb +248 -0
  106. data/lib/pgbus/web/data_source.rb +3 -0
  107. data/lib/pgbus/web/workflow_action_plan.rb +62 -0
  108. data/lib/pgbus/web/workflow_insights_queries.rb +250 -0
  109. data/lib/pgbus/web/workflow_insights_report.rb +171 -0
  110. data/lib/pgbus/web/workflow_payload.rb +36 -0
  111. data/lib/pgbus/web/workflow_query.rb +82 -0
  112. data/lib/pgbus/web/workflow_state.rb +76 -0
  113. data/lib/pgbus/web/workflow_timeline.rb +113 -0
  114. data/lib/pgbus/web/workflow_window.rb +51 -0
  115. data/lib/pgbus/workflow/batch_finished_job.rb +21 -0
  116. data/lib/pgbus/workflow/dsl.rb +105 -0
  117. data/lib/pgbus/workflow/error_capture.rb +63 -0
  118. data/lib/pgbus/workflow/exception_policy.rb +170 -0
  119. data/lib/pgbus/workflow/fan_out.rb +157 -0
  120. data/lib/pgbus/workflow/fan_out_definition.rb +41 -0
  121. data/lib/pgbus/workflow/flow_control.rb +94 -0
  122. data/lib/pgbus/workflow/instance.rb +183 -0
  123. data/lib/pgbus/workflow/outside_verbs.rb +138 -0
  124. data/lib/pgbus/workflow/payload.rb +53 -0
  125. data/lib/pgbus/workflow/registry.rb +53 -0
  126. data/lib/pgbus/workflow/removed_step.rb +14 -0
  127. data/lib/pgbus/workflow/runner.rb +218 -0
  128. data/lib/pgbus/workflow/signal_matcher.rb +53 -0
  129. data/lib/pgbus/workflow/signals.rb +132 -0
  130. data/lib/pgbus/workflow/states.rb +119 -0
  131. data/lib/pgbus/workflow/step_context.rb +58 -0
  132. data/lib/pgbus/workflow/step_definition.rb +131 -0
  133. data/lib/pgbus/workflow/step_execution.rb +242 -0
  134. data/lib/pgbus/workflow/step_job.rb +28 -0
  135. data/lib/pgbus/workflow/step_outcome.rb +151 -0
  136. data/lib/pgbus/workflow/steps.rb +103 -0
  137. data/lib/pgbus/workflow/sweep.rb +156 -0
  138. data/lib/pgbus/workflow/test_helpers.rb +152 -0
  139. data/lib/pgbus/workflow/wait_timeout.rb +73 -0
  140. data/lib/pgbus/workflow/waiting.rb +82 -0
  141. data/lib/pgbus/workflow.rb +183 -0
  142. data/sig/pgbus/configuration.rbs +22 -0
  143. metadata +95 -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,439 @@ 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_timeout_html: Waiting for signal %{signal} since %{ago}. The wait times out %{time}.
1353
+ waiting_step_html: Waiting on %{step}.
1354
+ not_found:
1355
+ hint: It may have finished and been removed after workflow_retention, or the database could not be read (see the log).
1356
+ title: Workflow not found
1357
+ outcomes:
1358
+ cancelled: cancelled
1359
+ completed: completed
1360
+ finished_early: finished the run early
1361
+ paused: paused the run
1362
+ reattempted: reattempted
1363
+ skipped: skipped
1364
+ resume:
1365
+ carry_on: 'Resume: carry on with %{step}'
1366
+ continue: 'Resume: continue with %{step}'
1367
+ finish: 'Resume: finish the run'
1368
+ resend: 'Resume: send %{step} again'
1369
+ retry: 'Resume: retry %{step}'
1370
+ rewait: 'Resume: wait again on %{step}'
1371
+ show:
1372
+ actions: Actions
1373
+ arguments: Arguments
1374
+ back: "← Workflows"
1375
+ cancelled_at: Cancelled
1376
+ class_missing: "%{workflow_class} is not loaded in this process: the run can still be cancelled, but not resumed."
1377
+ definition_outdated: 'This run started on an older definition of %{workflow_class}: its steps have changed since it started.'
1378
+ details: Details
1379
+ finished_at: Finished
1380
+ no_arguments: This run has no arguments.
1381
+ paused_at: Paused
1382
+ reason_hint: Recorded on the audit trail, next to who did it.
1383
+ reason_label: Reason (optional)
1384
+ rerun_of: Rerun of
1385
+ reruns: Rerun as
1386
+ resume_at_label: Step to resume at
1387
+ signal:
1388
+ hint: A step waiting for it wakes at once; otherwise it waits, pending, until a step takes it.
1389
+ name: Signal name
1390
+ payload: Payload (JSON)
1391
+ send: Send signal
1392
+ title: Send a signal
1393
+ signal_statuses:
1394
+ claimed: Claimed
1395
+ consumed: Consumed
1396
+ pending: Pending
1397
+ signals:
1398
+ empty: No signals delivered to this run.
1399
+ headers:
1400
+ claimed: Claimed
1401
+ consumed: Consumed
1402
+ idempotency_key: Idempotency key
1403
+ name: Signal
1404
+ received: Received
1405
+ status: Status
1406
+ payload: Payload
1407
+ title: Signals
1408
+ statuses:
1409
+ cancelled: Cancelled
1410
+ finished: Finished
1411
+ gone: gone
1412
+ paused: Paused
1413
+ performing: Performing
1414
+ ready: Ready
1415
+ scheduled: Scheduled
1416
+ waiting: Waiting
1417
+ step_statuses:
1418
+ cancelled: Cancelled
1419
+ completed: Completed
1420
+ failed: Failed
1421
+ in_progress: Running
1422
+ scheduled: Scheduled
1423
+ skipped: Skipped
1424
+ waiting: Waiting
1425
+ steps:
1426
+ batch: batch %{batch}
1427
+ caused_by: Caused by %{error}
1428
+ empty: No attempts yet.
1429
+ headers:
1430
+ finished: Finished
1431
+ queued: Queued
1432
+ ran: Ran
1433
+ scheduled: Scheduled
1434
+ started: Started
1435
+ status: Status
1436
+ step: Step
1437
+ waited: Waited
1438
+ worker: Worker
1439
+ revision: revision %{revision}
1440
+ show_backtrace: Show backtrace
1441
+ title: Attempts
1442
+ waiting_for: then waiting %{duration}
1443
+ waits_for_html: waits for %{signal}
1444
+ tabs:
1445
+ all: All
1446
+ cancelled: Cancelled
1447
+ finished: Finished
1448
+ ongoing: Ongoing
1449
+ paused: Paused
1450
+ performing: Performing
1451
+ ready: Ready
1452
+ waiting: Waiting
1453
+ timeline:
1454
+ 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.'
1455
+ empty: No attempts yet.
1456
+ paused_period_html: Paused at %{from} for %{duration}
1457
+ paused_row: Paused
1458
+ series:
1459
+ paused: Paused
1460
+ queued: Queued
1461
+ ran_cancelled: Ran, cancelled
1462
+ ran_failed: Ran, failed
1463
+ ran_ok: Ran
1464
+ ran_open: Running
1465
+ waited: Waited
1466
+ waiting: Waiting
1467
+ title: Timeline