Link & Session Liveness Checker
Check which saved links and login sessions are still alive, dead or blocked, without mistaking SPA 200s, soft 404s, bot blocks or cookie dates for proof. Turns a list of URLs and notes about saved sessions into an ALIVE / DEAD / UNDETERMINED table. It handles single-page apps that return 200 for any path, 403/429/challenge pages (reported as blocked, not dead), login redirects, soft-404 pages, HEAD versus GET differences, and the gap between a cookie's expires date and the real server-side session. It writes safe curl or Playwright probes with decision rules and a rate-limit plan (one request per URL, 2 seconds per host). It does not run requests itself, never asks for cookie values, and does not bypass bot blocks, CAPTCHAs or login walls. Intended only for links and accounts you own or may test.
Example input
Use the Link and Session Liveness Checker on this (a sample I wrote). These are all my own sites/accounts. Links I want checked (I ran one curl each, results below): 1. https://docs.example.com/guide/setup -> status 200, bytes=1840, body is `<div id="root"></div>` shell; no marker known. 2. https://shop.example.com/p/blue-mug -> status 200, final same URL, body contains "Blue Mug" (my known marker) . 3. https://blog.example.com/2023/old-post -> status 404, body "Page not found". 4. https://api.example.org/v1/status -> status 429, Retry-After: 120. 5. https://news.example.net/archive -> status 200, title "Example News", body says "This article is no longer available". Saved sessions (cookie names/dates only, values redacted): A. dashboard.example.com: cookie file ~/sessions/dash.txt; names sid (HttpOnly, Secure), _ga; sid expires 2027-03-01; last verified 2 weeks ago; logged-in page https://dashboard.example.com/account, marker "Sign out". B. portal.example.org: file ~/sessions/portal.txt; sid session-only; last verified 3 months ago; no logged-in URL noted.
Example output
## Evidence
| Item | Observed | Known marker |
|---|---|---|
| 1 docs.example.com/guide/setup | 200, 1840 bytes, `<div id="root">` shell | unknown |
| 2 shop.example.com/p/blue-mug | 200, same URL, marker present | "Blue Mug" |
| 3 blog.example.com/2023/old-post | 404, "Page not found" | unknown |
| 4 api.example.org/v1/status | 429, Retry-After: 120 | unknown |
| 5 news.example.net/archive | 200, title "Example News", "no longer available" | unknown |
| A dashboard session | cookie `sid` (HttpOnly, Secure) dated 2027-03-01, verified 2 weeks ago | "Sign out" on /account |
| B portal session | `sid` session-only, verified 3 months ago, no logged-in URL | unknown |
## Verdicts
| Item | Verdict | Evidence (status, marker, final URL) | Confidence | Next step |
|---|---|---|---|---|
| 1 docs setup | UNDETERMINED | 200 with a small SPA shell, no marker | unconfirmed | Run Case C once for the host, then Case D with a marker you pick |
| 2 shop blue-mug | ALIVE | 200, "Blue Mug" present, same URL | confirmed | none |
| 3 blog old-post | DEAD | real 404 with not-found body | confirmed | Replace or remove the link (re-check once later if it matters) |
| 4 api status | UNDETERMINED (blocked, not dead) | 429, Retry-After 120 | unconfirmed | Stop this host for this run; try again after the wait, or open it manually |
| 5 news archive | DEAD (soft 404) | 200 but explicit "no longer available" text, marker not given | likely | Open it in a browser to confirm, then replace the link |
| A dashboard | UNDETERMINED | cookie date 2027-03-01 is only "claimed" | unconfirmed | Run Case E |
| B portal | UNDETERMINED | session-only cookie, 3 months old, no logged-in URL | unconfirmed | Tell me one logged-in-only page and a marker that only logged-in users see |
## Probes to run
Item 1 (control path, once for docs.example.com; wait at least 2 seconds between the two requests):
```bash
curl -sS -o /tmp/real.html -w 'real=%{http_code} %{size_download}\n' 'https://docs.example.com/guide/setup'
curl -sS -o /tmp/fake.html -w 'fake=%{http_code} %{size_download}\n' 'https://docs.example.com/this-path-should-not-exist-7f3a'
cmp -s /tmp/real.html /tmp/fake.html && echo IDENTICAL || echo DIFFERENT
```
If IDENTICAL, render it (pick a heading that only the real page shows, for example the page title):
```bash
node probe.js 'https://docs.example.com/guide/setup' '<heading-text-from-the-real-page>'
```
(`probe.js` is the Playwright script from Case D: goto, innerText, check marker. No stealth options.)
…Real output from running the skill on a sample problem, shortened. The skill file itself is not published here.