Loop OPS-2 · Operations & construction · reports to Yasar

How fast does site paperwork actually move?

Measures how long delivery and work inspections take per project against targets set with Yasar — the honest version: the timestamps mostly don't exist yet, so the loop ships in degraded mode and upgrades itself as data appears.

Built & tested — pilotWave 4🕐 Weekly (when data exists)⚙️ Hermes bizops (planned)
Part 1 — the plain-english view

You can't speed up what nobody times.

What it watches
  • Stage durations per project: delivered → inspection, installed → inspection sign-off
  • Medians vs targets agreed with Yasar
  • Until then: data coverage itself — which projects have capture dates at all
When & how it speaks

Weekly once real data flows; today it reports coverage honestly (“0 of 4 deliveries have inspection dates”) rather than pretending.

Why it exists

The investigation found the billing database has the right tables but they're empty — inspections and batch dates simply aren't captured. So this loop's first deliverable was a precise feature request (three capture fields), plus a monitor that switches itself from “coverage report” to “speed report” the day data lands.

0 / 4
deliveries with inspection dates today — the honest baseline
3 fields
requested in the billing app: the minimal capture needed to time the process
Auto-upgrade
the loop detects real data and switches from coverage mode to speed mode on its own

Weekly

Monday

👀

Reads billing snapshot

Milestone tables, capture coverage

🔀

Mode check

Data present? → speed report. Absent? → coverage report

💬

Digest to Yasar

Medians vs targets, or the coverage gap

Targets stay human

Yasar sets what “fast enough” means

What it will never doNever chases site staff directly — findings go to Yasar.
Where it stands today · July 2026Built in degraded mode and tested; the speed math is unit-verified and dormant until the billing app captures the three requested fields. This is the portfolio's honesty principle in action: say “the data doesn't exist yet” rather than fake a metric.
Part 2 — under the hood

How it's wired: systems, models, and the path a number takes.

For implementers and the technically curious. The full build sheet — verified queries, thresholds, and build notes — lives on the specs page.

ReadsBilling app snapshot
Milestone tables — currently empty of dates
Stepops2_cycletime.py
Coverage check → auto-upgrade → stage-duration medians
DeliversWeekly digest
Coverage gaps now; speed vs targets later
Human gateYasar
Sets targets; decides process changes
System we read Automated step State / memory Human decision
SystemRole in this loop
Joinery Billing appSQLite on our serverThe construction billing system. The loop reads a snapshot copy of its database — never the live file.
Hermesagent runtime on our serverThe scheduler that wakes the loop up. Each loop is a cron job under a Hermes profile; the planned bizops profile will host the business digests (IT loops run under vpsops).
Healthcheckshealthchecks.huxapps.comThe dead-man's switch. The loop pings it only after a clean run — if the loop dies or errors, the ping stops and Healthchecks raises the alarm independently. This is how 'never silent' is enforced by machinery, not promises.
Email renderer + gwsrender_email.pyAll digests pass through one shared renderer: Huxberry-branded HTML, tables for repeated rows, a coral 'needs your response' box when the loop has questions, and an arrow link on every record. Sent from the loops mailbox via the Google Workspace CLI.
Loop chassisloop_common.pyShared plumbing every loop reuses instead of reinventing: state files, run-over-run diffing, Metabase drill-down link building, quiet-on-green notify logic.
Model / brainWhat it does here
None at run timedeterministic scriptA normal cycle is a plain Python script — no AI tokens are spent unless a diagnosis or judgment step is actually needed. AI wrote the script; the script does the rounds.
GPT-5.5 via Codexthe bulk-work modelWrote and maintains the mechanical parts — SQL, diffing, digest assembly. Effectively free on our existing subscription, so routine cycles cost almost nothing.
State & memory

Coverage history — so “capture is improving” is itself a visible trend while the feature request lands.

Delivery

Weekly email to Yasar; deliberately short until there's something real to measure.

Safety rails

Snapshot reads only. Reports coverage honestly instead of inventing durations from absent data.

Before it can run for real
  • Billing-app feature request: three milestone-date capture fields (filed; awaiting Nish/Yasar's go)
Full build sheet →