Highlights
Reliability — reentrancy + durability. Message-correlation grains gained an explicit state machine + mutex (#655), eliminating a class of reentrancy races. BPMN timers now persist via Orleans reminders (Redis-backed by default, with a new Postgres provider option), surviving silo restarts (#650, #669). Child-workflow start failures propagate up to the parent activity instead of silently hanging (#654). SQLite now opens in WAL mode for concurrent dev access (#656), and the schema-init catch is narrowed to the specific "already exists" case (#660).
Observability. Fleans now defines its own OpenTelemetry Meter and ActivitySource for workflow-level metrics (fleans.workflow.started, fleans.workflow.terminated, fleans.activity.duration) and traces (#462). Domain events carry OccurredAt timestamps for downstream correlation (#651). Three new troubleshooting pages cover Common Issues, Performance Tuning, and Logs & Debugging (#483–#485).
Architecture. CQRS read-side is now enforced via an IFleanQueryContext interface (#661). Custom-task catalog grains defend against silent self-wipes on partial activation (#659). A PlacementRoleAssertion fails fast at silo startup when Fleans:Role config and grain placement attributes disagree (#457).
Operability. Helm chart now exposes streaming queue-count knobs (#610). MCP server liveness/readiness probes switched from tcpSocket to httpGet /alive and /health (#487). Admin UI Editor uses a targeted max-version query instead of an unbounded GetAllProcessDefinitions (#611).
Testing. Playwright .NET E2E suite landed with 25+ manual plans automated (#640, #641, #644, #645). Every grain command is now covered by an event-journal-append regression test (#652).
Docs. CLAUDE.md was split into rules + docs/conventions/ + docs/runbooks/ (#649). Custom Tasks documentation split into a dedicated plugin-hosting concept page (#624). User Tasks guide refreshed with the new fail / cancel / group-claim semantics (#625). Website docs migrated from the zeebe: to fleans: namespace (#623), and the pin-guard CI now blocks contributor-doc URLs in user-facing pages (#634, #626).
What's Changed
Other
- fix: render BPMN diagram after LoadInstance completes (firstRender race in ProcessInstance.razor) by @nightBaker in #637
- fix(web): instance-page properties panel shows the full element schema (task-definition type, mappings, multi-instance, …) by @nightBaker in #638
- ci(#634): Phase 0 — website-pin-guard CI check + allow-list ratchet by @nightBaker in #635
- docs(#623): zeebe: → fleans: in website docs by @nightBaker in #639
- feat(e2e): Playwright .NET E2E suite + 14 manual plans automated (Phases 1+2) by @nightBaker in #640
- feat(e2e): port plans 15-26 (boundary/start/event-subprocess/compensation/transaction) by @nightBaker in #641
- feat(e2e): activate plans #37/#39 happy paths (custom-task framework + RestCaller) by @nightBaker in #644
- feat(e2e): start EditorPage POM, automate plan #50 default-flow round-trip by @nightBaker in #645
- fix(e2e): reactivate plans #17 + #30 from TODO backlog (DeliveredCount + userTask completion) by @nightBaker in #646
- docs: split CLAUDE.md into rules + docs/conventions/ + docs/runbooks/ by @nightBaker in #649
- feat(#650): persistent reminder service (Redis) for BPMN timer durability by @nightBaker in #663
- feat(#651): PR A1 — add OccurredAt field to lifecycle + compensation events by @nightBaker in #667
- test(#652): verify every grain command appends events to journal by @nightBaker in #665
- feat(#654): catch child-workflow start failures + fail parent activity by @nightBaker in #664
- fix(#656): enable SQLite WAL journal_mode on schema init by @nightBaker in #666
- feat(#658): pre-call IsTimerFireStale guard on HandleTimerFired by @nightBaker in #668
- docs(#625): refresh user-tasks guide and api.md (routes + fail/cancel/group-claim + ErrorResponse camelCase) by @nightBaker in #647
- feat(#457): PlacementRoleAssertion fails fast on Fleans:Role / placement-attribute mismatch by @nightBaker in #648
- feat(#462): Fleans-defined Meter + ActivitySource for workflow telemetry by @nightBaker in #662
- feat(#659): defend CustomTaskCatalogGrain against silent self-wipe by @nightBaker in #671
- fix(#660): narrow SqliteSchemaInitializer catch (fail-fast on non-race errors) by @nightBaker in #670
- feat(#661): enforce CQRS read-side via IFleanQueryContext interface by @nightBaker in #673
- fix(#482): refresh multi-instance-activities drift-guard pins to f4205f4 by @nightBaker in #674
- feat(#669): add Postgres provider option for Orleans reminders by @nightBaker in #672
- feat(#655): correlation grain reentrancy state machine + mutex by @nightBaker in #678
- docs(#483): add Common Issues troubleshooting page by @nightBaker in #688
- docs(#484): add Performance Tuning troubleshooting page by @nightBaker in #689
- fix(#552): remove orphaned IWorkflowEventsHandler interface by @nightBaker in #692
- docs(claude): re-add Regression tests section for worker pipeline by @nightBaker in #693
- fix(#487): replace MCP tcpSocket probes with httpGet /alive and /health by @nightBaker in #691
- docs(#485): add Logs and Debugging troubleshooting page by @nightBaker in #690
- fix(#610): expose streaming queue-count knobs in Helm chart by @nightBaker in #695
- fix(#611): replace unbounded GetAllProcessDefinitions in Editor with targeted max-version query by @nightBaker in #694
- docs(#624): split concepts/custom-tasks.md, extract plugin hosting into new concept page by @nightBaker in #696
- fix(#626): close website pin-guard ratchet — URL-rewrite 60 source pointers, delete 40 contributor-only entries by @nightBaker in #697
Full Changelog: v0.4.1...v0.5.0