2026-08-08 → 2026-09-25 · every record committed, every number below read from them
42 nights watched. 4,531 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 125 · latest 125
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: 29 nights.
A real published record, not a description of one
Below is a real excerpt of run 01a0d9f5-7f1c-713f-9cab-4ccd61b83a21 — the latest one, 2026-09-25 19:05:39 UTC. Nothing on this page is invented; every line here is copied from the committed file.
Checks (a sample of 125)
- 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) → 999; retried GET → 999 at 2026-09-25T19:05:39.868Z
- HEAD https://www.linkedin.com/in/james-lorenz-santos-720776251/ → 999 at 2026-09-25T19:05:39.868Z
Absence of evidence, verbatim
93 of 125 checks came back clean; 31 were skipped or errored (see notChecked).
93 clean · header:2 link:88 reach:2 weight:1
See the full record, with every check and the Verify button →
44 records, 43 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
- 26 c625c782026-09-07
- 27 1bfeaf72026-09-08
- 28 cbfe76a2026-09-09
- 29 c9d50722026-09-10
- 30 bf194a62026-09-11
- 31 46d00722026-09-12
- 32 e5619e32026-09-13
- 33 4c654cb2026-09-14
- 34 ea88ecf2026-09-15
- 35 75ff8152026-09-16
- 36 a7b1a4b2026-09-17
- 37 a5112562026-09-18
- 38 3c637552026-09-19
- 39 da7b05e2026-09-20
- 40 77a7d872026-09-21
- 41 096644f2026-09-22
- 42 42dd0012026-09-23
- 43 fafb7a32026-09-24
- 44 b9a37b62026-09-25
genesis prevRecordHash: null → head b9a37b653223b8613db0952a4282b90ea23944afb5e60fce94b06ad4269864c5
6,121 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
Not yet deployed (SPEC §12 M0-M2). Every family for this site is skipped reasonCode:not_published by config, before any HTTP request is made — never by probing and interpreting a response. Verified live 2026-08-08: this shared *.vercel.app subdomain already resolves to an unrelated third-party project, so a response-driven skip would risk publishing a claim about someone else's software (SPEC §1 non-goal 1).
https://chaff.vercel.app
Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.
https://sluice.vercel.app
Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.
https://snapgauge.vercel.app
Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.
https://dogwatch-two.vercel.app
Deployed at this URL since M6. Self-watch is nevertheless OFF (deployed:false), so every family here is skipped reasonCode:not_published by config before any request — turning it on changes what the nightly run does and is a deliberate, separate step. Unlike the other four, this subdomain is NOT a third-party squat: the bare dogwatch.vercel.app is, which is why the URL above is the real alias read from `vercel inspect` rather than the guessable one.
https://agentjames.vercel.app
Live. The brand family is intentionally omitted here: the backlink+footer-attribution rule (SPEC §2) asserts that sibling tool sites link back to the portfolio hub, not that the hub links to itself.
94 checks ran last night across 4 families.
agentjames response time, 44 nights
recorded, not judged — no threshold, no alert
- min
- 173 ms
- mean
- 671 ms
- max
- 1845 ms
$0.0000 spent across 42 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.