Out-of-scope finding from #8220 / PR #8429, measured by its dev (cloud session session_01AkiE189Csm7aBT2qCVSx3X) and filed by the dispatching PM on its behalf (the dev's environment had no GitHub API egress — provenance in the os-dev-report on #8220). Unassigned, for triage; lands in packages/plugins/plugin-sharing (identity lane's family).
The gap
#8220 declared the filter-subtree provenance mark and set it at TWO read-scope merge boundaries (plugin-security's RLS injection; service-analytics' withReadScope). plugin-sharing's read-path merge (sharing-plugin.ts composeAnd sites, ~:871/:896) is a third merge boundary outside that card's declared file surface:
The fix shape (for whoever takes it)
Mark at plugin-sharing with the #8220 spec exports (markFilterSubtreeProvenance from @objectstack/spec/data): 'policy' on its injected sharing filters; it can also preserve the author vouch across its rewrite (mark the caller's subtree 'author' under the same identity-vouch discipline plugin-security uses — a rewritten sibling tree is vouched for nobody). Pins per the #8220 pattern: author names columns / policy withholds / unmarked withholds, at a real driver.
Constraints inherited from #8220 (binding on any implementation)
- Fail-closed: unmarked/ambiguous ⇒ withheld; the mark is permission to reveal.
- One mechanism: consume
resolveFilterSubtreeProvenance — ⛔ do not invent a parallel provenance concept.
Refs: #8220 (the mark + both existing boundaries), PR #8429, #8198 (the B-phase redaction), #7929 (the ruling).
Out-of-scope finding from #8220 / PR #8429, measured by its dev (cloud session
session_01AkiE189Csm7aBT2qCVSx3X) and filed by the dispatching PM on its behalf (the dev's environment had no GitHub API egress — provenance in theos-dev-reporton #8220). Unassigned, for triage; lands inpackages/plugins/plugin-sharing(identity lane's family).The gap
#8220 declared the filter-subtree provenance mark and set it at TWO read-scope merge boundaries (plugin-security's RLS injection; service-analytics'
withReadScope).plugin-sharing's read-path merge (sharing-plugin.tscomposeAndsites, ~:871/:896) is a third merge boundary outside that card's declared file surface:ast.wherehas already been rewritten by the sharing composition), so the author's OWN cross-field refusal stays redacted — the exact author-experience cost [A of #7929] a spec-declared provenance mark set at both read-scope merge boundaries, so the driver can restore the author-facing cross-field diagnostic without re-disclosing policy #8220 existed to remove, surviving on one composition path.The fix shape (for whoever takes it)
Mark at plugin-sharing with the #8220 spec exports (
markFilterSubtreeProvenancefrom@objectstack/spec/data):'policy'on its injected sharing filters; it can also preserve the author vouch across its rewrite (mark the caller's subtree'author'under the same identity-vouch discipline plugin-security uses — a rewritten sibling tree is vouched for nobody). Pins per the #8220 pattern: author names columns / policy withholds / unmarked withholds, at a real driver.Constraints inherited from #8220 (binding on any implementation)
resolveFilterSubtreeProvenance— ⛔ do not invent a parallel provenance concept.Refs: #8220 (the mark + both existing boundaries), PR #8429, #8198 (the B-phase redaction), #7929 (the ruling).