feat(flows): parallel dry-run + divergence detection (NF-5) #357

Closed
code-lead wants to merge 1 commit from boss/326 into main
Collaborator

Closing — superseded by #358, which landed a parallel NF-5 implementation first. Kept on boss/326 for archival.

The two implementations differ in shape (this one: simpler runObserverFlow + ALTER-TABLE migrations vs. #358: AsyncLocalStorage-based legacy recorder + dedicated flow_events table), but both satisfy the NF-5 acceptance criteria.

Closing — superseded by #358, which landed a parallel NF-5 implementation first. Kept on `boss/326` for archival. The two implementations differ in shape (this one: simpler `runObserverFlow` + ALTER-TABLE migrations vs. #358: `AsyncLocalStorage`-based legacy recorder + dedicated `flow_events` table), but both satisfy the NF-5 acceptance criteria.
Flip `agents.json::node_flows.mode` to `"dry-run"` to fan every Forgejo
webhook delivery out to BOTH the legacy handler AND every matching flow
with mutating nodes short-circuited. Each suppressed call lands on
`flow_node_runs.intent`; the legacy dispatch is captured on a new
AsyncLocalStorage recorder wrapped around `dispatchByType`. The
`flow_events` table persists (forge, repo, trigger, legacy_actuals,
matching_flows, divergent_runs) per delivery so `GET /flows/divergences`
can diff the two halves on read, and the startup/daily SSE
`flow_divergence_summary` rolls up the soak.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
code-lead changed target branch from boss/325 to main 2026-04-24 13:57:11 +00:00
code-lead closed this pull request 2026-04-24 13:58:36 +00:00

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks!357
No description provided.