A5 Construction / Installation — Reverse-Engineering Spec & Reconciliation¶
Sources read (read-only, verified 2026-08-26):
| File | Sheet(s) read | Tool |
|---|---|---|
reference/excel/2_lca_vn.xlsx |
A5 extracted in full (B4:H8); C1(Demolition) and INTERPRETATION read for cross-check; all 12 sheets enumerated |
openpyxl 3.x, raw formulas (data_only=False) and computed values (data_only=True) |
Verdict tags follow PROJECT.md decision #23 (two-axis scheme). Geographic tags follow PROJECT.md decision #26 (per-stage geographic-provenance policy).
Fork outcome (Session 9 Step 1): an A5 calculation EXISTS in 2_lca_vn.xlsx
(dedicated A5 sheet, rows 4–8, columns B–H). Fork (a) applies — the sheet is
reverse-engineered here rather than the scope being proposed from first principles.
Its scope is narrow (see §8) but it is real, and it is what is implemented.
§1 Where the A5 calculation lives¶
| Sheet | Dimensions | Relevance to A5 |
|---|---|---|
A5 |
B4:H8 | The whole A5 calculation. 3 equipment rows + a total row |
C1(Demolition) |
B4:G6 | Reuses the A5 generator: C1!C5 = 'A5'!$C$5, same G = C*E*F form, 80 h |
INTERPRETATION |
B2:N27 | Consumes A5: E23='A5'!G5, E24='A5'!G6, E25='A5'!G7, E26='A5'!G8 |
A5 is not material-keyed. Unlike A1–A3, A4, B4, C2, C3, C4 and D — all of which
carry one row per material and are joined on the 18-row LCI Final inventory — A5
carries one row per item of site plant. INTERPRETATION reflects this: the three
A5 rows (23–25) sit below the 18 material rows (5–22) and have an empty A1-A3,
A4, B4, C2, C3, C4, D cell. The lca.a5 module therefore keys on a
SiteEquipment enum, not on MaterialCategory.
§2 A5 sheet — raw formula structure¶
Header row 4: Equipment | Power | Unit | Usage (hours) | Emission Factor(kg CO2-eq/kwh) | Impact Emission (kg CO2-eq) | % impact
| Cell | Content | Notes |
|---|---|---|
B5 / B6 / B7 |
Generator / Cutting Machine / Welding Machine |
Free-text labels; no model, no rating plate |
C5 / C6 / C7 |
27.6 / 4.8 / 12 |
Rated power, literal. No source note in any cell, no comment on any cell of the sheet (verified: ws.comment is None for every populated cell) |
D5:D7 |
kw |
Unit label, lowercase in the workbook; read as kW |
E5 |
=10*2 → 20 |
Usage hours. Multiplicands undocumented |
E6 |
=10*1 → 10 |
" |
E7 |
=10*4 → 40 |
" |
F5 / F6 / F7 |
0.26 |
Emission factor, kg CO₂-eq/kWh — the same literal in all three rows, and the same literal as A4!I5:I22 |
G5:G7 |
=C{r}*E{r}*F{r} |
Impact = power × hours × factor |
H5:H7 |
=G{r}/$G$8 |
Share of the A5 total |
B8 |
Total |
|
G8 |
=SUM(G5:G7) → 280.8 |
There is no A5 row anywhere else in the workbook: no material wastage column, no
site-water row, no packaging row, no transport-of-plant row. A5!G8 = 280.8 kg CO₂-eq
is 0.029 % of the workbook's INTERPRETATION!M26 LCA total.
§3 The formula, and its dimensional check¶
The single A5 formula, as written:
Dimensionally kW × h = kWh, and kWh × kg CO₂-eq/kWh = kg CO₂-eq. The expression
is exactly the EN 15804+A2 form for an energy-carrier-driven process: an energy
demand term (P × t, a project input) multiplied by an energy-carrier emission
factor (a database parameter). The two halves are cleanly separable, which is what
lets the module compute and report site energy demand in kWh even while the factor
is BLOCKED — the same separation lca.a4 makes between transport work (t·km) and the
per-t·km factor.
Share column: share_e = A5_e / Σ A5. Because a single EF is applied to all three
rows, EF cancels and the share is in fact a pure energy share. The module does
not exploit that cancellation: share is emitted only when the impacts are
computed (§5), because the cancellation holds only while every row draws on one
carrier, and that is a property of this workbook, not of A5.
P × t reduction, exact to double precision:
| Row | P (kW) |
t (h) |
Energy (kWh) | × 0.26 | Workbook G |
|---|---|---|---|---|---|
| Generator | 27.6 | 20 | 552.0 | 143.52 | 143.52 |
| Cutting Machine | 4.8 | 10 | 48.0 | 12.48 | 12.48 |
| Welding Machine | 12.0 | 40 | 480.0 | 124.80000000000001 | 124.80000000000001 |
| Total | 1080.0 | 280.8 | 280.8 |
No reduction or re-derivation is needed — unlike A4, where a four-constant truck-power expression had to be reduced algebraically to a per-t·km form. A5 is already in the normative form.
§4 Parameter-by-parameter reconciliation¶
§4.1 F5:F7 = 0.26 kg CO₂-eq/kWh — site energy emission factor — BLOCKED¶
This is the binding finding of the module. Four independent reasons, any one of which is sufficient:
- No citation. The value is a bare literal in three cells. The sheet has no source column, no cell comments, and no legend. Nothing in the workbook names a dataset, a programme operator, a country or a year.
- Decision #26 governs it as an energy-linked stage. A5 construction energy is
named explicitly in decision #26's "Energy-linked stages" clause: "BLOCKED on EU
grid emission factors. Must use African national grid factors from IEA World Energy
Statistics or IPCC EFDB, per country of the project.
lca.a5… raiseValueErrorif the supplied grid emission factor originates from a non-African source." An uncited 0.26 cannot be shown to be African-sourced, and 0.26 kg CO₂-eq/kWh sits in the EU-average band, not the Senegalese one. - The workbook contradicts itself. The same workbook carries a Senegal grid
factor at
B1!D5 = 1.1 kg CO₂/kWhfor operational energy — 4.2× the A5 value. Two grid factors differing by a factor of four sit in one file with no note reconciling them.B1!D5is itself unverified (AR-09). - The factor is applied to a diesel genset. Row 5 is a generator. A generator does not consume grid electricity; it produces electricity by burning fuel. Its per-kWh emission factor is a fuel-combustion quantity (published gensets sit around 0.7–0.8 kg CO₂-eq/kWh at typical load), not a grid quantity. Applying a grid-shaped number to a genset is a category error independent of whose grid it is. See §4.3.
Consequence: factor_for(EnergyCarrier.SITE_ELECTRICITY) raises ValueError.
No default, no placeholder (decision #23 Axis 2). All three A5 rows are BLOCKED and
the A5 total is None. Register row: AR-54 (see §9), which turns on AR-09.
§4.2 C5:C7 rated powers — 27.6 / 4.8 / 12 kW — attribution pending¶
Rated power is a project input, not an impact factor — the same class as the A4
distances, which decision #26 exempts from geographic substitution. It is used as
given. But no equipment is identified: no make, no model, no rating plate, no hire
docket. 27.6 kW is an oddly precise figure for a genset (standard ratings cluster at
20/25/30 kVA); 4.8 kW and 12 kW are plausible for a disc cutter and an arc welder
respectively. The values are carried with a usage_source string naming their cell,
and an attribution request is raised (AR-55) rather than a block: a wrong power
scales a number that is already None for want of a factor.
§4.3 The generator / machine relationship — unresolved, not corrected¶
Rows 6 and 7 are electrically-driven machines. Row 5 is a generator. In an off-grid rural Senegalese site the cutting and welding machines are powered by that generator. If so, the sheet double-counts: the generator row already accounts for the energy converted from fuel, and the machine rows count the same energy again as load. The correct model would be either (a) fuel in → generator only, machines as load attribution within it, or (b) machines' kWh × a genset kWh factor, generator row dropped.
This spec does not correct it. The workbook does not state whether the site was grid-connected, and the Pedrazzi thesis records no site-power description. Choosing between (a) and (b) without that fact would be inventing scope, which the Step 1 fork rule forbids. It is raised as AR-56 and is a methodology question for Marco + Chiwara, not a code change. Note that the ambiguity is presently harmless: every row is BLOCKED on §4.1 anyway, so no double-counted number can reach a report. It stops being harmless the moment AR-54 clears.
§4.4 E5:E7 = 10*2, 10*1, 10*4 — usage hours — attribution pending¶
The 10 is common to all three and reads as a site duration (10 days); the second
multiplicand then reads as hours per day (2 h/day generator, 1 h/day cutting, 4 h/day
welding). That reading is not stated anywhere — it is inference from the shape of
the formula. A 10-day construction period for a school complex whose earth walls alone
run to hundreds of tonnes is implausible on its face; 2 h/day of generator run-time
against 4 h/day of welding is internally inconsistent if the welder is genset-powered
(§4.3). Usage hours are project inputs and are used as given, with the raw =10*2
form preserved in the usage_source string so the two multiplicands are never lost.
Attribution request AR-55 covers this together with §4.2.
§4.5 Cross-check against C1(Demolition)¶
C1!C5 = 'A5'!$C$5 — the demolition sheet imports the A5 generator power by reference
and applies the same G = C*E*F form with E5 = 10*8 = 80 h and the same literal
F5 = 0.26. So the 0.26 block propagates: lca.c1, when implemented, inherits it
exactly as lca.c2 inherits the A4 road factor (AR-17). Recorded as AR-57 so that
lca.c1 is not implemented against the uncited value.
§5 Verdict summary¶
Axis 1 — Formula verdicts¶
| Formula | Cells | Verdict | Basis |
|---|---|---|---|
A5_e = P × t × EF |
G5:G7 |
VALIDATED | Dimensionally correct; the EN 15804+A2 energy-carrier form. Parity 0.1 %. |
total = Σ A5_e |
G8 |
VALIDATED | Plain sum of the three rows; no omission, no double-add. Parity 0.1 %. |
share = A5_e / total |
H5:H7 |
VALIDATED | Plain share of total. Parity 0.1 %. |
No CORRECTED formula exists on this sheet. No divergence fixture is written for
lca.a5 — writing one would require asserting a Δ against a corrected formula, and
there is none. The defects found here are all Axis 2 (parameters) or scope (§8).
Axis 2 — Parameter provenance¶
| Parameter | Value in workbook | Verdict | Disposition |
|---|---|---|---|
| Site energy emission factor | 0.26 kg CO₂-eq/kWh |
BLOCKED | factor_for() raises. AR-54. |
| Generator rated power | 27.6 kW |
Project input, attribution pending | Used as given. AR-55. |
| Cutting machine rated power | 4.8 kW |
Project input, attribution pending | Used as given. AR-55. |
| Welding machine rated power | 12 kW |
Project input, attribution pending | Used as given. AR-55. |
| Usage hours | 20 / 10 / 40 h |
Project input, attribution pending | Used as given, raw form preserved. AR-55. |
No EXPERT-JUDGEMENT parameter is admitted in this module. Decision #23 forbids
EXPERT-JUDGEMENT for impact factors, and every parameter here that is not a project
input is an impact factor.
Geographic provenance tags (decision #26)¶
| Parameter | Tag | Note |
|---|---|---|
| Site energy emission factor | BLOCKED | Energy-linked stage. Requires a Senegalese grid factor from IEA World Energy Statistics or IPCC EFDB — or, if §4.3 resolves to a genset, a fuel-combustion factor per litre of diesel. pending_african_data = True. |
Weidema pedigree axis 4 (geographic representativeness) for the site energy factor: 5 — origin unknown, so it cannot be scored better; and a value in the EU-average band applied to Senegal would score 5 in any case.
§6 Parity fixture — A5 sheet computed values¶
Extracted with data_only=True on 2026-08-26. These are formula-parity targets and
are reproduced only by passing EXCEL_REFERENCE_FACTORS explicitly (§4.1).
| Equipment | C kW |
E h |
Energy kWh | G kg CO₂-eq |
H share |
|---|---|---|---|---|---|
| Generator | 27.6 | 20 | 552.0 | 143.52 | 0.5111111111111111 |
| Cutting Machine | 4.8 | 10 | 48.0 | 12.48 | 0.044444444444444446 |
| Welding Machine | 12.0 | 40 | 480.0 | 124.80000000000001 | 0.4444444444444445 |
Total (G8) |
1080.0 | 280.8 | 1.0 |
Cross-check: INTERPRETATION!E26 = 280.8 and INTERPRETATION!E27 = 0.000290513…
(A5's share of the whole-workbook LCA total) — consistent, so the A5 sheet is wired
into the interpretation exactly as read here.
§7 Reference inputs for the Keur Songho project¶
backend/app/domains/lca/a5.py carries these as KEUR_SONGHO_EQUIPMENT:
| Equipment | Carrier | Rated power | Usage | Source |
|---|---|---|---|---|
GENERATOR |
SITE_ELECTRICITY |
27.6 kW | 20 h | A5!C5, A5!E5 = 10*2 |
CUTTING_MACHINE |
SITE_ELECTRICITY |
4.8 kW | 10 h | A5!C6, A5!E6 = 10*1 |
WELDING_MACHINE |
SITE_ELECTRICITY |
12 kW | 40 h | A5!C7, A5!E7 = 10*4 |
One carrier is declared, because the workbook uses one factor for all three rows. Declaring a separate diesel-genset carrier would pre-judge §4.3, which is Marco's call, not this spec's.
§8 Scope gap vs EN 15978 / EN 15804+A2 — recorded, not filled¶
EN 15804+A2 §6.3.4.4 and EN 15978 §7.4.4 place the following in A5. The workbook covers only the first:
| A5 sub-scope | In 2_lca_vn.xlsx? |
Consequence |
|---|---|---|
| On-site construction/installation energy (plant, equipment) | Yes — the three rows | Implemented, BLOCKED on the factor |
| Material losses / installation wastage (A1–A4 burden of the wasted fraction, plus its C1–C4 treatment) | No | Structural under-count. Earth-wall construction has non-trivial wastage. |
| On-site water for installation (mixing, curing, compaction) | No | Interacts with the AR-48 mixing-water cut-off question |
| Packaging waste treatment | No | |
| Temporary works (formwork, scaffolding, site accommodation) | No | |
| Transport of plant and workers to site | No | |
| Site earthworks / preparation | No |
This module does not invent any of the missing sub-scopes. Doing so would put
numbers in an ISO 14071 review that trace to nothing. The gap is recorded as AR-58,
a methodology-scope decision for Marco: which A5 sub-scopes v1 declares, and which are
declared out of scope with a stated cut-off justification per EN 15804+A2 §6.3.5. Until
then lca.a5 computes what the reference calculation computes, and the module docstring,
the API description and the A5Result scope note all state the omission explicitly so
the number can never read as a complete A5.
§9 New BLOCKED items → register rows¶
| Row | Item | Category | Turns on |
|---|---|---|---|
| AR-54 | A5 site energy emission factor BLOCKED — uncited 0.26 kg CO₂-eq/kWh on an energy-linked stage |
DEV-BLOCKER / SOURCING | AR-09 (Senegal grid factor verification) |
| AR-55 | A5 equipment powers and usage hours have no attribution (27.6/4.8/12 kW, =10*2 / 10*1 / 10*4) |
ATTRIBUTION | Chiwara team |
| AR-56 | Generator-vs-machine double-count unresolved (§4.3) | METHODOLOGY | Marco + Chiwara |
| AR-57 | lca.c1 inherits the same uncited 0.26 by cell reference (C1!C5 = 'A5'!$C$5) |
DEV-BLOCKER | AR-54 |
| AR-58 | A5 scope covers site energy only; six EN 15804+A2 A5 sub-scopes absent (§8) | METHODOLOGY | Marco |
§10 Session prerequisite status¶
- Step 1 (this document) — complete.
- Steps 2–6 — executed in the same session against this spec.
lca.a5status indocs/architecture/module-map.md: implemented (site energy only; factor BLOCKED → totalNone). It does not advance to parity-verified for the module as a whole, because the parity that passes is formula parity under Excel replication, exactly as forlca.a4.