AIdenID Glasswing · Test Flight 2026

AIdenID Glasswing — live demo runbook

One workflow, six beats, all against the real control plane and the real protected site. Every status, decision and reason code below comes from the server; the console only displays them. Judges can inspect the same facts through the site's operator API and the control-plane API.

State this runbook is tied to: main with the foundation (PR #7), the kernel PRs (#1 revocation and effect gate, #3 @aidenid/jev, #4 @aidenid/agent-client, #5 session signer and JWKS), the protected site with the Glasswing operator API (#9, #11), the Glasswing console (#8), the kernel end-to-end test (#6) and the demo launcher (#10). Per-PR evidence: docs/aidenid-build/evidence/PR-00-navigator.md.

Conventions:

Setup

  1. pnpm dev (details in docs/aidenid-build/LOCAL_DEVELOPMENT.md). It builds the workspace, then starts the protected site on 4100, its embedded control plane on 4000 and the dashboard on 3000: loopback only, in-memory state, login disabled. The first log lines name the three URLs. If the launcher prints apps/protected-site is not built, the build failed; fix that before anything else.
  2. Health: GET SITE/healthz → { "status": "ok", "site_id": "sit_glasswing_demo" }. GET CP/healthz → { "ok": true, "service": "aidenid-control-plane" }. GET http://127.0.0.1:3000/api/status/health → { "state": "connected" }.
  3. Keys: GET CP/.well-known/aidenid-session-jwks.json returns the control plane's public Ed25519 key with its kid. The site's verifier trusts exactly that key, so a judge can see which key every session token is checked against.
  4. At startup the site registered its target on the control plane (sit_glasswing_demo, tenant ten_glasswing_demo, origin https://aidenid.local) and loaded its policy: GET /catalog and POST /items/:id/reserve allow a verified agent that holds the matching permission; GET /customers/export is denied for every actor class; GET /reports/bulk allows a verified agent with reports:bulk and a stated purpose, then hands the request to Jev; every other path is denied by a catch-all. Only /healthz and the operator API under /glasswing/* are open to every actor class, and the operator API is guarded by the operator token in its handlers. There is nothing to register by hand.
  5. Open the console. Expect the heading Operations console, the note Protected site: http://127.0.0.1:4100, and the banner "Live: every outcome below is recorded by the control plane and the protected site." With login disabled the page issues its own session cookie (aidenid_operator_token, 8 h) through /api/glasswing/session. That route is enabled only by the launcher flag AIDENID_DASHBOARD_DEV_SESSION and refuses without it, off loopback, or when AIDENID_REQUIRE_LOGIN is on. If the banner says the operator API is not reachable, see "If something fails".

Beat 1 — Mint an agent

Beat 2 — Assign scoped work (issue a grant)

Beat 3 — Agent makes an allowed request

Beat 4 — Agent is denied out of scope

Two walls; show both.

Beat 5 — Jev escalation on an ambiguous action

Beat 6 — Revoke, then refused

Reset

Restarting pnpm dev is the reset. The console keeps its grant list and timeline in the page: reloading /glasswing mid-demo clears both (agents and reviews are fetched again, grants are not), so do not reload during the demo; if it happens, issue a new grant and continue. Targets, grants, sessions, decisions, outbox entries, agents, keys, reviews and released jobs are all in-process. Say this out loud rather than implying persistence.

If something fails