Add expanded strategy details with POC pilots and redesign poster
- strategy-details.md: detailed operations, interoperability, and POC pilot plans for all four strategies (satellite nodes, MAR, wetlands, mycorrhizal backbone) with cost estimates and timelines - poster-mockup.html: redesigned with improved white space, cleaner typography hierarchy (DM Serif Display), punchier content, better visual balance, and modern card-based layout - scribus-poster-script.py: updated to match new design aesthetic - bprize-living-pipeline.pdf: regenerated A3 poster Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
9b0bd7fde7
commit
446d51b594
Binary file not shown.
1232
poster-mockup.html
1232
poster-mockup.html
File diff suppressed because it is too large
Load Diff
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
Scribus script: Generate the B-Prize 2026 "Living Pipeline" A3 poster.
|
||||
Creates a landscape A3 (420x297mm) document with all content.
|
||||
Creates a landscape A3 (420x297mm) document with improved design.
|
||||
|
||||
Run via wrapper that sets sys.argv before exec.
|
||||
"""
|
||||
|
|
@ -26,28 +26,29 @@ def parse_args():
|
|||
|
||||
|
||||
def define_colors(scribus):
|
||||
scribus.defineColorRGB("DarkNavy", 12, 35, 64)
|
||||
scribus.defineColorRGB("DeepTeal", 27, 79, 114)
|
||||
scribus.defineColorRGB("ForestGreen", 26, 107, 74)
|
||||
scribus.defineColorRGB("BrightGreen", 39, 174, 96)
|
||||
scribus.defineColorRGB("LightGreen", 213, 245, 227)
|
||||
scribus.defineColorRGB("AlertRed", 192, 57, 43)
|
||||
scribus.defineColorRGB("BrightRed", 231, 76, 60)
|
||||
scribus.defineColorRGB("AccentBlue", 52, 152, 219)
|
||||
scribus.defineColorRGB("LightBlue", 212, 230, 241)
|
||||
scribus.defineColorRGB("Navy", 11, 29, 51)
|
||||
scribus.defineColorRGB("DeepTeal", 20, 83, 105)
|
||||
scribus.defineColorRGB("Forest", 27, 107, 74)
|
||||
scribus.defineColorRGB("Green", 34, 168, 97)
|
||||
scribus.defineColorRGB("LightGreen", 232, 245, 233)
|
||||
scribus.defineColorRGB("Alert", 198, 40, 40)
|
||||
scribus.defineColorRGB("AlertLight", 255, 235, 238)
|
||||
scribus.defineColorRGB("Blue", 46, 134, 193)
|
||||
scribus.defineColorRGB("LightBlue", 227, 242, 253)
|
||||
scribus.defineColorRGB("DarkText", 26, 35, 50)
|
||||
scribus.defineColorRGB("MidGray", 100, 100, 100)
|
||||
scribus.defineColorRGB("LightGray", 230, 230, 230)
|
||||
scribus.defineColorRGB("VLightGray", 245, 245, 245)
|
||||
scribus.defineColorRGB("PageBG", 250, 251, 247)
|
||||
scribus.defineColorRGB("CardBG", 255, 255, 255)
|
||||
scribus.defineColorRGB("EarthBrown", 139, 69, 19)
|
||||
scribus.defineColorRGB("Purple", 142, 68, 173)
|
||||
scribus.defineColorRGB("WarmBG", 253, 245, 237)
|
||||
scribus.defineColorRGB("CoolBG", 236, 247, 236)
|
||||
scribus.defineColorRGB("MidText", 84, 110, 122)
|
||||
scribus.defineColorRGB("LightText", 144, 164, 174)
|
||||
scribus.defineColorRGB("Border", 224, 224, 224)
|
||||
scribus.defineColorRGB("Surface", 255, 255, 255)
|
||||
scribus.defineColorRGB("BG", 248, 249, 250)
|
||||
scribus.defineColorRGB("Purple", 123, 31, 162)
|
||||
scribus.defineColorRGB("Earth", 121, 85, 72)
|
||||
scribus.defineColorRGB("MapBG1", 214, 234, 248)
|
||||
scribus.defineColorRGB("MapBG2", 212, 239, 223)
|
||||
scribus.defineColorRGB("BarRed", 239, 83, 80)
|
||||
scribus.defineColorRGB("BarGreen", 102, 187, 106)
|
||||
|
||||
|
||||
# Track unique name counter to avoid collisions
|
||||
_name_counter = [0]
|
||||
|
||||
def uname(prefix="obj"):
|
||||
|
|
@ -55,7 +56,7 @@ def uname(prefix="obj"):
|
|||
return f"{prefix}_{_name_counter[0]}"
|
||||
|
||||
|
||||
def rect(s, x, y, w, h, fill, line_color="None", line_w=0):
|
||||
def rect(s, x, y, w, h, fill, line_color="None", line_w=0, radius=0):
|
||||
n = s.createRect(x, y, w, h, uname("r"))
|
||||
s.setFillColor(fill, n)
|
||||
if line_color != "None":
|
||||
|
|
@ -64,6 +65,8 @@ def rect(s, x, y, w, h, fill, line_color="None", line_w=0):
|
|||
else:
|
||||
s.setLineColor("None", n)
|
||||
s.setLineWidth(0, n)
|
||||
if radius > 0:
|
||||
s.setCornerRadius(int(radius), n)
|
||||
return n
|
||||
|
||||
|
||||
|
|
@ -80,14 +83,14 @@ def txt(s, x, y, w, h, text, font="DejaVu Sans", size=10, color="DarkText", alig
|
|||
return n
|
||||
|
||||
|
||||
def hline(s, x, y, length, color="LightGray", width=0.5):
|
||||
def hline(s, x, y, length, color="Border", width=0.5):
|
||||
n = s.createLine(x, y, x + length, y, uname("l"))
|
||||
s.setLineColor(color, n)
|
||||
s.setLineWidth(width, n)
|
||||
return n
|
||||
|
||||
|
||||
def vline(s, x1, y1, x2, y2, color="BrightGreen", width=0.75):
|
||||
def vline(s, x1, y1, x2, y2, color="Green", width=0.75):
|
||||
n = s.createLine(x1, y1, x2, y2, uname("vl"))
|
||||
s.setLineColor(color, n)
|
||||
s.setLineWidth(width, n)
|
||||
|
|
@ -105,38 +108,35 @@ def main():
|
|||
output_path = args.get("output", "/app/output/bprize-poster.pdf")
|
||||
dpi = args.get("dpi", 300)
|
||||
|
||||
s = scribus # shorthand
|
||||
s = scribus
|
||||
|
||||
# ═══ PAGE SETUP ═══
|
||||
# A3 Landscape: pass dimensions as landscape directly
|
||||
PW = 420.0
|
||||
PH = 297.0
|
||||
|
||||
s.newDocument(
|
||||
(PW, PH), # Already landscape dimensions
|
||||
(PW, PH),
|
||||
(6, 6, 6, 6),
|
||||
s.PORTRAIT, # Don't double-swap with LANDSCAPE flag
|
||||
s.PORTRAIT,
|
||||
1, s.UNIT_MILLIMETERS, s.PAGE_1, 0, 1,
|
||||
)
|
||||
|
||||
define_colors(s)
|
||||
|
||||
# ═══ LAYOUT GRID ═══
|
||||
HEADER_H = 26.0
|
||||
GAP = 1.5
|
||||
MARGIN = 4.0
|
||||
COL_TOP = HEADER_H + GAP
|
||||
COL_H = PH - COL_TOP - MARGIN
|
||||
HEADER_H = 22.0
|
||||
FOOTER_H = 6.0
|
||||
MARGIN = 0.0
|
||||
COL_TOP = HEADER_H
|
||||
COL_H = PH - HEADER_H - FOOTER_H
|
||||
|
||||
# Three columns with gaps
|
||||
TOTAL_W = PW - MARGIN * 2
|
||||
COL1_W = TOTAL_W * 0.30
|
||||
COL2_W = TOTAL_W * 0.37
|
||||
COL3_W = TOTAL_W * 0.33
|
||||
COL1_W = 110.0
|
||||
COL2_W = 180.0
|
||||
COL3_W = 130.0
|
||||
|
||||
COL1_X = MARGIN
|
||||
COL2_X = COL1_X + COL1_W + GAP
|
||||
COL3_X = COL2_X + COL2_W + GAP
|
||||
COL1_X = 0
|
||||
COL2_X = COL1_W
|
||||
COL3_X = COL1_W + COL2_W
|
||||
|
||||
B = "DejaVu Sans Bold"
|
||||
R = "DejaVu Sans"
|
||||
|
|
@ -145,351 +145,360 @@ def main():
|
|||
# ═══════════════════════════════════════
|
||||
# HEADER
|
||||
# ═══════════════════════════════════════
|
||||
rect(s, 0, 0, PW, HEADER_H, "DarkNavy")
|
||||
rect(s, 0, HEADER_H - 0.8, PW, 0.8, "BrightGreen")
|
||||
rect(s, 0, 0, PW, HEADER_H, "Navy")
|
||||
# Gradient accent line
|
||||
rect(s, 0, HEADER_H - 0.7, PW * 0.5, 0.7, "Blue")
|
||||
rect(s, PW * 0.5, HEADER_H - 0.7, PW * 0.5, 0.7, "Green")
|
||||
|
||||
txt(s, 10, 2.5, 280, 11, "THE LIVING PIPELINE", B, 26, "White")
|
||||
txt(s, 10, 13, 310, 5,
|
||||
"A mycorrhizal network model for distributed water supply along the Collingwood\u2013Alliston corridor",
|
||||
R, 8.5, "White")
|
||||
txt(s, 10, 19, 310, 5,
|
||||
txt(s, 14, 2.5, 250, 8, "The Living Pipeline", B, 22, "White")
|
||||
txt(s, 14, 10, 270, 4.5,
|
||||
"A biomimicry-inspired distributed water system for the Collingwood\u2013Alliston corridor",
|
||||
R, 7.5, "White")
|
||||
txt(s, 14, 15, 270, 4,
|
||||
"Instead of one $270M pipe, what if the landscape itself became the water system?",
|
||||
I, 8, "White")
|
||||
txt(s, PW - 80, 4, 74, 18,
|
||||
"Biomimicry Commons\nB-Prize 2026\nCollingwood\u2013Alliston Corridor\nOntario, Canada",
|
||||
R, 7, "White", 2)
|
||||
I, 7, "White")
|
||||
|
||||
# Badge
|
||||
rect(s, PW - 62, 3, 50, 16, "Navy", "White", 0.3)
|
||||
txt(s, PW - 62, 4, 50, 3, "B-PRIZE 2026", B, 5.5, "White", 1)
|
||||
txt(s, PW - 62, 8, 50, 4, "Biomimicry Commons", R, 6.5, "White", 1)
|
||||
txt(s, PW - 62, 13, 50, 3, "Simcoe County, Ontario", R, 4.5, "White", 1)
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# COLUMN BACKGROUNDS
|
||||
# ═══════════════════════════════════════
|
||||
rect(s, COL1_X, COL_TOP, COL1_W, COL_H, "PageBG")
|
||||
rect(s, COL2_X, COL_TOP, COL2_W, COL_H, "CardBG")
|
||||
rect(s, COL3_X, COL_TOP, COL3_W, COL_H, "PageBG")
|
||||
rect(s, COL1_X, COL_TOP, COL1_W, COL_H, "Surface")
|
||||
rect(s, COL2_X, COL_TOP, COL2_W, COL_H, "BG")
|
||||
rect(s, COL3_X, COL_TOP, COL3_W, COL_H, "Surface")
|
||||
# Column separators
|
||||
vline(s, COL2_X, COL_TOP, COL2_X, PH - FOOTER_H, "Border", 0.25)
|
||||
vline(s, COL3_X, COL_TOP, COL3_X, PH - FOOTER_H, "Border", 0.25)
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# COLUMN 1 — THE PROBLEM
|
||||
# COLUMN 1 — THE CHALLENGE
|
||||
# ═══════════════════════════════════════
|
||||
cx = COL1_X + 4
|
||||
cw = COL1_W - 8
|
||||
cy = COL_TOP + 3
|
||||
cx = COL1_X + 8
|
||||
cw = COL1_W - 16
|
||||
cy = COL_TOP + 8
|
||||
|
||||
txt(s, cx, cy, cw, 5, "THE CHALLENGE", B, 9.5, "AlertRed")
|
||||
hline(s, cx, cy + 5, cw, "BrightRed", 0.6)
|
||||
cy += 7
|
||||
# Section title
|
||||
txt(s, cx, cy, cw, 4, "THE CHALLENGE", B, 7.5, "Alert")
|
||||
hline(s, cx, cy + 5, cw, "Alert", 0.5)
|
||||
cy += 8
|
||||
|
||||
txt(s, cx, cy, cw, 24,
|
||||
"In September 2023, the cost to expand Collingwood\u2019s Raymond A. Barker Water Treatment Plant doubled \u2014 from $121M to $270M \u2014 to pump Georgian Bay water 53 km uphill to Alliston via a single 600mm pipeline following the historic 1852 railway corridor.\n\nOne pipe. Five towns. Zero redundancy. A break at km 30 cuts off everyone downstream.",
|
||||
R, 7.5, "DarkText")
|
||||
cy += 26
|
||||
# Intro text
|
||||
txt(s, cx, cy, cw, 18,
|
||||
"Collingwood\u2019s water treatment plant expansion doubled from $121M to $270M to serve five municipalities along a single 53 km pipeline.\n\nOne pipe. Five towns. Zero redundancy.",
|
||||
R, 7, "MidText")
|
||||
cy += 20
|
||||
|
||||
# Stats row
|
||||
sw = (cw - 4) / 3
|
||||
stats = [("$270M", "Expansion cost"), ("53 km", "Single pipeline"), ("5", "Towns dependent")]
|
||||
# Hero stats
|
||||
sw = (cw - 6) / 3
|
||||
stats = [("$270M", "Expansion cost"), ("53 km", "Single pipeline"), ("5", "Towns at risk")]
|
||||
for i, (val, lab) in enumerate(stats):
|
||||
sx = cx + i * (sw + 2)
|
||||
rect(s, sx, cy, sw, 13, "CardBG", "LightGray", 0.25)
|
||||
txt(s, sx, cy + 1, sw, 6, val, B, 13, "AlertRed", 1)
|
||||
txt(s, sx, cy + 7.5, sw, 5, lab, R, 5, "MidGray", 1)
|
||||
cy += 16
|
||||
sx = cx + i * (sw + 3)
|
||||
rect(s, sx, cy, sw, 14, "AlertLight", "None", 0, 1.5)
|
||||
txt(s, sx, cy + 1.5, sw, 7, val, B, 14, "Alert", 1)
|
||||
txt(s, sx, cy + 9, sw, 4, lab, R, 4.5, "LightText", 1)
|
||||
cy += 17
|
||||
|
||||
# Community table
|
||||
txt(s, cx, cy, cw, 3.5, "COMMUNITY STATUS", B, 6.5, "MidGray")
|
||||
cy += 4.5
|
||||
|
||||
rect(s, cx, cy, cw, 4, "DarkNavy")
|
||||
txt(s, cx + 1, cy + 0.7, 30, 3, "Community", B, 5, "White")
|
||||
txt(s, cx + 32, cy + 0.7, 38, 3, "Source", B, 5, "White")
|
||||
txt(s, cx + 71, cy + 0.7, cw - 72, 3, "Status", B, 5, "White")
|
||||
cy += 4.5
|
||||
|
||||
rows = [
|
||||
("Collingwood", "Georgian Bay WTP", "$270M expansion", "MidGray"),
|
||||
("Stayner", "4 groundwater wells", "AT CAPACITY", "AlertRed"),
|
||||
("Angus", "6 wells + pipeline", "DEV FROZEN", "AlertRed"),
|
||||
("Alliston", "Pipeline + wells", "6,400 HOMES REJECTED", "AlertRed"),
|
||||
("Blue Mountains", "Pipeline only", "1,250 m\u00b3/day", "MidGray"),
|
||||
]
|
||||
for i, (c, src, st, sc) in enumerate(rows):
|
||||
bg = "CardBG" if i % 2 == 0 else "VLightGray"
|
||||
rect(s, cx, cy, cw, 3.8, bg)
|
||||
txt(s, cx + 1, cy + 0.5, 30, 3, c, B, 5.5, "DarkText")
|
||||
txt(s, cx + 32, cy + 0.5, 38, 3, src, R, 5, "MidGray")
|
||||
txt(s, cx + 71, cy + 0.5, cw - 72, 3, st, B, 4.5, sc)
|
||||
cy += 4
|
||||
rect(s, cx, cy, cw, 3.5, "Navy")
|
||||
txt(s, cx + 1.5, cy + 0.5, 26, 2.5, "Community", B, 4.5, "White")
|
||||
txt(s, cx + 28, cy + 0.5, 32, 2.5, "Source", B, 4.5, "White")
|
||||
txt(s, cx + 62, cy + 0.5, cw - 63, 2.5, "Status", B, 4.5, "White")
|
||||
cy += 4
|
||||
|
||||
# Nature's Model
|
||||
txt(s, cx, cy, cw, 4.5, "NATURE\u2019S MODEL", B, 9, "ForestGreen")
|
||||
hline(s, cx, cy + 5, cw, "BrightGreen", 0.5)
|
||||
cy += 7
|
||||
rows = [
|
||||
("Collingwood", "Georgian Bay WTP", "$270M expansion", "MidText"),
|
||||
("Stayner", "4 groundwater wells", "At capacity", "Alert"),
|
||||
("Angus", "6 wells + pipeline", "Dev frozen", "Alert"),
|
||||
("Alliston", "Pipeline + wells", "6,400 homes rejected", "Alert"),
|
||||
("Blue Mountains", "Pipeline", "1,250 m\u00b3/day", "MidText"),
|
||||
]
|
||||
for i, (c, src, st, sc) in enumerate(rows):
|
||||
bg = "Surface" if i % 2 == 0 else "BG"
|
||||
rect(s, cx, cy, cw, 3.5, bg)
|
||||
txt(s, cx + 1.5, cy + 0.5, 26, 2.5, c, B, 5, "DarkText")
|
||||
txt(s, cx + 28, cy + 0.5, 32, 2.5, src, R, 4.5, "MidText")
|
||||
txt(s, cx + 62, cy + 0.5, cw - 63, 2.5, st, B, 4.5, sc)
|
||||
cy += 3.7
|
||||
cy += 5
|
||||
|
||||
bw = (cw - 3) / 2
|
||||
# Nature's Model header
|
||||
txt(s, cx, cy, cw, 3, "NATURE\u2019S MODEL", B, 6, "LightText")
|
||||
cy += 5
|
||||
|
||||
# Comparison boxes
|
||||
bw = (cw - 4) / 2
|
||||
|
||||
# Problem box
|
||||
rect(s, cx, cy, bw, 36, "WarmBG", "AlertRed", 0.3)
|
||||
txt(s, cx + 2, cy + 2, bw - 4, 4, "CURRENT SYSTEM", B, 6.5, "AlertRed", 1)
|
||||
txt(s, cx + 2, cy + 8, bw - 4, 26,
|
||||
"One trunk, one root.\nCut the trunk \u2192 all die.\n\nSingle point of failure.\nNo redundancy.\nNo local capacity.\n\n53 km of pumping\nuphill from Georgian Bay.",
|
||||
R, 6.5, "DarkText", 1)
|
||||
rect(s, cx, cy, bw, 32, "AlertLight", "None", 0, 2)
|
||||
txt(s, cx + 2, cy + 2, bw - 4, 3.5, "CURRENT SYSTEM", B, 5.5, "Alert", 1)
|
||||
txt(s, cx + 2, cy + 8, bw - 4, 22,
|
||||
"One trunk. One root.\nCut it \u2014 everything dies.\n\nSingle point of failure.\n53 km of pumping uphill.",
|
||||
R, 6, "MidText", 1)
|
||||
|
||||
# Solution box
|
||||
sx = cx + bw + 3
|
||||
rect(s, sx, cy, bw, 36, "CoolBG", "BrightGreen", 0.3)
|
||||
txt(s, sx + 2, cy + 2, bw - 4, 4, "MYCORRHIZAL FOREST", B, 6.5, "ForestGreen", 1)
|
||||
txt(s, sx + 2, cy + 8, bw - 4, 26,
|
||||
"Many roots, connected\nunderground. Resources\nflow to where needed.\n\nHub trees share water\nvia fungal networks.\nModular = resilient.\n\nNo single point of failure.",
|
||||
R, 6.5, "DarkText", 1)
|
||||
cy += 39
|
||||
sx = cx + bw + 4
|
||||
rect(s, sx, cy, bw, 32, "LightGreen", "None", 0, 2)
|
||||
txt(s, sx + 2, cy + 2, bw - 4, 3.5, "MYCORRHIZAL FOREST", B, 5.5, "Forest", 1)
|
||||
txt(s, sx + 2, cy + 8, bw - 4, 22,
|
||||
"Many roots, connected\nunderground. Resources\nflow where needed.\n\nNo single point of failure.",
|
||||
R, 6, "MidText", 1)
|
||||
cy += 35
|
||||
|
||||
# Principle box
|
||||
rect(s, cx, cy, cw, 28, "CoolBG")
|
||||
rect(s, cx, cy, 1, 28, "BrightGreen")
|
||||
txt(s, cx + 3, cy + 2, cw - 5, 24,
|
||||
"In Ontario forests, 90% of rainfall events produce zero runoff. Every point along water\u2019s journey is a collection point, a storage node, and a treatment system. There is no \u201cend of pipe.\u201d\n\nDecentralized modular networks improve infrastructure resilience by a minimum of 3\u00d7 (Springer, 2024). Hydraulic redistribution through fungal hyphae increases shallow soil water by 28\u2013102% (Egerton-Warburton et al., J. Exp. Botany).\n\nDesign principle: Distribute collection, treatment, and storage across the network. Every node both gives and receives. Use the landscape as infrastructure.",
|
||||
I, 6.5, "DarkText")
|
||||
# Principle callout
|
||||
rect(s, cx, cy, cw, 22, "LightGreen", "None", 0, 1.5)
|
||||
rect(s, cx, cy, 0.8, 22, "Green")
|
||||
txt(s, cx + 3, cy + 2, cw - 5, 16,
|
||||
"In Ontario forests, 90% of rainfall events produce zero runoff. Every point along water\u2019s journey is a collection point, a storage node, and a treatment system.\n\nDecentralized networks improve resilience by 3\u00d7 minimum (Springer, 2024).",
|
||||
I, 6, "DarkText")
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# COLUMN 2 — THE SOLUTION
|
||||
# ═══════════════════════════════════════
|
||||
cx = COL2_X + 4
|
||||
cw = COL2_W - 8
|
||||
cy = COL_TOP + 3
|
||||
cx = COL2_X + 10
|
||||
cw = COL2_W - 20
|
||||
cy = COL_TOP + 8
|
||||
|
||||
txt(s, cx, cy, cw, 5, "THE LIVING PIPELINE", B, 9.5, "ForestGreen")
|
||||
hline(s, cx, cy + 5, cw, "BrightGreen", 0.6)
|
||||
cy += 7
|
||||
txt(s, cx, cy, cw, 4, "THE LIVING PIPELINE", B, 7.5, "Forest")
|
||||
hline(s, cx, cy + 5, cw, "Green", 0.5)
|
||||
cy += 8
|
||||
|
||||
txt(s, cx, cy, cw, 9,
|
||||
"Instead of $270M for one bigger plant, distribute capacity across the corridor \u2014 turning the landscape into a living water system where each community both gives and receives.",
|
||||
R, 7, "DarkText")
|
||||
cy += 11
|
||||
txt(s, cx, cy, cw, 7,
|
||||
"Distribute capacity across the corridor \u2014 the landscape becomes a living water system where each community both gives and receives.",
|
||||
R, 7.5, "DarkText")
|
||||
cy += 10
|
||||
|
||||
# Solution Map
|
||||
map_h = 58
|
||||
rect(s, cx, cy, cw, map_h, "LightBlue", "AccentBlue", 0.25)
|
||||
map_h = 68
|
||||
rect(s, cx, cy, cw, map_h, "LightBlue", "Blue", 0.2, 2)
|
||||
|
||||
# Bay label
|
||||
txt(s, cx + 2, cy + 2, 30, 3.5, "Georgian Bay", B, 6, "DeepTeal")
|
||||
txt(s, cx + cw/2 - 15, cy + 1.5, 30, 3, "Georgian Bay", B, 5.5, "DeepTeal", 1)
|
||||
|
||||
# Backbone line
|
||||
mx = cx + cw * 0.42
|
||||
vline(s, mx, cy + 8, mx, cy + map_h - 6, "BrightGreen", 0.75)
|
||||
mx = cx + cw * 0.45
|
||||
vline(s, mx, cy + 8, mx, cy + map_h - 8, "Green", 0.6)
|
||||
|
||||
# Nodes
|
||||
nodes = [
|
||||
(cy + 10, "Collingwood WTP", "(reduced expansion)", True),
|
||||
(cy + 22, "Stayner Node", "3,000 m\u00b3/day", False),
|
||||
(cy + 34, "Angus Node", "5,000 m\u00b3/day", True),
|
||||
(cy + 46, "Alliston Node", "3,000 m\u00b3/day", False),
|
||||
(cy + 9, "Collingwood WTP", "(reduced expansion)", True),
|
||||
(cy + 23, "Stayner Node", "3,000 m\u00b3/day", False),
|
||||
(cy + 39, "Angus Node", "5,000 m\u00b3/day", True),
|
||||
(cy + 55, "Alliston Node", "3,000 m\u00b3/day", False),
|
||||
]
|
||||
for ny, label, sub, right_side in nodes:
|
||||
rect(s, mx - 2, ny - 2, 4, 4, "BrightGreen", "White", 0.3)
|
||||
rect(s, mx - 2.5, ny - 2.5, 5, 5, "Green", "Surface", 0.3, 2.5)
|
||||
lx = mx + 6 if right_side else cx + 3
|
||||
txt(s, lx, ny - 2, 55, 7, f"{label}\n{sub}", R, 5.5, "DarkText")
|
||||
txt(s, lx, ny - 2, 55, 6, f"{label}\n{sub}", R, 5, "DarkText")
|
||||
|
||||
# Flow arrows
|
||||
for ay in [cy + 17, cy + 29, cy + 41]:
|
||||
txt(s, mx + 3, ay, 6, 4, "\u2195", B, 7, "BrightGreen")
|
||||
for ay in [cy + 17, cy + 32, cy + 48]:
|
||||
txt(s, mx + 3.5, ay, 6, 4, "\u2195", B, 6.5, "Green")
|
||||
|
||||
# MAR zone
|
||||
rect(s, cx + cw - 40, cy + map_h - 20, 37, 16, "LightBlue", "AccentBlue", 0.2)
|
||||
txt(s, cx + cw - 39, cy + map_h - 18, 35, 12, "MAR Zone\nAlliston Sand Plain", B, 5.5, "DeepTeal", 1)
|
||||
rect(s, cx + cw - 42, cy + map_h - 22, 38, 17, "LightBlue", "Blue", 0.2, 3)
|
||||
txt(s, cx + cw - 41, cy + map_h - 20, 36, 12, "MAR Zone\nAlliston Sand Plain", B, 5, "DeepTeal", 1)
|
||||
|
||||
# Wetland patches
|
||||
for wy in [cy + 18, cy + 30, cy + 42]:
|
||||
rect(s, cx + 2, wy, 22, 7, "LightGreen", "BrightGreen", 0.2)
|
||||
txt(s, cx + 3, wy + 1.5, 20, 4, "Wetland", R, 5, "ForestGreen", 1)
|
||||
for wy in [cy + 20, cy + 38]:
|
||||
rect(s, cx + 2, wy, 24, 8, "LightGreen", "Green", 0.15, 2)
|
||||
txt(s, cx + 3, wy + 2, 22, 4, "Wetland", R, 4.5, "Forest", 1)
|
||||
|
||||
# Legend
|
||||
txt(s, cx + 2, cy + map_h - 5, cw - 4, 3.5,
|
||||
"\u25cf Treatment Node \u25a2 MAR Zone \u25a2 Constructed Wetland \u2195 Bidirectional Flow",
|
||||
R, 4.5, "MidGray")
|
||||
cy += map_h + 3
|
||||
txt(s, cx + 2, cy + map_h - 4, cw - 4, 3,
|
||||
"\u25cf Node \u25a2 MAR Zone \u25a2 Wetland \u2195 Bidirectional",
|
||||
R, 4, "LightText")
|
||||
cy += map_h + 4
|
||||
|
||||
# Strategy Cards
|
||||
strategies = [
|
||||
("1", "SATELLITE TREATMENT NODES", "EarthBrown",
|
||||
("1", "Satellite Treatment Nodes", "Earth",
|
||||
"Each tree\u2019s own root system",
|
||||
"3\u20134 modular membrane + UV units at existing well sites. Canadian manufacturers (H2O Innovation, Trojan Technologies). $2\u20138M each, deployable in 12\u201324 months. Reduces pipeline demand by 30\u201350%. Capacity tracks demand \u2014 no $270M upfront commitment."),
|
||||
("2", "MANAGED AQUIFER RECHARGE", "AccentBlue",
|
||||
"3\u20134 modular membrane + UV units at existing wells. $2\u20138M each, online in 12\u201324 months. Reduces pipeline demand 30\u201350%."),
|
||||
("2", "Managed Aquifer Recharge", "Blue",
|
||||
"Forest floor + beaver dam storage",
|
||||
"Alliston Sand Plain \u2014 Ontario\u2019s best MAR candidate (CFB Borden, one of the world\u2019s most studied aquifer sites). Infiltration basins (May\u2013Nov) + ASR wells (year-round). 1 ha of basin = water for 15\u201320K people. Precedent: Turku, Finland serves 300K on identical glaciofluvial geology."),
|
||||
("3", "CONSTRUCTED TREATMENT WETLANDS", "BrightGreen",
|
||||
"Alliston Sand Plain \u2014 Ontario\u2019s best MAR candidate. 1 ha basin = water for 15\u201320K people. Precedent: Turku, Finland serves 300K on identical geology."),
|
||||
("3", "Constructed Treatment Wetlands", "Green",
|
||||
"Riparian buffer zones",
|
||||
"Hybrid subsurface-flow wetlands proven in Ontario winters (Fleming College CAWT, Lindsay ON). O&M costs 75% cheaper than conventional mechanical treatment. Non-potable reuse of treated greywater cuts potable demand 30\u201340% per household. Creates habitat corridors along rail trail."),
|
||||
("4", "MYCORRHIZAL BACKBONE", "Purple",
|
||||
"Subsurface-flow wetlands proven in Ontario winters (Fleming College CAWT). O&M 75% cheaper. Greywater reuse cuts demand 30\u201340%."),
|
||||
("4", "Mycorrhizal Backbone", "Purple",
|
||||
"Common mycorrhizal network",
|
||||
"Existing 600mm pipeline becomes smart balancing network \u2014 SCADA/IoT sensors, bidirectional flow, real-time optimization. Any node can supply neighbours during shortage. Precedent: SEQ Water Grid (Australia) \u2014 12 dams + 5 plants managed as one distributed system."),
|
||||
"Existing pipeline becomes smart bidirectional grid \u2014 SCADA/IoT, adaptive routing. Precedent: SEQ Water Grid (Australia) \u2014 12 dams + 5 plants as one system."),
|
||||
]
|
||||
|
||||
card_h = 27
|
||||
card_h = 24
|
||||
for num, title, color, bio, desc in strategies:
|
||||
rect(s, cx, cy, cw, card_h, "CardBG", "LightGray", 0.15)
|
||||
rect(s, cx, cy, 1.2, card_h, color)
|
||||
# Number
|
||||
rect(s, cx + 3, cy + 1.5, 5, 5, color)
|
||||
txt(s, cx + 3, cy + 1.8, 5, 4, num, B, 7, "White", 1)
|
||||
rect(s, cx, cy, cw, card_h, "Surface", "Border", 0.15, 2)
|
||||
rect(s, cx, cy, 1, card_h, color)
|
||||
# Number badge
|
||||
rect(s, cx + 3, cy + 2, 6.5, 6.5, color, "None", 0, 1.5)
|
||||
txt(s, cx + 3, cy + 2.3, 6.5, 5, num, B, 8, "White", 1)
|
||||
# Title
|
||||
txt(s, cx + 10, cy + 1.5, cw - 14, 4, title, B, 7, "DarkText")
|
||||
txt(s, cx + 12, cy + 2, cw - 16, 4, title, B, 7, "DarkText")
|
||||
# Bio
|
||||
txt(s, cx + 10, cy + 5.5, cw - 14, 3, f"Biomimicry: {bio}", I, 5, "MidGray")
|
||||
txt(s, cx + 12, cy + 6, cw - 16, 3, f"Biomimicry: {bio}", I, 5, "LightText")
|
||||
# Desc
|
||||
txt(s, cx + 3, cy + 9.5, cw - 6, 13, desc, R, 6, "DarkText")
|
||||
cy += card_h + 1.5
|
||||
txt(s, cx + 4, cy + 10, cw - 8, 12, desc, R, 5.5, "MidText")
|
||||
cy += card_h + 2
|
||||
|
||||
# ═══════════════════════════════════════
|
||||
# COLUMN 3 — FEASIBILITY
|
||||
# ═══════════════════════════════════════
|
||||
cx = COL3_X + 4
|
||||
cw = COL3_W - 8
|
||||
cy = COL_TOP + 3
|
||||
cx = COL3_X + 8
|
||||
cw = COL3_W - 16
|
||||
cy = COL_TOP + 8
|
||||
|
||||
txt(s, cx, cy, cw, 5, "FEASIBILITY & IMPACT", B, 9.5, "DeepTeal")
|
||||
hline(s, cx, cy + 5, cw, "AccentBlue", 0.6)
|
||||
cy += 7.5
|
||||
txt(s, cx, cy, cw, 4, "FEASIBILITY & IMPACT", B, 7.5, "DeepTeal")
|
||||
hline(s, cx, cy + 5, cw, "Blue", 0.5)
|
||||
cy += 8
|
||||
|
||||
# ── Cost Bars ──
|
||||
txt(s, cx, cy, cw, 3, "FINANCIAL COMPARISON", B, 6.5, "MidGray")
|
||||
# ── Cost section ──
|
||||
txt(s, cx, cy, cw, 3, "CAPITAL COST", B, 5.5, "LightText")
|
||||
cy += 4
|
||||
|
||||
bar_w = (cw - 16) / 2
|
||||
bar_base_y = cy + 32
|
||||
bar_w = (cw - 20) / 2
|
||||
bar_base_y = cy + 28
|
||||
|
||||
# Red bar
|
||||
bh_red = 28
|
||||
rect(s, cx + 2, bar_base_y - bh_red, bar_w, bh_red, "BrightRed")
|
||||
txt(s, cx + 2, bar_base_y - bh_red + 4, bar_w, 8, "$270M", B, 14, "White", 1)
|
||||
txt(s, cx + 2, bar_base_y + 1, bar_w, 5, "Centralized\n(Status Quo)", B, 5.5, "MidGray", 1)
|
||||
bh_red = 24
|
||||
rect(s, cx + 4, bar_base_y - bh_red, bar_w, bh_red, "BarRed", "None", 0, 1.5)
|
||||
txt(s, cx + 4, bar_base_y - bh_red + 5, bar_w, 8, "$270M", B, 13, "White", 1)
|
||||
txt(s, cx + 4, bar_base_y + 1.5, bar_w, 4, "Centralized", B, 5, "LightText", 1)
|
||||
|
||||
# Green bar
|
||||
bh_green = 16
|
||||
gx = cx + bar_w + 14
|
||||
rect(s, gx, bar_base_y - bh_green, bar_w, bh_green, "BrightGreen")
|
||||
txt(s, gx, bar_base_y - bh_green + 2, bar_w, 7, "$118\u2013170M", B, 10, "White", 1)
|
||||
txt(s, gx, bar_base_y + 1, bar_w, 5, "Living Pipeline\n(Distributed)", B, 5.5, "MidGray", 1)
|
||||
bh_green = 14
|
||||
gx = cx + bar_w + 16
|
||||
rect(s, gx, bar_base_y - bh_green, bar_w, bh_green, "BarGreen", "None", 0, 1.5)
|
||||
txt(s, gx, bar_base_y - bh_green + 2, bar_w, 6, "$118\u2013170M", B, 9, "White", 1)
|
||||
txt(s, gx, bar_base_y + 1.5, bar_w, 4, "Living Pipeline", B, 5, "LightText", 1)
|
||||
cy = bar_base_y + 7
|
||||
|
||||
cy = bar_base_y + 8
|
||||
# Savings badge
|
||||
rect(s, cx + cw/2 - 24, cy, 48, 5.5, "LightGreen", "Green", 0.2, 1)
|
||||
txt(s, cx + cw/2 - 24, cy + 0.8, 48, 4, "Save $100\u2013150M (37\u201356%)", B, 6, "Forest", 1)
|
||||
cy += 8
|
||||
|
||||
# Cost breakdown
|
||||
# Cost breakdown table
|
||||
cost_items = [
|
||||
("WTP expansion (smaller Phase 1)", "$80\u2013100M"),
|
||||
("WTP expansion (Phase 1)", "$80\u2013100M"),
|
||||
("Satellite nodes (3\u20134)", "$15\u201330M"),
|
||||
("MAR infrastructure", "$8\u201315M"),
|
||||
("Constructed wetlands (4 sites)", "$12\u201320M"),
|
||||
("Constructed wetlands (4)", "$12\u201320M"),
|
||||
("Smart network integration", "$3\u20135M"),
|
||||
]
|
||||
rect(s, cx, cy, cw, 3.5, "DarkNavy")
|
||||
txt(s, cx + 1, cy + 0.5, cw * 0.6, 2.5, "Component", B, 5, "White")
|
||||
txt(s, cx + cw * 0.6, cy + 0.5, cw * 0.4 - 1, 2.5, "Cost (CAD)", B, 5, "White", 2)
|
||||
cy += 4
|
||||
rect(s, cx, cy, cw, 3, "Navy")
|
||||
txt(s, cx + 1, cy + 0.3, cw * 0.6, 2.5, "Component", B, 4.5, "White")
|
||||
txt(s, cx + cw * 0.6, cy + 0.3, cw * 0.4 - 1, 2.5, "Cost (CAD)", B, 4.5, "White", 2)
|
||||
cy += 3.5
|
||||
|
||||
for i, (comp, cost) in enumerate(cost_items):
|
||||
bg = "CardBG" if i % 2 == 0 else "VLightGray"
|
||||
rect(s, cx, cy, cw, 3.2, bg)
|
||||
txt(s, cx + 1, cy + 0.4, cw * 0.6, 2.5, comp, R, 5, "DarkText")
|
||||
txt(s, cx + cw * 0.6, cy + 0.4, cw * 0.4 - 1, 2.5, cost, R, 5, "DarkText", 2)
|
||||
cy += 3.3
|
||||
|
||||
# Savings row
|
||||
rect(s, cx, cy, cw, 3.8, "LightGreen")
|
||||
txt(s, cx + 1, cy + 0.6, cw * 0.5, 3, "SAVINGS", B, 6, "ForestGreen")
|
||||
txt(s, cx + cw * 0.4, cy + 0.6, cw * 0.6 - 1, 3, "$100\u2013150M (37\u201356%)", B, 6, "ForestGreen", 2)
|
||||
cy += 6
|
||||
bg = "Surface" if i % 2 == 0 else "BG"
|
||||
rect(s, cx, cy, cw, 3, bg)
|
||||
txt(s, cx + 1, cy + 0.3, cw * 0.6, 2.5, comp, R, 4.5, "MidText")
|
||||
txt(s, cx + cw * 0.6, cy + 0.3, cw * 0.4 - 1, 2.5, cost, R, 4.5, "DarkText", 2)
|
||||
cy += 3.2
|
||||
cy += 4
|
||||
|
||||
# ── Timeline ──
|
||||
txt(s, cx, cy, cw, 3, "TIMELINE ADVANTAGE", B, 6.5, "MidGray")
|
||||
txt(s, cx, cy, cw, 3, "TIMELINE", B, 5.5, "LightText")
|
||||
cy += 4
|
||||
|
||||
# Centralized bar
|
||||
txt(s, cx, cy, 22, 3, "Centralized", B, 5, "MidGray")
|
||||
tbar_x = cx + 23
|
||||
tbar_w = cw - 23
|
||||
rect(s, tbar_x, cy, tbar_w, 3.5, "LightGray")
|
||||
rect(s, tbar_x + tbar_w * 0.5, cy, tbar_w * 0.5, 3.5, "BrightRed")
|
||||
txt(s, tbar_x, cy + 0.4, tbar_w, 2.5, "First water: 2029", B, 5, "White", 2)
|
||||
cy += 4.5
|
||||
|
||||
# Living Pipeline bar
|
||||
txt(s, cx, cy, 22, 3, "Living Pipeline", B, 5, "MidGray")
|
||||
rect(s, tbar_x, cy, tbar_w, 3.5, "LightGray")
|
||||
rect(s, tbar_x + tbar_w * 0.15, cy, tbar_w * 0.45, 3.5, "BrightGreen")
|
||||
txt(s, tbar_x, cy + 0.4, tbar_w, 2.5, "First water: 2027", B, 5, "White", 2)
|
||||
cy += 4.5
|
||||
|
||||
txt(s, cx, cy, cw, 3,
|
||||
"\u25b2 2 years faster \u2014 unblocks ~3,000\u20135,000 housing units sooner",
|
||||
B, 5.5, "BrightGreen", 1)
|
||||
txt(s, cx, cy, 20, 3, "Centralized", B, 4.5, "LightText")
|
||||
tbar_x = cx + 22
|
||||
tbar_w = cw - 22
|
||||
rect(s, tbar_x, cy, tbar_w * 0.55, 3.5, "Border")
|
||||
rect(s, tbar_x + tbar_w * 0.55, cy, tbar_w * 0.45, 3.5, "BarRed", "None", 0, 1)
|
||||
txt(s, tbar_x, cy + 0.5, tbar_w, 2.5, "First water: 2029", B, 4.5, "White", 2)
|
||||
cy += 5
|
||||
|
||||
txt(s, cx, cy, 20, 3, "Living Pipeline", B, 4.5, "LightText")
|
||||
rect(s, tbar_x, cy, tbar_w * 0.18, 3.5, "Border")
|
||||
rect(s, tbar_x + tbar_w * 0.18, cy, tbar_w * 0.42, 3.5, "BarGreen", "None", 0, 1)
|
||||
rect(s, tbar_x + tbar_w * 0.6, cy, tbar_w * 0.4, 3.5, "Border")
|
||||
txt(s, tbar_x, cy + 0.5, tbar_w * 0.6, 2.5, "First water: 2027", B, 4.5, "White", 1)
|
||||
cy += 4.5
|
||||
|
||||
txt(s, cx, cy, cw, 3, "2 years faster \u2014 unblocks ~3\u20135K homes sooner", B, 5, "Green", 1)
|
||||
cy += 5.5
|
||||
|
||||
# ── Resilience ──
|
||||
txt(s, cx, cy, cw, 3, "RESILIENCE", B, 6.5, "MidGray")
|
||||
txt(s, cx, cy, cw, 3, "RESILIENCE", B, 5.5, "LightText")
|
||||
cy += 4
|
||||
|
||||
rc = [cw * 0.24, cw * 0.38, cw * 0.38]
|
||||
rc = [cw * 0.25, cw * 0.375, cw * 0.375]
|
||||
|
||||
rect(s, cx, cy, cw, 3.5, "DarkNavy")
|
||||
txt(s, cx + 1, cy + 0.5, rc[0], 2.5, "Risk", B, 4.5, "White")
|
||||
txt(s, cx + rc[0], cy + 0.5, rc[1], 2.5, "Centralized", B, 4.5, "White")
|
||||
txt(s, cx + rc[0] + rc[1], cy + 0.5, rc[2], 2.5, "Living Pipeline", B, 4.5, "White")
|
||||
cy += 4
|
||||
rect(s, cx, cy, cw, 3, "Navy")
|
||||
txt(s, cx + 1, cy + 0.3, rc[0], 2.5, "Risk", B, 4, "White")
|
||||
txt(s, cx + rc[0], cy + 0.3, rc[1], 2.5, "Centralized", B, 4, "White")
|
||||
txt(s, cx + rc[0] + rc[1], cy + 0.3, rc[2], 2.5, "Living Pipeline", B, 4, "White")
|
||||
cy += 3.5
|
||||
|
||||
res = [
|
||||
("WTP failure", "All towns lose supply", "One node; others compensate"),
|
||||
("WTP failure", "All towns lose supply", "Others compensate"),
|
||||
("Pipeline break", "Downstream cut off", "Nodes self-sufficient"),
|
||||
("Drought", "Entire system stressed", "Aquifers buffer demand"),
|
||||
("Cost escalation", "$121M\u2192$270M (+123%)", "Phased, no mega-risk"),
|
||||
("Drought", "System-wide stress", "Aquifers buffer"),
|
||||
("Cost escalation", "$121M\u2192$270M", "Phased, no mega-risk"),
|
||||
]
|
||||
for i, (risk, cent, liv) in enumerate(res):
|
||||
bg = "CardBG" if i % 2 == 0 else "VLightGray"
|
||||
rect(s, cx, cy, cw, 3.5, bg)
|
||||
txt(s, cx + 1, cy + 0.4, rc[0] - 1, 2.5, risk, R, 4.5, "DarkText")
|
||||
txt(s, cx + rc[0], cy + 0.4, rc[1] - 1, 2.5, cent, R, 4.5, "AlertRed")
|
||||
txt(s, cx + rc[0] + rc[1], cy + 0.4, rc[2] - 1, 2.5, liv, R, 4.5, "BrightGreen")
|
||||
cy += 3.8
|
||||
cy += 3
|
||||
bg = "Surface" if i % 2 == 0 else "BG"
|
||||
rect(s, cx, cy, cw, 3.2, bg)
|
||||
txt(s, cx + 1, cy + 0.3, rc[0] - 1, 2.5, risk, R, 4, "DarkText")
|
||||
txt(s, cx + rc[0], cy + 0.3, rc[1] - 1, 2.5, cent, R, 4, "Alert")
|
||||
txt(s, cx + rc[0] + rc[1], cy + 0.3, rc[2] - 1, 2.5, liv, R, 4, "Green")
|
||||
cy += 3.4
|
||||
cy += 4
|
||||
|
||||
# ── Co-Benefits ──
|
||||
txt(s, cx, cy, cw, 3, "CO-BENEFITS", B, 6.5, "MidGray")
|
||||
txt(s, cx, cy, cw, 3, "CO-BENEFITS", B, 5.5, "LightText")
|
||||
cy += 4
|
||||
|
||||
coben = [
|
||||
("Ecological:", "10\u201320 ha new habitat along rail corridor, integrating with NVCA restoration (78K trees, 2024)"),
|
||||
("Economic:", "Unblocks development 2+ years sooner. 3,000 homes \u00d7 $400K = $1.2B housing construction"),
|
||||
("Indigenous:", "Working with the watershed aligns with Saugeen Ojibway Nation water stewardship principles"),
|
||||
("Energy:", "Local treatment uses 40\u201355% less energy than pumping 53 km. Savings ~$90\u2013130K/node/year"),
|
||||
("Ecological:", "10\u201320 ha new habitat along rail corridor"),
|
||||
("Economic:", "3,000+ homes unlocked = $1.2B construction"),
|
||||
("Indigenous:", "Working with the watershed, not against it"),
|
||||
("Energy:", "40\u201355% less than pumping 53 km"),
|
||||
]
|
||||
for label, text in coben:
|
||||
txt(s, cx, cy, cw, 5,
|
||||
f"{label} {text}", R, 5, "DarkText")
|
||||
cy += 5.5
|
||||
cy += 2
|
||||
txt(s, cx, cy, cw, 4, f"{label} {text}", R, 4.5, "MidText")
|
||||
cy += 4.5
|
||||
cy += 3
|
||||
|
||||
# ── Biomimicry Spiral ──
|
||||
txt(s, cx, cy, cw, 3, "BIOMIMICRY DESIGN SPIRAL", B, 6.5, "MidGray")
|
||||
# ── Design Spiral ──
|
||||
txt(s, cx, cy, cw, 3, "DESIGN METHODOLOGY", B, 5.5, "LightText")
|
||||
cy += 4
|
||||
|
||||
steps = [
|
||||
("Define", "Supply 5 towns\ncost-effectively"),
|
||||
("Biologize", "How does nature\ndistribute?"),
|
||||
("Discover", "Mycorrhizal nets,\nbeavers, wetlands"),
|
||||
("Abstract", "Distributed nodes,\nlandscape as infra"),
|
||||
("Emulate", "Satellite plants,\nMAR, backbone"),
|
||||
("Discover", "Mycorrhizal nets,\nwetlands"),
|
||||
("Abstract", "Nodes + landscape\nas infra"),
|
||||
("Emulate", "MAR, satellites,\nsmart grid"),
|
||||
("Evaluate", "37\u201356% savings,\n3\u00d7 resilience"),
|
||||
]
|
||||
stw = (cw - 5) / 6
|
||||
for i, (title, desc) in enumerate(steps):
|
||||
sx = cx + i * (stw + 1)
|
||||
rect(s, sx, cy, stw, 11, "CardBG", "LightGray", 0.15)
|
||||
txt(s, sx, cy + 0.5, stw, 2.5, title, B, 4.5, "ForestGreen", 1)
|
||||
txt(s, sx, cy + 3.5, stw, 7, desc, R, 4, "MidGray", 1)
|
||||
cy += 14
|
||||
rect(s, sx, cy, stw, 10, "Surface", "Border", 0.1, 1)
|
||||
txt(s, sx, cy + 0.5, stw, 2.5, title, B, 4, "Forest", 1)
|
||||
txt(s, sx, cy + 3.5, stw, 6, desc, R, 3.5, "LightText", 1)
|
||||
cy += 13
|
||||
|
||||
# ── Sources ──
|
||||
hline(s, cx, cy, cw, "LightGray", 0.3)
|
||||
hline(s, cx, cy, cw, "Border", 0.25)
|
||||
cy += 1.5
|
||||
txt(s, cx, cy, cw, 12,
|
||||
"Key Sources: Collingwood WTP Class EA (2022); NVCA IWMP (2019); New Tecumseth Master Plan (2016); CFB Borden aquifer studies (U of Waterloo); Region of Waterloo ASR; Fleming College CAWT; SEQ Water Grid (QLD, Australia); Turku Finland MAR; Egerton-Warburton et al., J. Exp. Botany (2007); Ontario Stormwater Mgmt Manual; Biomimicry Institute Design Spiral; BC Wildlife Federation 10,000 Wetlands.",
|
||||
R, 4.5, "MidGray")
|
||||
"Sources: Collingwood WTP Class EA (2022) \u2022 NVCA IWMP (2019) \u2022 New Tecumseth Master Plan (2016) \u2022 CFB Borden (U of Waterloo) \u2022 Region of Waterloo ASR \u2022 Fleming College CAWT \u2022 SEQ Water Grid (Australia) \u2022 Turku Finland MAR \u2022 Egerton-Warburton et al., J. Exp. Botany (2007) \u2022 Biomimicry Institute Design Spiral",
|
||||
R, 4, "LightText")
|
||||
|
||||
# ═══ FOOTER ═══
|
||||
rect(s, 0, PH - FOOTER_H, PW, FOOTER_H, "Navy")
|
||||
txt(s, 14, PH - FOOTER_H + 1.5, 200, 3, "Jeff Emmett \u2022 The Living Pipeline \u2022 B-Prize 2026", R, 5, "White")
|
||||
txt(s, PW - 200, PH - FOOTER_H + 1.5, 186, 3,
|
||||
"Biomimicry Commons \u2022 Collingwood\u2013Alliston Corridor, Simcoe County, Ontario",
|
||||
R, 5, "White", 2)
|
||||
|
||||
# ═══ EXPORT ═══
|
||||
pdf = s.PDFfile()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,278 @@
|
|||
# The Living Pipeline: Four Integrated Strategies
|
||||
## Expanded Operations, Interoperability, and POC Pilot Plans
|
||||
|
||||
---
|
||||
|
||||
## Strategy 1: Satellite Treatment Nodes
|
||||
|
||||
### How It Operates
|
||||
|
||||
Satellite treatment nodes are small, modular water treatment plants deployed at existing municipal well sites throughout the corridor. Each node draws from local groundwater and treats it to Ontario drinking water standards using containerized membrane filtration (ultrafiltration or nanofiltration) paired with UV disinfection.
|
||||
|
||||
**Technical operation:**
|
||||
- Raw groundwater is pumped from existing or expanded wells into a pre-treatment stage (aeration, iron/manganese removal if needed)
|
||||
- Water passes through membrane modules (0.01-0.04 micron pore size) removing particulates, bacteria, and protozoa
|
||||
- UV disinfection (40 mJ/cm2 minimum) provides pathogen barrier
|
||||
- Chlorine residual added for distribution system protection
|
||||
- Treated water enters the local distribution network directly
|
||||
|
||||
**Capacity model:**
|
||||
- Each node sized to local demand: 2,000-5,000 m3/day
|
||||
- Modular design allows adding membrane racks as demand grows (1,000 m3/day increments)
|
||||
- Nodes operate autonomously with remote SCADA monitoring
|
||||
- Canadian supply chain: H2O Innovation (Quebec) for membranes, Trojan Technologies (London, ON) for UV
|
||||
|
||||
**Three proposed node locations:**
|
||||
1. **Stayner Node** (Klondike Rd wells) — 3,000 m3/day, serving Clearview growth
|
||||
2. **Angus Node** (existing McGeorge/Brownley pumphouses) — 5,000 m3/day, unlocking Essa development
|
||||
3. **Alliston Node** (new wells on Sand Plain) — 3,000 m3/day, supplementing pipeline supply
|
||||
|
||||
### How It Interoperates
|
||||
|
||||
- **With MAR (Strategy 2):** Nodes can receive MAR-recovered water as a supplemental source, or feed excess treated water into MAR injection wells during low-demand periods
|
||||
- **With Wetlands (Strategy 3):** Each node's wastewater equivalent is directed to co-located constructed wetlands for tertiary polishing before aquifer recharge or non-potable reuse
|
||||
- **With Backbone (Strategy 4):** Nodes connect to the pipeline backbone via bidirectional valves. During local surplus, a node pushes treated water into the backbone to supply other communities. During local deficit, it draws from the backbone as backup
|
||||
|
||||
### POC Pilot Plan
|
||||
|
||||
**Pilot: Stayner Satellite Treatment Node**
|
||||
- **Why Stayner:** Existing wells at capacity, no current pipeline connection, clear demand signal, Clearview is actively seeking water solutions
|
||||
- **Scale:** Single containerized membrane + UV unit, 500-1,000 m3/day (proof of concept scale)
|
||||
- **Timeline:** 12-18 months
|
||||
- Months 1-3: Wellhead hydrogeological assessment, raw water quality testing (6 sampling rounds)
|
||||
- Months 3-6: Regulatory pre-consultation with MECP (Guideline F-5 pathway for small systems), preliminary design
|
||||
- Months 6-9: Procure containerized treatment unit (H2O Innovation or equivalent), site preparation
|
||||
- Months 9-12: Installation, commissioning, regulatory sampling (bacteriological, chemical, operational)
|
||||
- Months 12-18: Monitored operation period, performance data collection, community water quality reporting
|
||||
- **Cost:** $1.5-3M (pilot scale)
|
||||
- **Success metrics:** Consistent ODWS compliance, >95% membrane recovery rate, energy consumption <0.35 kWh/m3, community acceptance
|
||||
- **Key partnerships:** Clearview Township (site access, existing well infrastructure), Ontario Clean Water Agency (operational support), H2O Innovation or Trojan Technologies (equipment supply and technical support)
|
||||
|
||||
---
|
||||
|
||||
## Strategy 2: Managed Aquifer Recharge (MAR)
|
||||
|
||||
### How It Operates
|
||||
|
||||
MAR uses the Alliston Sand Plain — a large, well-characterized glaciofluvial aquifer — as a natural underground reservoir. Treated or pre-treated surface water is infiltrated into the aquifer during periods of surplus, stored naturally in the sand and gravel formation, and recovered through wells when needed.
|
||||
|
||||
**Two complementary MAR techniques:**
|
||||
|
||||
1. **Infiltration Basins (warm season, May-November)**
|
||||
- Shallow basins (1-3 ha each) constructed on permeable sand deposits
|
||||
- Source water: treated stormwater, seasonal surplus from Nottawasaga River tributaries, or excess treated water from satellite nodes
|
||||
- Water percolates through 5-15m of sand at 0.5-2.0 m/day
|
||||
- Natural soil passage provides additional treatment: removal of turbidity, pathogens (3-5 log reduction), some organics and nutrients
|
||||
- 1 hectare operating 200 days/year at 1 m/day = ~2,000,000 m3/year = supply for 15,000-20,000 people
|
||||
|
||||
2. **Aquifer Storage and Recovery (ASR) Wells (year-round)**
|
||||
- Injection wells push treated water into confined aquifer zones (Thorncliffe Formation, 50-80m depth)
|
||||
- Water stored below the Newmarket Till confining layer — protected from surface contamination
|
||||
- Recovery wells extract stored water during peak demand (summer) or emergency
|
||||
- 60-90% recovery rates typical in sand/gravel aquifers
|
||||
- Each well: 500-3,000 m3/day capacity
|
||||
|
||||
**Natural treatment benefits:**
|
||||
- Soil passage acts like a multi-layer biofilter (the "forest floor" model)
|
||||
- Residence time in aquifer (weeks to months) allows biodegradation of trace organics
|
||||
- Temperature moderation: aquifer-stored water emerges at stable 8-10C year-round
|
||||
|
||||
### How It Interoperates
|
||||
|
||||
- **With Satellite Nodes (Strategy 1):** Satellite nodes provide treated water as MAR source during low-demand periods. MAR recovery wells feed into satellite node distribution systems during high-demand periods. This creates a "seasonal battery" — store water when plentiful, recover when scarce
|
||||
- **With Wetlands (Strategy 3):** Constructed wetlands pre-treat surface water before infiltration (removing sediment, nutrients, pathogens). Post-recovery, MAR water can be polished through wetlands before non-potable reuse
|
||||
- **With Backbone (Strategy 4):** MAR zones connect to the backbone network. Recovered water can be distributed to any community on the grid. The aquifer essentially becomes a distributed storage node visible to the SCADA system
|
||||
|
||||
### POC Pilot Plan
|
||||
|
||||
**Pilot: Alliston Sand Plain Infiltration Basin + Monitoring Well Array**
|
||||
- **Why Alliston:** The Sand Plain is the best-characterized MAR candidate in the corridor, CFB Borden is literally in the study area with decades of aquifer data, and New Tecumseth urgently needs additional water supply
|
||||
- **Scale:** 0.25-0.5 ha infiltration basin + 3-5 monitoring wells + 1 recovery well
|
||||
- **Timeline:** 18-24 months
|
||||
- Months 1-4: Detailed hydrogeological investigation (builds on existing CFB Borden data). Install monitoring well array. Baseline groundwater quality sampling
|
||||
- Months 4-8: Basin design and construction. Source water characterization (Nottawasaga River tributary or satellite node surplus). MECP Environmental Compliance Approval application for groundwater injection
|
||||
- Months 8-14: First infiltration season (May-Nov). Continuous monitoring of infiltration rates, mounding, water quality at monitoring wells, recovery well water quality
|
||||
- Months 14-18: Winter monitoring (aquifer response during non-infiltration period). Data analysis
|
||||
- Months 18-24: Second infiltration season with adjusted operations. Recovery testing. Performance report
|
||||
- **Cost:** $2-4M (including well installation, basin construction, monitoring equipment, regulatory process)
|
||||
- **Success metrics:** Infiltration rate >0.5 m/day sustained, recovery water quality meeting ODWS, >70% recovery rate, no unacceptable groundwater mounding, regulatory approval pathway confirmed
|
||||
- **Key partnerships:** University of Waterloo (hydrogeological expertise, leverage CFB Borden research program), Region of Waterloo (share ASR operational experience), NVCA (source water access, watershed context), New Tecumseth (site access, integration with municipal water system)
|
||||
|
||||
---
|
||||
|
||||
## Strategy 3: Constructed Treatment Wetlands
|
||||
|
||||
### How It Operates
|
||||
|
||||
Constructed treatment wetlands are engineered ecosystems that use natural biological, chemical, and physical processes to treat wastewater and stormwater. For the Living Pipeline, hybrid subsurface-flow wetlands treat municipal wastewater effluent and greywater to enable non-potable reuse and reduce potable water demand.
|
||||
|
||||
**Cold-climate design for Ontario:**
|
||||
- **Subsurface flow** (water stays below the surface): horizontal subsurface flow (HSSF) and vertical subsurface flow (VSSF) cells in series
|
||||
- Water flows through gravel/sand media populated by wetland plants (Phragmites, Typha, Carex)
|
||||
- Biological treatment occurs via microbial biofilms on media surfaces and in the root zone
|
||||
- Subsurface flow keeps water below the frost line — **proven functional in Ontario winters**
|
||||
- Additional insulation: 15-30cm mulch/straw layer, natural snow accumulation
|
||||
- Beds oversized 2x for reduced winter biological kinetics
|
||||
- Deeper beds (0.8-1.2m vs 0.6m temperate standard) to maintain treatment volume below frost
|
||||
|
||||
**Treatment performance:**
|
||||
- BOD removal: 85-95%
|
||||
- TSS removal: 90-98%
|
||||
- Nitrogen removal: 40-70% (hybrid systems)
|
||||
- Phosphorus removal: 50-80% (with media amendment)
|
||||
- Pathogen removal: 2-4 log (E. coli)
|
||||
|
||||
**Non-potable reuse pathway:**
|
||||
- Treated greywater (showers, sinks, laundry — 50-70% of household flow) is collected separately
|
||||
- Wetland-treated greywater used for toilet flushing, irrigation, and commercial cooling
|
||||
- Reduces potable water demand by 30-40% per connected household
|
||||
- Combined with rainwater harvesting: 40-60% reduction
|
||||
|
||||
**O&M advantage:**
|
||||
- Passive operation — no chemical dosing, no mechanical aeration, minimal energy
|
||||
- $0.05-0.20/m3 vs $0.30-0.80/m3 for conventional mechanical treatment (75% savings)
|
||||
- Primary maintenance: vegetation management, inlet/outlet inspection, annual media sampling
|
||||
- Design life: 25-30+ years with proper maintenance
|
||||
|
||||
### How It Interoperates
|
||||
|
||||
- **With Satellite Nodes (Strategy 1):** Co-located with satellite treatment nodes. Node handles potable water; wetland handles the wastewater side. Together they create a complete local water cycle
|
||||
- **With MAR (Strategy 2):** Wetland effluent can be further polished and directed to MAR infiltration basins as a recharge source. This closes the loop: water is used, treated by the wetland, recharged into the aquifer, and eventually recovered for treatment and reuse
|
||||
- **With Backbone (Strategy 4):** By reducing potable demand 30-40% at each community, wetlands decrease the volume of water that needs to flow through the backbone — reducing pumping energy and pipeline stress. The SCADA system tracks wetland output to optimize backbone flow allocation
|
||||
- **Along the rail corridor:** Wetlands built along the former railway corridor serve triple duty — water treatment, habitat corridor (connecting NVCA restoration sites), and public greenspace amenity along the active transportation trail
|
||||
|
||||
### POC Pilot Plan
|
||||
|
||||
**Pilot: Angus Community Greywater Wetland**
|
||||
- **Why Angus:** Development is frozen due to water/wastewater capacity constraints. A greywater reuse pilot directly addresses demand reduction. Essa Township is motivated. Proximity to CFB Borden (monitoring expertise)
|
||||
- **Scale:** Hybrid VSSF+HSSF wetland treating greywater from 50-100 new homes in a designated subdivision
|
||||
- **Timeline:** 24-30 months
|
||||
- Months 1-4: Partnership development — Fleming College CAWT (design expertise), Essa Township (regulatory champion), developer partner (new subdivision site). Greywater characterization study
|
||||
- Months 4-8: Wetland system design (sized for 50-100 homes at 150 L/person/day greywater flow). Dual plumbing specification for pilot subdivision. MECP consultation on greywater reuse regulatory pathway (Ontario has no framework yet — this would be a pathfinder)
|
||||
- Months 8-14: Wetland construction during warm season. Dual plumbing installation in pilot homes during construction. Monitoring equipment installation
|
||||
- Months 14-20: Commissioning with phased loading as homes are occupied. Weekly water quality monitoring of influent, intermediate, and effluent. Community engagement program
|
||||
- Months 20-30: Full-year operational monitoring through all seasons (critical: demonstrate winter performance). Performance data compilation. Regulatory submission for expanded approval
|
||||
- **Cost:** $1.5-3M (wetland construction: ~$500K, dual plumbing premium: ~$3-5K/home x 100, monitoring and operations: ~$500K, Fleming College partnership: ~$200K)
|
||||
- **Success metrics:** Year-round effluent quality meeting non-potable reuse targets, measured 30%+ reduction in potable demand per household, winter treatment performance within 80% of summer, community acceptance and engagement, regulatory pathway established
|
||||
- **Key partnerships:** Fleming College CAWT (design, monitoring, research), Essa Township (municipal champion, development permits), willing subdivision developer, MECP (regulatory innovation), NVCA (environmental permitting)
|
||||
|
||||
---
|
||||
|
||||
## Strategy 4: Mycorrhizal Backbone Network
|
||||
|
||||
### How It Operates
|
||||
|
||||
The mycorrhizal backbone transforms the existing 600mm pipeline from a one-way supply conduit into an intelligent, bidirectional water grid. Instead of replacing the pipeline, it is augmented with smart infrastructure that allows water to flow between any connected points based on real-time supply and demand.
|
||||
|
||||
**Physical infrastructure:**
|
||||
- Existing 600mm pipeline retained as the primary backbone (no new mega-construction)
|
||||
- Bidirectional pump stations and control valves installed at key junctions (estimated 4-6 locations)
|
||||
- Smaller-diameter lateral connections (200-300mm) link satellite nodes and MAR recovery wells to the backbone
|
||||
- Pressure management zones created to allow independent operation of segments
|
||||
|
||||
**Digital nervous system (SCADA/IoT):**
|
||||
- Flow meters, pressure sensors, and water quality monitors at every node and junction
|
||||
- Real-time telemetry to a central SCADA system (cloud-hosted, accessible to all partner municipalities)
|
||||
- Water quality sensors: turbidity, chlorine residual, pH, temperature at minimum
|
||||
- Automated control: valves and pumps respond to demand signals without manual intervention
|
||||
|
||||
**Adaptive routing algorithm:**
|
||||
- Inspired by mycorrhizal network source-sink dynamics: water flows from areas of surplus to areas of need
|
||||
- Demand forecasting: uses historical patterns, weather data, and real-time consumption to predict needs
|
||||
- Supply optimization: balances between pipeline delivery, satellite node output, and MAR recovery
|
||||
- Emergency response: automatic rerouting if a node or pipeline segment fails — no single point of failure
|
||||
|
||||
**Precedent — SEQ Water Grid (Queensland, Australia):**
|
||||
- Built after the Millennium Drought (2007-2009)
|
||||
- Connects 12 dams, 2 desalination plants, 3 recycled water plants, and groundwater sources
|
||||
- Managed as one unified system with centralized optimization
|
||||
- Demonstrated far superior resilience to single-source infrastructure
|
||||
- The Living Pipeline applies this model at a smaller, regional scale
|
||||
|
||||
### How It Interoperates
|
||||
|
||||
The backbone is the connective tissue that makes the other three strategies function as a unified system rather than isolated projects:
|
||||
|
||||
- **With Satellite Nodes (Strategy 1):** Each node registers on the SCADA grid as both a consumer and a supplier. When a node produces more than local demand, excess flows into the backbone. When local wells underperform, the backbone supplements. This is the "mycorrhizal" sharing model — bidirectional, need-based resource transfer
|
||||
- **With MAR (Strategy 2):** MAR recovery wells connect to the backbone. The SCADA system treats the aquifer as a storage buffer — "charging" it (via infiltration) when surface supply exceeds demand, and "discharging" it (via recovery) when demand peaks. The backbone distributes MAR-recovered water to wherever it's needed
|
||||
- **With Wetlands (Strategy 3):** Wetlands reduce demand at each node, which the SCADA system factors into flow optimization. Less backbone throughput needed = less pumping energy = lower operating cost. The system learns seasonal patterns (wetland output varies with temperature) and adapts
|
||||
|
||||
**The key insight:** No single strategy works in isolation. The backbone makes the system greater than the sum of its parts — just as a mycorrhizal network enables individual trees to function as a resilient forest.
|
||||
|
||||
### POC Pilot Plan
|
||||
|
||||
**Pilot: Angus-Alliston Bidirectional Segment**
|
||||
- **Why this segment:** Angus and Alliston are adjacent on the pipeline, both have existing well infrastructure, and both face acute capacity constraints. Demonstrating bidirectional flow and smart optimization between two communities proves the network concept at minimum viable scale
|
||||
- **Scale:** 15-20 km pipeline segment between Angus pumphouse and Alliston connection point, with SCADA overlay and bidirectional capability
|
||||
- **Timeline:** 12-18 months
|
||||
- Months 1-3: Pipeline condition assessment (age, capacity, flow characteristics). Baseline hydraulic modeling. SCADA system architecture design
|
||||
- Months 3-6: Procure and install flow meters, pressure sensors, and water quality monitors at 6-8 points along the segment. Install bidirectional pump/valve assembly at Angus junction
|
||||
- Months 6-9: SCADA system deployment and integration. Connect to Essa and New Tecumseth existing monitoring. Commission telemetry and automated controls
|
||||
- Months 9-12: Controlled bidirectional flow testing. Scenario exercises: simulate Alliston demand spike (Angus supplies backbone), simulate Angus well maintenance (backbone supplies Angus from pipeline)
|
||||
- Months 12-18: Full operational period with adaptive routing. Performance data: flow balancing, energy optimization, response time to demand changes, water quality consistency
|
||||
- **Cost:** $2-4M (SCADA/IoT infrastructure: ~$1-2M, bidirectional pump station: ~$500K-1M, engineering and commissioning: ~$500K)
|
||||
- **Success metrics:** Demonstrated bidirectional flow without water quality degradation, automated demand response within 15 minutes, energy savings >20% vs unidirectional pumping, zero supply interruptions during simulated failure scenarios, both municipalities reporting improved supply reliability
|
||||
- **Key partnerships:** Essa Township and New Tecumseth (joint municipal agreement for shared infrastructure), Ontario Clean Water Agency (SCADA expertise), Simcoe County (pipeline owner/operator), engineering firm with distributed water grid experience
|
||||
|
||||
---
|
||||
|
||||
## System Interoperability: How the Four Strategies Work Together
|
||||
|
||||
The four strategies are not independent projects — they form an integrated system modeled on how a forest manages water:
|
||||
|
||||
```
|
||||
GEORGIAN BAY
|
||||
|
|
||||
[Collingwood WTP]
|
||||
(reduced scope)
|
||||
|
|
||||
=== BACKBONE PIPELINE ===
|
||||
/ | \
|
||||
[Stayner [Angus [Alliston
|
||||
Node] Node] Node]
|
||||
| | |
|
||||
Wetland Wetland Wetland
|
||||
| | |
|
||||
... [MAR Zone - Alliston Sand Plain]
|
||||
(shared aquifer storage)
|
||||
```
|
||||
|
||||
**Seasonal cycle:**
|
||||
- **Spring/Summer (high supply):** Satellite nodes treat groundwater for local use. Surplus feeds into MAR infiltration basins. Wetlands operate at peak efficiency. Backbone balances any local surpluses/deficits
|
||||
- **Fall (transition):** MAR infiltration basins wind down. Aquifer fully "charged." Wetlands continue operating (subsurface flow insulated). Backbone shifts to drawing on stored aquifer water
|
||||
- **Winter (high demand, reduced natural recharge):** ASR wells recover stored water. Satellite nodes and backbone share the load. Wetlands operate at reduced but functional capacity
|
||||
- **Emergency:** Any node failure triggers automatic rerouting through backbone. MAR provides emergency buffer. System degrades gracefully — no single point of failure
|
||||
|
||||
**Data integration:**
|
||||
All four strategies feed into a unified SCADA/IoT dashboard:
|
||||
- Node production rates and water quality (Strategy 1)
|
||||
- Aquifer levels, recharge rates, recovery volumes (Strategy 2)
|
||||
- Wetland throughput and treatment performance (Strategy 3)
|
||||
- Backbone flow rates, pressures, energy consumption (Strategy 4)
|
||||
|
||||
This gives operators — and the participating municipalities — a real-time view of the entire distributed system as one unified water utility.
|
||||
|
||||
---
|
||||
|
||||
## POC Pilot Summary
|
||||
|
||||
| Strategy | Pilot Location | Scale | Timeline | Cost | Key Output |
|
||||
|---|---|---|---|---|---|
|
||||
| 1. Satellite Nodes | Stayner (Klondike Rd) | 500-1,000 m3/day | 12-18 months | $1.5-3M | Proven modular treatment at Ontario well site |
|
||||
| 2. MAR | Alliston Sand Plain | 0.25-0.5 ha basin | 18-24 months | $2-4M | Validated infiltration + recovery in local geology |
|
||||
| 3. Wetlands | Angus subdivision | 50-100 homes greywater | 24-30 months | $1.5-3M | Year-round cold-climate CW + greywater reuse data |
|
||||
| 4. Backbone | Angus-Alliston segment | 15-20 km pipeline | 12-18 months | $2-4M | Bidirectional smart grid between two municipalities |
|
||||
|
||||
**Total POC investment: $7-14M**
|
||||
**Timeline: All pilots can run concurrently, with key results in 18-24 months**
|
||||
**Purpose: De-risk the full $118-170M deployment with real, local performance data**
|
||||
|
||||
### Sequencing Recommendation
|
||||
|
||||
**Phase 0 (Months 1-6):** Launch Pilots 1 and 4 simultaneously — these are the fastest to deploy and prove the most fundamental concepts (local treatment and smart grid connectivity)
|
||||
|
||||
**Phase 1 (Months 4-8):** Launch Pilot 2 (MAR) — slightly longer regulatory pathway but can overlap with Phase 0
|
||||
|
||||
**Phase 2 (Months 6-12):** Launch Pilot 3 (Wetlands) — requires the most partnership development and regulatory innovation (Ontario greywater framework), so benefits from the momentum and credibility of the earlier pilots
|
||||
|
||||
**Phase 3 (Months 18-30):** Integration — connect the operating pilots into a mini-network. This is the proof that the system works as a whole, not just as individual components. This becomes the basis for the full deployment business case.
|
||||
Loading…
Reference in New Issue