Version. 0.1 Date. 2026-07-18 Author. Claude Code on DUNIN7-M4, on Operator direction. Status. STUB. Deferred out of perimeter Stage 1 to its own scoping. No change was made in that build. Origin. Surfaced during Stage 1 Step 2 verification; carried through the Step 6 authorization design; deferred by Operator ruling 2026-07-18.
GET /engagements answers an unauthenticated request with HTTP 200 and an empty list, not 401. No data leaks — the route scopes by session, so an anonymous caller's scope is genuinely empty. The question is whether an empty answer is the right shape of answer, or whether a caller with no session should be told so.
This is a product decision about API shape. It is not a security hole in either form, which is why it was deferred rather than fixed in flight.
While verifying the production /api/* proxy in Stage 1 Step 2, /api/engagements was used as a test target and returned 200 {"total_count":0,...,"engagements":[]} with no session. That made it unusable as a demonstration of Stage 1 section 9 item 4 ("an unauthenticated request to a protected surface is refused") — the refusal check was moved to a founder-gated /admin/grants route instead, which demonstrates it cleanly.
So Stage 1 was unblocked. The underlying question was left standing.
/engagements is the one observed; the same shape likely exists on other session-scoped list routes. The sweep is part of the work, not a precondition to it.Nothing. This stub records both sides and the reasons for deferring; it does not lean toward either outcome. It exists so the question is not silently lost between Stage 1 and whatever build picks it up.
DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — session-scoped list refusal — scoping-note stub — v0_1 — 2026-07-18