2026-08-08 → 2026-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.
Checks run per night, one column per calendar day
peak 121 · latest 121
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.
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
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.
- 01 38467132026-08-08
- 02 aee8b502026-08-08
- 03 f5b42b62026-08-15
- 04 01977102026-08-16
- 05 ebaa3172026-08-17
- 06 287f9d52026-08-18
- 07 de9f3ee2026-08-19
- 08 64e27722026-08-20
- 09 cbb13ac2026-08-21
- 10 9768bb52026-08-22
- 11 34f85032026-08-23
- 12 02e3cd12026-08-24
- 13 c6807e02026-08-25
- 14 d12034b2026-08-26
- 15 a52958b2026-08-28
- 16 199aa742026-08-28
- 17 cb2549b2026-08-29
- 18 326ef252026-08-30
- 19 a8e9ac02026-08-31
- 20 c179a542026-09-01
- 21 7fca2792026-09-02
- 22 a0ad72b2026-09-03
- 23 67bbdf32026-09-04
- 24 2aa64c12026-09-05
- 25 136eed12026-09-06
genesis prevRecordHash: null → head 136eed177f75b61758e5d03c43e064b01e3ccc12e27268c4bee3b04b75c2582d
2,682 hash-linked audit events inside them
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.
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.
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.
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.
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.
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.
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.
degraded: llm rather than pretendEvery 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.
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.

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.