v1.9.4
Fixed
TransitionPrimitive.guard_expressionwas declared but never consulted — not read byguards.py,traversal.py,state.py, orlogic.py.ThinkingMapTraversal.attempt_transition()now treats a non-emptyguard_expressionas aDecisionRule.namereference in the boundLogicLayer: the transition only fires when that rule's current recommendation (action_if_true/action_if_false, whichever the condition resolves to) matches the transition_id being attempted. Closes #10.- A routing-policy mismatch returns
REVISE_PLAN— notESCALATE— with the rule's actual recommendation inOutcome.alternatives, so an agentic caller can retry the correct transition_id in the same turn.REVISE_PLANwas declared inOutcomeKindsince the outcome space was first drawn up but never previously returned by any code path. - No active recommendation (condition false with no
action_if_false, or aHINT/WARNrule's vacuous-implication suppression): silent pass-through, same as not settingguard_expressionat all. - Dangling reference (no
logic_layerbound, or the named rule doesn't exist): silent no-op, matchingrequired_gate_id's existing convention for an unresolved reference — backward compatible with every existing map.
- A routing-policy mismatch returns
check_route_gated_transitionadded topython -m fpf_thinking_map.verify(28/28).
Full Changelog: v1.9.3...v1.9.4