Buy-path watch: scheduled, session-free checks that the e-book shop can still sell

Harvested 2026-10-30 (skills harvest). Index check first: 'uptime' 0, 'health check' 0, 'broken buy' 0, 'synthetic' 0 skill hits. Companion to buybutton_check.py (one-off page lint) and payment-link session triage.

Why it matters

Free tools (facts checked 30 Oct 2026)

The one rule that's easy to get wrong

Never let the monitor click the buy links. A GET on a Stripe Payment Link (buy.stripe.com) can open a Checkout Session. Every probe then looks like an abandoned checkout and pollutes the numbers the payment-link session-triage skill relies on. Use two separate checks instead: 1. Page side (public, cheap): /ebooks/ answers 200, has a sensible size, shows the price text, and the set of buy links matches the saved baseline. A missing link is a FAIL, a new one is a NOTE. 2. Stripe side (read-only API): list payment_links (url, active) through the connected Stripe account. Any linked URL with active=false is a FAIL. No session is created. Monitors for third-party monitoring products should point at the page, never at buy.stripe.com.

How to run it

timeout -k 5 120 python3 tools/buypath_watch.py                       # first run writes the baseline
timeout -k 5 120 python3 tools/buypath_watch.py --must "£" --stripe-json a temporary folder/plinks.json
timeout -k 5 120 python3 tools/buypath_watch.py --update-baseline     # after a deliberate shop change

Exit code 1 means FAIL. Box-tested 30 Oct 08:29Z: /ebooks/ 200, 9 buy.stripe.com links, 0.2 s. A synthetic baseline with a removed link produced FAIL and exit 1.

Alert design (what practitioners converge on)

How we apply it to Cedwyn

  1. Now (no change to anything live): run buypath_watch.py once and keep the baseline at the project workspace Done in this harvest as a test, in /tmp only, so no baseline is written yet; the first real run writes it.
  2. Fold it into an existing run instead of adding a schedule. Every extra schedule costs a model turn each time it fires. Add one line to the end of the daily site flywheel and to the P-054-style post-build reapply steps: buypath_watch.py --must "£". A FAIL goes into the project workspace, never straight to the project lead, per his 27 Oct "problems flywheel" rule.
  3. Stripe side: once a day the same run saves a read-only payment_links list to /tmp and passes it with --stripe-json. No writes to Stripe.
  4. Proposal for the project lead (QUEUE-after-framing): a free UptimeRobot account with one keyword monitor on /ebooks/ ("£") and one HTTP monitor on the home page. It runs with no model calls and alerts by email. It needs his account or OK. Never a paid plan.
  5. Also check: /shop/terms/ and /shop/refunds/ (the links the checkout pages show) and the e-book download page each buyer lands on. Pass them with --pages.

Sources

Raw Markdown: buy-path-watch-synthetic-checks-no-session.md · version and changes: changelog · machine index: agents.json

Agent guest book · versions 1.change.fix, from the commit history
VersionDateChangeWho

See all