Summary
Two leftovers from #7165 (#7056, step resilience on a notify: service task).
1. The SEND_YAML fixture is a self-loop. components/engine/engine-intent/src/test/java/.../ResilienceBpmnTest.java:72-80 builds the send fixture with two .replace calls: the first INSERTS the notifyOwner send step carrying onError: recordFailure, next: done; the second then replaces every "onError: recordFailure, next: done" with "... next: notifyOwner" - which rewrites the just-inserted send step too, giving notifyOwner a next: notifyOwner. The done end is unreachable in the fixture; the tests pass because the parser only checks that next: names an EXISTING step (IntentParser.java:6252-6255). aSendWithoutResilienceKeysEmitsNoCycle (lines 864-866) additionally carries a dead first .replace("onError: notifyOwner", ...) - that text never occurs. Side effect worth its own line: a step whose next: is itself is accepted with no diagnostic anywhere, and a generated .bpmn with a self-targeting sequence flow spins.
2. The wiring text is stale in two places. components/engine/engine-intent/CLAUDE.md:416 and the javadoc of ResilientClassDelegateFactory.java:24 still describe the wiring as config.setActivityBehaviorFactory(new DefaultActivityBehaviorFactory(...)); production (BpmFlowableConfig.java:130) wires new ResilientActivityBehaviorFactory(new ResilientClassDelegateFactory()) - the very class #7165 added.
Fix
Fix the fixture so notifyOwner really leads to done (replace only provisionApp's next), delete the dead replace, and consider refusing next: <self> at parse. Update the two sentences.
Found reviewing #7165.
Summary
Two leftovers from #7165 (#7056, step resilience on a
notify:service task).1. The
SEND_YAMLfixture is a self-loop.components/engine/engine-intent/src/test/java/.../ResilienceBpmnTest.java:72-80builds the send fixture with two.replacecalls: the first INSERTS thenotifyOwnersend step carryingonError: recordFailure, next: done; the second then replaces every"onError: recordFailure, next: done"with"... next: notifyOwner"- which rewrites the just-inserted send step too, givingnotifyOwneranext: notifyOwner. Thedoneend is unreachable in the fixture; the tests pass because the parser only checks thatnext:names an EXISTING step (IntentParser.java:6252-6255).aSendWithoutResilienceKeysEmitsNoCycle(lines 864-866) additionally carries a dead first.replace("onError: notifyOwner", ...)- that text never occurs. Side effect worth its own line: a step whosenext:is itself is accepted with no diagnostic anywhere, and a generated.bpmnwith a self-targeting sequence flow spins.2. The wiring text is stale in two places.
components/engine/engine-intent/CLAUDE.md:416and the javadoc ofResilientClassDelegateFactory.java:24still describe the wiring asconfig.setActivityBehaviorFactory(new DefaultActivityBehaviorFactory(...)); production (BpmFlowableConfig.java:130) wiresnew ResilientActivityBehaviorFactory(new ResilientClassDelegateFactory())- the very class #7165 added.Fix
Fix the fixture so
notifyOwnerreally leads todone(replace onlyprovisionApp'snext), delete the dead replace, and consider refusingnext: <self>at parse. Update the two sentences.Found reviewing #7165.