Commit graph

11 commits

Author SHA1 Message Date
Khalim Conn-Kowlessar
c732c21836 docs: handover — Summary + API cohort expansion to 38 additional certs
Hands off the next workstream: the 38 cert subdirs at
`sap worksheets/additional with api 2/`. Each subdir is named after
the 20-digit EPC cert reference and contains a Summary PDF + dr87
worksheet PDF. API JSONs are NOT in the dataset but ARE fetchable
via the existing `EpcClientService` (token in `backend/.env` as
`OPEN_EPC_API_TOKEN`).

User's stated ordering: Elmhurst Summary mapping FIRST, API path
SECOND. Folder names = cert refs; need to verify the matching before
bulk-pinning (any mis-filed PDF would silently invalidate slice
work).

Handover ships with verified dataset and first-attempt baselines:

  - Folder-vs-cert sweep: **38/38 match** at handover (postcode
    parity check between Summary PDF and Open EPC API).
  - First-attempt Summary-path probe across 38 certs:
      24  closed at ±0.07 (first-try, zero new slices needed)
       9 ~ small gap (<1 SAP) — likely 1 slice each
       3 ✗ big gap (>1 SAP) — multi-slice investigation
       2 RAISES UnmappedElmhurstLabel: cylinder_size='Normal'

The two `Normal` cylinder raises are the immediate Phase 1 slice —
Slice S0380.15's strict-enum pattern paid off on its first new
cohort by surfacing the gap at extraction time instead of as a
downstream SAP delta.

Workstream phases documented in the handover:

  Phase 0: folder-vs-cert sweep (already done — 38/38)
  Phase 1: fix 'Normal' cylinder unmapped-label raise
  Phase 2: bulk-pin the 24 first-try-closures as chain tests
  Phase 3: close the 9 small-gap certs one slice each
  Phase 4: investigate the 3 big-gap certs (likely HP-routing)
  Phase 5: fetch + persist API JSON for all 38, run API path tests
  Phase 6: cross-mapper EPC parity (Summary EPC ≡ API EPC) — the
    user's stated north-star

Includes:
  - Paste-able diagnostic probe scripts (Summary path + folder-vs-
    cert sweep + .env loader + EpcClientService usage example).
  - Full table of first-attempt deltas per cert with classifications.
  - All 15 prior-session slice commits indexed.
  - Memory references to the slicing / methodology conventions.
  - Per-cert diagnostic recipe template.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
18f8e0f6c5 docs: handover — start cert 0380 Summary → EPC → calculator path
The 7-cert ASHP cohort API path is closed at the spec-precision
floor (this session). Next workstream is the Summary path for cert
0380 — the user's preferred starting point because the Summary +
worksheet PDFs surface labelled intermediate values that the API
path lacks.

Cert 0380 Summary PDF (`Summary_000899.pdf`) is already in the
test fixtures dir; just needs a path constant + RED chain test.
Previous handover flagged the extractor at Δ -58.37 SAP for HPs
— the immediate diagnostic is whether the mapper surfaces
main_heating_category=4 and main_heating_index_number=104568.

The handover also documents the user's "Elmhurst-specific"
challenge worth re-exploring: closed boiler certs hit 1e-4 vs
Elmhurst via the same cascade, so the residual is precisely at the
Appendix N3.6 PSR interpolation step. Cross-check with the BRE
xlsx canonical calculator is suggested.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
8b5a8db7e1 docs: handover refresh — cohort closed to spec-precision floor
Updates the handover with the final state after 11 slices:
- All 7 ASHP cohort certs cascade SAP integer == lodged (residual 0).
- Continuous SAP residual clusters within +0.030..+0.060.
- BRE web confirmed max_output_kw values (4.39 / 3.933) match cascade
  exactly — the remaining drift is NOT a max_output bug.
- Cascade (39) annual avg HLC EXACTLY matches worksheet (39) at 4 dp
  for cert 0380 and 2225 — HLC is NOT the bug either.
- Implied drift is ~0.15% in η_space interpolation precision, likely
  in Elmhurst's internal rounding convention (not in public SAP 10.2
  spec or BRE PCDB).

Recommends Path A (ship Layer 4 chain tests at ±0.07 SAP tolerance)
as the spec-precision floor. Path B (close to 1e-4) requires Elmhurst
implementation access that's outside public docs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
ba8c7062cd docs: handover update — slices 102f-prep.1-8 shipped, cohort analysis
Refreshes the handover with the full session's work:
- All 7 ASHP cohort certs' MIT cascade matches worksheet (92) at 1e-3.
- 6/7 cohort SAP residuals cluster at +0.03..+0.06 vs worksheet.
- Identified PSR-formula drift root cause: max_output_kw ≈ 4.40 kW
  back-solved from 3 certs' worksheet η_space pins, vs the 4.39 lodged
  at PCDB position 47 (likely a field-position misread; needs BRE web
  cross-check for PCDB 104568 / 102421).
- Identified cert 2636's +0.49 outlier as missing cantilever Exposed
  floor (3.74 m² = upper-floor 42.92 − ground-floor 39.18 area diff).

Recommends Path A (resolve max_output + cantilever to land 1e-4) or
Path B (widen Layer 4 tolerance to 0.1 with documented limitations).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
36037ff740 docs: handover — cert 0380 §N3.5 MIT cascade shipped (102f-prep.1-6)
Session shipped 6 slices closing cert 0380's SAP residual from
+0.5999 → +0.0594 vs worksheet 88.5104. The MIT cascade now matches
worksheet line (92) at 1e-3 per month and is spec-faithful through
SAP 10.2 Appendix N3.5 + Equation N5. Remaining residual is a
single PSR-formula divergence (cascade PSR 1.4266 per spec vs
worksheet-implied 1.4321, ~0.4%) that propagates to η_space at 0.2%
and ~0.045 SAP. Three candidate root causes documented; investigation
deferred to next session as the blocker for slice 102f's Layer 4
1e-4 chain test.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
ebb492c5d3 docs: handover — cert 0380 HW cascade (slices 102a-e shipped, MIT residual deferred to next session) 2026-06-01 16:28:46 +00:00
Khalim Conn-Kowlessar
ac867499ea docs: update handover — cert 0380 API path Δ -18.37 → +2.92 SAP
Cert 0380 (semi-detached bungalow ASHP) was the prior handover's
"defer until HP go-ahead" pilot. Three slices this session closed
the dwelling-shape part of the gap:

- 101a: glazing_type=14 → DG/TG post-2022 (windows HLC exact)
- 101b: cavity wall + filled cavity + external insulation
  (composite U via Table 14 R_ins + 2 d.p. round; walls HLC exact)
  + Table 11 cat-4 secondary fraction = 0
- 101c: Table 4f cat-4 pumps/fans kWh = 0

(37) total fabric heat loss is now EXACT vs worksheet 96.0889.

Remaining gap (Δ +2.92 SAP) is dominated by the hot water cascade:
the cert lodges a 160 L cylinder (storage loss + primary loss) and
the HW HP COP is model-specific (PCDB index 104568 → 1.711 per
worksheet, not the Table 4a generic 2.3 our cascade uses). Both
require new cascade work — HP HW-specific COP from PCDB plus
cylinder storage/primary loss application.

Cert 0380's HW work will benefit all 6 sibling ASHPs sharing PCDB
idx 104568 (and partially the 102421 outlier).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:45 +00:00
Khalim Conn-Kowlessar
04d6e8b868 docs: update handover — cert 9501 closed, HP workstream still next
Cert 9501 (top-floor flat + RR + measured PV) is now CLOSED on both
Summary and API paths at 1e-4 vs worksheet 68.5252 (Slices 99a-99e
on Summary + 100a-100c on API). Three boiler certs in total now
have Layer 4 production gates.

Updated handover lists the 7 ASHP workstream (still deferred), the
8 cohort certs without worksheets (residuals tightened by Slice
100c's gap-aware DG-pre-2002 glazing lookup), and captures the 7
key learnings from cert 9501 closure as guidance for the HP
workstream.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:45 +00:00
Khalim Conn-Kowlessar
7c6a9e07c2 docs: handover for cert 9501 (flat exposure) + HP workstream
Captures session state after cert 0330 closed both Summary and API
Layer 4 1e-4 gates (Slices 96-98). Cert 9501 fixtures are staged
(commit 5d1778ac) but the Summary path is RED at Δ -5.25 SAP because
the cert is a flat with RR + party-floor / party-ceiling — a
fundamentally different cascade shape from the boiler houses we've
validated.

Handover quantifies the cascade-component gaps (-69.92 W/K on walls
because RR gables aren't surfaced, +9.25 W/K on floor because the
party-floor exposure isn't recognised, +7.36 W/K on party walls
because U_party=0 isn't being applied), lists the 4 fixes likely
needed in slice order, and leaves the heat-pump workstream sketch
intact for when the user gives the go-ahead.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:45 +00:00
Khalim Conn-Kowlessar
757c099de0 docs: handover for per-cert mapper validation workflow
Rewrites the cert 001479 closure handover into a forward-looking
brief for the new workstream: validating the API EpcPropertyDataMapper
against 9 newly-staged (Summary + worksheet + API) cert triples.

Key contents:

- User's stated workflow (verbatim): Summary path proves itself
  against the worksheet → becomes canonical reference for API parity.
- Folder-structure changes since the prior handover were written
  (packages/domain/ removed; sap10_calculator + sap10_ml now at the
  repo root under a PEP 420 namespace; docs/sap-spec/ moved into
  domain/sap10_calculator/docs/; PCDB data into tables/pcdb/data/).
- New test data layout: `sap worksheets/Additional data with api/
  <cert-ref>/{Summary_NNNNNN.pdf, dr87-0001-NNNNNN.pdf}`.
- Cert reference table with heating type, PCDB index, worksheet SAP,
  TFA, bp count, dwelling type for all 9 triples.
- Major scope discovery: 7 of 9 are Air Source Heat Pumps (PCDB
  104568 / 102421). The mapper has never been validated against HPs;
  cert 0380 pilot showed catastrophic deltas (Summary -70 / API -18
  SAP vs worksheet). Recommended deferring HP certs until boiler
  workflow is proven.
- Cert 0330 (mid-terrace gas boiler) pilot status: fixtures staged
  uncommitted; Summary path +0.47 SAP, API path +2.15 SAP vs
  worksheet 61.5993. Cascade-component diff localises 2 specific
  gaps (windows HLC +6.71 W/K likely from glazing_type=14 missing
  from Slice 93's transmission map; HW kWh +1060 needs §4
  subsystem probe).
- Tooling shortcut: use OPEN_EPC_API_TOKEN (not EPC_AUTH_TOKEN) in
  backend/.env with EpcClientService._fetch_certificate(cert_ref)
  to fetch raw JSON.
- First actions for next agent: confirm baseline, commit cert 0330
  fixtures, add RED Layer 2 test, iterate.

Lesson preserved: cohort hand-builts encode non-spec quirks
(e.g. has_suspended_timber_floor=False to override §(12) spec
inference and match the non-spec worksheet). Cross-check against
spec-inferred mapper output before trusting hand-built fields.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 16:28:45 +00:00
Khalim Conn-Kowlessar
a7b08a4e8f refactor: move docs/sap-spec/ contents into domain/sap10_calculator/
Locality of reference — SAP-specific docs, specs, and runtime data
now live alongside the calculator that consumes them, mirroring the
prior packages→domain layout moves.

Move targets:

- Narrative MDs → domain/sap10_calculator/docs/
    NEXT_AGENT_PROMPT.md, HANDOVER_NEXT.md, SAP_CALCULATOR.md
- Spec PDFs → domain/sap10_calculator/docs/specs/
    RdSAP 10 Specification 10-06-2025.pdf
    PCDF_Spec_Rev-06b_12_May_2021.pdf
    sap-10-2-full-specification-2025-03-14.pdf
    sap-10-3-full-specification-2026-01-13.pdf
- PCDB runtime data → domain/sap10_calculator/tables/pcdb/data/
    pcdb10.dat (8.3MB) + 7× pcdb_table_*.jsonl (18MB total)

Path code rewrites (load-bearing):

- tables/pcdb/__init__.py: replaced parents[4]/'docs'/'sap-spec' with
  Path(__file__).resolve().parent/'data' for Table 105 JSONL loading.
- tables/pcdb/postcode_weather.py: same rebase for the pcdb10.dat path
  read by _postcode_climate_table().
- tables/pcdb/etl.py __main__: same rebase for the manual ETL invocation
  (source + output_dir both now point inside the package).
- tests/test_pcdb_etl.py: _PCDB_DAT_PATH now derives from
  parents[1]/'tables'/'pcdb'/'data' (was parents[3]/'docs'/'sap-spec').

Citation rewrites:

- 12 .py docstrings and 4 .md docs (ADRs + READMEs + narrative docs)
  had `docs/sap-spec/<file>` strings rewritten to their new locations.
- Two cases where the catch-all sed misfired (an ADR-0009 line about a
  PCDB extract; the pcdb __init__.py docstring about ETL output) were
  hand-corrected to point at tables/pcdb/data/ rather than docs/specs/.

docs/sap-spec/ is now empty (will be removed in a follow-up sweep or
left as a vestigial empty dir for future repurposing). ADRs 0009 and
0010 remain at docs/adr/ — they're part of the chronological
cross-cutting decision log, not calculator-specific narrative.

Verified:

- Calculator's 1e-4 production gate
  (test_api_001479_full_chain_sap_matches_worksheet_pdf_exactly) GREEN.
- Wider sweep (domain/sap10_calculator/ + domain/sap10_ml/): 1654
  passed / 20 failed — exact pre-move baseline. All 20 failures
  pre-existing (10 hand-built skeleton + 4 cohort chain + 6 cohort
  diff).
- Pyright net-zero on the 4 touched runtime/test files (0 errors)
  and unchanged on heat_transmission.py (13) / cert_to_inputs.py (35) /
  mapper.py (33).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 13:17:18 +00:00