dogwatch

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.

49 calendar days42 scheduled · 2 manual43/43 hash links verified0 LLM calls6,121 audit events0 gates opened

Checks run per night, one column per calendar day

peak 125 · latest 125

0813182328020712172225
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: 29 nights.

3,121checks passed
1,343skipped, 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 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

lowconfirmedF-b86ef8842913link.unverifiable

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.

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

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).

chaffnot probed

https://chaff.vercel.app

Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.

sluicenot probed

https://sluice.vercel.app

Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.

snapgaugenot probed

https://snapgauge.vercel.app

Not yet deployed. See tiltmeter note — same verified-live third-party-squat situation on this subdomain.

dogwatchnot probed

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.

Agent Jameswatched

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.

0live model calls, all time
$0.0000billed, to four decimals — rounding $0.0055 to a cent would overstate it twofold
44nights 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.