Skip to content

feat(security): ADR-0056 D1 (canonical OWD vocab) + D2 (anonymous deny posture) - #2065

Merged
os-zhuang merged 2 commits into
mainfrom
claude/adr-0056-d1-owd-vocab
Jun 20, 2026
Merged

feat(security): ADR-0056 D1 (canonical OWD vocab) + D2 (anonymous deny posture)#2065
os-zhuang merged 2 commits into
mainfrom
claude/adr-0056-d1-owd-vocab

Conversation

@os-zhuang

@os-zhuangos-zhuang commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Two ADR-0056 decisions, both verified, both non-breaking.

D1 — canonical OWD vocabulary on object.sharingModel

Reconciles the three-way naming mismatch to one vocabulary: private | public_read | public_read_write | controlled_by_parent (canonical) plus legacy read / read_write / full aliases (kept, non-breaking). The sharing runtime maps them onto the three enforced behaviours; unknown values stay enum-rejected (authoring-time fail-closed). The showcase announcement now declares the canonical public_read, exercised end-to-end.

  • plugin-sharing 32 unit tests (+4 D1); OWD dogfood 8/8 with the canonical name; liveness green.

D2 — secure-by-default anonymous posture (warn → enforce)

The deny capability already exists: api.requireAuth=true rejects anonymous via enforceAuth, and share-link / guest_portal / control-plane routes are exempt (so public functionality survives). But the default is fail-open (requireAuth=false) — an object with no OWD/RLS is world-readable with no signal.

Expert judgment (long-term): the right move is not to flip the global default in a code merge — that would 401 every deployment relying on anonymous reads, and public access already has dedicated declared channels (share-links / publicSharing). Instead this lands the warn of warn→enforce: a boot-time WARN when running fail-open, making the posture explicit (consistent with D4/D8 honesty). The actual default flip stays a release-gated, announced decision.

  • Proven by showcase-anonymous-deny (4/4): anonymous read+write → 401, authenticated → 200, control-plane (/auth) open.

ADR-0056 status after this

Done + merged/merging: OWD scenarios (#2062), D4+D8 (#2064), D1+D2 (this). Remaining: D7 default Profile (additive; turnkey already met by member_default), D6 role hierarchy (P4), D10 conformance matrix (CI artifact), and the eventual release-gated requireAuth default flip.

🤖 Generated with Claude Code

…sharingModel
Add the canonical OWD names (public_read / public_read_write) to the
object.sharingModel enum alongside the legacy read/read_write/full aliases
(non-breaking), and map them in the sharing runtime onto the three enforced
behaviours. Unknown values stay enum-rejected (authoring-time fail-closed).
Showcase announcement switched to canonical `public_read`, proven end-to-end.
sharing-service 32 tests (+4 D1); OWD dogfood proofs 8/8; liveness green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVdnfUAx85amkerym26vdx
@vercel

vercelBot commented Jun 20, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
specReadyReadyPreview, CommentJun 20, 2026 8:30am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation protocol:data tests tooling labels Jun 20, 2026
@github-actions

github-actionsBot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

No hand-written docs reference the 0 changed package(s). ✅

…nforce)
The data API's deny capability already exists (requireAuth=true → 401 for
anonymous; share-link / guest_portal / control-plane exempt) but the DEFAULT is
fail-open. Add a boot WARN when requireAuth is off so the insecure posture is
explicit, WITHOUT flipping the global default (release-gated; flipping would break
anonymous-dependent deployments). Proven by showcase-anonymous-deny (4/4):
anonymous read+write 401, authenticated 200, control-plane open.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVdnfUAx85amkerym26vdx
@os-zhuangos-zhuang changed the title feat(spec,sharing): ADR-0056 D1 — canonical OWD vocabulary on object.sharingModelfeat(security): ADR-0056 D1 (canonical OWD vocab) + D2 (anonymous deny posture)Jun 20, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review June 20, 2026 08:31
@os-zhuang
os-zhuang merged commit e7f6539 into mainJun 20, 2026
2 checks passed
@os-zhuang
os-zhuang deleted the claude/adr-0056-d1-owd-vocab branch June 20, 2026 08:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude