Phase 1 of RESET-2026 is merged, pushed, and working — and unverified. Its acceptance bar needs seven consecutive mornings; you have two. The test finishes Aug 21, not at the commit.
Saturday you shipped gen_brief.py, ntfy decision pushes with action buttons, and the relay drain loop. The roadmap defines phase 1 as done when 'the brief arrives 7 consecutive mornings including LLM-failure days.' output/brief/ currently holds two files. The commit felt like the finish line; the criterion says otherwise.
Most acceptance criteria are checkable the moment the code lands. Does the function return the right value, does the page render, does the route dispatch. You run it, you see it, you're done. But some criteria have a clock in them — seven consecutive mornings, no failures for a month, survives a restart — and those cannot be checked at merge no matter how carefully you read the diff.
Time-bearing criteria are the ones that quietly go unverified, and the reason is psychological rather than technical. The commit produces the feeling of completion. The satisfaction arrives, the branch merges, attention moves to phase 2 — which is exactly what happened Saturday, when phase 2 landed about an hour after phase 1. Nothing was left to do that felt like doing, so the criterion just sat there.
The fix is to make the clock someone else's job. If the seven-morning check lives in your head, it depends on you remembering on Aug 21 that you cared on Aug 15. If it lives in job_health_check.py, it runs whether you remember or not, and it stays red until it's genuinely satisfied. A criterion you can't automate is a criterion you'll assume was met.
Turn the prose criterion into a check that stays red until it's true:
# Where you are right now
ls /Users/tom/Claude/PDB/output/brief/
# 2026-08-15.html 2026-08-16.html index.html -> 2 of 7
# The criterion, as code (sketch for job_health_check.py):
def consecutive_days_check(name, dirpath, days, recover):
from datetime import date, timedelta
import os
def _check():
today = date.today()
want = [(today - timedelta(days=i)).isoformat() for i in range(days)]
have = [d for d in want
if os.path.exists(os.path.join(dirpath, f"{d}.html"))]
if len(have) == days:
return True, f"{name}: {days} consecutive days present"
missing = [d for d in want if d not in have]
return False, f"{name}: missing {missing}. Recover: {recover}"
return _check
When a criterion has a clock in it, the merge isn't the finish line — encode the clock in a check, or you'll assume the answer you wanted.