pub const HERMES_WORKFLOW: &str = "# Hermes 0.21 card machine and independent run supervision. ADR 0001.\ndescription: Hermes Kanban\'s lifecycle and dispatcher, with supercode\'s session lanes\nparams:\n dispatch_in_gateway: true\n dispatch_interval_seconds: 60\n dispatch_stale_timeout_seconds: null\n failure_limit: 2\n claim_ttl_seconds: 900\n max_in_progress: null\n max_in_progress_per_profile: null\n max_spawn: null\n default_assignee: null\n review_dispatch: true\n review_skills:\n - sdlc-review\n auto_decompose: true\n auto_decompose_per_tick: 3\n reconcile_orphans: true\n block_recurrence_limit: 2\n rate_limit_cooldown_seconds: 300\n recent_success_seconds: 3600\n active_pr_seconds: 86400\n blocker_pattern: (?i)\\b(quota|rate[\\s_-]?limit|429|403|auth\\w*|unauthorized|forbidden|billing|subscription|access[\\s_]denied|permission[\\s_]denied|invalid[\\s_]api[\\s_]key)\\b\n pr_pattern: (?i)https?://github\\.com/[^/\\s]+/[^/\\s]+/pull/\\d+\n session_grace_seconds: 120\n goal_mode_default: false\n goal_max_turns: 20\n heartbeat_quiet_seconds: 1800\n managers: []\n machine_offline_grace_seconds: 3600\n machines: {}\nroles:\n implementer: card.assignee ?? params.default_assignee\n reviewer: card.assignee ?? params.default_assignee\n creator: card.created_by\n triager: card.assignee ?? params.default_assignee\ninitial:\n- guard: event.initial_status == \'blocked\'\n target: blocked\n actions:\n - assign:\n field: goal_mode\n value: \'{{event.goal ?? (event.subtask_of == null && params.goal_mode_default)}}\'\n- guard: event.triage\n target: triage\n actions:\n - assign:\n field: goal_mode\n value: \'{{event.goal ?? (event.subtask_of == null && params.goal_mode_default)}}\'\n- guard: \'!card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\'])\'\n target: todo\n actions:\n - assign:\n field: goal_mode\n value: \'{{event.goal ?? (event.subtask_of == null && params.goal_mode_default)}}\'\n- target: ready\n actions:\n - assign:\n field: goal_mode\n value: \'{{event.goal ?? (event.subtask_of == null && params.goal_mode_default)}}\'\nstatuses:\n triage:\n stored_as: triage\n description: a rough idea waiting to be specified (Hermes asks its auxiliary model; here a session writes it)\n run_role: triager\n resume_as: triage\n todo:\n stored_as: todo\n description: waiting on its parents\n always:\n - guard: card.arc != null && card.arc.status in [\'done\', \'archived\']\n target: blocked\n actions:\n - assign:\n field: block_kind\n value: needs_input\n - record:\n kind: blocked\n payload:\n reason: its arc {{card.arc.id}} ended with it open\n kind: needs_input\n source_status: ready\n - guard: card.parents.all(p, p.status in [\'done\', \'archived\'])\n target: ready\n actions:\n - record: promoted\n ready:\n stored_as: ready\n description: waiting for the dispatcher to start it\n always:\n - guard: card.arc != null && card.arc.status in [\'done\', \'archived\']\n target: blocked\n actions:\n - assign:\n field: block_kind\n value: needs_input\n - record:\n kind: blocked\n payload:\n reason: its arc {{card.arc.id}} ended with it open\n kind: needs_input\n source_status: ready\n - guard: \'!card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\'])\'\n target: todo\n running:\n stored_as: running\n description: its implementer is working it\n run_role: implementer\n resume_as: ready\n review:\n stored_as: review\n description: its implementer asked for review\n run_role: reviewer\n resume_as: review\n exit:\n - close_session: reviewer\n blocked:\n stored_as: blocked\n description: waiting on a person, a capability, or a transient cause\n always:\n - guard: card.last_block_event != \'blocked\' && card.counters.failures < (card.max_retries ?? params.failure_limit) &&\n card.parents.all(p, p.status in [\'done\', \'archived\'])\n target: \'{{card.resume_status ?? \'\'ready\'\'}}\'\n actions:\n - record: promoted\n scheduled:\n stored_as: scheduled\n description: set aside until someone brings it back\n done:\n stored_as: done\n description: finished\n archived:\n stored_as: archived\n description: out of the way\ndispatch:\n serve: params.dispatch_in_gateway\n tick: params.dispatch_interval_seconds\n start: start\n eligible: card.current_run_id == null && (card.claim_lock == null && card.subtask_of == null && !(run.local && (host.memory_pressure\n == \'critical\' || (host.memory_pressure == \'elevated\' && tick.local_started >= 1))))\n order:\n - \'card.status == \'\'review\'\' ? 1 : 0\'\n - -card.priority\n - card.created_at\n limits:\n - description: the home runs this many cards at most across its boards (kanban.max_in_progress)\n group: \'\'\'home\'\'\'\n counts: card.stored_as == \'running\'\n max: params.max_in_progress ?? host.max_in_progress\n reserve:\n for: card.status == \'review\'\n slots: 1\n - description: the board runs this many cards at most (kanban.max_spawn)\n group: card.board\n counts: card.stored_as == \'running\'\n max: params.max_spawn\n - description: the profile\'s capacity (worker.capacity, else kanban.max_in_progress_per_profile)\n group: card.assignee\n counts: card.stored_as == \'running\'\n max: lane.capacity ?? params.max_in_progress_per_profile\n - description: the machine\'s capacity; an idle session on a done or blocked card holds its place until closed (ours)\n group: card.machine\n counts: card.stored_as == \'running\' || card.session_live\n max: params.machines[card.machine].capacity\n - description: triage sessions started per tick (kanban.auto_decompose_per_tick)\n group: \'\'\'triage\'\'\'\n counts: card.status == \'triage\' && card.current_run_id != null && card.started_this_tick\n max: params.auto_decompose_per_tick\nnotify:\n creator:\n completed: \'\u{2714} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} done \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n blocked: \'\u{23f8} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} blocked{{event.reason ? \'\': \'\' +\n cut(event.reason, 300) : \'\'\'\'}}\'\n gave_up: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} gave up after {{event.failures}}\n failures{{event.error ? \'\'\n\n \'\' + cut(event.error, 300) : \'\'\'\'}}\'\n crashed: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}}: its worker exited without completing\n it; the board will retry\'\n timed_out: \'\u{23f1} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} timed out (max_runtime {{event.limit_seconds}}s);\n the board will retry\'\n status: \'\u{1f504} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2192} {{event.status}}\'\n block_loop_detected: \'\u{1f6d1} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} went to triage: blocked\n {{event.recurrences}}x for the same cause{{event.reason ? \'\': \'\' + cut(event.reason, 200) : \'\'\'\'}}\'\n review_requested: \'\u{1f440} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} ready for review \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n changes_requested: \'\u{1f6d1} card {{card.id}}: review asked for changes: {{cut(event.reason ?? \'\'reviewer feedback\'\', 300)}}\'\n session_started: \'\u{25b6} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2014} {{card.title}}: the board\n started session {{event.session_id}} on {{event.machine}} (pane {{event.pane}}; {{event.address}}).\'\n session_resumed: \'\u{25b6} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2014} {{card.title}}: the board\n resumed session {{event.session_id}} on {{event.machine}} (pane {{event.pane}}; {{event.address}}).\'\n session_replaced: \'\u{25b6} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2014} {{card.title}}: the board\n could not resume the card\'\'s last session and started session {{event.session_id}} on {{event.machine}} (pane {{event.pane}};\n {{event.address}}).\'\n session_adopted: \'\u{25b6} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2014} {{card.title}}: the board\n found session {{event.session_id}} still live on {{event.machine}} and kept it ({{event.address}}).\'\n session_lost: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}}: session {{event.session_id}}\n is gone from {{event.machine}}; the board resumes it, and replaces it from the card only when it cannot.\'\n spawn_failed: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}}: its session did not start:\n {{cut(event.error, 300)}}\'\n worker:\n commented: \'\u{1f4ac} card {{card.id}}, {{event.author}}:\n\n {{comment.body}}\'\n assigned: card {{card.id}} is now assigned to {{event.assignee ?? \'nobody\'}}\n machine_set: card {{card.id}} now runs on {{event.machine ?? \'no machine\'}}\n blocked: \'\u{23f8} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} blocked{{event.reason ? \'\': \'\' +\n cut(event.reason, 300) : \'\'\'\'}}\'\n unblocked: \u{25b6} card {{card.id}} unblocked\n completed: \'\u{2714} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} done \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n archived: card {{card.id}} archived\n changes_requested: \'\u{1f6d1} card {{card.id}}: review asked for changes: {{cut(event.reason ?? \'\'reviewer feedback\'\', 300)}}\'\n linked: \'card {{card.id}}: dependency linked ({{event.parent}} \u{2192} {{event.child}})\'\n unlinked: \'card {{card.id}}: dependency unlinked ({{event.parent}} \u{2192} {{event.child}})\'\n promoted_manual: card {{card.id}} promoted to ready by {{event.actor}}\n subtask_added: \'card {{card.id}} has a new subtask {{event.subtask}}: {{event.title}}\'\n session_adopted: \'\u{25b6} card {{card.id}} \u{2014} {{card.title}} is running again, with you: carry it on from where it stands (`supercode\n workflow show {{card.id}}` reads it).\'\n dependency:\n completed: \'\u{2714} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} done \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n blocked: \'\u{23f8} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} blocked{{event.reason ? \'\': \'\' +\n cut(event.reason, 300) : \'\'\'\'}}\'\n unblocked: \u{25b6} card {{card.id}} unblocked\n review_requested: \'\u{1f440} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} ready for review \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n changes_requested: \'\u{1f6d1} card {{card.id}}: review asked for changes: {{cut(event.reason ?? \'\'reviewer feedback\'\', 300)}}\'\n commented: \'\u{1f4ac} card {{card.id}}, {{event.author}}:\n\n {{comment.body}}\'\n chat:\n completed: \'\u{2714} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} done \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n blocked: \'\u{23f8} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} blocked{{event.reason ? \'\': \'\' +\n cut(event.reason, 300) : \'\'\'\'}}\'\n gave_up: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} gave up after {{event.failures}}\n failures{{event.error ? \'\'\n\n \'\' + cut(event.error, 300) : \'\'\'\'}}\'\n crashed: \'\u{2716} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}}: its worker exited without completing\n it; the board will retry\'\n timed_out: \'\u{23f1} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} timed out (max_runtime {{event.limit_seconds}}s);\n the board will retry\'\n status: \'\u{1f504} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} \u{2192} {{event.status}}\'\n block_loop_detected: \'\u{1f6d1} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} went to triage: blocked\n {{event.recurrences}}x for the same cause{{event.reason ? \'\': \'\' + cut(event.reason, 200) : \'\'\'\'}}\'\n review_requested: \'\u{1f440} {{card.assignee ? \'\'@\'\' + card.assignee + \'\' \'\' : \'\'\'\'}}card {{card.id}} ready for review \u{2014} {{card.title}}{{event.summary\n ? \'\'\n\n \'\' + cut(event.summary, 300) : \'\'\'\'}}\'\n changes_requested: \'\u{1f6d1} card {{card.id}}: review asked for changes: {{cut(event.reason ?? \'\'reviewer feedback\'\', 300)}}\'\nverbs:\n specify:\n - target: todo\n actions:\n - specify: \'{{event}}\'\n - record: specified\n guard: (card.current_run_id == null) && (true)\n from:\n - triage\n - by:\n - implementer\n target: todo\n actions:\n - end_run:\n outcome: specified\n - specify: \'{{event}}\'\n - record: specified\n guard: (card.current_run_id != null) && (true)\n from:\n - triage\n decompose:\n - target: todo\n actions:\n - decompose: \'{{event}}\'\n - record: decomposed\n guard: (card.current_run_id == null) && (true)\n from:\n - triage\n - by:\n - implementer\n target: todo\n actions:\n - end_run:\n outcome: decomposed\n - decompose: \'{{event}}\'\n - record: decomposed\n guard: (card.current_run_id != null) && (true)\n from:\n - triage\n start:\n - by:\n - platform\n guard: (card.current_run_id == null) && (params.auto_decompose)\n target: triage\n actions:\n - claim: implementer\n from:\n - triage\n - by:\n - manager\n target: triage\n actions:\n - claim: implementer\n guard: (card.current_run_id == null) && (true)\n from:\n - triage\n - by:\n - platform\n validate:\n - expr: \'!(card.last_run.outcome == \'\'rate_limited\'\' && now - card.last_run.ended_at < params.rate_limit_cooldown_seconds)\'\n message: rate_limit_cooldown\n - expr: \'!matches(card.last_failure_error, params.blocker_pattern)\'\n message: blocker_auth\n - expr: \'!(card.last_completed != null && now - card.last_completed.ended_at < params.recent_success_seconds && card.events_since(card.last_completed.ended_at,\n [\'\'status\'\', \'\'promoted\'\', \'\'unblocked\'\', \'\'reclaimed\'\']).size() == 0)\'\n message: recent_success\n - expr: \'!card.comments_since(now - params.active_pr_seconds).exists(c, matches(c.body, params.pr_pattern))\'\n message: active_pr\n target: running\n actions:\n - claim: implementer\n from:\n - ready\n - by:\n - platform\n guard: (card.current_run_id == null) && (params.review_dispatch)\n validate:\n - expr: \'!(card.last_run.outcome == \'\'rate_limited\'\' && now - card.last_run.ended_at < params.rate_limit_cooldown_seconds)\'\n message: rate_limit_cooldown\n - expr: \'!matches(card.last_failure_error, params.blocker_pattern)\'\n message: blocker_auth\n target: review\n actions:\n - claim: reviewer\n from:\n - review\n block:\n - by:\n - implementer\n - manager\n description: \'you cannot go on: `\"<why>\" --kind needs_input|capability|transient|dependency`\'\n target: blocked\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: blocked\n guard: (card.current_run_id != null) && (true)\n from:\n - triage\n - guard: event.kind == \'dependency\'\n target: todo\n actions:\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: dependency_wait\n from:\n - ready\n - guard: card.block_kind == event.kind && card.counters.block_recurrences + 1 >= params.block_recurrence_limit\n target: triage\n actions:\n - count: block_recurrences\n - record: block_loop_detected\n from:\n - ready\n - target: blocked\n actions:\n - count: block_recurrences\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: blocked\n from:\n - ready\n - by:\n - implementer\n - manager\n description: \'you cannot go on and nothing you wait on will wake you (a wait with a known end is a heartbeat `--until`):\n `\"<why>\" --kind needs_input|capability|transient|dependency`\'\n guard: event.kind == \'dependency\'\n target: todo\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: dependency_wait\n from:\n - running\n - by:\n - implementer\n - manager\n guard: card.block_kind == event.kind && card.counters.block_recurrences + 1 >= params.block_recurrence_limit\n target: triage\n actions:\n - end_run:\n outcome: blocked\n - count: block_recurrences\n - record: block_loop_detected\n from:\n - running\n - by:\n - implementer\n - manager\n target: blocked\n actions:\n - end_run:\n outcome: blocked\n - count: block_recurrences\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: blocked\n from:\n - running\n - target: blocked\n actions:\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: blocked\n guard: (card.current_run_id == null) && (true)\n from:\n - review\n - by:\n - reviewer\n - manager\n description: \'you cannot go on and nothing you wait on will wake you (a wait with a known end is a heartbeat `--until`):\n `\"<why>\" --kind needs_input|capability|transient|dependency`\'\n target: blocked\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record: blocked\n guard: (card.current_run_id != null) && (true)\n from:\n - review\n - by:\n - implementer\n - manager\n guard: event.kind == \'dependency\'\n target: todo\n actions:\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record:\n kind: dependency_wait\n payload:\n reason: \'{{event.reason}}\'\n kind: dependency\n source_status: \'{{card.resume_status}}\'\n from:\n - blocked\n - by:\n - implementer\n - manager\n description: \'the block is another: `\"<why>\" --kind needs_input|capability|transient|dependency`\'\n actions:\n - assign:\n field: block_kind\n value: \'{{event.kind}}\'\n - record:\n kind: blocked\n payload:\n reason: \'{{event.reason}}\'\n kind: \'{{event.kind}}\'\n source_status: \'{{card.resume_status}}\'\n from:\n - blocked\n promote:\n - validate:\n - expr: event.force || card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: parents not done (force to override)\n target: ready\n actions:\n - record: promoted_manual\n from:\n - todo\n - validate:\n - expr: event.force || card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: parents not done (force to override)\n target: ready\n actions:\n - record: promoted_manual\n from:\n - blocked\n schedule:\n - target: scheduled\n actions:\n - record: scheduled\n from:\n - todo\n - target: scheduled\n actions:\n - record: scheduled\n from:\n - ready\n - by:\n - manager\n target: scheduled\n actions:\n - end_run:\n outcome: scheduled\n - record: scheduled\n from:\n - running\n - target: scheduled\n actions:\n - record: scheduled\n from:\n - blocked\n request_review:\n - target: review\n actions:\n - assign:\n field: assignee\n value: \'{{event.reviewer ?? (card.last_reviewer in lanes ? card.last_reviewer : null) ?? card.assignee}}\'\n - record: review_requested\n from:\n - ready\n - by:\n - implementer\n - manager\n description: \'the work is ready for review: `--summary \"<what to review>\"`\'\n validate:\n - expr: event.run_id == card.current_run_id || event.force\n message: the card is running under a live claim; its worker requests review, or pass --force\n target: review\n actions:\n - end_run:\n outcome: review_requested\n - assign:\n field: assignee\n value: \'{{event.reviewer ?? (card.last_reviewer in lanes ? card.last_reviewer : null) ?? card.assignee}}\'\n - record: review_requested\n from:\n - running\n complete:\n - validate:\n - expr: card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: the card waits on parents that are not done\n target: done\n actions:\n - end_run:\n outcome: completed\n - set_result: \'{{event}}\'\n - reset:\n - failures\n - block_recurrences\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - assign:\n field: block_kind\n value: \'{{null}}\'\n - cleanup_workspace: null\n - record: completed\n - check_references: \'{{event}}\'\n from:\n - ready\n - by:\n - implementer\n - manager\n description: \'the work is done: `--summary \"<what you did and how it was verified>\"`\'\n validate:\n - expr: event.run_id == null || event.run_id == card.current_run_id\n message: that run is no longer the card\'s current run\n - expr: card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: the card waits on parents that are not done\n target: done\n actions:\n - end_run:\n outcome: completed\n - set_result: \'{{event}}\'\n - reset:\n - failures\n - block_recurrences\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - assign:\n field: block_kind\n value: \'{{null}}\'\n - cleanup_workspace: null\n - record: completed\n - check_references: \'{{event}}\'\n from:\n - running\n - by:\n - reviewer\n - manager\n description: \'the work is done: `--summary \"<what you did and how it was verified>\"`\'\n validate:\n - expr: card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: the card waits on parents that are not done\n target: done\n actions:\n - end_run:\n outcome: completed\n summary: \'{{event.summary ?? \'\'Review approved without additional evidence.\'\'}}\'\n - set_result: \'{{event}}\'\n - reset:\n - failures\n - block_recurrences\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - assign:\n field: block_kind\n value: \'{{null}}\'\n - cleanup_workspace: null\n - record: completed\n - check_references: \'{{event}}\'\n guard: (card.current_run_id == null) && (true)\n from:\n - review\n - by:\n - reviewer\n - manager\n description: \'the work is done: `--summary \"<what you did and how it was verified>\"`\'\n validate:\n - expr: card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: the card waits on parents that are not done\n target: done\n actions:\n - end_run:\n outcome: completed\n - set_result: \'{{event}}\'\n - reset:\n - failures\n - block_recurrences\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - assign:\n field: block_kind\n value: \'{{null}}\'\n - cleanup_workspace: null\n - record: completed\n - check_references: \'{{event}}\'\n guard: (card.current_run_id != null) && (true)\n from:\n - review\n - validate:\n - expr: card.parents.all(p, p.status in [\'done\', \'archived\'])\n message: the card waits on parents that are not done\n target: done\n actions:\n - set_result: \'{{event}}\'\n - reset:\n - failures\n - block_recurrences\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - assign:\n field: block_kind\n value: \'{{null}}\'\n - record: completed\n - check_references: \'{{event}}\'\n from:\n - blocked\n reclaim:\n - by:\n - manager\n target: ready\n actions:\n - end_run:\n outcome: reclaimed\n - reset:\n - failures\n - record: reclaimed\n from:\n - running\n request_changes:\n - by:\n - reviewer\n - manager\n target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? \'\'ready\'\' : \'\'todo\'\'}}\'\n actions:\n - assign:\n field: assignee\n value: \'{{card.implementer}}\'\n - record: changes_requested\n guard: (card.current_run_id == null) && (true)\n from:\n - review\n - by:\n - reviewer\n - manager\n description: \'send it back to its implementer: `\"<what must change>\"`\'\n target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? \'\'ready\'\' : \'\'todo\'\'}}\'\n actions:\n - end_run:\n outcome: changes_requested\n - assign:\n field: assignee\n value: \'{{card.implementer}}\'\n - record: changes_requested\n guard: (card.current_run_id != null) && (true)\n from:\n - review\n reopen_review:\n - by:\n - manager\n target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? \'\'ready\'\' : \'\'todo\'\'}}\'\n actions:\n - assign:\n field: assignee\n value: \'{{card.implementer}}\'\n - record: review_reopened\n guard: (card.current_run_id == null) && (true)\n from:\n - review\n unblock:\n - by:\n - implementer\n description: \'what you waited on arrived: `--reason \"<what arrived>\"`\'\n guard: card.counters.failures < (card.max_retries ?? params.failure_limit)\n target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? (card.resume_status ?? \'\'ready\'\') : \'\'todo\'\'}}\'\n actions:\n - record: unblocked\n from:\n - blocked\n - target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? (card.resume_status ?? \'\'ready\'\') : \'\'todo\'\'}}\'\n actions:\n - reset:\n - failures\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - record: unblocked\n from:\n - blocked\n - target: ready\n actions:\n - record: unblocked\n from:\n - scheduled\n edit:\n - actions:\n - set_result: \'{{event}}\'\n - record: edited\n from:\n - done\n reopen:\n - target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? \'\'ready\'\' : \'\'todo\'\'}}\'\n actions:\n - invalidate_descendants: null\n - record: status\n from:\n - done\n - target: \'{{card.parents.all(p, p.status in [\'\'done\'\', \'\'archived\'\']) ? \'\'ready\'\' : \'\'todo\'\'}}\'\n actions:\n - invalidate_descendants: null\n - record: status\n from:\n - archived\n comment:\n - actions:\n - record: commented\n assign:\n - validate:\n - expr: \'!(card.status in [\'\'running\'\', \'\'reviewing\'\'])\'\n message: the card is running; reclaim it before reassigning\n guard: event.assignee != card.assignee\n actions:\n - assign:\n field: assignee\n value: \'{{event.assignee}}\'\n - reset:\n - failures\n - assign:\n field: last_failure_error\n value: \'{{null}}\'\n - record: assigned\n - actions:\n - record: assigned\n set_model:\n - actions:\n - assign:\n field: model_override\n value: \'{{event.model}}\'\n - assign:\n field: provider_override\n value: \'{{event.provider}}\'\n - record: model_override_set\n set_goal:\n - actions:\n - assign:\n field: goal_mode\n value: \'{{event.goal}}\'\n - assign:\n field: goal_max_turns\n value: \'{{event.max_turns}}\'\n - record: goal_set\n link:\n - actions:\n - link: \'{{event.parent}}\'\n - record: linked\n unlink:\n - actions:\n - unlink: \'{{event.parent}}\'\n - record: unlinked\n archive:\n - target: archived\n actions:\n - end_run:\n outcome: reclaimed\n summary: task archived with run still active\n - record: archived\n adopt:\n - by:\n - manager\n validate:\n - expr: card.status in [\'todo\', \'ready\', \'blocked\', \'scheduled\', \'triage\', \'review\']\n message: only an open card takes a session\n target: running\n actions:\n - claim: implementer\nrun:\n initial: active\n roles:\n triager:\n role: implementer\n session: worker\n prompt_file: prompts/triager.md\n implementer:\n role: implementer\n session: worker\n limits:\n runtime: card.max_runtime_seconds\n stale: \'run.surface == \'\'headless\'\' ? params.dispatch_stale_timeout_seconds : null\'\n grace: params.session_grace_seconds\n prompt_file: prompts/implementer.md\n reviewer:\n role: reviewer\n session: reviewer\n skills:\n - sdlc-review\n limits:\n runtime: card.max_runtime_seconds\n grace: params.session_grace_seconds\n prompt_file: prompts/reviewer.md\n states:\n active: {}\n triaging_spawn_failed_0: {}\n triaging_spawn_failed_1: {}\n triaging_session_idle_1: {}\n triaging_machine_offline_0: {}\n triaging_session_lost_0: {}\n triaging_orphaned_0: {}\n triaging_exited_0: {}\n running_exited_0: {}\n running_exited_1: {}\n running_exited_2: {}\n running_exited_3: {}\n running_spawn_failed_0: {}\n running_spawn_failed_1: {}\n running_timed_out_0: {}\n running_timed_out_1: {}\n running_orphaned_0: {}\n running_stale_0: {}\n running_session_lost_0: {}\n running_session_lost_1: {}\n running_session_lost_2: {}\n running_machine_offline_0: {}\n running_session_idle_1: {}\n reviewing_exited_0: {}\n reviewing_spawn_failed_0: {}\n reviewing_spawn_failed_1: {}\n reviewing_timed_out_0: {}\n reviewing_session_lost_0: {}\n reviewing_orphaned_0: {}\n reviewing_session_idle_1: {}\n reviewing_machine_offline_0: {}\n \'on\':\n heartbeat:\n - by:\n - implementer\n description: \'still working on a long step, or waiting on something outside (a person, a run): the board leaves you\n be for a while, or until the time you name (`--note \"<what>\" [--until <time|2h>]`)\'\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (true))\n actions:\n - extend_claim: null\n - reset:\n - goal_turns\n - record: heartbeat\n - by:\n - implementer\n description: \'still working on a long step, or waiting on something outside (a person, a run): the board leaves you\n be for a while, or until the time you name (`--note \"<what>\" [--until <time|2h>]`)\'\n guard: card.status == \'running\' && (true)\n actions:\n - extend_claim: null\n - reset:\n - goal_turns\n - record: heartbeat\n - by:\n - reviewer\n description: \'still working on a long step, or waiting on something outside (a person, a run): the board leaves you\n be for a while, or until the time you name (`--note \"<what>\" [--until <time|2h>]`)\'\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n actions:\n - extend_claim: null\n - reset:\n - goal_turns\n - record: heartbeat\n spawn_failed:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (card.counters.failures + 1 >= (card.max_retries\n ?? params.failure_limit)))\n target: triaging_spawn_failed_0\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (true))\n target: triaging_spawn_failed_1\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n - by:\n - platform\n guard: card.status == \'running\' && (card.counters.failures + 1 >= (card.max_retries ?? params.failure_limit))\n target: running_spawn_failed_0\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n target: running_spawn_failed_1\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (card.counters.failures + 1 >= (card.max_retries\n ?? params.failure_limit)))\n target: reviewing_spawn_failed_0\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n target: reviewing_spawn_failed_1\n actions:\n - end_run:\n outcome: spawn_failed\n - count: failures\n - record: spawn_failed\n session_idle:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (card.last_heartbeat_at != null && now < (card.last_events.heartbeat.payload.until\n ?? card.last_heartbeat_at + params.heartbeat_quiet_seconds)))\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (event.turns >= (card.goal_max_turns ?? params.goal_max_turns)))\n target: triaging_session_idle_1\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: needs_input\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (true))\n actions:\n - count: goal_turns\n - send_to_actor: \'Card {{card.id}} ({{card.title}}) is waiting for you to decide ({{event.turns + 1}} of {{card.goal_max_turns\n ?? params.goal_max_turns}}).\n\n {{doors}}\'\n - record:\n kind: decision_asked\n payload:\n turn: \'{{event.turns + 1}}\'\n budget: \'{{card.goal_max_turns ?? params.goal_max_turns}}\'\n - by:\n - platform\n guard: card.status == \'running\' && (card.last_heartbeat_at != null && now < (card.last_events.heartbeat.payload.until\n ?? card.last_heartbeat_at + params.heartbeat_quiet_seconds))\n - by:\n - platform\n guard: card.status == \'running\' && ((card.goal_mode || !event.worked) && event.turns >= (card.goal_max_turns ?? params.goal_max_turns))\n target: running_session_idle_1\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: needs_input\n - by:\n - platform\n guard: card.status == \'running\' && (card.goal_mode)\n actions:\n - count: goal_turns\n - send_to_actor: \'Card {{card.id}} ({{card.title}}) is not done yet: keep working toward it (goal turn {{event.turns\n + 1}} of {{card.goal_max_turns ?? params.goal_max_turns}}).\n\n {{doors}}\'\n - record:\n kind: goal_continued\n payload:\n turn: \'{{event.turns + 1}}\'\n budget: \'{{card.goal_max_turns ?? params.goal_max_turns}}\'\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n actions:\n - reset: \'{{event.worked ? [\'\'goal_turns\'\'] : []}}\'\n - count: goal_turns\n - send_to_actor: \'Card {{card.id}} ({{card.title}}) is still running and you are idle: decide ({{(event.worked ? 0 :\n event.turns) + 1}} of {{card.goal_max_turns ?? params.goal_max_turns}}). If there is more to do, keep working. A\n session that stays idle without deciding has its card blocked for its creator.\n\n {{doors}}\'\n - record:\n kind: decision_asked\n payload:\n turn: \'{{(event.worked ? 0 : event.turns) + 1}}\'\n budget: \'{{card.goal_max_turns ?? params.goal_max_turns}}\'\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (card.last_heartbeat_at != null && now < (card.last_events.heartbeat.payload.until\n ?? card.last_heartbeat_at + params.heartbeat_quiet_seconds)))\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (event.turns >= (card.goal_max_turns ?? params.goal_max_turns)))\n target: reviewing_session_idle_1\n actions:\n - end_run:\n outcome: blocked\n - assign:\n field: block_kind\n value: needs_input\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n actions:\n - count: goal_turns\n - send_to_actor: \'Card {{card.id}} ({{card.title}}) is waiting for you to decide ({{event.turns + 1}} of {{card.goal_max_turns\n ?? params.goal_max_turns}}).\n\n {{doors}}\'\n - record:\n kind: decision_asked\n payload:\n turn: \'{{event.turns + 1}}\'\n budget: \'{{card.goal_max_turns ?? params.goal_max_turns}}\'\n machine_offline:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (event.seconds >= params.machine_offline_grace_seconds))\n target: triaging_machine_offline_0\n actions:\n - end_run:\n outcome: reclaimed\n - assign:\n field: block_kind\n value: capability\n - by:\n - platform\n guard: card.status == \'running\' && (event.seconds >= params.machine_offline_grace_seconds)\n target: running_machine_offline_0\n actions:\n - end_run:\n outcome: reclaimed\n - assign:\n field: block_kind\n value: capability\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (event.seconds >= params.machine_offline_grace_seconds))\n target: reviewing_machine_offline_0\n actions:\n - end_run:\n outcome: reclaimed\n - assign:\n field: block_kind\n value: capability\n session_lost:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (true))\n target: triaging_session_lost_0\n actions:\n - end_run:\n outcome: reclaimed\n - record: session_lost\n - by:\n - platform\n guard: card.status == \'running\' && (event.never_came_up && card.counters.failures + 1 >= (card.max_retries ?? params.failure_limit))\n target: running_session_lost_0\n actions:\n - end_run:\n outcome: reclaimed\n - count: failures\n - record: session_lost\n - by:\n - platform\n guard: card.status == \'running\' && (event.never_came_up)\n target: running_session_lost_1\n actions:\n - end_run:\n outcome: reclaimed\n - count: failures\n - record: session_lost\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n target: running_session_lost_2\n actions:\n - end_run:\n outcome: reclaimed\n - record: session_lost\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n target: reviewing_session_lost_0\n actions:\n - end_run:\n outcome: reclaimed\n - record: session_lost\n orphaned:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (params.reconcile_orphans))\n target: triaging_orphaned_0\n actions:\n - end_run:\n outcome: reclaimed\n - record: reconciled\n - comment: \'Requeued: the card was running with no claim and nothing live behind it.\'\n - by:\n - platform\n guard: card.status == \'running\' && (params.reconcile_orphans)\n target: running_orphaned_0\n actions:\n - end_run:\n outcome: reclaimed\n - record: reconciled\n - comment: \'Requeued: the card was running with no claim and nothing live behind it.\'\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (params.reconcile_orphans))\n target: reviewing_orphaned_0\n actions:\n - end_run:\n outcome: reclaimed\n - record: reconciled\n - comment: \'Requeued: the card was running with no claim and nothing live behind it.\'\n exited:\n - by:\n - platform\n guard: card.status == \'triage\' && ((card.current_run_id != null) && (true))\n target: triaging_exited_0\n actions:\n - end_run:\n outcome: crashed\n - record: crashed\n - by:\n - platform\n guard: card.status == \'running\' && (event.code == 75)\n target: running_exited_0\n actions:\n - end_run:\n outcome: rate_limited\n - record: rate_limited\n - by:\n - platform\n guard: card.status == \'running\' && (event.code == 0)\n target: running_exited_1\n actions:\n - end_run:\n outcome: protocol_violation\n - count: failures\n - record: crashed\n - by:\n - platform\n guard: card.status == \'running\' && (card.counters.failures + 1 >= (card.max_retries ?? params.failure_limit))\n target: running_exited_2\n actions:\n - end_run:\n outcome: \'{{event.code == 0 ? \'\'protocol_violation\'\' : \'\'crashed\'\'}}\'\n - count: failures\n - record: crashed\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n target: running_exited_3\n actions:\n - end_run:\n outcome: \'{{event.code == 0 ? \'\'protocol_violation\'\' : \'\'crashed\'\'}}\'\n - count: failures\n - record: crashed\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n target: reviewing_exited_0\n actions:\n - end_run:\n outcome: crashed\n - count: failures\n - record: crashed\n timed_out:\n - by:\n - platform\n guard: card.status == \'running\' && (card.counters.failures + 1 >= (card.max_retries ?? params.failure_limit))\n target: running_timed_out_0\n actions:\n - stop_run: null\n - end_run:\n outcome: timed_out\n - count: failures\n - record: timed_out\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n target: running_timed_out_1\n actions:\n - stop_run: null\n - end_run:\n outcome: timed_out\n - count: failures\n - record: timed_out\n - by:\n - platform\n guard: card.status == \'review\' && ((card.current_run_id != null) && (true))\n target: reviewing_timed_out_0\n actions:\n - stop_run: null\n - end_run:\n outcome: timed_out\n - count: failures\n - record: timed_out\n stale:\n - by:\n - platform\n guard: card.status == \'running\' && (true)\n target: running_stale_0\n actions:\n - stop_run: null\n - end_run:\n outcome: stale\n - record: stale\n outcomes:\n triaging_spawn_failed_0:\n - target: blocked\n actions:\n - record: gave_up\n triaging_spawn_failed_1:\n - target: triage\n actions: []\n triaging_session_idle_1:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: its triage session went idle {{event.turns}} times without deciding; review it\n kind: needs_input\n source_status: triage\n triaging_machine_offline_0:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: machine {{event.machine}} has been off the fleet for {{event.seconds}}s\n kind: capability\n source_status: triage\n triaging_session_lost_0:\n - target: triage\n actions: []\n triaging_orphaned_0:\n - target: triage\n actions: []\n triaging_exited_0:\n - target: triage\n actions: []\n running_exited_0:\n - target: ready\n actions: []\n running_exited_1:\n - target: blocked\n actions:\n - record: gave_up\n running_exited_2:\n - target: blocked\n actions:\n - record: gave_up\n running_exited_3:\n - target: ready\n actions: []\n running_spawn_failed_0:\n - target: blocked\n actions:\n - record: gave_up\n running_spawn_failed_1:\n - target: ready\n actions: []\n running_timed_out_0:\n - target: blocked\n actions:\n - record: gave_up\n running_timed_out_1:\n - target: ready\n actions: []\n running_orphaned_0:\n - target: ready\n actions: []\n running_stale_0:\n - target: ready\n actions: []\n running_session_lost_0:\n - target: blocked\n actions:\n - record: gave_up\n running_session_lost_1:\n - target: ready\n actions: []\n running_session_lost_2:\n - target: ready\n actions: []\n running_machine_offline_0:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: machine {{event.machine}} has been off the fleet for {{event.seconds}}s\n kind: capability\n source_status: ready\n running_session_idle_1:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: its session went idle {{event.turns}} times without deciding done or blocked; review it\n kind: needs_input\n source_status: ready\n reviewing_exited_0:\n - target: review\n actions: []\n reviewing_spawn_failed_0:\n - target: blocked\n actions:\n - record: gave_up\n reviewing_spawn_failed_1:\n - target: review\n actions: []\n reviewing_timed_out_0:\n - target: review\n actions: []\n reviewing_session_lost_0:\n - target: review\n actions: []\n reviewing_orphaned_0:\n - target: review\n actions: []\n reviewing_session_idle_1:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: its reviewer went idle {{event.turns}} times without deciding; review it\n kind: needs_input\n source_status: review\n reviewing_machine_offline_0:\n - target: blocked\n actions:\n - record:\n kind: blocked\n payload:\n reason: machine {{event.machine}} has been off the fleet for {{event.seconds}}s\n kind: capability\n source_status: review\nstored_as:\n- guard: card.current_run_id != null\n status: running\nlosses:\n- role-specific prompts\n- machines, panes and resume\n- run supervision nudges\n- notice subscriptions\n- pause flag lowers to blocked\n- archived loses done versus cancelled\n";Expand description
The built-in Hermes workflow’s source.