39 lines
1.6 KiB
Markdown
39 lines
1.6 KiB
Markdown
---
|
|
epic: 13
|
|
story: 13.2
|
|
title: "Dependency Graph & Lazy Evaluation"
|
|
status: draft
|
|
---
|
|
|
|
## Epic 13 — Performance & Reliability
|
|
**Goal:** Instant evaluation, never lose work.
|
|
|
|
### Story 13.2: Dependency Graph & Lazy Evaluation
|
|
|
|
As a CalcPad user,
|
|
I want only the lines affected by a change to re-evaluate,
|
|
So that editing a variable on line 5 of a 500-line sheet does not re-evaluate unrelated lines.
|
|
|
|
**Acceptance Criteria:**
|
|
|
|
**Given** the engine maintains a directed acyclic graph (DAG) of variable dependencies across all lines
|
|
**When** a variable's value changes on a specific line
|
|
**Then** only lines that directly or transitively depend on that variable are marked dirty and re-evaluated
|
|
**And** lines with no dependency on the changed variable are not re-evaluated
|
|
|
|
**Given** a sheet where line 3 defines `tax = 0.08` and lines 10, 25, and 40 reference `tax`
|
|
**When** the user changes `tax` to `0.10` on line 3
|
|
**Then** only lines 3, 10, 25, 40 (and any lines that depend on those) are re-evaluated
|
|
**And** all other lines retain their cached results without recomputation
|
|
|
|
**Given** a circular dependency is introduced (e.g., `a = b + 1` and `b = a + 1`)
|
|
**When** the engine builds or updates the DAG
|
|
**Then** the circular dependency is detected before evaluation
|
|
**And** an error is displayed on the offending lines indicating a circular reference
|
|
**And** the rest of the sheet continues to evaluate normally
|
|
|
|
**Given** a line is deleted that other lines depend on
|
|
**When** the DAG is updated
|
|
**Then** all lines that referenced the deleted variable are marked dirty
|
|
**And** those lines display an "undefined variable" error on next evaluation
|