Skip to content

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*220 Usage hours. Multiplicands undocumented
E6 =10*110 "
E7 =10*440 "
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:

A5_e  =  P_e [kW]  ×  t_e [h]  ×  EF [kg CO₂-eq/kWh]

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:

  1. 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.
  2. 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 … raise ValueError if 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.
  3. The workbook contradicts itself. The same workbook carries a Senegal grid factor at B1!D5 = 1.1 kg CO₂/kWh for 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!D5 is itself unverified (AR-09).
  4. 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.a5 status in docs/architecture/module-map.md: implemented (site energy only; factor BLOCKED → total None). 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 for lca.a4.