This repository was archived by the owner on Apr 11, 2026. It is now read-only.
Commit d710120
fix(fn-20): address 3 adversarial review findings
1. Approval race condition (HIGH) — approve/reject now checks
affected-row count from the conditional UPDATE. Concurrent
resolutions that lose the race return InvalidTransition instead
of reloading the row and falsely emitting a second
ApprovalResolved event.
(flowctl-service/src/approvals.rs)
2. CLI daemon discovery (MEDIUM) — flow_state_dir now walks up
from cwd to find the nearest .flow/ directory instead of
rooting at env::current_dir(). Running flowctl approval from
a subdirectory no longer silently bypasses the daemon.
(flowctl-cli/src/commands/approval.rs)
3. Outputs handoff ordering (MEDIUM) — Phase 5c (Outputs Dump)
is now reordered BEFORE Phase 5 (Complete) in the canonical
phase sequence, so the narrative handoff artifact exists
before flowctl done unblocks dependents.
(flowctl-cli/src/commands/workflow/phase.rs, agents/worker.md)
All flowctl-service approval tests pass (5/5); full suite 284+
tests pass; clippy clean.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent e29f590 commit d710120
4 files changed
Lines changed: 49 additions & 9 deletions
File tree
- agents
- flowctl/crates
- flowctl-cli/src/commands
- workflow
- flowctl-service/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
435 | 435 | | |
436 | 436 | | |
437 | 437 | | |
| 438 | + | |
| 439 | + | |
438 | 440 | | |
439 | 441 | | |
440 | 442 | | |
| |||
519 | 521 | | |
520 | 522 | | |
521 | 523 | | |
| 524 | + | |
| 525 | + | |
522 | 526 | | |
523 | 527 | | |
524 | | - | |
| 528 | + | |
525 | 529 | | |
526 | 530 | | |
527 | 531 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
102 | 120 | | |
103 | 121 | | |
104 | 122 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | | - | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
71 | 73 | | |
72 | 74 | | |
73 | | - | |
| 75 | + | |
74 | 76 | | |
75 | 77 | | |
76 | 78 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
181 | 181 | | |
182 | 182 | | |
183 | 183 | | |
| 184 | + | |
184 | 185 | | |
185 | 186 | | |
186 | 187 | | |
| |||
189 | 190 | | |
190 | 191 | | |
191 | 192 | | |
192 | | - | |
| 193 | + | |
| 194 | + | |
193 | 195 | | |
194 | 196 | | |
195 | 197 | | |
196 | 198 | | |
197 | 199 | | |
198 | 200 | | |
199 | 201 | | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
200 | 208 | | |
201 | 209 | | |
202 | 210 | | |
| |||
206 | 214 | | |
207 | 215 | | |
208 | 216 | | |
| 217 | + | |
209 | 218 | | |
210 | 219 | | |
211 | 220 | | |
| |||
214 | 223 | | |
215 | 224 | | |
216 | 225 | | |
217 | | - | |
| 226 | + | |
| 227 | + | |
218 | 228 | | |
219 | 229 | | |
220 | 230 | | |
221 | 231 | | |
222 | 232 | | |
223 | 233 | | |
224 | 234 | | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
225 | 241 | | |
226 | 242 | | |
227 | 243 | | |
| |||
0 commit comments