Uh oh!
There was an error while loading. Please reload this page.
feat(adapters): envelope the hono adapter's two discovery bodies (#9436) - #9814
Conversation
Maintainer ruling 2026-08-18, option A: GET {prefix} and GET {prefix}/discovery
gain success: true beside data. The check-route-envelope entry for
packages/adapters/hono/src/index.ts graduates to conformant (unenveloped 2 -> 0)
and the exempt-block prose records the ruling as the other side of #9389's
boundary. Six discovery tests now pin the envelope.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WeN7F6jQFpcqW2BN56RdPa📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. ✅ What this run could not seeCoarse fallback — 1 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4b799c11a02d42149c4f979c854b461fb79ecb0a && git checkout 4b799c11a02d42149c4f979c854b461fb79ecb0a
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 06f9848f91fc787e67af32b2f6f88e55b5d93e86 c938eeabe7bca1594c5425e2aedd270a4e6b7de6 && git checkout -B drift-repro 06f9848f91fc787e67af32b2f6f88e55b5d93e86 && git merge --no-ff c938eeabe7bca1594c5425e2aedd270a4e6b7de6
node scripts/docs-audit/affected-docs.mjs --json 06f9848f91fc787e67af32b2f6f88e55b5d93e86 |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9436
Maintainer ruling on that card (2026-08-18, option A, recorded 22:30:43Z): envelope both discovery bodies.
GET {prefix}andGET {prefix}/discoveryinpackages/adapters/hono/src/index.tsnow answer{ success: true, data }instead of bare{ data }. The ruling deliberately does not inherit #9389's pre-auth exemption — these bodies are read by SDKs, codegen and AI clients, and the migration is one key.Reader sweep (ruled to run first — it did)
Every reported search ran with a control; no zero was accepted without one.
@objectstack/clientconnect()(packages/client/src/index.ts531-532, 557-558): unwrapsbody.data || bodyon both the/api/v1/discoveryprobe and the.well-knownfallback — bare,{ data }, and{ success, data }all resolve to the same document. Unaffected.packages/core/src/qa/http-adapter.tsresolveDataMount()): discriminates on'routes' in body, else readsbody.data. The new shape falls tobody.data. Unaffected.body.data?.routes ?? body.routes. Unaffected.ConditionalAuthWrapper.tsxanddata-objectstack/src/index.tsunwrap only whentypeof body.success === 'boolean' && 'data' in body— today's bare{ data }fails that test; the post-flip shape satisfies it, so those readers now unwrap this mount correctly.ConnectAgentWidget.tsxuses the tolerant(json?.data ?? json)?.routes. No intolerant reader; no cross-repo flip needed, so no Blocked-by split..well-known/objectstackliteral — 20 files subject, 20 on the intolerant spelling; objectuifetch(count 156 (nonzero harness); examples tree 197 ts files scanned, zero discovery readers (both hits were prose); cli 7 discovery mentions, all comments, against 17fetch(sites.success: truepins added).Gate table (
scripts/check-route-envelope.mjs){}with a conversion comment; itsratchet/notedrop per the gate's own last-counter rule.{ data }discovery bodies lose their ratchet owner when #9364 lands #9436 ruling as the other side of [Decision] Pre-auth discovery/bootstrap payloads: inside BaseResponseSchema (coordinated objectui flip) or ruled exempt with reasons — today they are neither #9389's boundary (who reads the body decides), replacing the text that carried the fork as open.ratchetentries name 20 hand-built plugin-route bodies depart from the declared envelope — the ratchet #9267's third gate surface opened with #9364" was already discharged onmainbefore this PR — PR chore(lint): record the ruled pre-auth exemption in the route-envelope gate #9455 had converted the three [Decision] Pre-auth discovery/bootstrap payloads: inside BaseResponseSchema (coordinated objectui flip) or ruled exempt with reasons — today they are neither #9389 files toexemptentries (noratchetfield) and had repointed this file'sratchetat adapters/hono's two bare{ data }discovery bodies lose their ratchet owner when #9364 lands #9436. No pointer edits remained beyond this file's entry graduating; zero counters moved by pointer work. The two'#9364'strings still in the file are self-test fixture literals, not table entries.Verification (all readings at head
c938eea)check:route-envelopebefore: 11 modules, 161 bodies — 7 conformant, 1 ratcheted (this file, unenveloped 2), 3 exempt; exit 0. After: 8 conformant, 0 ratcheted, 3 exempt; exit 0, self-test green. Theunenvelopedcounter is what dropped, 2 → 0, confirming Zone 2a —success: truewas the only key the gate needed../indexrelatively (source path, no dist in the chain), so no rebuild was involved in either leg — stated per ablation discipline.pnpm --filter @objectstack/hono test: 73/73 passed (2 files), exit 0.tsc --noEmiton the package: exit 0.node scripts/pm/dispatch-gates.mjs, no hand-fed paths — 4 paths matched, exactly this PR's files): check:changeset-gate-self-tests, check:cross-package-test-inputs, check:objectui-changeset, check:route-envelope, check:test-source-alias, check:type-source-resolution, check-adr-0087-registration, check-changeset-no-major, check-empty-changeset, docs-audit/check-affected-docs, plus convention-triggered check:query-options-erasure, check:type-check-coverage, check:type-check-debt (full packages closure built first, 70 tasks; re-measure: no entry above its recorded number), check:engine-double-contract, check:where-matcher — all exit 0.pnpm lint(run regardless, per the brief — the derivation does not name it): exit 0.check:nul-bytes: green.Out of scope, filed
packages/runtime/src/dispatcher-plugin.tsserves the same{ data }discovery shape on/.well-known/objectstackand the REST-less{prefix}/discoveryfallback, outside this ruling's named file and outside the envelope gate's scan populations.Changeset:
minorfor@objectstack/hono(additive wire change; adr-0087 marker: not-required, no key renamed or removed).Generated by Claude Code