12 KiB
PROSE-WORKFLOW-STANDARD.md
Fleet Standard for Autonomous Cycle Definition
Status: RATIFIED — April 6, 2026
Authors: Ezra (bridge) + Timmy (engine)
Authority: Alexander Whitestone
Applies to: All wizard houses, all repeatable work
The One Rule
If your lane involves repeatable work, express it as a workflow.
No more 200-word prompts. No more heroic one-off sessions. Define the cycle once. Run it infinitely.
The Sovereign Cycle
Every autonomous workflow follows the same heartbeat:
WAKE → ASSESS → ACT → COMMIT → REPORT → SLEEP
| Phase | Purpose | Output |
|---|---|---|
| WAKE | Load state, verify preconditions, gather inputs | inputs/ snapshot |
| ASSESS | Evaluate against contract (requires/ensures) | Go / No-go decision |
| ACT | Execute the core work (parallel or sequential) | Artifacts + side effects |
| COMMIT | Persist changes with proof (commits, comments, files) | Evidence hashes |
| REPORT | Summarize what happened and why | Structured log entry |
| SLEEP | Save cycle state, schedule next wake | Checkpoint written |
Two Formats, One Standard
The fleet supports two equivalent representations. Use whichever matches your executor.
Format A: .prose / .md — Ezra's Bridge
For agents running through Hermes delegate_task. Contracts are readable, enforceable intent.
File location: ~/.hermes/prose-workflows/<name>.md
Executor: prose2hermes.py → generates Python script with delegate_task calls
Best for: Complex reasoning tasks, PR reviews, research synthesis, multi-agent coordination
Required Sections
---
name: wizard-health-check
kind: service
services: [disk, gateway, gitea, memory]
---
requires:
- runbook: path to the health check definition
- thresholds: critical vs warning limits per check
- owner: the wizard house responsible for action
ensures:
- report: a structured markdown report of all checks
- alerts: Telegram notifications for any critical findings
- checkpoint: cycle state saved to SQLite
strategies:
- when a check fails: run remediation once, then alert
- when multiple checks fail: prioritize disk and security
- when all checks pass: still commit a null report for traceability
execution:
call disk_check
task: Verify disk usage is below threshold
runbook: "{{runbook}}"
threshold: "{{thresholds.disk}}"
call gateway_check
task: Verify all gateway processes are alive
owner: "{{owner}}"
call report_assemble
task: Compile checks into markdown report
checks: "$results"
Frontmatter Schema
| Key | Type | Required | Description |
|---|---|---|---|
name |
string | ✅ | Canonical workflow identifier |
kind |
string | ✅ | service, cycle, review, triage |
services |
list | optional | Named sub-services this workflow coordinates |
version |
string | optional | Semver for tracking changes |
owner |
string | optional | Wizard house DRI |
Format B: .yaml — Timmy's Engine
For agents running the native Hermes workflow engine. Cycles are machine-executable with state persistence.
File location: ~/.hermes/prose-workflows/<name>.yaml
Executor: prose-workflow-engine.py
Best for: Scheduled health checks, cron loops, telemetry pipelines, mechanical repetition
Required Schema
name: wizard-health-check
kind: cycle
version: "1.0.0"
owner: ezra
cycle:
wake:
load: [runbook, thresholds, owner]
verify: [runbook_exists]
assess:
condition: runbook_valid
on_fail: report_and_sleep
act:
steps:
- id: disk_check
tool: terminal
command: "python3 health_check.py --runbook {{runbook}} --threshold {{thresholds.disk}}"
- id: gateway_check
tool: terminal
command: "python3 gateway_check.py --owner {{owner}}"
parallel: false
- id: report_assemble
tool: file
depends_on: [disk_check, gateway_check]
template: "reports/health-check.md.j2"
commit:
- save_file: "reports/{{timestamp}}-health-check.md"
- send_telegram: "{{owner}}-alerts"
- write_checkpoint: "wizard-health-check"
report:
format: markdown
fields: [summary, critical_count, warning_count, remediation_taken]
sleep:
interval: "1h"
checkpoint_path: "~/.hermes/prose-workflows/checkpoints/wizard-health-check.json"
YAML Schema
| Key | Type | Required | Description |
|---|---|---|---|
name |
string | ✅ | Matches .prose name for equivalence |
kind |
string | ✅ | cycle, service, review, triage |
cycle.wake |
dict | ✅ | Precondition checks and input loading |
cycle.assess |
dict | ✅ | Go/no-go gate |
cycle.act |
dict | ✅ | Steps to execute |
cycle.commit |
list | ✅ | Persistence actions |
cycle.report |
dict | ✅ | Output specification |
cycle.sleep |
dict | ✅ | Checkpoint + scheduling |
Mapping Between Formats
.prose concept |
.yaml equivalent |
|---|---|
requires: |
cycle.wake.load + cycle.assess |
ensures: |
cycle.report.fields + cycle.commit |
strategies: |
Step notes: or on_fail: handlers |
call <service> |
cycle.act.steps[] |
{{variable}} |
Jinja2 templating in YAML |
$results |
depends_on: references |
Both formats must produce the same observable behavior: same inputs consumed, same artifacts committed, same report generated.
Fleet Example Library
Example 1: PR Review Workflow
ezra-pr-review.prose (bridge format)
---
name: ezra-pr-review
kind: review
services: [security, performance, maintainability]
owner: ezra
---
requires:
- pr_url: the URL of the pull request
- repo: the repository full name
ensures:
- review: a unified code review comment posted to the PR
- each issue: has severity and actionable recommendation
- issues are prioritized by severity
strategies:
- when reviewing large diffs: focus on changed files and entry points
- when many issues found: group by category and highlight the top 5
execution:
call security_review
task: Review PR for security issues
pr_url: "{{pr_url}}"
repo: "{{repo}}"
call performance_review
task: Review PR for performance issues
pr_url: "{{pr_url}}"
repo: "{{repo}}"
call maintainability_review
task: Review PR for maintainability issues
pr_url: "{{pr_url}}"
repo: "{{repo}}"
call report_unify
task: Post unified review comment
pr_url: "{{pr_url}}"
reviews: "$results"
ezra-pr-review.yaml (engine format)
name: ezra-pr-review
kind: review
owner: ezra
cycle:
wake:
load: [pr_url, repo]
verify: [pr_url_accessible]
assess:
condition: pr_open
act:
steps:
- id: security_review
tool: delegate
goal: "Review PR for security issues"
context:
pr_url: "{{pr_url}}"
repo: "{{repo}}"
- id: performance_review
tool: delegate
goal: "Review PR for performance issues"
context:
pr_url: "{{pr_url}}"
repo: "{{repo}}"
parallel: true
- id: maintainability_review
tool: delegate
goal: "Review PR for maintainability issues"
context:
pr_url: "{{pr_url}}"
repo: "{{repo}}"
parallel: true
- id: report_unify
tool: file
depends_on: [security_review, performance_review, maintainability_review]
action: post_pr_comment
target: "{{pr_url}}"
commit:
- post_comment: "{{pr_url}}"
- save_file: "reviews/{{repo}}-{{pr_number}}.md"
report:
format: markdown
fields: [severity_counts, top_issues, recommendation]
sleep:
interval: "on_demand"
Example 2: Health Check Workflow
wizard-health-check.yaml (engine format)
name: wizard-health-check
kind: cycle
owner: ezra
cycle:
wake:
load: [thresholds, owner]
assess:
condition: always_run
act:
steps:
- id: disk
tool: terminal
command: "df -h"
- id: gateway
tool: terminal
command: "pgrep -f 'hermes gateway'"
- id: gitea
tool: terminal
command: "python3 -c 'from tools.gitea_api import get_client; get_client().whoami()'"
- id: memory
tool: terminal
command: "free -h"
commit:
- save_file: "health-checks/{{timestamp}}-{{owner}}.md"
- send_telegram: "{{owner}}-alerts"
report:
format: markdown
fields: [pass_count, fail_count, critical_alerts]
sleep:
interval: "1h"
Example 3: Issue Triage Workflow
fleet-triage.prose (bridge format)
---
name: fleet-triage
kind: triage
services: [scan, rank, assign, notify]
owner: ezra
---
requires:
- repo: target repository
- board: project board name
- assignees: list of available agents
ensures:
- stale issues: closed or pinged
- unassigned issues: assigned to best-fit agent
- duplicates: marked and linked
- report: posted to Telegram with today's actions
strategies:
- when an issue is >30 days old with no activity: close as stale
- when an issue matches an existing open issue: mark duplicate
- when agent capacity is known: assign to least-loaded producer
execution:
call scan_issues
task: Scan all open issues in repo
repo: "{{repo}}"
call rank_issues
task: Rank issues by priority and staleness
issues: "$results.scan_issues"
call assign_issues
task: Assign unassigned issues to best-fit agents
ranked: "$results.rank_issues"
assignees: "{{assignees}}"
call notify
task: Post triage summary to Telegram
actions: "$results"
Naming Conventions
-
Workflow files:
<wizard>-<verb>.mdor<wizard>-<verb>.yaml- Good:
ezra-pr-review.md,bezalel-health-check.yaml - Bad:
workflow1.md,new_workflow.yaml
- Good:
-
Checkpoints:
~/.hermes/prose-workflows/checkpoints/<name>.json -
Reports:
~/.hermes/prose-workflows/reports/<timestamp>-<name>.md -
Issue references: Every workflow execution must reference a Gitea issue or epic in its report.
Adoption Rules
- New repeatable work: Must be defined as a workflow before execution.
- Existing epics: Convert to workflows during next review cycle.
- One-shot tasks: Don't workflow-ify exploration or research. Use your judgment.
- Both formats accepted: No format wars.
.prose↔.yamlare equivalent. - Commit the proof: A workflow without a committed artifact didn't run.
Toolchain Reference
| Tool | Path | Purpose |
|---|---|---|
| Ezra's bridge | ~/.hermes/skills/devops/open-prose-bridge/scripts/prose2hermes.py |
.prose → Hermes Python |
| Timmy's engine | ~/.hermes/bin/prose-workflow-engine.py |
.yaml → native cycle executor |
| Workflow directory | ~/.hermes/prose-workflows/ |
Standard home for all definitions |
| Checkpoint directory | ~/.hermes/prose-workflows/checkpoints/ |
Cycle state persistence |
| Report directory | ~/.hermes/prose-workflows/reports/ |
Human-readable execution logs |
Ratification
This standard is active immediately. All wizard houses are directed to:
- Read this document.
- Convert their highest-frequency repeatable task to a workflow (either format).
- Execute it within 24 hours.
- Post proof to their epic or Gitea issue.
No more prompt engineering. No more heroic sessions. Just defined cycles, infinite execution.
"The pattern works. Ezra proved the bridge. Timmy proved the engine. Now run it."