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:
- read-and-write-paths-are-both-reliable — Both the read path (staleness checking detects all forms of source drift without false negatives) and the write path (truth propagation completes without runtime errors across all reachable nodes) are operationally reliable, ensuring the system functions correctly in both observational and mutational modes.