Module Map¶
This page shows the EN 15978 modular boundary the tool implements, every domain module and shared service, their dependency relationships, and their current build status. Status is read from the source files and the git history — nothing is invented here.
For the tool pipeline (how a BoQ becomes a result), see Data flow. This page is the life-cycle stage view.
EN 15978 modular boundary — current build status¶
flowchart TD
QTY["quantities<br/>BoQ → material explosion<br/>(tool entry — not an EN 15978 module)"]
subgraph PROD["A1–A3 · Product stage"]
A1A3["lca.a1_a3<br/>A1 raw supply · A2 transport · A3 manufacturing"]
end
subgraph CONS["A4–A5 · Construction process stage"]
A4["lca.a4<br/>A4 Transport to site"]
A5["lca.a5<br/>A5 Construction / installation"]
end
subgraph USE["B1–B7 · Use stage"]
B1["B1 Use"]
B2["B2 Maintenance"]
B3["B3 Repair"]
B4["lca.b4<br/>B4 Replacement"]
B5["B5 Refurbishment"]
B6["lca.b6<br/>B6 Operational energy"]
B7["B7 Operational water"]
end
subgraph EOL["C1–C4 · End-of-life stage"]
C1["lca.c1<br/>C1 Deconstruction / demolition"]
C2["lca.c2<br/>C2 Transport to waste processing"]
C3["lca.c3<br/>C3 Waste processing"]
C4["lca.c4<br/>C4 Disposal"]
end
subgraph BEYOND["D · Beyond the system boundary"]
D["lca.d<br/>Reuse · recovery · recycling potential<br/>reported separately, never netted against A–C"]
end
QTY --> PROD
PROD --> CONS
CONS --> USE
USE --> EOL
C1 --> C2
C2 --> C3
C3 --> C4
EOL --> BEYOND
classDef done fill:#2e7d32,stroke:#1b5e20,stroke-width:1px,color:#ffffff
classDef spec fill:#ef6c00,stroke:#e65100,stroke-width:1px,color:#ffffff
classDef todo fill:#757575,stroke:#424242,stroke-width:1px,color:#ffffff
classDef excl fill:none,stroke:#9e9e9e,stroke-width:1px,color:#757575,stroke-dasharray: 5 4
class QTY,A1A3,A4,A5 done
class B4,C3,C4,D spec
class B6,C1,C2 todo
class B1,B2,B3,B5,B7 excl
Legend¶
flowchart LR
L1["GREEN — implemented, tests green<br/>quantities · lca.a1_a3 · lca.a4 · lca.a5"]
L2["AMBER — scaffold file only, no logic;<br/>reverse-engineering spec committed"]
L3["GREY — scaffold file only, no logic;<br/>no reverse-engineering spec yet"]
L4["DASHED — excluded from v1<br/>(decision #2, documented rationale)"]
classDef done fill:#2e7d32,stroke:#1b5e20,stroke-width:1px,color:#ffffff
classDef spec fill:#ef6c00,stroke:#e65100,stroke-width:1px,color:#ffffff
classDef todo fill:#757575,stroke:#424242,stroke-width:1px,color:#ffffff
classDef excl fill:none,stroke:#9e9e9e,stroke-width:1px,color:#757575,stroke-dasharray: 5 4
class L1 done
class L2 spec
class L3 todo
class L4 excl
\"Scaffold only\" means a 5-line file — no logic, not a partial implementation
lca.b4, lca.b6, lca.c1, lca.c2, lca.c3, lca.c4 and lca.d are scaffold
only. Each source file is exactly five lines: the AGPL-3.0 header, a one-line docstring,
and # TODO: Phase 2 — see ROADMAP.md. There is no function, no schema, no test, and no
behaviour of any kind to call. Verified by reading all seven files, not inferred from the
status column.
An amber node therefore means the Excel sheet has been reverse-engineered — the spec exists, the code does not. It does not mean the module is partly built. Amber and grey differ only in whether a Step-1 spec has been written; the code state is identical.
Read the B4/C3/C4/D spec accordingly: where it says "lca.b4 raises" or "lca.c3 raises",
it is stating a requirement on the module still to be written, not describing shipped
behaviour.
Green means the code exists and its tests pass — not that a number can be reported
lca.a1_a3, lca.a4 and lca.a5 are implemented and parity-tested, and all three
currently return total = None because impact factors they depend on are BLOCKED
under decision #23. lca.a5 does report its factor-independent half — 1 080 kWh of
site energy demand — which is the shape every blocked module should aim for.
Green is a build status, not a reportability status. Every open factor is listed in the
Action register.
Dependency graph¶
Arrows mean "depends on". Dashed arrows indicate reporting/output relationships.
graph LR
subgraph DOM_LCA ["Domain: lca/"]
A1A3["a1_a3"]
A4["a4"]
A5["a5"]
B4["b4"]
B6["b6"]
C1["c1"]
C2["c2"]
C3["c3"]
C4["c4"]
D["d"]
end
subgraph DOM_OTHER ["Domain: other"]
QTY["quantities"]
THERM["thermal"]
ENERGY["energy"]
end
subgraph SVC ["services/"]
PROXY["proxy_engine"]
PEDIGREE["pedigree"]
INTERP["interpolation"]
UNCERT["uncertainty"]
REPORT["reporting"]
end
QTY --> A1A3
QTY --> A4
QTY --> A5
QTY --> B4
QTY --> B6
QTY --> C1
QTY --> C2
QTY --> C3
QTY --> C4
QTY --> D
PEDIGREE --> PROXY
INTERP --> PROXY
PROXY --> A1A3
PROXY --> A4
THERM --> ENERGY
ENERGY --> B6
UNCERT --> A1A3
UNCERT --> A4
UNCERT --> A5
UNCERT --> B4
UNCERT --> B6
UNCERT --> C1
UNCERT --> C2
UNCERT --> C3
UNCERT --> C4
UNCERT --> D
REPORT -.->|"EN 15978 §9"| A1A3
Status table¶
Status progression is stub → implemented → parity-verified. Four modules have reached
implemented; none has reached parity-verified, because parity-verified requires a
non-BLOCKED factor set. Every module below those four is at the weakest end of stub —
a scaffold file with no logic. See the note under the legend.
Domain modules¶
| Module | Path | Status | Phase | Parity source |
|---|---|---|---|---|
quantities |
domains/quantities/ |
implemented (C3 slab rebar BLOCKED; C5 anti-termite EXPERT-JUDGEMENT pending) | Phase 1 | 1a_boq_input_lca.xlsx · Spec · Reconciliation |
lca.a1_a3 |
domains/lca/a1_a3.py |
implemented (Earth/Crude oil/Floor Tiles BLOCKED; Antirust PROVISIONAL) | Phase 1 | 2_lca_vn.xlsx — A1–A3 sheet · Spec |
lca.a4 |
domains/lca/a4.py |
implemented (both transport factors BLOCKED → 15 of 18 materials BLOCKED) | Phase 1 | 2_lca_vn.xlsx — A4 sheet · Spec |
lca.a5 |
domains/lca/a5.py |
implemented (site energy only; energy factor BLOCKED → all 3 plant items BLOCKED, GWP total None, kWh total reported) |
Phase 1 | 2_lca_vn.xlsx — A5 sheet · Spec |
lca.b4 |
domains/lca/b4.py |
scaffold only — 5-line file, no logic; RE spec committed | Phase 2 | 2_lca_vn.xlsx — B4 sheet · Spec |
lca.b6 |
domains/lca/b6.py |
scaffold only — 5-line file, no logic; no Step 1 RE yet | Phase 2 | 2_lca_vn.xlsx — "B1" sheet (mislabelled) |
lca.c1 |
domains/lca/c1.py |
scaffold only — 5-line file, no logic; no Step 1 RE yet. Must not be implemented against the uncited 0.26 it inherits from A5 (AR-57) |
Phase 2 | 2_lca_vn.xlsx — C1 sheet |
lca.c2 |
domains/lca/c2.py |
scaffold only — 5-line file, no logic; inherits the BLOCKED A4 road factor (task A4-6) | Phase 2 | 2_lca_vn.xlsx — C2 sheet |
lca.c3 |
domains/lca/c3.py |
scaffold only — 5-line file, no logic; RE spec committed | Phase 2 | 2_lca_vn.xlsx — C3 sheet · Spec |
lca.c4 |
domains/lca/c4.py |
scaffold only — 5-line file, no logic; RE spec committed | Phase 2 | 2_lca_vn.xlsx — C4 sheet · Spec |
lca.d |
domains/lca/d.py |
scaffold only — 5-line file, no logic; RE spec committed | Phase 2 | 2_lca_vn.xlsx — D sheet · Spec |
thermal |
domains/thermal/ |
stub | Phase 2 | 1b_thermal_properties.xlsx |
energy |
domains/energy/ |
stub | Phase 2 | 1c_energetic_analysis.xlsx |
Modules B1, B2, B3, B5, B7 are excluded from v1 per PROJECT.md decision #2 and carry no source file.
Phase column — reconciled against the source files
All seven scaffold modules are Phase 2, which is the phase the scaffold files themselves
declare (# TODO: Phase 2). The Phase column and the file TODOs now agree, so the column is
no longer provisional. "In scope for v1" and "Phase 2" were never in conflict: v1.0 ships at
the end of Phase 3, so a Phase 2 module is in scope for v1 and simply not started. Only the
dashed B1/B2/B3/B5/B7 set is out of scope for v1 outright.
Shared services¶
| Service | Path | Status | Phase | Spec doc |
|---|---|---|---|---|
proxy_engine |
services/proxy_engine.py |
stub | Phase 1 | — |
pedigree |
services/pedigree.py |
stub | Phase 1 | Pedigree / DQI |
interpolation |
services/interpolation.py |
stub | Phase 2 | METHODOLOGY.md §5a |
uncertainty |
services/uncertainty.py |
stub | Phase 2 | Uncertainty |
reporting |
services/reporting.py |
stub | Phase 3 | — |
Keeping this page current
Per CLAUDE.md, every new domain module or service session must update the boundary
diagram colours, the dependency graph, and the status table — and must update the
Action register in the same session.