PureLangGraph._evaluate_edge_condition() had no branch for
content_not_contains (Actor Configuration Standard §5.4), so it fell
into the "unknown condition type" catch-all and always returned True.
A classifier node with sibling content_contains/content_not_contains
edges (the classic if/else idiom) would traverse both edges whenever
the configured text was present, instead of the single edge intended.
Adds a content_not_contains branch mirroring the existing correct
implementations in nodes.py, bridge.py, and reactive/stream_router.py:
true when the text is absent from the (stringified) message content,
for both string and dict messages; falls back to True (not found, so
not contained) for any other message shape, matching the sibling
content_not_contains implementations' "absent" fallback rather than
content_contains's False fallback.
Removes @tdd_expected_fail from the issue #95 regression scenario now
that the fix makes it pass unconditionally, and adds direct
content_not_contains true/false coverage plus a sibling-edge scenario
for the text-absent direction. Adds a Robot integration test
(robot/pure_graph_sibling_edges.robot, robot/PureGraphLib.py) that
executes a real two-branch pure graph end-to-end and asserts exactly
one branch node runs for each direction.
Per rui.hu's PR #100 review: adds direct coverage of the non-string/
non-dict message fallback branch (previously untested) and updates the
step-definitions module docstring, which was stale about which method
the scenarios exercise. The reviewer's coverage-threshold-reconciliation
note is a pre-existing, project-wide config/doc mismatch out of scope
for this issue and was already addressed in review comments.
Verified locally (Forgejo CI is currently down): nox -s lint, format
--check, typecheck, unit_tests (2905/2905 scenarios) are green, and the
new fallback scenario covers the previously-uncovered line in
pure_graph.py.
ISSUES CLOSED: #95
Refs: #96