dogwatch

2026-08-082026-09-06 · every record committed, every number below read from them

23 nights watched. 2,156 checks. 2 findings. $0.0000.

dogwatch is the night watch over the six public surfaces of the Agent James program. Every night it publishes one immutable record: what it checked, what it found, what it refused, and what it cost.

30 calendar days23 scheduled · 2 manual24/24 hash links verified0 LLM calls2,682 audit events0 gates opened

Checks run per night, one column per calendar day

peak 121 · latest 121

08131823280206
checks that ranskipped, not publishednight with a findingpublished nothing

The cadence is not unbroken and this page will not say it is. 7 nights inside the span published nothing — the six from 2026-08-09 were a scheduled workflow failing in seconds on a checkout guard, fixed 2026-08-15; 2026-08-27 was a GitHub-side gap. Longest unbroken run: 12 nights.

1,354checks passed
754skipped, by config
2distinct findings
1errors, all time
$0.0000total spend
1quiet nights

Every run, in full · last night’s record

A real published record, not a description of one

Below is a real excerpt of run 01a077c2-cc0e-7f59-8d92-59f00faaa640 — the latest one, 2026-09-06 17:27:30 UTC. Nothing on this page is invented; every line here is copied from the committed file.

Checks (a sample of 121)

  • pass/ reachablereach.status_not_200
    curl -sS "https://agentjames.vercel.app"
  • passheader "strict-transport-security" presentheader.missing
    curl -sS "https://agentjames.vercel.app"
  • pass/ transfer size within the 300000-byte budgetweight.budget_exceeded
    curl -sS "https://agentjames.vercel.app"

A finding, with its source

lowconfirmedF-dc6ce22e43c6link.unverifiable

HEAD https://www.linkedin.com/in/james-lorenz-santos-720776251/ (linked from https://agentjames.vercel.app/resume) → 999; retried GET → 999 at 2026-09-06T17:27:30.062Z

  • HEAD https://www.linkedin.com/in/james-lorenz-santos-720776251/999 at 2026-09-06T17:27:30.062Z

Absence of evidence, verbatim

89 of 121 checks came back clean; 31 were skipped or errored (see notChecked).

89 clean · header:2 link:84 reach:2 weight:1

See the full record, with every check and the Verify button →

25 records, 24 links, checked not claimed

Each record commits the hash of the one before it. Editing any published night would break every link after it. The count below was recomputed while this page was built.

Six surfaces. 1 probed. The other 5 refused, on purpose.

Every skipped check names its reason in the record. Last night 31 checks were declared not-run with reasonCode: "not_published" — a decision made from config, never from interpreting a response.

tiltmeternot probed

https://tiltmeter.vercel.app

Skipped by config before any request. This bare subdomain resolves to an unrelated third party’s project, so probing it could publish a claim about someone else’s software.

chaffnot probed

https://chaff.vercel.app

Skipped by config before any request. This bare subdomain resolves to an unrelated third party’s project, so probing it could publish a claim about someone else’s software.

sluicenot probed

https://sluice.vercel.app

Skipped by config before any request. This bare subdomain resolves to an unrelated third party’s project, so probing it could publish a claim about someone else’s software.

snapgaugenot probed

https://snapgauge.vercel.app

Skipped by config before any request. This bare subdomain resolves to an unrelated third party’s project, so probing it could publish a claim about someone else’s software.

dogwatchnot probed

https://dogwatch-two.vercel.app

Skipped by config before any request. This bare subdomain resolves to an unrelated third party’s project, so probing it could publish a claim about someone else’s software.

Agent Jameswatched

https://agentjames.vercel.app

90 checks ran against it last night across 4 families.

agentjames response time, 25 nights

recorded, not judged — no threshold, no alert

min
176 ms
mean
376 ms
max
1003 ms

$0.0000 spent across 23 nights

Not because the meter is a stub. The advisory model is wired, capped, schema-forced and Zod-validated — and it has never once been reached.

0live model calls, all time
$0.0000billed, to four decimals — rounding $0.0055 to a cent would overstate it twofold
25nights that published degraded: llm rather than pretend

Every record carries its own llm block with calls: 0 and the reason. The issue-drafting half of that model is fully built and provably unreachable — src/llm/unreachable.test.ts fails the build if any code path could reach it. Real gate notifications use a deterministic template instead.

Every action outside this repo waits behind a gate

A confirmed finding proposes an action. Opening the gate starts a 48-hour timer. A human decides through one of three channels. Approval executes the action exactly once. Rejection refuses it — and so does silence: 48 hours with no decision refuses it too. That timeout path is the only edge in this diagram that fires without a human, which is why it is the one amber line.

Flow diagram of the dogwatch gate: a confirmed finding is proposed as an action. Opening the gate starts a 48-hour timer and notifies through an issue in dogwatch's own repo plus an optional webhook. A human decides through one of three channels — a single-use HMAC token on the web, a GitHub Actions workflow_dispatch usable from the mobile app with no token, or the CLI as a recorded break-glass — all converging on one decision. Approval executes the action exactly once through sluice's idempotent effect runner. Rejection refuses it. So does 48 hours passing with no decision at all — that timeout path, drawn in amber, is the only edge that fires without a human choosing anything.

Read the gate flow field by field, and the three decision channels →

What runs on its own, and what doesn't yet

L2 · auto
Everything inside this repo: publishing the record, committing artifacts, opening and closing dogwatch's own gate issues.
L3 · human gate
Every write to a repo dogwatch does not own. Nothing dogwatch can do touches a system I don't operate.

watch.yml has fired on its own schedule — see kind: "scheduled" on the runs it produced.

Watch a real run get published

Recorded against the live site, not a mockup: the recording opens on /runs, opens the newest run, and scrolls through its checks, its findings with their sources, and its cost — the same page a visitor reaches by clicking through themselves.

Poster frame of the demo recording: the dogwatch homepage, showing the published-history headline, the per-night chart, and the dead-man line above it.

Motion is turned off in your browser, so the recording isn't playing automatically. Watch the recording (.webm, has motion).

What it shows: the runs index, the newest published run, its checks grouped by family, its findings with sources, and the cost line — no narration, no cuts.