Nightly deploy check
Three HTTP GETs sweep a live deployment's routes — 200 plus a stable body sentinel on each — the nightly is-my-site-still-up-and-correct gate, read-only.
A real, replayable Reelier skill against a live public API. Every replay proves the same thing: Each route of a live deployment answers 200 and still serves its expected body content — and writes a receipt saying exactly which assertions held.
What this checks
Three steps: an HTTP GET to each of a live deployment's routes — homepage, blog index, and docs. Six assertions, two per route: the route answered 200 and its response body contains a known sentinel string (a headline or tagline you know belongs on that page).
A 200 alone isn't enough. A route can return 200 while serving a blank shell or the wrong build, so each step pairs status == 200 with a body sentinel — the check catches the silent-wrong-content failure that a bare uptime ping misses.
The sentinels are stable strings, never volatile values. A route that goes down, or ships a build that dropped its sentinel, fails the assert and the receipt records a real failure — it never silently passes.
| Steps | Assertions | Effect | Seed run (2026-07-21) |
|---|---|---|---|
| 3 | 6 | read | ✓ 3/3 passed · 245ms · 0 LLM tokens |
Endpoints it hits:
https://www.reelier.com/https://www.reelier.com/bloghttps://www.reelier.com/docs
The skill file
This is the whole artifact — a markdown file with an assertion on every step. Copy it, check it into your repo, replay it anywhere.
---
name: nightly-deploy-check
description: Nightly gate that sweeps several routes of YOUR live deployment — 200 + a body sentinel on each — read-only
---
<!-- synced from seldonframe/reelier examples/portfolio — edit there -->
# Nightly deploy check
Inputs: (none — this file replays green as-is; see the personalization note)
<!--
Personalization: swap the three literal https://www.reelier.com URLs for
your own deploy URL and routes, and swap each `body contains "..."`
sentinel for a stable string you know is on that page (a headline, a
tagline, a nav label). The portfolio README's "Point these at YOUR
project" section has the one-command version. The skill grammar has no
default-value syntax for {{var}} holes — an unbound {{var}} is an explicit
error, never a guessed fallback — so this file ships with literals that
replay green with zero flags.
This checks YOUR OWN deployed routes, not a third party's status page: it
is the nightly "is my site still up AND still serving the right content"
gate. A 200 alone isn't enough — a route can return 200 while serving a
blank shell or the wrong build. Pairing status == 200 with a body sentinel
catches the silent-wrong-content failure that a bare uptime ping misses.
Pick sentinels that are STABLE run-to-run — a headline or tagline, never a
volatile value (a date, a view count, a build hash) that flips tomorrow. A
route that goes down, or ships a build that dropped the sentinel, fails the
assert and the receipt records a real failure — it never silently passes.
All three routes verified live on 2026-07-21: each 200, each sentinel
present in the response body.
-->
## Steps
### Step 1 — Homepage is up and serving the real tagline
- intent: Confirm the homepage serves 200 and still carries its core tagline
- action: http.get {"url": "https://www.reelier.com/"}
- assert: status == 200
- assert: body contains "Snapshot tests and CI for agent workflows"
- effect: read
### Step 2 — Blog index is up with its real heading
- intent: Confirm the blog index serves 200 and still carries its heading
- action: http.get {"url": "https://www.reelier.com/blog"}
- assert: status == 200
- assert: body contains "The receipts, written out."
- effect: read
### Step 3 — Docs page is up with its real description
- intent: Confirm the docs page serves 200 and still carries its description
- action: http.get {"url": "https://www.reelier.com/docs"}
- assert: status == 200
- assert: body contains "What Reelier is, how it works, and how to use it."
- effect: readRun it yourself
reelier run takes a local file, so fetch the canonical copy first (or clone the repo). The replay is read-only, needs no account and no keys, and writes its receipt to .reelier/runs/.
# straight from the repo's main branch (the canonical copy):
curl -fsSL https://raw.githubusercontent.com/seldonframe/reelier/main/examples/portfolio/nightly-deploy-check.skill.md -o nightly-deploy-check.skill.md
npx -y reelier@latest run nightly-deploy-check.skill.md
# or from a clone:
git clone https://github.com/seldonframe/reelier
cd reelier && npx -y reelier@latest run examples/portfolio/nightly-deploy-check.skill.mdThe receipt
The portfolio README records a real seed run of this skill, replayed with the published CLI on 2026-07-21. Verbatim output:
✓ Step 1 — Homepage is up and serving the real tagline [passed] 175ms
✓ Step 2 — Blog index is up with its real heading [passed] 44ms
✓ Step 3 — Docs page is up with its real description [passed] 26ms
PASSED: 3/3 steps ok, 0 failed, 245ms total
[measured] 0 LLM tokensAnd the proof keeps accumulating without anyone touching it: a GitHub Action replays all five portfolio skills every 6 hours (plus on demand) — the public Actions tab is the standing audit log. A failing endpoint produces an honestly failing receipt there, never a retried-until-green one.
Point it at your project
Swap the three literal https://www.reelier.com URLs for your own deploy URL and routes, and swap each body sentinel for a stable string you know is on that page (a headline, a tagline, a nav label). Unlike the single-token skills, there is no one find-and-replace that yields a green run here — each route's sentinel is page-specific — so this one is edited by hand rather than sed'd.