THE MECHANICS

One node.
Four agents.
No surprises.

The harness reads your books and your job data, drafts the work no one wants to do, and parks each draft in your approval queue. The contract is simple — agents propose, you dispose, the audit log keeps the receipt.

A DAY ON A REAL JOB
01
04:00 PT · NIGHTLY

The node syncs.

Postgres + n8n + FastAPI on a single back-office box (or a VPC you own). At 04:00 it pulls overnight bank activity, fresh QuickBooks state, the job time tracker, the GC's portal status, and any inbound supplier ACKs.

NIGHTLY · audit log entry
2026-05-11 04:00:12  sync.qbo  vendor_bills=12 customers=146 jobs=14
2026-05-11 04:00:47  sync.bank acct=op last_balance=$1,247,418.04
2026-05-11 04:01:02  sync.gc   portal=lakeside rfis=2 cos=1
2026-05-11 04:01:08  scan.coi  subs=12 expired=1 (Bay Plumbing 05/18)
02
04:30–05:45 PT · AGENT RUN

Agents propose.

Each agent reads the slice of state it owns and drafts. agent.ap matches vendor bills 3-way. agent.cfo runs the 13-week cash forecast against your minimum-cash threshold. agent.aia checks whether a draw is due this month. Nothing posts. Everything gets queued with a tier.

AGENT.AP · output
VENDOR
Carrier Supply Co
PROPOSED
bill #INV-88412 → JOB#41209
PO MATCH
$12,402.16 ✓
BOL MATCH
$12,402.16 ✓
TIER
2 · routine review
QUEUED AS
approval #1042
03
06:00 PT · YOU

Morning Briefing.

You open the briefing on your phone with coffee. Cash position. WIP. AR aging. The 13-week forecast with weeks below threshold flagged. Project alerts. A count of things awaiting your stamp — usually under 10.

EMAIL · 06:02 from agent.cfo
subj: Weekly cash position — wk03 + wk04 below $80K min target · 3 actions inside
────────────────────────────────────────────
Tom — cash position is $1.24M as of 06:00 Monday.
Two upcoming weeks are below your $80K floor.

   wk03 (05-26)  proj $72K  driven by Lakeside CO-014 not yet billed
   wk04 (06-02)  proj $64K  payroll $58K + AP $42K stack

3 drafted actions in your queue. Open queue →
04
06:30 PT · APPROVAL

You stamp.

Tier 1 rows (a routine AP match, a 30-day AR reminder) you batch-approve. Tier 2 you skim. Tier 3 is where you actually engage — a variance, a CO over $10K, a lien waiver. Tier 4 is owner-only and rare. Anything you reject takes a one-line reason; the agent learns from it.

TIER 1 · BATCH
approved 8 in 12s
TIER 2 · INDIVIDUAL
approved 4, edited 1
TIER 3 · VARIANCE
held for PM
TIER 4 · OWNER
0 today
05
06:30:14 PT · THE NODE WRITES

Then — and only then — it posts.

An approved row triggers the QuickBooks write with an idempotency key. If QB rejects (duplicate doc number, closed period, validation error), the row flips to conflict and a retry schedule starts. Nothing silently fails. Nothing double-posts. The audit log gets every attempt.

AUDIT LOG · two entries
2026-05-11 06:30:14  approve.user  #1042 by tom@aire-tech.com
2026-05-11 06:30:14  qbo.write     vendor_bill INV-88412 · idem=ap-1042-20260511 · ok
THE HARD INVARIANTS

The three things
the harness will never do.

Most "AI for the trades" products want to act for you. We don't. The architecture forbids it — and the audit log proves it.

HITL · 01

Never posts without a stamp.

Every external mutation requires approval_queue.status='approved' — enforced at the DB layer. No agent can bypass it; no admin can disable it. If the harness wrote it, you signed it.

AUDIT · 02

Never loses the receipt.

Every approve, reject, edit, expire, and QB sync writes one append-only row. UPDATE and DELETE on the audit table are blocked at the DB. Bonded contractors get a clean audit out of the box.

IDEM · 03

Never double-posts.

Every queue row carries a unique idempotency key. Retry the write — same key — get the same result. The harness can crash, resume, and never bill the same vendor twice.

SEE IT YOURSELF

Walk through
a real morning.