propagation-is-crash-free

IN derived (depth 2)

Truth propagation completes without runtime errors across all reachable nodes

Summary

When you change a belief's status, the ripple effect through all dependent beliefs will finish cleanly without crashing. This holds because the propagation uses bounded breadth-first traversal, skips nodes that haven't actually changed, and guards against cycles — so there's no path to a stack overflow, infinite loop, or runtime error during updates.

Justifications

SL — Propagation is safe when all dependent IDs resolve; a dangling dependent reference causes an uncaught KeyError that crashes the BFS walk

Antecedents (all must be IN):

  • propagation-is-bfs — Truth value propagation in `_propagate` uses `deque`-based BFS through the `dependents` graph, not DFS, ensuring breadth-first wavefront expansion.
  • propagate-cascade-stops-on-unchanged — If a dependent's recomputed truth value equals its current value, it is not enqueued — the cascade terminates along that path, making propagation selective rather than exhaustive
  • derive-depth-cycle-guard — `_get_depth` sets `memo[node_id] = 0` before recursing to prevent infinite recursion on cyclic justification chains; cycles resolve to depth 0

Unless (any of these IN defeats this justification):

  • propagate-assumes-dependents-exist — Every ID in `node.dependents` is accessed via `self.nodes[dep_id]` without a membership check; a dangling dependent reference will raise `KeyError` — this is intentional (broken invariant = bug)
SL — Propagation is safe when all dependent IDs resolve and termination is guaranteed; a dangling dependent reference causes an uncaught KeyError that crashes the BFS walk

Antecedents (all must be IN):

  • propagation-is-bfs — Truth value propagation in `_propagate` uses `deque`-based BFS through the `dependents` graph, not DFS, ensuring breadth-first wavefront expansion.
  • propagate-cascade-stops-on-unchanged — If a dependent's recomputed truth value equals its current value, it is not enqueued — the cascade terminates along that path, making propagation selective rather than exhaustive
  • propagation-terminates-deterministically — Truth propagation is guaranteed to terminate: BFS prevents stack overflow, stop-on-unchanged prevents oscillation, and fixpoint iteration bounds the outer loop

Unless (any of these IN defeats this justification):

  • propagate-assumes-dependents-exist — Every ID in `node.dependents` is accessed via `self.nodes[dep_id]` without a membership check; a dangling dependent reference will raise `KeyError` — this is intentional (broken invariant = bug)

Dependents

These beliefs depend on this one:

Details