Files
gh-tachyon-beep-skillpacks-…/skills/using-systems-thinking/behavior-over-time-graphs.md
2025-11-30 09:00:08 +08:00

844 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Behavior-Over-Time Graphs
## When to Use This Skill
Use behavior-over-time (BOT) graphs when:
- **Predicting future states**: "What will customer count be in 6 months?"
- **Comparing scenarios**: "With intervention vs without intervention"
- **Communicating urgency**: "Look how fast debt is growing!"
- **Demonstrating time-to-crisis**: "We have 14 months before capacity saturated"
- **Validating models**: Overlay actual vs predicted behavior
- **Explaining delays**: "Why solutions take 3 months to show results"
**Don't use BOT graphs when**:
- You don't know the structure yet → Start with causal loop diagram (CLD)
- You need to show feedback loops → Use CLD with polarity markers
- You want current state only (no trajectory) → Use stock-flow diagram
- Data too uncertain to plot → Use qualitative archetype analysis
- Audience needs WHY not WHEN → Use CLD to show causal logic
**Key insight**: BOT graphs answer "What happens over time?" with concrete numbers and dates. Use them AFTER you've mapped structure (CLD) and calculated values (stock-flow), to communicate dynamics visually.
## The 7-Step Construction Process
**Build BOT graphs systematically. Never jump to the final graph without validating each step.**
### Step 1: Identify What to Plot (Stock vs Flow)
**Rule**: BOT graphs typically show STOCKS (accumulated quantities), not flows (rates).
**Why**: Stakeholders care about "How bad is the problem?" (stock level) more than "How fast is it changing?" (flow rate).
**Test**: Can you measure this at a single instant without reference to time?
- YES → Stock (plot it)
- NO → Flow (consider plotting the stock it affects instead)
**Examples**:
- ✅ Plot: Customer Count (stock)
- ❌ Not: Customer Acquisition Rate (flow) - unless specifically analyzing flow behavior
- ✅ Plot: Bug Backlog (stock)
- ❌ Not: Bug Arrival Rate (flow)
- ✅ Plot: Technical Debt Points (stock)
- ❌ Not: Debt Accumulation Rate (flow)
**Exception**: Plot flows when analyzing flow behavior itself (e.g., "Development Velocity over time")
### Step 2: Determine Time Scale (Granularity and Range)
**Two decisions**: How fine-grained? How far forward?
**Granularity** (X-axis intervals):
- **Hourly**: Real-time monitoring, very fast dynamics
- **Daily**: Operational metrics (deployments, incidents)
- **Weekly**: Sprint-level analysis
- **Monthly**: Business metrics (MRR, customer count)
- **Quarterly**: Strategic planning
- **Yearly**: Long-term trends
**Decision criteria**:
- Match measurement frequency (if customers tracked monthly, use monthly)
- Show intervention timeframe (if intervention monthly, don't use yearly)
- Avoid unnecessary noise (daily SaaS revenue too volatile, use monthly)
**Range** (how far forward to project):
**Rule of thumb**: Show **2-3× the time constant** of the system
**Time constant (τ)** = Time for system to reach ~63% of equilibrium (from stocks-and-flows-modeling)
**Examples**:
- Customer growth τ = 8 months → Plot 16-24 months
- Bug backlog τ = 2 weeks → Plot 4-6 weeks
- Technical debt τ = infinity (unbounded) → Plot until crisis or intervention
**Practical**:
- Show intervention point + outcome period (decide at month 3, show months 0-12)
- Include phase transitions (growth → crisis → stabilization)
- Don't over-extend (24 months for 2-week problem dilutes insight)
### Step 3: Calculate Values (Using Stock-Flow Equations)
**Never eyeball the curve**. Calculate stock levels using formal equations from stocks-and-flows-modeling.
**Standard formula**:
```
Stock(t+1) = Stock(t) + Δt × (Inflow - Outflow)
```
**Process**:
1. Identify initial condition: Stock(0) = ?
2. Calculate flows for each time period
3. Apply formula iteratively
4. Verify units: Stock in [X], Flows in [X/time], Δt in [time]
5. Validate: Does equilibrium match calculation? (Set Inflow = Outflow)
**Example - Bug Backlog**:
```
Backlog(0) = 50 bugs
Inflow = 30 bugs/month (constant)
Outflow = 0.8 × Velocity (bugs/month, stock-dependent)
Velocity = 40 points/sprint, 2 sprints/month
Month 0: 50 bugs
Month 1: 50 + (30 - 0.8×40×2) = 50 + (30 - 64) = 16 bugs
Month 2: 16 + (30 - 0.8×40×2) = -18 bugs → Floor at 0 bugs
Equilibrium: Inflow < Outflow, backlog drains to 0
```
**Common mistake**: Guessing values instead of calculating. If stakeholders question, you must defend with math.
### Step 4: Select Graph Type
**Decision tree**:
**Is the data continuous or discrete?**
- **Continuous** (smooth accumulation) → **Line graph** ✓ (default)
- **Discrete** (step changes) → **Step function**
**Do you want to emphasize magnitude?**
- **YES** → **Area chart** (fills area under line)
- **NO** → **Line graph**
**Are you comparing discrete time periods?**
- **YES** → **Bar chart**
- **NO** → **Line graph**
**Examples**:
- Customer growth over time: **Line graph** (continuous accumulation)
- Headcount changes (hire whole people): **Step function** (discrete jumps)
- Quarterly revenue comparison: **Bar chart** (discrete periods)
- Technical debt accumulation: **Area chart** or **Line** (either works, area emphasizes magnitude)
**Default**: When unsure, use **line graph**. It's the most versatile and widely understood.
### Step 5: Choose Scale (Y-Axis Range)
**The 70-80% Rule**: Maximum value in your data should occupy **70-80% of the Y-axis range**.
**Formula**:
```
Y_max = Data_max / 0.75
```
**Example**:
- Data maximum: 60 debt points
- Y-axis max: 60 / 0.75 = 80 points ✓
**Why 70-80%?**
- Provides visual buffer (not cramped at top)
- Makes growth impactful (not tiny slope in vast space)
- Industry standard for clear visualization
**Common mistakes**:
- ❌ Y-axis = 120 when data max = 60 (only 50% occupied, wastes space)
- ❌ Y-axis = 65 when data max = 60 (92% occupied, cramped, hard to see trend)
- ✅ Y-axis = 80 when data max = 60 (75% occupied, perfect)
**When to start Y-axis at non-zero**:
- **Use 0 baseline** when showing absolute change (customer count growth 0 → 7,000)
- **Use non-zero** when showing small variations around large baseline (server uptime 98.5% → 99.2%)
- **Warning**: Non-zero baselines can mislead. If using, annotate clearly.
**Logarithmic scale**:
- Use when data spans multiple orders of magnitude (1 → 1,000 → 1,000,000)
- Use when exponential growth makes linear scale unreadable
- **Always label** "logarithmic scale" explicitly
### Step 6: Add Annotations (Events, Phases, Thresholds)
**Annotations reveal WHY the curve behaves the way it does.**
**Types of annotations**:
**1. Event markers** (vertical lines at intervention points):
```
[INTERVENTION]
```
- Product launch, infrastructure investment, policy change
- Mark the TIME of the decision/event
**2. Phase labels** (text for regions):
```
[GROWTH PHASE] [CRISIS] [STABILIZATION]
```
- Mark distinct system behaviors over time periods
**3. Threshold lines** (horizontal lines for critical values):
```
─────────────── Capacity Limit (100 customers/month)
─────────────── Crisis Threshold (200 bugs)
```
- Show when system crosses critical boundaries
**4. Annotations density limit**: **Max 5-7 annotations per graph**
- More than 7 → Cluttered, unreadable
- If you need more, split into multiple graphs
**Placement**:
- Events: Vertical line at X position, label above or below
- Phases: Text box or bracket spanning time period
- Thresholds: Horizontal line with label at end or middle
**Priority**: Annotate the 3 most important events/thresholds, not everything.
### Step 7: Validate (Quality Checklist)
**Before presenting any BOT graph, check**:
**Units clearly labeled on both axes?**
- Y-axis: "Technical Debt (story points)"
- X-axis: "Time (months)"
**Scale follows 70-80% rule?**
- Data_max / Y_max between 0.70 and 0.80?
**Time range shows full story?**
- Intervention point + enough time to see outcome?
- Shows equilibrium or steady state if system reaches it?
**Annotations clear and not cluttered?**
- ≤7 annotations total?
- Labels don't overlap?
**Graph type appropriate for data?**
- Continuous data → Line
- Discrete changes → Step function
- Time period comparison → Bar
**Readable at presentation size?**
- Can you read axis labels from 10 feet away?
- Are data lines thick enough?
**Validated against stock-flow calculations?**
- Do plotted values match your calculated spreadsheet?
- Did you verify equilibrium point?
**Comparison method clear (if multiple scenarios)?**
- Different line styles (solid vs dashed)?
- Legend shows which line is which?
**If any check fails, FIX before presenting.** Wrong scale or missing units destroys credibility.
## ASCII/Text Visualization Standards
**Character set for text-based graphs**:
```
│ ─ ┌ ┐ └ ┘ ╲ ● ○ ▲ ▼ ┼ ├ ┤
```
**Axis notation**:
```
Y-Axis Label (units)
80│
60│
40│
20│
0└───┬───┬───┬───┬───┬───┬───
0 2 4 6 8 10 12
X-Axis Label (units)
```
**Data line styles**:
- **Solid line**: ─── (primary scenario, baseline)
- **Dashed line**: ╌╌╌ or - - - (alternative scenario, comparison)
- **Markers**: ● (data points), ▲ (intervention), ▼ (crisis event)
**Multiple scenarios on same graph**:
```
80│ ┌───●─── Scenario A (solid)
│ ┌─○┤
60│ ╌─┘ │ ○╌╌╌ Scenario B (dashed)
│ ╌─┘ │
40│ ╌─┘ │
│╌─┘ │
20│ │
└──────────────┼──────────
0 3 6 9 12 months
INTERVENTION
```
**Spacing and readability**:
- Leave 2-3 character spaces between axis ticks
- Align numbers right-justified on Y-axis
- Keep X-axis labels centered under tick marks
**Template** (copy and modify):
```
[Y-AXIS LABEL] (units)
MAX│
75%│ ┌───
│ ┌─┘
50%│ ┌─┘
│ ┌─┘
25%│ ┌─┘
│ ┌─┘
0 └───┬───┬───┬───┬───┬───┬───
0 1 2 3 4 5 6
[X-AXIS LABEL] (units)
```
## Multi-Variable Framework
**When you need to plot multiple variables**, choose strategy systematically:
### Strategy 1: Dual Y-Axis (Same Graph, Two Scales)
**When to use**:
- ✅ Variables have **causal relationship** (team size drives velocity)
- ✅ Different units (engineers vs story points)
- ✅ Similar time dynamics (both change over same period)
- ✅ Viewer needs to see correlation visually
**Example**: Team Size (left axis: engineers) + Velocity (right axis: points/sprint)
**Limitations**:
- Hard in ASCII (need clear labeling)
- Max 2 variables (more is confusing)
### Strategy 2: Separate Panels (Stacked, Shared X-Axis)
**When to use**:
- ✅ Variables from **different domains** (technical vs human)
- ✅ Very different scales (0-100 bugs vs 1-10 morale)
- ✅ Want independent Y-axes for clarity
- ✅ More than 2 variables
**Example**:
```
Bug Backlog (bugs)
200│ ╱───
│ ╱──
100│──
0 └───────────
Morale (1-10)
10│────╲
│ ╲
5 │ ──╲
0 └───────────
0 3 6 months
```
**Benefit**: Each variable has appropriate scale, viewer can cross-reference via shared time axis
### Strategy 3: Normalized 0-100% (Same Scale)
**When to use**:
- ✅ Relative trends matter more than absolute values
- ✅ Comparing variables with very different units
- ✅ Showing patterns, not magnitudes
**Example**: Customer % vs Revenue % vs Team % (all normalized to 0-100%)
**Warning**: Loses actionability. "Customer % = 75%" doesn't tell stakeholder "we have 7,500 customers."
**Use sparingly**: Only when pattern visualization is the goal, not decision-making.
### Decision Matrix:
| Variables | Strategy | Example |
|-----------|----------|---------|
| 2 related, different units | Dual Y-axis | Team Size + Velocity |
| 3+ from different domains | Separate panels | Bugs + Morale + Debt |
| Need pattern, not magnitude | Normalized 0-100% | Multi-metric dashboard |
| 2 same units | Single axis, overlay | Scenario A vs B customers |
## Comparison Strategies
**Showing "with intervention vs without intervention":**
### Method 1: Overlay (Same Graph)
**Best for**:
- Similar scales (both scenarios fit 70-80% rule on same Y-axis)
- Direct visual comparison
- 2-3 scenarios maximum
**Technique**:
- Solid line = Baseline
- Dashed line = Alternative
- Markers differentiate: ● vs ○
- Legend shows which is which
**Example**:
```
7000│ ○╌╌╌ With Investment (+5%)
│ ╌─┤
6000│ ╌─┘ │ ●── Baseline
│ ╌─┘ ●─┘
5000│ ╌─┘ ●─┘
│ ╌──●─┘
4000│●─┘
```
### Method 2: Side-by-Side (Separate Graphs)
**Best for**:
- Different scales (Scenario A: 0-100, Scenario B: 0-500)
- Many scenarios (4+)
- Independent analysis
**Technique**:
- Graph 1: Scenario A
- Graph 2: Scenario B
- Shared time axis
- Separate Y-axis scales
**Use**: When overlay would be cluttered or scales incompatible
### Method 3: Stacked Panels (Vertically Aligned)
**Best for**:
- Showing multiple aspects of same scenario
- Different variables (customers, revenue, cost)
- Aligned time for cross-reference
**Technique**:
- Panel 1: Primary metric
- Panel 2: Secondary metric
- Panel 3: Tertiary metric
- Shared X-axis, independent Y-axes
## Phase/Region Marking
**Showing "crisis zone" or "stable region":**
**Technique 1: Vertical bands** (time periods):
```
│ [GROWTH] [CRISIS] [STABLE]
│ ╱──────╲ ──────────
│╱ ╲────────
└─────────────────────
0 3 6 9 12
```
**Technique 2: Horizontal regions** (threshold bands):
```
│ ───────── 200 bugs ←─── CRISIS THRESHOLD
│ ╱──────
│ ╱── [SAFE ZONE]
│╱──
└────────
```
**Technique 3: Text labels with brackets**:
```
│ ╱──────
│ ╱── └──[Peak: Crisis Mode]
│╱──
└─────
```
**When to use**:
- Complex dynamics with distinct phases (growth, plateau, decline)
- Critical thresholds (capacity limits, SLA boundaries)
- Multi-phase interventions (before, during, after)
## Common Mistakes Catalog
### 1. Y-Axis Too Large
**Mistake**:
```
120│
│ ┌───── (Data only reaches 60)
60│ ┌─┘
0 └──────────
```
**Problem**: Wastes 50% of space, minimizes visual impact
**Fix**: Apply 70-80% rule → Y-max = 80
### 2. Y-Axis Too Small
**Mistake**:
```
65│┌───────── (Data hits 60, cramped!)
│││
60││
└──────
```
**Problem**: Exaggerates tiny changes, looks volatile
**Fix**: Provide 20-30% buffer above max value
### 3. Missing Units on Axes
**Mistake**:
```
│ "Technical Debt" ← What units? Story points? Hours? $$?
└── "Time" ← Days? Weeks? Months?
```
**Fix**: Always label with units: "Technical Debt (story points)", "Time (months)"
### 4. Time Range Too Short
**Mistake**: Showing months 0-3 when intervention at month 3 (cuts off outcome)
**Fix**: Extend to month 6-12 to show result of intervention
### 5. Time Range Too Long
**Mistake**: Showing 24 months for 2-week bug fix project (dilutes insight)
**Fix**: Match time range to problem scale (weeks for bugs, months for customers, years for strategy)
### 6. Too Many Annotations
**Mistake**: 15 labels, arrows, boxes → Unreadable clutter
**Fix**: Limit to 5-7 most important events/thresholds
### 7. Wrong Graph Type
**Mistake**: Bar chart for continuous accumulation (treats smooth growth as discrete jumps)
**Fix**: Use line graph for continuous, step function for discrete, bar for period comparison
### 8. Misleading Non-Zero Baseline
**Mistake**:
```
99.5│ ╱─── (Looks like 10× growth!)
99.0│╱
```
**Reality**: 99.0% → 99.5% is only +0.5% absolute change
**Fix**: Either use 0 baseline OR annotate "Y-axis starts at 99%" prominently
### 9. Overlaying Incompatible Scales
**Mistake**: Plotting Customers (0-10,000) and Revenue ($0-$100) on same Y-axis without dual-axis
**Fix**: Use dual Y-axis (left: customers, right: revenue) or separate panels
### 10. Missing Key Events
**Mistake**: Curve changes slope at month 6, no annotation explaining why
**Fix**: Mark event: "▲ Infrastructure Investment" at month 6
## Audience Adaptation Template
**Create different versions for different audiences systematically.**
### Technical Version (Engineers, Analysts)
**Language**:
- Use precise terms: "Equilibrium", "Time constant", "Stock-dependent outflow"
- Show equations: `Debt(t+1) = Debt(t) + 15 - 5`
- Include units: "story points", "bugs/week"
**Detail level**:
- All calculations shown
- Validation checks documented
- Alternative scenarios with sensitivity analysis
- Limitations and assumptions listed
**Visual complexity**:
- Multi-panel graphs acceptable
- Dual Y-axes if needed
- Detailed annotations (formulas, thresholds)
**Focus**: HOW and WHY (mechanics, validation, replication)
### Executive Version (Board, C-Suite)
**Language**:
- Use business terms: "Debt stabilizes", "Crisis trajectory", "ROI"
- Hide equations (show result only)
- Use business units: "% of team capacity", "months to crisis"
**Detail level**:
- Key insights only (no intermediate calculations)
- Single clear recommendation
- ROI or cost-benefit comparison
- Risk framing ("Without action, we reach crisis in 6 months")
**Visual complexity**:
- Single clean graph (not multi-panel)
- Simple annotations (plain English, no jargon)
- Clear comparison (with vs without intervention)
**Focus**: WHAT and SO WHAT (outcomes, decisions, impact)
### General Audience (Team, Stakeholders)
**Language**:
- Minimal jargon
- Clear labels ("Bug Count", not "Defect Density")
- Intuitive units (days/months, not time constants)
**Detail level**:
- Enough to understand trend, not full derivation
- Key events marked
- Why it matters explained in one sentence
**Visual complexity**:
- Simple line graph
- 3-5 annotations maximum
- Pattern should be obvious (up, down, stable)
**Focus**: UNDERSTANDING (what's happening, why it matters)
### Systematic Translation Process:
| Aspect | Technical | Executive | General |
|--------|-----------|-----------|---------|
| **Language** | Equilibrium, τ, ΔS | Stabilizes, timeline, change | Levels off, when, difference |
| **Detail** | All calculations | Key insights | Main pattern |
| **Visual** | Multi-panel, dual-axis | Single clean graph | Simple line |
| **Equations** | Show formulas | Hide formulas | Hide formulas |
| **Units** | Precise (story points) | Business (% capacity) | Intuitive (days) |
| **Focus** | How/Why | What/So What | What/Why it matters |
**Process**: Create technical version first (complete), then simplify for executive/general by removing detail and translating language.
## Integration with Other Skills
### BOT + Stock-Flow Modeling
**Workflow**:
1. **Stock-Flow**: Build equations, calculate values, find equilibrium
2. **BOT Graph**: Visualize those values over time
3. **BOT Graph**: Show trajectory toward (or away from) equilibrium
**Example**: Stock-flow calculates "Bug backlog drains to 0 in 4 weeks", BOT graph shows the decline curve
### BOT + Causal Loop Diagrams
**Workflow**:
1. **CLD**: Map feedback loops, identify reinforcing vs balancing
2. **Stock-Flow**: Quantify the stocks and flows in loops
3. **BOT Graph**: Show how loops create growth, decline, or oscillation over time
**Example**: CLD shows "Debt → Slow Velocity → Pressure → Shortcuts → Debt (R loop)", BOT graph shows exponential debt growth
### BOT + System Archetypes
**Workflow**:
1. **Archetype**: Recognize pattern (Fixes that Fail, Escalation)
2. **Stock-Flow**: Model the specific instance
3. **BOT Graph**: Show characteristic behavior (symptom relief then return worse)
**Example**: "Fixes that Fail" archetype → BOT shows quick fix working temporarily (months 1-3), then problem returning worse (months 4-6)
### BOT + Leverage Points
**Workflow**:
1. **Leverage Points**: Identify intervention options (parameter vs structure change)
2. **Stock-Flow**: Model each intervention's impact
3. **BOT Graph**: Compare scenarios visually (intervention A vs B vs do nothing)
**Example**: BOT shows "Hiring (Level 12): Small improvement, Quality (Level 10): Reaches equilibrium"
### Complete Workflow:
1. **Unknown problem** → Start with **Causal Loop Diagram** (map structure)
2. **Familiar pattern** → Match to **System Archetype** (leverage known interventions)
3. **Need numbers** → Build **Stock-Flow Model** (quantify stocks, flows, equilibrium)
4. **Show dynamics** → Create **BOT Graph** (visualize trajectory over time)
5. **Choose intervention** → Apply **Leverage Points** (rank options)
6. **Communicate decision** → Use **BOT Graph** + **Leverage Points** (show impact of choice)
**BOT graphs are communication and prediction tools** - use them AFTER structure (CLD) and calculation (Stock-Flow) to show "what happens over time."
## Red Flags: Rationalizations to Resist
### "I can eyeball the curve"
**Reality**: Intuition fails on non-linear dynamics, delays, equilibrium points.
**Counter**:
- Exponential growth looks slow until it's not (then it's too late)
- Delays create overshoot your intuition won't predict
- Equilibrium isn't obvious (is it at 5,000 customers or 20,000?)
**Test**: Sketch your intuitive curve, then calculate. If they match, calculation was quick confirmation. If they don't, your intuition would have misled stakeholders.
### "Math takes too long"
**Reality**: 10 minutes of calculation vs months of wrong decisions.
**Counter**:
- Stock-flow calculation: 10-15 minutes in spreadsheet
- Drawing wrong curve: Stakeholders make $100K decisions based on it
- Wrong trajectory = wrong intervention = wasted resources
**Test**: Time to calculate vs cost of error. If error >$10K and decision not easily reversed, CALCULATE.
### "Let's make it look dramatic for the board"
**Reality**: Manipulated graphs destroy credibility permanently.
**Counter**:
- Non-zero baseline tricks can be spotted (lost trust forever)
- Exaggerated Y-axis makes real data look silly when revealed
- Board members aren't stupid - they'll ask questions
**Test**: If your graph would look different with accurate scale, you're manipulating. Use honest scale, let the real data speak.
### "Too many details, keep it clean"
**Reality**: "Clean" without context is ambiguous; "simple" ≠ "simplistic"
**Counter**:
- Removing intervention annotation: Now curve's slope change is mysterious
- Removing threshold: Now viewer doesn't know when crisis hits
- Removing units: Now "60" means nothing
**Test**: Can stakeholder make correct decision with this graph? If annotations are needed for that, they stay.
### "It's obvious what will happen"
**Reality**: Equilibrium points, overshoot, phase transitions are NOT obvious.
**Counter**:
- "Obviously grows forever" → Actually stabilizes at equilibrium
- "Obviously stabilizes" → Actually oscillates due to delays
- "Obviously smooth curve" → Actually has crisis dip (infrastructure limit)
**Test**: Ask three people to sketch their mental model. If they draw different curves, it's NOT obvious. Model it.
### "We don't have time to calculate"
**Reality**: Presenting wrong trajectory wastes everyone's time.
**Counter**:
- Meeting starts in 30 min → 15 min to calculate, 15 min to draw
- Presenting without calculation → "How did you get these numbers?" → Credibility lost
- Stakeholders make multi-month plans based on your graph → Worth getting right
**Test**: Is this graph for decision-making or just discussion? If decision-making, calculate. Always.
### "The actual data won't match anyway"
**Reality**: Models predict DYNAMICS (trends), not exact values.
**Counter**:
- You're right absolute numbers may be off ±20%
- But DYNAMICS are accurate: "Growth then plateau" vs "Unbounded growth"
- Overlay actual data when available, refine model
- Imperfect model > no model > wrong intuition
**Test**: Model shows "stabilizes at 5,000-7,000 customers in 12-18 months" - even if exact is 6,200 customers at 14 months, you captured the right behavior for decision-making.
## Summary
**Behavior-over-time graphs** visualize system dynamics over time:
**7-step construction process**:
1. Identify what to plot (stocks, not flows)
2. Determine time scale (granularity and range)
3. Calculate values (using stock-flow equations)
4. Select graph type (line, area, step, bar)
5. Choose scale (70-80% rule)
6. Add annotations (events, phases, thresholds, max 5-7)
7. Validate (checklist before presenting)
**ASCII standards**:
- Consistent character set: │ ─ ┌ ┐ └ ┘ ╲ ● ○
- Clear axis labels with units
- Templates for common patterns
**Key rules**:
- 70-80% scale rule (data_max = 70-80% of Y-axis)
- 2-3× time constant for range
- <7 annotations maximum
- Always calculate, never eyeball
**Multi-variable strategies**:
- Dual Y-axis: Related variables, different units
- Separate panels: Different domains, independent scales
- Normalized: Pattern focus, not magnitude
**Audience adaptation**:
- Technical: All details, equations, validation
- Executive: Key insights, business language, ROI
- General: Main pattern, minimal jargon, why it matters
**Integration**:
- BOT + Stock-Flow: Calculate then visualize
- BOT + CLD: Structure then dynamics
- BOT + Archetypes: Pattern then trajectory
- BOT + Leverage Points: Compare interventions
**Resist rationalizations**:
- "Eyeball it" → Intuition fails on non-linear systems
- "No time" → 15 min calculation vs wrong decisions
- "Make it dramatic" → Manipulation destroys credibility
- "Keep it clean" → Context matters for decisions
- "It's obvious" → Equilibrium, overshoot, phases aren't obvious
**The discipline**: Calculate values, choose scale systematically, validate before presenting, adapt to audience.
**The payoff**: Show concrete predictions with timelines, compare scenarios visually, communicate urgency effectively, enable data-driven decisions.