Filed unassigned, finding only — grading and routing are triage's field. This is the residual of the #8794 survey, which closed not planned on the "no in-repo caller" branch. Filing separately rather than leaving it on that card because #8794 is now closed, and a live observation carried only by a closed card is the shape that gets lost. Duplicate-searched first: no existing card.
⛔ Routing note, not a claim on it:#8794's ruling is explicit that any change to the mark's mechanism is a packages/spec card under #8220's lineage, routes to the spec seat, and needs a ruling before implementation. Nothing here should be implemented by the identity lane.
What #8794 established
The survey answered its question — no in-repo caller supplies a reused vouchable filter — and it did so with real controls, not assertion. Worth recording because the negative is only as good as its method:
- the
'author' mark can only be stamped on options.where itself or on the arms of a pure $and root, and every caller in that position builds fresh per request; - the one genuinely registry-held filter (
service-knowledge sources Map) runs isSystem, where both marking boundaries short-circuit; - the one genuinely reused metadata filter (
service-analyticsdatasetRegistry, compiled.filter) never occupies the marking position, because both strategies build and mark a fresh root; - flow-node config and token-bearing trees are deep-copied before the engine sees them — verified against the real, unmodified
filter-tokens.ts, including the control that a placeholder-free tree returns the same object (identity holds, mark kept) while any token rebuilds every node.
The zero-hit caller search carried a positive control: a synthetic module-scope where: ACTIVE_RECORDS in the docblock's exact shape made the detector report 1, proving it fires. Without that the zero would not have counted.
⚠️ But the mechanism IS reachable — that part was measured, not ruled out
The survey confirmed the fail-open shape works exactly as #8794 feared, on the real module:
- a stale
'author' mark on a nested object resolves 'author' under a root the request never vouched (with its negative control: a structurally identical fresh subtree resolves null); - a later corrective
'policy' stamp is a silent no-op once 'author' is set — "first mark wins" means the safer classification cannot displace the riskier one.
So the repo is safe today by the accident of how its callers happen to be written, not by anything that enforces it.
Residual 1 — the contract surface hands hosts the shape
getReadFilter is a public service method (packages/spec/src/contracts/security-service.ts:215), documented for hosts to scope their own queries. A host writing
engine.find(obj,{where: awaitsecurity.getReadFilter(obj,ctx)})puts a platform-authored policy predicate into the options.where position, where the identity vouch stamps it 'author' — and cel-to-filter.ts shows such predicates can carry $field, which is the disclosure condition.
In-repo the only consumer is the analytics bridge, which routes it to the 'policy' stamp, so no in-repo caller is affected and #8794's fork does not flip. But the survey's scope was in-repo callers, and this is the published API inviting precisely the excluded shape.
Why this is not merely pedantic: the vouch is consumed as "safe to disclose to this caller", not as "this caller passed it". A policy predicate sitting in the where slot therefore defeats the #7929 redaction the mark exists to preserve — even though the vouch's literal wording is satisfied.
Residual 2 — the invariant is unstated and untested
The negative depends on an invariant nobody has written down:
no filter object that can be vouched author may outlive the request that vouched it
A future caller can break it with no gate going red, and the survey would have to be re-run by someone who happens to remember it exists.
Suggested shape (spec seat's call, not decided here): the executable pin and the docblock correction, together. The docblock alone repeats the current failure mode — it already asserted this survey's conclusion before anyone had measured it, calling the mark "safe on filter objects that are reused across requests (view metadata, cached scopes)". That claim is sound only for policy subtrees, where provenance is intrinsic; for a caller's where it is contextual, and the docblock does not say so. Correction text is already drafted in #8794's survey comment.
Related
Filed unassigned,
findingonly — grading and routing are triage's field. This is the residual of the #8794 survey, which closednot plannedon the "no in-repo caller" branch. Filing separately rather than leaving it on that card because #8794 is now closed, and a live observation carried only by a closed card is the shape that gets lost. Duplicate-searched first: no existing card.⛔ Routing note, not a claim on it:#8794's ruling is explicit that any change to the mark's mechanism is a
packages/speccard under #8220's lineage, routes to the spec seat, and needs a ruling before implementation. Nothing here should be implemented by the identity lane.What #8794 established
The survey answered its question — no in-repo caller supplies a reused vouchable filter — and it did so with real controls, not assertion. Worth recording because the negative is only as good as its method:
'author'mark can only be stamped onoptions.whereitself or on the arms of a pure$androot, and every caller in that position builds fresh per request;service-knowledgesources Map) runsisSystem, where both marking boundaries short-circuit;service-analyticsdatasetRegistry,compiled.filter) never occupies the marking position, because both strategies build and mark a fresh root;filter-tokens.ts, including the control that a placeholder-free tree returns the same object (identity holds, mark kept) while any token rebuilds every node.The zero-hit caller search carried a positive control: a synthetic module-scope
where: ACTIVE_RECORDSin the docblock's exact shape made the detector report1, proving it fires. Without that the zero would not have counted.The survey confirmed the fail-open shape works exactly as #8794 feared, on the real module:
'author'mark on a nested object resolves'author'under a root the request never vouched (with its negative control: a structurally identical fresh subtree resolvesnull);'policy'stamp is a silent no-op once'author'is set — "first mark wins" means the safer classification cannot displace the riskier one.So the repo is safe today by the accident of how its callers happen to be written, not by anything that enforces it.
Residual 1 — the contract surface hands hosts the shape
getReadFilteris a public service method (packages/spec/src/contracts/security-service.ts:215), documented for hosts to scope their own queries. A host writingputs a platform-authored policy predicate into the
options.whereposition, where the identity vouch stamps it'author'— andcel-to-filter.tsshows such predicates can carry$field, which is the disclosure condition.In-repo the only consumer is the analytics bridge, which routes it to the
'policy'stamp, so no in-repo caller is affected and #8794's fork does not flip. But the survey's scope was in-repo callers, and this is the published API inviting precisely the excluded shape.Why this is not merely pedantic: the vouch is consumed as "safe to disclose to this caller", not as "this caller passed it". A policy predicate sitting in the
whereslot therefore defeats the #7929 redaction the mark exists to preserve — even though the vouch's literal wording is satisfied.Residual 2 — the invariant is unstated and untested
The negative depends on an invariant nobody has written down:
A future caller can break it with no gate going red, and the survey would have to be re-run by someone who happens to remember it exists.
Suggested shape (spec seat's call, not decided here): the executable pin and the docblock correction, together. The docblock alone repeats the current failure mode — it already asserted this survey's conclusion before anyone had measured it, calling the mark "safe on filter objects that are reused across requests (view metadata, cached scopes)". That claim is sound only for policy subtrees, where provenance is intrinsic; for a caller's
whereit is contextual, and the docblock does not say so. Correction text is already drafted in #8794's survey comment.Related
authorvouch past a boundary that would otherwise withhold #8794 — the survey, closednot planned, with the full enumeration and probe results