docs(event-envelope): terminal playbook.failed on orchestrator evaluate failure (v2.27.2)
Deterministic evaluate failures (invalid template in a step body, unknown
next-arc step) now emit a terminal playbook.failed instead of stranding the
execution in RUNNING. server#95 (closes server#94), surfaced by ai-meta#54.
docs(event-envelope): add EE-5 follow-up — lax decode of integer execution_id / event_id
Closes the wire-type drift between the Rust worker (noetl-events::ExecutorEvent
emits execution_id / event_id as JSON integers) and the server's strict-
String decode (which 422'd with "invalid type: integer, expected a string").
Shipped via noetl/server#57 (v2.19.1) — two custom serde adapters
(deserialize_string_or_i64 + Option<String> variant) applied to:
- EventRequest.execution_id
- EventRequest.event_id
- BatchEventRequest.execution_id
Outbound encoding stays String for browser JSON-number precision.
6 new unit tests pin the dual-shape contract.
Tracks noetl/ai-meta#55 + noetl/server#56.
wiki: refresh event-envelope page for noetl-events crate adoption (EE-4)
Catch-up wiki update for noetl/server#38 (EE-4 PR 3) — server v2.9.0
takes a direct dep on the canonical noetl-events crate and anchors
the shared subset of EventRequest to noetl_events::ExecutorEvent
via bidirectional conversion impls + four wire-compat tests.
- "Current shape" section bumps to v2.9.0+, adds inline comments
on which fields are server-only (result_kind, result_uri,
event_ids, actionable, informative), points at the new adoption
section for the design call.
- New "noetl-events crate adoption (EE-4 follow-up, noetl/ai-meta#49)"
section: the three-PR sequence (cli#49, cli#50, server#38), the
reason the two types stay distinct (server's EventRequest carries
5 legitimately server-only fields + String wire format for
execution_id / event_id for browser JSON-number precision), the
four wire-compat tests pinning the shared-subset round-trip
semantics, the conversion impl shapes.
- "Cross-stack envelope state" table now lists noetl-events as the
canonical row + flags noetl-executor 0.4.0+ as a re-export +
notes noetl-server v2.9.0+ anchors via From/TryFrom impls.
- "See also" section adds links to the noetl-events cli wiki page,
the crates.io entry, and the noetl/ai-meta#49 umbrella.
Tracks noetl/server#39 (sub-issue closed by server#38).
event-envelope: EE-4 truly complete after noetl#641 + kind validation
The EE umbrella's "all four producers/consumers accept the same
wire format" promise had a latent gap until 2026-05-31: EE-4
(noetl/noetl#639) added the EventEmitRequest schema with aliases
but it lived in dead code — the actually-mounted /api/events
endpoint at core/events.py used the legacy EventRequest model
with no aliases.
noetl/noetl#641 (noetl 4.0.0) closes the gap by adding the same
validation_alias declarations to core/models.py::EventRequest +
execution_id int→str coercion. Kind validation against the
live broker confirmed every EE-3 wire assertion holds.
Add a "EE-4 finalisation post-merge" section documenting the
gap + the fix + linking to the kind-validation summary on
noetl/ai-meta#30.
Refs noetl/ai-meta#30.
event-envelope: EE series complete after PR-EE-3 landed
noetl/worker#11 (noetl-worker 3.0.0) replaced WorkerEvent with
ExecutorEvent re-export. Updates the cross-stack reconciliation
table to ✅ for all four PRs and replaces the "pre-EE-3"
worker row with the post-EE-3 shape (top-level worker_id;
context replaces payload; event_id None today with the server
default firing pending the application-side snowflake
follow-up).
Refs noetl/ai-meta#30.
event-envelope: reflect EE-1 + EE-2 + EE-4 cross-stack reconciliation
After PR-EE-4 landed in Python (noetl#639) and noetl-server's
PR-EE-2 (#6) + pipeline-fix #7 (auto-republished as v2.0.1) the
event envelope is now aligned across executor / Rust server /
Python server — only EE-3 (worker switch) remains.
- Document EventRequest's new optional fields (event_id, status,
created_at) per observability.md Principle 3 (app-side
snowflakes) — server falls back to its existing defaults
when the caller omits them, so pre-EE clients keep working.
- Add cross-stack reconciliation progress table (EE-1/2/4 done,
EE-3 last).
- Add full envelope state table showing all four shapes accept
the same wire format.
- Document the dot-notation discovery that surfaced while
landing EE-4: the Python EventType Literal was already dead
code (real production events use step.exit, call.done,
command.completed, etc. — never the underscored variants).
docs(wiki): scaffold server wiki (Home + event-envelope + sidebar)
First substantive content for the noetl-server wiki. Replaces
the "Welcome to the server wiki!" stub with three pages.
- **Home.md**: documents noetl-server as the Rust port of the
control plane (twin to the Python implementation in
noetl/noetl/server during migration). Architecture diagram
(event flow: worker -> /api/events -> PostgreSQL -> NATS ->
worker claims). Full module layout table covering config /
db / error / handlers (events, commands, catalog, credentials,
executions, variables, keychain, runtime, dashboard) /
engine (commands, evaluator, orchestrator, state) / nats /
playbook / crypto. Migration plan: Python -> Rust over
R-1.3 -> R-2.
- **event-envelope.md**: the four-shape divergence currently in
flight (Rust server EventRequest, Python EventEmitRequest,
worker WorkerEvent, executor ExecutorEvent). Reconciliation
roadmap (v2 endpoint additive, then worker/CLI switch, then
v1 deprecation). Explains why ExecutorEvent's shape is the
right target. Cross-references the noetl/ai-meta#30
umbrella issue for tracking.
- **_Sidebar.md**: navigation; cross-links to cli + worker +
tools + noetl + ops wikis.
All cross-references use noetl/<repo>#<NN> format per the
ai-meta cross-repo issue-linking discipline.
Refs noetl/ai-meta#30 -- Appendix H umbrella.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>