Build1 distinct publisher3 min readPublished
A copilot that stores the source cards behind each answer has quietly built a read path its search guards never see. One developer's fix re-checks entitlements in the service at replay time.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The stored citation is a record of a decision, not a grant of one. At write time the live turn passes entitlement toggles, a fail-closed per-document view gate, and identity taken only from the JWT [8]. What lands in the database is that check's output, pinned onto the audit event that produced it so the transcript endpoint can replay it verbatim [7]. Weeks later the endpoint selects those rows and renders the cards again, and the rows carry none of the machinery that authorized them [9]. The author's phrasing for this is that persistence is not permission: what a turn was allowed to show at write time proves nothing about what it may show at read time [3].
Drift is what makes it operational. In this product, tenant admins hold two switches, the copilot itself and, separately, the document-search capability that produces the source cards [10]. Between the day a turn is written and the day it is replayed, weeks pass, toggles flip and contracts change [11]. Put the fail-closed rule and the graceful-degradation rule against those two switches and a single stored transcript has three legal renderings at read time: full replay, conversation text with the cards withheld, and a flat not-found [1]. The row set is identical in all three.
Denial is the cheap path. The coarse gate loads the tenant's entitlements at the top of every history read and refuses before touching a session row [12], and the author's test pins that the session and turn queries are never awaited when the toggle is off [16]. A refused read therefore costs one entitlement lookup and zero document-derived reads [2]. Authorization that runs before the query is also authorization a caller cannot skip by arriving with a valid session id.
Two of the choices will draw argument. The service re-checks even though a gateway in front of it is already gating, on the reasoning that an assumption held in another codebase is not a control [14]; reroute traffic or add a caller and the rule is somewhere else. And entitlement denial answers 404, the same uniform not-found the turns endpoint already returns for malformed, unknown and foreign session ids [15], so a denied caller is not told there is something present to want [5].
What the post demonstrates and what it asserts are not the same size. The published code is the tenant-level gate, which refuses unless the AI and copilot entitlements are both on [13]. The finer-grained behaviour, withholding document-derived cards while keeping the conversation text, is stated as the design rule [4] rather than shown running. It is one developer describing two weeks of work on one streaming-first document-search copilot [6]. The general claim, that every RAG product persisting retrievals has this door and the only open question is whether anyone put a lock on it [17], is cheap enough to test against your own transcript endpoint.
Ranked by verification strength, evidence, and original report placement.
The author's copilot persists the source cards it cites, including which documents backed each answer, their scores and names.
The moment retrieval results are persisted (citations, source cards, snippets), the history endpoint becomes a second read path into the same data the search path guards.
Design rule stated in the post: when the finer-grained entitlement is off, withhold the document-derived cards but keep the conversation text, because authorization outcomes are not all-or-nothing.
History reads fail closed and make denial look like absence: the same 404 is returned for 'no entitlement' as for 'session does not exist', so a denied caller learns nothing.
The sources each turn emitted were persisted per turn as JSONB and pinned onto the audit event that produced them, so the transcript endpoint could replay them verbatim.
The history endpoint reads document-derived data out of plain database rows, and the database knows nothing about those controls; shipped naively it is an unguarded side door into data that took months to gate.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Concrete but single-sourced and self-reported
The post supplies unusually specific artifacts for a practitioner claim: the gate helper, the one-line degrade expression, two named tests asserting the 404 and the never-awaited queries, and an explicit write-time/read-time data-flow. That is strong internal consistency. It is nonetheless one author describing one codebase with identifiers renamed, with no repository, audit, incident report or second publisher to check against, and the broadest claim (that every RAG product with persisted retrievals has this door) is asserted rather than evidenced.
One self-disclosed implementation
Adoption evidence is a single self-reported deployment inside the author's own product, with no named vendor, no user counts, no third-party adopters and no indication the pattern is used elsewhere. That is real but minimal signal, and the post's claim that the pattern is universal describes an exposure, not an adoption of the fix.
Mostly proportionate, with one over-reach
Core claims are narrowly scoped to what the code and tests show, and the framing is a design defense rather than a product pitch — no benchmark, growth or capability boasting. The only overstatement is the leap from one codebase to 'every RAG product that persists retrievals has this door', which the cluster does not evidence; the headline framing of history as a corpus read path likewise generalizes from a single implementation. Hence a slight positive gap rather than alignment.
Practitioner reputation, no commercial ask
The visible incentive is personal-brand and portfolio building on a developer blogging platform, reinforced by an internal cross-link to the author's companion post on cursor paging and UI hydration. No product is named or sold, no pricing, licensing or funding interest appears, and the author volunteers a design position they expect to be argued with — which limits, though does not remove, the promotional pull toward presenting their own choices as best practice.
Moderate: coherent single account, no corroboration
Confidence is limited chiefly by source concentration — one publisher, one author, one unverifiable codebase — rather than by internal weakness. Within that limit the account is detailed, technically coherent, and its narrow claims are backed by quoted code and tests, so the described controls are credible for that product. The generalizable security argument and any claim about how widespread either the exposure or the mitigation is remain unconfirmed.
build
The /userinfo fallback that quietly made Auth0 a hard dependency on every request1 distinct publisher
build
Don't start at the model layer: classify inputs by reliability, then let RAG wait1 distinct publisher
build
Your JWT Login Probably Has Exactly One Kill Switch: Log Everyone Out1 distinct publisher
build
Splitting one agent into five is a purchase, not a promotion1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 25, 2026