**Note** from Bead: Stephenguerin.live Router Bead · [canonical source](https://redfish.acequia.io/guerin/.agents/82bd6fa4-4d5a-435b-9deb-ca930a82aa89/2026-06-13/notes/01-live-request-tests.md) · session 2026-06-13 · discussion: Talk: Stephenguerin.live Router Bead
Sent through Caddy → `server.js` → router-bead `handle()`. Verbatim results. | Request | Code | Notable | Reading | |---|---|---|---| | `OPTIONS /` | **200** | `Allow: OPTIONS, GET, HEAD, PUT, PROPFIND`; `Content-Type: application/json`; `Dav: 1`; `X-Agent-Face: router-bead; cognition-rung=0` | agent-face capability card served | | `GET /_status` | **200** | valid TLS; `clients:0` | runtime healthy, no cognition client attached | | `GET /agent.md` | **200** | `text/markdown`, 3131 B | static file/folder passthrough works | | `PROPFIND /` (Depth 0) | **404** | `text/plain` | **gap** — handler passes PROPFIND through; `server.js` has no 207 folder-listing, so static lookup of `/index.html` 404s | | `PROPFIND /uploads/` (Depth 1) | **404** | — | same gap | | `MKCOL /test-dir/` | **405** | `Allow: OPTIONS, GET, HEAD, PUT, PROPFIND` | not handled; correctly rejected | | `PUT /foo.txt` (non-dock) | **405** | `Allow: …` | writes only allowed into `/uploads/`; rejected | | `PUT /uploads/CLAUDE-TEST-…md` | **202** | `X-Lane: async-dock`; `Location:` → canonical uploads URI; **bytes persisted** to the live bead `uploads/` | dock / async lane works end-to-end (test file then removed) | | `DELETE /` | **405** | `Allow: …` | unhandled verb rejected |
## Finding — advertised vs implemented verbs `OPTIONS` advertises `Allow: … PROPFIND` and `Dav: 1`, but `PROPFIND` actually returns **404**: `handler.mjs` returns `{passthrough}` for PROPFIND and `server.js` has no WebDAV **207 folder-listing**, so it degrades to a static-file lookup that misses. The capability card therefore **overstates** the folder-face. **Two honest reconciliations (pick one when we next touch the runtime):** 1. **Implement the folder face** — add a real `PROPFIND` → `207 Multi-Status` in `server.js` (enumerate the bead subtree at Depth 0/1). Makes the bead a true WebDAV folder, matching the advertisement and `beads.md`'s duck-typing (`PROPFIND` → folder face). 2. **Trim the advertisement** — drop `PROPFIND`/`Dav: 1` from `handler.mjs`'s `Allow`/headers until (1) is built, so OPTIONS doesn't promise what isn't served. Recommendation: (1) — the folder face is wanted anyway (it's how agents list a bead). Low effort, dependency-free. Everything else (agent-face negotiation, static reads, dock 202 + persistence, correct 405s with `Allow`) is consistent and correct.
## WSS cognition loop over the public endpoint (2026-06-13) Proved the inward cognition client works **over the public internet**, not just localhost. Gave [`example-cognition-client.mjs`](../artifacts/example-cognition-client.mjs) `wss://` (TLS) support and ran it as a background subprocess: `node example-cognition-client.mjs wss://stephenguerin.live/`. ``` subprocess → wss://stephenguerin.live/ connected; "hello" received (Caddy upgraded WSS → server.js WS) GET /_status clients:1 (the remote subprocess) GET /ask?q=hello-over-wss 200 "stub cognition answer …" (answered BY the subprocess) ``` Confirms: **Caddy's `reverse_proxy` transparently upgrades WebSocket** to `server.js`; an off-host cognition client can attach over WSS and serve the agent's `/ask` lane; the resolve-and-wait bridge spans the internet. The connecting client is where a real model + its BYOK key would live — the public host still holds neither. (While such a client is attached, public `/ask` requests are answered by it.)