docs(qa): record dispatcher-plugin.ts as deliberately outside the #2992 transport tripwire set - #9522
Merged
os-zhuang merged 1 commit intoAug 18, 2026
Conversation
… transport tripwire set (#9410) packages/runtime/src/dispatcher-plugin.ts mounts routes (/actions, /automation, /packages — the registration path separate from the @objectstack/rest one) and already writes SSE at two sites, yet none of the five #2992 / ADR-0096 D4 transport tripwires watch it. A subscribe/fan-out transport wired there mints no TRANSPORT-WIRED key and reds no build, and the protocol page stated that limitation only in general terms. This is a recording. No probe is added, no key is minted, and no matrix row is written for the two existing sites. The reason, recorded because a reader cannot re-derive it cheaply: both text/event-stream sites are per-request AI response streaming, not realtime subscription fan-out. Each drains one AsyncIterable returned by the route handler into that same request's response body and then calls res.end(); no subscriber is registered, no event reaches a set of recipients, and the file carries no upgrade handler, no subscribe registration and no realtime-service call. Watching it with the existing mechanics pattern would mint a key on day one for a surface the tripwires are not about. The boundary is drawn on fan-out, not on the SSE content type, and both records say so. Promoting the file into the population with a fan-out-specific marker is written into #8347's acceptance as a precondition of the WebSocket/SSE transport landing. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012WKSnqAaoqtW3QX7SSf1Vk
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. |
os-zhuang
marked this pull request as ready for review
August 18, 2026 07:18
os-zhuang
deleted the
claude/issue-9410-dispatcher-plugin-out-of-watched-set
branch
August 18, 2026 07:34
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #9410
packages/runtime/src/dispatcher-plugin.tshas both properties that make a file a plausible landing site for a realtime transport, and until now neither the conformance test nor the protocol page said anything about it:/actions,/automationand/packages, the registration path separate from the@objectstack/restone.text/event-streamsites (:248,:356) withno-cacheandkeep-alive, i.e. working plumbing an agent could extend without writing any new transport mechanics.None of the five
#2992/ ADR-0096 D4 transport tripwires watch it, so a subscribe/fan-out transport wired there mints noTRANSPORT-WIREDkey, produces no UNCLASSIFIED surface and reds no build. The protocol page stated the general limitation ("a transport wired outside the watched files produces no key and no failure") without naming the specific, already-SSE-capable file sitting inside it.What this PR does
Per the maintainer ruling on the card (2026-08-18): option C now, option A as a named precondition of #8347.
This is a recording. It changes no behaviour — no probe is added, no key is minted, and no matrix row is written for the two existing sites. Option B (watching the file with the full mechanics pattern and classifying the two AI-streaming sites) was rejected in the ruling by name, because it would put two non-realtime surfaces into the
TRANSPORT-WIREDvocabulary.The reason, recorded
Both
text/event-streamsites are per-request AI response streaming, not realtime subscription fan-out. Verified in source rather than assumed:AsyncIterablethat the route handler itself returned into that same request's response body, then callsres.end(). The second site's own source comment names its producer as the AI routes.handleUpgrade/WebSocket/EventSource/subscribe/realtime/fan-out: zero hits, against a control showing the same query hitting ten other files underpackages/runtime/src. The onlypublishhits in the file are ADR-0033 metadata package publishing, an unrelated sense of the word.Watching it with the existing mechanics pattern would therefore mint a key on day one for a surface the tripwires are not about, leaving only two exits: classify two non-realtime sites in the matrix, or weaken the pattern.
Where the recording went, and why there
packages/qa/dogfood/test/authz-conformance.test.ts— the note closes the#2992tripwire probe list, immediately after the last tripwire probe and before the unrelated MCP block. A reader who has just finished enumerating the watched set reads that set's boundary in the same breath, which is the moment the question "is that all?" actually arises. It sits beside, and explicitly distinguishes itself from, the pre-existing#5519mention of the same file at:96— that one is about anonymous gates on the mounted routes and is a different point, so a reader must not read it as the exclusion already having been recorded.content/docs/protocol/kernel/realtime-protocol.mdx— extends the identity-admission callout at the exact sentence that states the general limitation.The boundary is drawn on fan-out, not on the SSE content type
Both records say so explicitly, because that is the part that goes stale silently: wiring an upgrade handler, a subscribe registration or a realtime-service call into that file puts it back inside the hazard while the recorded boundary still claims otherwise, and nothing in CI will fail for whoever does it. Promoting the file into the tripwire population with such a fan-out-specific marker (not the bare SSE content type, which is precisely what would over-match the two sites above) belongs to #8347.
That precondition is already on record there: the triage seat posted the companion comment on #8347 at ruling time (comment
5322879847, 2026-08-18T02:49:06Z), naming the fan-out-specific marker and excluding the bare content type. This PR therefore adds no second comment and does not edit that card's body — #8347 remains open and is not addressed here.Verification
Union re-run at final commit
5bb3cb0a3.pnpm --filter '@objectstack/dogfood^...' build— exit 0 (dependency closure built first).vitest run test/authz-conformance.test.ts— 1 file passed, 27 tests passed, exit 0.node scripts/pm/dispatch-gates.mjs), all green:check:cross-package-test-inputs,check:changeset-gate-self-tests,check:objectui-changeset,check:docs-audit-scope,check:docs-redirects,check:role-word,check:test-source-alias,check:type-source-resolution,check:nul-bytes,check-adr-0087-registration,check-changeset-no-major,check-empty-changeset,docs-audit/check-affected-docs, plus the spec-liveness family (check:empty-state,check:liveness,check:strictness-ledger,check:variant-docs) and the convention-triggeredcheck:engine-double-contract,check:where-matcher,check:query-options-erasure,check:type-check-coverage.Reverse verification of the declaration reasoning
The new comment names two repo paths, so
check:cross-package-test-inputsis load-bearing here. Both are covered by pre-existing dogfood globs (packages/runtime/src/**, andrealtime-protocol.mdxdeclared verbatim by the earlier tripwire card), so no glob was added — but "already covered" is only meaningful if the gate actually reads comment text. Injecting an undeclared path into the new comment turned it red, naming the injected path and this file exactly:Restoring returned it to
OK: 12 package(s) read outside themselves, all declared. The gate does see the new prose; the coupling it enforces is real (editing the protocol page can make this recorded boundary wrong, which is exactly when the test should re-run); and no prose was reworded to dodge the scanner.Generated by Claude Code