Day 46 of 49 · Wednesday · Learning

Done-when has a clock in itReview

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.

Catch-up progress
46/49
Why this matters to you

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.

Worked example

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
▶ Do it now
  1. Run `ls PDB/output/brief/` and count. Write the number down — that's your baseline.
  2. Add the consecutive_days_check above to job_health_check.py and register it for the brief with days=7.
  3. Confirm it fails right now. A new check that passes on day one is measuring the wrong thing.
  4. Set a note for Aug 21 to re-run it. If it goes green, phase 1 is genuinely done and you can retire the check. If it doesn't, you've found the failure mode phase 1 was built to prevent.

Gotchas

One-card takeaway

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.