[object Object]

← back to Designerwallcoverings

TK-11301: fix a false-green in my own watcher — coverage window, not poll count

de0faeca8fd9cd52250c3abbca184ccde3df5732 · 2026-09-11 11:22:39 -0700 · Steve Abrams

The first cut passed once 20 polls had elapsed since the revoke (~22:50Z).
The second projected re-stamp window is ~00:09Z. So that threshold would
have reported PASS BEFORE the window it exists to observe — a check going
green on something it had not measured, which is the exact class this
ticket's lineage keeps producing.

PASS now requires wall-clock coverage through 2026-09-12T00:20:00Z, i.e.
polls spanning BOTH projected windows (~18:05Z and ~00:09Z) after four
consecutive fires at a ~6h cadence. Fixture-proved on all four paths:
clean+covered PASS, injected fire FAIL, clean-but-uncovered WARN, stale
log WARN.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XA7ZPurwcdipst1gsgwwXq

Files touched

Diff

commit de0faeca8fd9cd52250c3abbca184ccde3df5732
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Sep 11 11:22:39 2026 -0700

    TK-11301: fix a false-green in my own watcher — coverage window, not poll count
    
    The first cut passed once 20 polls had elapsed since the revoke (~22:50Z).
    The second projected re-stamp window is ~00:09Z. So that threshold would
    have reported PASS BEFORE the window it exists to observe — a check going
    green on something it had not measured, which is the exact class this
    ticket's lineage keeps producing.
    
    PASS now requires wall-clock coverage through 2026-09-12T00:20:00Z, i.e.
    polls spanning BOTH projected windows (~18:05Z and ~00:09Z) after four
    consecutive fires at a ~6h cadence. Fixture-proved on all four paths:
    clean+covered PASS, injected fire FAIL, clean-but-uncovered WARN, stale
    log WARN.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01XA7ZPurwcdipst1gsgwwXq
---
 verification/tk11301-postrevoke/verdict.json |  2 +-
 verification/tk11301-postrevoke/watch.sh     | 11 +++++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/verification/tk11301-postrevoke/verdict.json b/verification/tk11301-postrevoke/verdict.json
index 98bcadc..0e17f84 100644
--- a/verification/tk11301-postrevoke/verdict.json
+++ b/verification/tk11301-postrevoke/verdict.json
@@ -1 +1 @@
-{"skill":"tk11301-postrevoke-watch","ticket":"TK-11301","ts":"2026-09-11T18:21:06Z","verdict":"WARN","status":"WARN","revoke_ts":"2026-09-11T16:48:32Z","fires_after_revoke":0,"polls_after_revoke":5,"last_poll":"2026-09-11T18:03:53Z","last_fire_ever":"2026-09-11T11:54:33Z","log_age_min":17,"note":"only 5 polls since revoke (<20, i.e. under ~6h of coverage) — insufficient window, not yet provable"}
+{"skill":"tk11301-postrevoke-watch","ticket":"TK-11301","ts":"2026-09-11T18:22:07Z","verdict":"WARN","status":"WARN","revoke_ts":"2026-09-11T16:48:32Z","fires_after_revoke":0,"polls_after_revoke":5,"last_poll":"2026-09-11T18:03:53Z","last_fire_ever":"2026-09-11T11:54:33Z","log_age_min":18,"note":"clean so far (5 polls, 0 fires) but coverage only reaches 2026-09-11T18:03:53Z — the criterion needs polls through 2026-09-12T00:20:00Z (two consecutive projected fire windows ~18:05Z and ~00:09Z). NOT yet provable."}
diff --git a/verification/tk11301-postrevoke/watch.sh b/verification/tk11301-postrevoke/watch.sh
index e43ab69..96c9e81 100755
--- a/verification/tk11301-postrevoke/watch.sh
+++ b/verification/tk11301-postrevoke/watch.sh
@@ -4,6 +4,13 @@
 # 2026-09-11T16:48:32Z revoke of Shopify token …75b9 (app ImportNewSkufromURL-12-10-25).
 # Evidence source = the standing 18-min tripwire's own log; this only reads + summarises it.
 REVOKE_TS="2026-09-11T16:48:32Z"
+# PASS requires coverage through TWO consecutive projected fire windows after the revoke.
+# Prior fires: 09-10T17:44, 23:44:53, 09-11T05:48:13, 11:54:33 (deltas +6:00:37, +6:03:20,
+# +6:06:20 — ~6h drifting ~3min later each cycle). Projected next two: ~18:05Z and ~00:09Z.
+# A poll-count threshold would have gone green at ~22:50Z, BEFORE the second window — a
+# false green. The criterion is therefore wall-clock coverage, not poll count.
+COVER_UNTIL="${TK11301_COVER_UNTIL:-2026-09-12T00:20:00Z}"
+COVER_UNTIL_EPOCH=$(date -u -j -f "%Y-%m-%dT%H:%M:%SZ" "$COVER_UNTIL" +%s)
 LOG="${TK11301_TRIPWIRE_LOG:-/tmp/zero-price-tripwire.log}"
 OUT_OVERRIDE="${TK11301_OUT:-}"
 OUT="${OUT_OVERRIDE:-$(dirname "$0")/verdict.json}"
@@ -17,7 +24,7 @@ now=$(date -u +%s); lp=$(date -u -j -f "%Y-%m-%dT%H:%M:%SZ" "$last_poll" +%s 2>/
 age=$(( (now - lp) / 60 ))
 if [ "$lp" = "0" ] || [ "$age" -gt 45 ]; then v=WARN; note="tripwire log stale (${age}m since last poll) — NOT MEASURED, refusing to report PASS"
 elif [ "$fires_after" -gt 0 ]; then v=FAIL; note="re-stamper FIRED $fires_after time(s) after the token revoke — revoke did NOT stop it"
-elif [ "$polls_after" -lt 20 ]; then v=WARN; note="only $polls_after polls since revoke (<20, i.e. under ~6h of coverage) — insufficient window, not yet provable"
-else v=PASS; note="$polls_after consecutive clean polls since the revoke, 0 fires (prior cadence was a fire every ~6h)"; fi
+elif [ "$lp" -lt "$COVER_UNTIL_EPOCH" ]; then v=WARN; note="clean so far ($polls_after polls, 0 fires) but coverage only reaches $last_poll — the criterion needs polls through $COVER_UNTIL (two consecutive projected fire windows ~18:05Z and ~00:09Z). NOT yet provable."
+else v=PASS; note="$polls_after consecutive clean polls, 0 fires, coverage past $COVER_UNTIL — spans two consecutive projected fire windows after four consecutive fires at a ~6h cadence"; fi
 printf '{"skill":"tk11301-postrevoke-watch","ticket":"TK-11301","ts":"%s","verdict":"%s","status":"%s","revoke_ts":"%s","fires_after_revoke":%s,"polls_after_revoke":%s,"last_poll":"%s","last_fire_ever":"%s","log_age_min":%s,"note":"%s"}\n' \
   "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$v" "$v" "$REVOKE_TS" "$fires_after" "$polls_after" "$last_poll" "$last_fire" "$age" "$note" | tee "$OUT"

← 3347aa6 TK-11301: read-only post-revoke recurrence watch + negative  ·  back to Designerwallcoverings  ·  auto-data-snapshot: 2026-09-11T11:23:31 (2 data files) — ver f518287 →