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-zhuang os-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

vercel Bot commented Jun 20, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 20, 2026 8:30am

Request Review

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

github-actions Bot 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-zhuang os-zhuang changed the title feat(spec,sharing): ADR-0056 D1 — canonical OWD vocabulary on object.sharingModel feat(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 main Jun 20, 2026
2 checks passed
@os-zhuang
os-zhuang deleted the claude/adr-0056-d1-owd-vocab branch June 20, 2026 08:32
@github-actions github-actions Bot added size/m and removed size/s labels Jun 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants