Files
rune/scripts/admit_wave_workflow_engine.py
Nick 6a82141b83 feat(runtime): workflow engine 4.3 — four trigger classes, bounded retries, pause-with-alert, evidence-backed proposals
New module workflow-engine (library + thin shell): time (cron)/event/
condition (measured) triggers + natural-language HONESTLY STUBBED
(ErrParseStub — never fires, demands reviewed conversion); contracts
with bounded per-step retries (negative rejected, only failed step
retried); failure exhaustion PAUSES with state + per-attempt evidence
preserved + typed alert (never silent death); 3-same-way failures mint
one evidence-backed proposal (3 cases + 3 run records, awaiting_owner);
different-way failures never propose. Headless proof fake-clock <1s;
live CLI pause exit 3 with records. Red-first; race-clean.
Main-session verify: green own run.
2026-10-17 00:34:49 +01:00

107 lines
4.2 KiB
Python

"""Admission dispatch for wave workflow-engine (unattended workflows, runtime side).
classify + activate + admit (the headless scaffolding entry law,
tests/test_construction_admission.py pattern): the workflow-engine
build on the existing rune project, user-dispatch approved.
"""
import json
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
from rune import construction_activation as cact # noqa: E402
from rune import construction_admission as cadm # noqa: E402
from rune import construction_mode as cmode # noqa: E402
from rune import scaffold as sc # noqa: E402
ROOT = os.path.join(os.path.dirname(__file__), "..")
OBJECTIVE = (
"build the unattended workflow engine runtime side (openspec "
"add-native-rune-tui / unattended-workflows): four trigger classes "
"with the natural-language parse stub honestly marked (never fires, "
"registration demands reviewed conversion), workflow contracts with "
"bounded per-step retries, failure-exhaustion PAUSE with state and "
"evidence preserved plus a typed evidence-bearing alert (never "
"silent death), evidence-backed improvement proposals after three "
"same-way failures awaiting approval, and a headless run proof "
"under a fake clock with zero real sleeps"
)
AFFECTED = [
"src/go/workflow-engine/go.mod",
"src/go/workflow-engine/main.go",
"src/go/workflow-engine/internal/workflow/types.go",
"src/go/workflow-engine/internal/workflow/trigger.go",
"src/go/workflow-engine/internal/workflow/nlparse.go",
"src/go/workflow-engine/internal/workflow/engine.go",
"src/go/workflow-engine/internal/workflow/cli.go",
"src/go/workflow-engine/internal/workflow/trigger_matrix_test.go",
"src/go/workflow-engine/internal/workflow/retry_pause_test.go",
"src/go/workflow-engine/internal/workflow/proposal_test.go",
"src/go/workflow-engine/internal/workflow/headless_test.go",
]
def main() -> int:
store = os.path.join(ROOT, "store", "scaffold")
scaffold = sc.Scaffold(store, "rune")
md = cmode.classify_mode(
OBJECTIVE,
target_project="rune",
project_exists=True,
affected_surface=AFFECTED,
)
print("classified mode:", md.mode)
need = {
"need_id": "need-wave-workflow-engine",
"objective": OBJECTIVE,
"origin": "worker",
"project": "rune",
"task_ref": "wave-workflow-engine",
"affected_surface": AFFECTED,
"evidence_refs": [
"docs/openspec/changes/add-native-rune-tui/specs/unattended-workflows/spec.md",
"src/go/cron-engine/main.go",
"src/go/work-manager/main.go",
],
}
act = cact.activate(md, need=need, scaffold=scaffold,
builder="wave-workflow-engine")
print("activated:", act.get("activated"), act.get("mode"))
env = cadm.admit(
act,
objective=OBJECTIVE,
builder="wave-workflow-engine",
affected_surface=AFFECTED,
evidence_refs=need["evidence_refs"],
origin="worker",
task_ref="wave-workflow-engine",
expected_new_entities=[
"src/go/workflow-engine (module: library internal/workflow + thin shell)",
],
expected_runtime_effects=[
"event dispatch runs registered workflows headlessly, writing run records and typed alerts",
"failure exhaustion pauses the workflow with state and evidence preserved (never silent death)",
"three same-way failures mint one evidence-backed improvement proposal awaiting approval",
],
verification_obligations=[
"go test ./... in src/go/workflow-engine green (frozen batteries: trigger matrix, bounded-retry-then-pause, proposal-on-3-failures, headless fake-clock run)",
"gofmt -l clean and go vet clean in src/go/workflow-engine",
"live CLI headless run proof: run subcommand pauses with exit 3 and evidence links",
],
approval_ref="user:wave-workflow-engine dispatch",
contract_id="ADMIT-wave-workflow-engine",
project_store=store,
project_id="rune",
)
print(json.dumps(env, indent=2, default=str)[:2400])
return 0 if env.get("success") else 1
if __name__ == "__main__":
sys.exit(main())