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.
107 lines
4.2 KiB
Python
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())
|