One record, and the figures cannot drift
Survey, priced schedule and completion sit in one costed record, and every document is
generated from it — so the schedule, the works order and the paste-sheet cannot disagree
by a rounding. The build reads its own documents back and stops if a table does not tie
to the record.
Checked in record.py, artefacts.py,
checks.py — which exists because a £100 provisional sum once
went missing off a paste-sheet, and now cannot.
Priced off your own schedule of rates
Load your schedule from Excel or CSV — it reads by column heading and counts every
skipped row with the reason. Map your defect types to your own lines once, and from then
on the report prices itself. Every figure states the base rate and the contract adjustment
applied to it.
Checked in schedule.py — load_file,
detect_columns, parse_rows,
map_defect.
The clock, counted the way the regulations count it
A report is stamped to the second with its timezone; an attendance is stamped the same
way; and the working days between them are counted by the statutory definition —
Saturdays, Sundays, Christmas Day, Good Friday and bank holidays out. A naive timestamp
with no zone is refused, because 00:40 on a Saturday in London is still the Friday in
UTC, and a legal period counts from a day.
Checked in clock.py — the 2025 Regulations quoted at
reg 2 verbatim, not paraphrased.
A map that works in a stairwell
The map is drawn on the machine from bundled Ordnance Survey open data — OS OpenMap Local
and OS Open Greenspace, under the Open Government Licence v3.0 — decoded once into typed
arrays. No tile is ever fetched from anywhere. Jobs are pinned on it. It
works in a basement, a void, or a lift lobby with no signal. The map at the top of this
page is that render, from that data.
Checked in shell/ground.json — 981,869 bytes, its own
header naming the source and the licence — and the one local fetch that reads it.
Site conditions kept as evidence
The conditions on the day go on the job record as a validated field: date, conditions,
temperature, note. A free-typed date or a mistyped condition refuses to land, exactly as a
bad status does — because rain at the inspection is evidence in a disrepair file, and
evidence has to mean something. Live weather is a separate, fenced, optional thing; see
below.
Checked in record.py —
WEATHER_KEYS, WEATHER_CONDITIONS.
A timer that is checked, not believed
Start and stop on site. Then the run is set against what the filing already evidences
about that day — a photograph timed 08:12 proves you were there at 08:12, so a timer
claiming to cover that day must have been running at 08:12. If they agree, they agree. If
they disagree, both figures go on the screen and you choose. Nothing is
averaged and nothing is silently preferred.
Checked in timer.py — four verdicts:
agree, disagree,
alone, evidence_only.
And one more, for the demonstration: the assistant that turns
a report into a priced repair speaks — a local voice, on the machine, ranked
to the best one your operating system has. There is no microphone: no speech recognition, no
getUserMedia, no recorder anywhere in the file, and a test pins that
refusal so a later hand cannot quietly add listening. A cloud voice is refused even when the
browser offers one.