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 @@ es:
140
140
  throughput: Rendimiento
141
141
  throughput_detail: trabajos/min en los últimos %{minutes} min
142
142
  throughput_unavailable: requiere estadísticas de trabajos (rails g pgbus:add_job_stats)
143
+ workflows: Workflows
144
+ workflows_attention:
145
+ one: "%{count} requiere atención"
146
+ other: "%{count} requieren atención"
147
+ workflows_detail: en curso (%{paused} en pausa)
143
148
  verdict:
144
149
  links:
145
150
  dlq: Mensajes muertos
@@ -723,6 +728,7 @@ es:
723
728
  processes: Procesos
724
729
  queues: Colas
725
730
  recurring: Recurrente
731
+ workflows: Workflows
726
732
  return_to_app: Volver a la app
727
733
  title: Panel de Pgbus
728
734
  toggle_dark_mode: Alternar modo oscuro
@@ -1023,3 +1029,442 @@ es:
1023
1029
  disabled: Tarea deshabilitada
1024
1030
  enabled: Tarea habilitada
1025
1031
  failed: No se pudo cambiar la tarea
1032
+ workflow_insights:
1033
+ back_to_classes: Todas las clases de flujo
1034
+ back_to_runs: Todas las ejecuciones de flujos
1035
+ bad_request: 'Solicitud incorrecta: %{reason}'
1036
+ capped: 'Limitado a workflow_retention (%{retention}): las ejecuciones terminadas y canceladas más antiguas se eliminan.'
1037
+ few_samples:
1038
+ one: n=%{count}, pocas muestras
1039
+ other: n=%{count}, pocas muestras
1040
+ index:
1041
+ description: 'Cómo le fue a cada clase de flujo en %{window}: las ejecuciones en curso, las que terminaron y cuánto tarda una ejecución de principio a fin.'
1042
+ empty_hint: 'Define una subclase de Pgbus::Workflow e inicia una ejecución: YourWorkflow.start!(subject, **arguments).'
1043
+ empty_title: Ninguna clase de flujo se ha ejecutado todavía.
1044
+ headers:
1045
+ attention: Requieren atención
1046
+ cancelled: Canceladas
1047
+ duration_p50: Duración p50
1048
+ duration_p95: Duración p95
1049
+ finished: Terminadas
1050
+ ongoing: En curso
1051
+ paused: Pausadas
1052
+ workflow_class: Clase de flujo
1053
+ title: Análisis de flujos
1054
+ links:
1055
+ at_step: "%{status} ejecuciones en %{step}"
1056
+ attention: ejecuciones de %{workflow} que requieren atención
1057
+ cancelled: ejecuciones de %{workflow} canceladas en la ventana
1058
+ cancelled_bucket: ejecuciones canceladas en este periodo
1059
+ finished: ejecuciones de %{workflow} terminadas en la ventana
1060
+ finished_bucket: ejecuciones terminadas en este periodo
1061
+ ongoing: ejecuciones en curso de %{workflow}
1062
+ paused: ejecuciones pausadas de %{workflow}
1063
+ started: ejecuciones de %{workflow} iniciadas en la ventana
1064
+ started_bucket: ejecuciones iniciadas en este periodo
1065
+ not_found:
1066
+ hint: Ninguna subclase de Pgbus::Workflow ni ninguna ejecución se llama %{workflow} (o falló la lectura, mira el registro).
1067
+ title: Clase de flujo desconocida
1068
+ not_loaded: Definición no cargada
1069
+ not_loaded_hint: 'Esta clase ya no se carga en la aplicación: sus pasos vienen de las filas de sus ejecuciones, en el orden en que las ejecuciones los alcanzaron.'
1070
+ percentile: "%{name} %{value}"
1071
+ removed_in_flight:
1072
+ one: "%{count} ejecución en el paso eliminado %{step}"
1073
+ other: "%{count} ejecuciones en el paso eliminado %{step}"
1074
+ show:
1075
+ by_revision:
1076
+ all_steps: Todos los pasos
1077
+ caption: 'Las mismas cifras para las últimas cinco revisiones de la aplicación que terminaron un intento en la ventana, la más reciente primero: una regresión tras un despliegue aparece como una fila.'
1078
+ empty: Ningún intento en esta ventana registró una revisión de la aplicación (config.app_revision).
1079
+ headers:
1080
+ attempts: Intentos
1081
+ failed: Fallidos
1082
+ reattempted: Reintentados
1083
+ revision: Revisión
1084
+ run_time: Tiempo de ejecución
1085
+ skipped: Omitidos
1086
+ step: Paso
1087
+ seen_html: visto de %{from} a %{to}
1088
+ title: Por revisión de la aplicación
1089
+ worse: sube desde %{rate} en %{revision}
1090
+ charts:
1091
+ durations:
1092
+ between: "%{from}–%{to}"
1093
+ caption:
1094
+ one: Cuánto tardó la %{count} ejecución terminada en la ventana, de principio a fin.
1095
+ other: Cuánto tardaron las %{count} ejecuciones terminadas en la ventana, de principio a fin.
1096
+ headers:
1097
+ range: Duración
1098
+ runs: Ejecuciones
1099
+ over: "%{from} o más"
1100
+ title: Duración de principio a fin
1101
+ under: menos de %{to}
1102
+ series:
1103
+ cancelled: Canceladas
1104
+ finished: Terminadas
1105
+ runs: Ejecuciones
1106
+ started: Iniciadas
1107
+ throughput:
1108
+ caption: 'Ejecuciones iniciadas, terminadas y canceladas por %{bucket} en %{window}: %{started} iniciadas, %{finished} terminadas, %{cancelled} canceladas.'
1109
+ headers:
1110
+ cancelled: Canceladas
1111
+ finished: Terminadas
1112
+ from: Desde
1113
+ started: Iniciadas
1114
+ title: Ejecuciones por %{bucket}
1115
+ description: 'En %{window}: dónde están sus ejecuciones ahora, cómo rinde cada paso y dónde se detienen las ejecuciones.'
1116
+ funnel:
1117
+ caption:
1118
+ one: 'De la %{count} ejecución iniciada en la ventana: cuántas alcanzaron cada paso y dónde está ahora.'
1119
+ other: 'De las %{count} ejecuciones iniciadas en la ventana: cuántas alcanzaron cada paso y dónde está cada una ahora.'
1120
+ empty: Ninguna ejecución se inició en esta ventana.
1121
+ headers:
1122
+ now_here: Ahora en este paso
1123
+ reached: Alcanzado
1124
+ share: De las iniciadas
1125
+ step: Paso
1126
+ here:
1127
+ cancelled:
1128
+ one: "%{count} cancelada"
1129
+ other: "%{count} canceladas"
1130
+ finished:
1131
+ one: "%{count} terminada"
1132
+ other: "%{count} terminadas"
1133
+ paused:
1134
+ one: "%{count} pausada"
1135
+ other: "%{count} pausadas"
1136
+ performing:
1137
+ one: "%{count} en ejecución"
1138
+ other: "%{count} en ejecución"
1139
+ ready:
1140
+ one: "%{count} programada"
1141
+ other: "%{count} programadas"
1142
+ waiting:
1143
+ one: "%{count} esperando"
1144
+ other: "%{count} esperando"
1145
+ title: Embudo
1146
+ pipeline:
1147
+ attempts:
1148
+ one: "%{count} intento"
1149
+ other: "%{count} intentos"
1150
+ caption: 'Cada paso en orden: las ejecuciones que están en él ahora y cómo fueron sus intentos terminados en la ventana.'
1151
+ empty: 'Aún no hay pasos: ninguna ejecución de esta clase tiene un paso en la ventana y ninguna está en curso.'
1152
+ failed: Fallidos
1153
+ kinds:
1154
+ fan_out: Fan-out
1155
+ removed: Eliminado
1156
+ signal: Espera una señal
1157
+ undeclared: No está en la definición
1158
+ live:
1159
+ paused: Pausadas
1160
+ performing: En ejecución
1161
+ ready: Programadas
1162
+ waiting: Esperando
1163
+ now_label: Ejecuciones en este paso ahora
1164
+ pickup: Recogida
1165
+ reattempted: Reintentados
1166
+ run_time: Tiempo de ejecución
1167
+ skipped: Omitidos
1168
+ step_link: Ejecuciones en curso en %{step}
1169
+ title: Pipeline
1170
+ window_label: Intentos terminados en la ventana
1171
+ summary:
1172
+ attention: Requieren atención
1173
+ cancelled: Canceladas
1174
+ duration: Duración p50
1175
+ finished: Terminadas
1176
+ ongoing: En curso
1177
+ started: Iniciadas
1178
+ window_label: Ventana de tiempo
1179
+ windows:
1180
+ 1h: la última hora
1181
+ 24h: las últimas 24 horas
1182
+ 30d: los últimos 30 días
1183
+ 7d: los últimos 7 días
1184
+ workflows:
1185
+ actions:
1186
+ bulk_cancel: Cancelar todo
1187
+ bulk_resume: Reanudar todo
1188
+ cancel: Cancelar
1189
+ rerun: Repetir
1190
+ resume: Reanudar
1191
+ resume_at: Reanudar desde el paso
1192
+ run_now: Ejecutar ahora
1193
+ signal: Enviar señal
1194
+ skip_step: Omitir paso
1195
+ attempt: intento %{attempt}
1196
+ attention:
1197
+ at_step_html: en %{step}
1198
+ back: "← Workflows"
1199
+ cancel_all:
1200
+ one: Cancelar %{count}
1201
+ other: Cancelar todas (%{count})
1202
+ confirm:
1203
+ cancel:
1204
+ one: "¿Cancelar la ejecución atascada en %{step}?"
1205
+ other: "¿Cancelar las %{count} ejecuciones atascadas en %{step}?"
1206
+ cancel_error:
1207
+ one: "¿Cancelar la ejecución atascada en %{step} por %{error}?"
1208
+ other: "¿Cancelar las %{count} ejecuciones atascadas en %{step} por %{error}?"
1209
+ resume:
1210
+ one: "¿Reanudar la ejecución en pausa en %{step}?"
1211
+ other: "¿Reanudar las %{count} ejecuciones en pausa en %{step}?"
1212
+ resume_error:
1213
+ one: "¿Reanudar la ejecución en pausa en %{step} por %{error}?"
1214
+ other: "¿Reanudar las %{count} ejecuciones en pausa en %{step} por %{error}?"
1215
+ description: Ejecuciones en curso que esperan a una persona, agrupadas por lo que las detuvo. Una vez corregida la causa, actúe sobre todo el grupo.
1216
+ empty_hint: Ninguna ejecución en curso está en pausa, bloqueada, atrasada o esperando más allá de workflow_waiting_visibility_threshold.
1217
+ empty_title: Nada requiere atención.
1218
+ first_seen_html: primera vez %{time}
1219
+ headers:
1220
+ actions: Acciones
1221
+ reason: Motivo
1222
+ runs: Ejecuciones
1223
+ seen: Visto
1224
+ workflow: Workflow
1225
+ last_seen_html: última vez %{time}
1226
+ only_class_html: Solo %{workflow}.
1227
+ reasons:
1228
+ overdue: 'Atrasada: vencida, pero sin tomar'
1229
+ paused_error: En pausa por un error
1230
+ paused_manual: Pausada manualmente
1231
+ stalled: 'Bloqueada: su worker dejó de responder'
1232
+ waiting_overdue: Espera demasiado larga
1233
+ resume_all:
1234
+ one: Reanudar %{count}
1235
+ other: Reanudar todas (%{count})
1236
+ show_all: Mostrar todas las clases
1237
+ show_runs: Mostrar ejecuciones
1238
+ title: Requieren atención
1239
+ audit:
1240
+ by: "%{event} por %{actor}"
1241
+ empty: No hay eventos registrados.
1242
+ headers:
1243
+ what: Qué ocurrió
1244
+ when: Cuándo
1245
+ title: Historial de auditoría
1246
+ with_reason: "%{sentence}: %{reason}"
1247
+ with_step: "%{sentence} (%{step} #%{attempt})"
1248
+ bad_request: 'Solicitud no válida: %{reason}'
1249
+ confirm:
1250
+ cancel: "¿Cancelar este workflow? Sus pasos abiertos se cancelan y no volverá a ejecutarse."
1251
+ rerun: "¿Iniciar este workflow de nuevo como una ejecución nueva, con el mismo sujeto y los mismos argumentos?"
1252
+ resume: "¿Reanudar este workflow?"
1253
+ resume_at: "¿Reanudar este workflow desde el paso elegido? Sus pasos abiertos se cancelan primero."
1254
+ run_now: "¿Ejecutar ahora el paso programado en lugar de esperar?"
1255
+ signal: "¿Enviar esta señal al workflow?"
1256
+ skip_step: "¿Omitir el paso que espera este workflow y pasar al siguiente?"
1257
+ events:
1258
+ cancelled: Cancelado
1259
+ fan_out_finished: Fan-out terminado
1260
+ fan_out_opened: Fan-out abierto
1261
+ finished: Terminado
1262
+ late_completion_ignored: Finalización tardía ignorada
1263
+ paused: Pausado
1264
+ rerun: Repetido
1265
+ rescheduled: Reprogramado
1266
+ resumed: Reanudado
1267
+ run_now: Ejecutar ahora
1268
+ signal_claimed: Señal reclamada
1269
+ signal_received: Señal recibida
1270
+ stall_detected: Bloqueo detectado
1271
+ started: Iniciado
1272
+ step_completed: Paso completado
1273
+ step_failed: Paso fallido
1274
+ step_reattempted: Paso reintentado
1275
+ step_scheduled: Paso programado
1276
+ step_skipped: Paso omitido
1277
+ step_started: Paso iniciado
1278
+ step_waiting: Paso en espera
1279
+ wait_timed_out: Espera agotada
1280
+ filters:
1281
+ apply: Aplicar filtros
1282
+ clear: Borrar
1283
+ created_from: Creado desde
1284
+ created_to: Creado hasta
1285
+ ended_from: Terminado desde
1286
+ ended_to: Terminado hasta
1287
+ error_class: Clase de error
1288
+ step: Paso actual
1289
+ subject_id: ID del sujeto
1290
+ subject_type: Tipo de sujeto
1291
+ workflow_class: Clase del workflow
1292
+ workflow_id: ID del workflow
1293
+ flash:
1294
+ bad_group: Ese grupo no es válido.
1295
+ bulk_cancel:
1296
+ one: "%{count} cancelado."
1297
+ other: "%{count} cancelados."
1298
+ bulk_cancel_skipped: "%{count} cancelados; %{skipped} ya habían avanzado."
1299
+ bulk_failed: "%{count} no se pudieron cambiar: %{reason}"
1300
+ bulk_more: 'Puede haber más ejecuciones en espera: pulse de nuevo para las siguientes %{cap}.'
1301
+ bulk_resume:
1302
+ one: "%{count} reanudado."
1303
+ other: "%{count} reanudados."
1304
+ bulk_resume_skipped: "%{count} reanudados; %{skipped} ya habían avanzado."
1305
+ cancel: Workflow cancelado.
1306
+ choose_step: Elija un paso desde el que reanudar.
1307
+ failed:
1308
+ not_allowed: 'No realizado: la ejecución está ahora %{status}.'
1309
+ not_found: Ese workflow ya no existe.
1310
+ other: "%{action} falló: %{reason}"
1311
+ payload_not_object: 'No enviada: la carga útil no es un objeto JSON.'
1312
+ payload_too_large: 'No enviada: la carga útil supera los %{limit} bytes.'
1313
+ rerun: Se inició una nueva ejecución.
1314
+ resume: Workflow reanudado.
1315
+ resume_at: Workflow reanudado en %{step}.
1316
+ run_now: El paso programado se ejecuta ahora.
1317
+ signal: Señal %{name} enviada.
1318
+ signal_duplicate: La señal %{name} ya se entregó con esta clave; no se envió nada nuevo.
1319
+ signal_name_missing: 'No enviada: la señal necesita un nombre.'
1320
+ skip_step: Paso omitido.
1321
+ headers:
1322
+ current_step: Paso actual
1323
+ last_activity: Última actividad
1324
+ started: Iniciado
1325
+ status: Estado
1326
+ subject: Sujeto
1327
+ workflow: Workflow
1328
+ index:
1329
+ attention_link:
1330
+ one: Requiere atención (%{count})
1331
+ other: Requieren atención (%{count})
1332
+ description: 'Ejecuciones duraderas de varios pasos: qué hace cada una y qué ocurre a continuación.'
1333
+ empty_hint: Elija otro estado o borre los filtros. Una ejecución se inicia con YourWorkflow.start!(subject, **arguments).
1334
+ empty_title: Ningún workflow coincide.
1335
+ insights_link: Análisis por clase
1336
+ status_label: Filtrar por estado
1337
+ title: Workflows
1338
+ next:
1339
+ cancelled_html: Cancelado %{ago}.
1340
+ due_html: 'Listo: %{step} debía ejecutarse %{ago} y espera a un worker.'
1341
+ finished_html: Terminado %{ago}.
1342
+ overdue_html: 'Atrasado: %{step} debía ejecutarse %{ago}; el barrido lo envía de nuevo.'
1343
+ paused_error_html: 'En pausa en %{step}: %{error} — reanude o cancele.'
1344
+ paused_manual_html: En pausa en %{step} — reanude o cancele.
1345
+ performing_attempt_html: Ejecutando %{step} (intento %{attempt}).
1346
+ performing_html: Ejecutando %{step}.
1347
+ ready_html: 'Listo: %{step} se ejecuta a continuación.'
1348
+ scheduled_html: 'Programado: %{step} se ejecuta %{time}.'
1349
+ unknown_html: 'Estado: %{status}.'
1350
+ waiting_batch_html: Esperando el lote %{batch} (%{done} de %{total} trabajos terminados).
1351
+ waiting_signal_html: Esperando la señal %{signal} desde %{ago}.
1352
+ waiting_signal_late_html: Esperando la señal %{signal} desde %{ago} (con retraso desde %{late}). El próximo aviso de retraso sale %{time}.
1353
+ waiting_signal_notify_html: Esperando la señal %{signal} desde %{ago}. Un aviso de retraso sale %{time} y la espera continúa.
1354
+ waiting_signal_timeout_html: Esperando la señal %{signal} desde %{ago}. La espera caduca %{time}.
1355
+ waiting_step_html: Esperando a %{step}.
1356
+ not_found:
1357
+ hint: Puede que haya terminado y se haya eliminado tras workflow_retention, o que no se haya podido leer la base de datos (consulta el registro).
1358
+ title: Workflow no encontrado
1359
+ outcomes:
1360
+ cancelled: cancelado
1361
+ completed: completado
1362
+ finished_early: terminó la ejecución antes de tiempo
1363
+ paused: pausó la ejecución
1364
+ reattempted: reintentado
1365
+ skipped: omitido
1366
+ resume:
1367
+ carry_on: 'Reanudar: seguir con %{step}'
1368
+ continue: 'Reanudar: continuar con %{step}'
1369
+ finish: 'Reanudar: terminar la ejecución'
1370
+ resend: 'Reanudar: enviar %{step} de nuevo'
1371
+ retry: 'Reanudar: reintentar %{step}'
1372
+ rewait: 'Reanudar: esperar de nuevo a %{step}'
1373
+ show:
1374
+ actions: Acciones
1375
+ arguments: Argumentos
1376
+ back: "← Workflows"
1377
+ cancelled_at: Cancelado
1378
+ class_missing: "%{workflow_class} no está cargado en este proceso: la ejecución aún se puede cancelar, pero no reanudar."
1379
+ definition_outdated: 'Esta ejecución se inició con una definición anterior de %{workflow_class}: sus pasos han cambiado desde entonces.'
1380
+ details: Detalles
1381
+ finished_at: Terminado
1382
+ no_arguments: Esta ejecución no tiene argumentos.
1383
+ paused_at: Pausado
1384
+ reason_hint: Se registra en el historial de auditoría, junto a quien lo hizo.
1385
+ reason_label: Motivo (opcional)
1386
+ rerun_of: Repetición de
1387
+ reruns: Repetida como
1388
+ resume_at_label: Paso desde el que reanudar
1389
+ signal:
1390
+ hint: Un paso que la espera despierta de inmediato; si no, queda pendiente hasta que un paso la tome.
1391
+ name: Nombre de la señal
1392
+ payload: Carga útil (JSON)
1393
+ send: Enviar señal
1394
+ title: Enviar una señal
1395
+ signal_statuses:
1396
+ claimed: Reclamada
1397
+ consumed: Consumida
1398
+ pending: Pendiente
1399
+ signals:
1400
+ empty: No se entregó ninguna señal a esta ejecución.
1401
+ headers:
1402
+ claimed: Reclamada
1403
+ consumed: Consumida
1404
+ idempotency_key: Clave de idempotencia
1405
+ name: Señal
1406
+ received: Recibida
1407
+ status: Estado
1408
+ payload: Carga útil
1409
+ title: Señales
1410
+ statuses:
1411
+ cancelled: Cancelado
1412
+ finished: Terminado
1413
+ gone: desaparecido
1414
+ paused: En pausa
1415
+ performing: Ejecutándose
1416
+ ready: Listo
1417
+ scheduled: Programado
1418
+ waiting: En espera
1419
+ step_statuses:
1420
+ cancelled: Cancelado
1421
+ completed: Completado
1422
+ failed: Fallido
1423
+ in_progress: En ejecución
1424
+ scheduled: Programado
1425
+ skipped: Omitido
1426
+ waiting: En espera
1427
+ steps:
1428
+ batch: lote %{batch}
1429
+ caused_by: Causado por %{error}
1430
+ empty: Aún no hay intentos.
1431
+ headers:
1432
+ finished: Terminado
1433
+ queued: En cola
1434
+ ran: Ejecución
1435
+ scheduled: Programado
1436
+ started: Iniciado
1437
+ status: Estado
1438
+ step: Paso
1439
+ waited: Espera
1440
+ worker: Worker
1441
+ revision: revisión %{revision}
1442
+ show_backtrace: Mostrar traza
1443
+ title: Intentos
1444
+ waiting_for: luego espera %{duration}
1445
+ waits_for_html: espera %{signal}
1446
+ tabs:
1447
+ all: Todos
1448
+ cancelled: Cancelados
1449
+ finished: Terminados
1450
+ ongoing: En curso
1451
+ paused: En pausa
1452
+ performing: Ejecutándose
1453
+ ready: Listos
1454
+ waiting: En espera
1455
+ timeline:
1456
+ caption: 'Cada intento, el más antiguo arriba: esperó (su espera), en cola (vencido, aún sin tomar), se ejecutó (coloreado según cómo terminó) y en espera (de una señal o de su lote), con las pausas en su propia fila. La tabla de intentos de abajo muestra las mismas duraciones. Una línea discontinua marca cada vez que una espera superó su plazo.'
1457
+ empty: Aún no hay intentos.
1458
+ paused_period_html: En pausa desde %{from} durante %{duration}
1459
+ paused_row: En pausa
1460
+ series:
1461
+ paused: En pausa
1462
+ queued: En cola
1463
+ ran_cancelled: Ejecutado, cancelado
1464
+ ran_failed: Ejecutado, fallido
1465
+ ran_ok: Ejecutado
1466
+ ran_open: En ejecución
1467
+ waited: Esperó
1468
+ waiting: En espera
1469
+ title: Cronología
1470
+ wait_timeout_html: 'La espera de %{step} superó su plazo en %{time} (on_timeout: %{action}).'