Architectural Invariant Design: Capacitor 7 Scoped Storage PhotoPicker Sandbox Fencing & Descriptor Recycling
Capacitor 7 Scoped Storage PhotoPicker Sandbox Fencing & Descriptor Recycling defines an industrial-grade behavioral standard for mobile engineering. Enforces strict Scoped Storage fencing, explicit URI permission acquisition, and immediate native FileDescriptor recycling for Capacitor 7 running on modern Android target SDKs (34+). Prevents silent process death from kernel file descriptor exhaustion and invalid URI persistence failures across Android activity recreation. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.
Hazard Analysis: What Breaks Without This Rule
The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:
| Failure Mode | AI Symptom (The Anti-Pattern) | Severity | Production Impact & Remedy |
|---|---|---|---|
| AI Hallucination & Deprecation Drift | Leaking Transient Content URIs and Raw File Descriptors Across the Capacitor Web-Native Bridge | Critical | Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production. Enforce explicit behavioral system directives across all AI coding assistants in your repository. |
| Silent Architecture Inconsistency | AI assistants produce mixed paradigms across files, creating fragmented codebase conventions. | Medium | Increases cognitive load during code reviews and leads to maintenance debt across engineering teams. Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails. |
Step-by-Step Production Directives
Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:
Engineers MUST NEVER query deprecated MediaStore columns (such as `_data`) to reconstruct absolute file system paths under Android API 29+.
Engineers MUST NEVER query deprecated MediaStore columns (such as `_data`) to reconstruct absolute file system paths under Android API 29+.
Engineers MUST ALWAYS wrap `ContentResolver.openFileDescriptor` or `ContentResolver.openInputStream` in `use { ... }` (Kotlin) or `try-with-resources` (Java) to prevent native Linux file descriptor exhaustion.
Engineers MUST ALWAYS wrap `ContentResolver.openFileDescriptor` or `ContentResolver.openInputStream` in `use { ... }` (Kotlin) or `try-with-resources` (Java) to prevent native Linux file descriptor exhaustion.
Engineers MUST NOT pass raw `content
Engineers MUST NOT pass raw `content://` URIs directly to the Capacitor WebView; media MUST be staged to `context.cacheDir` and resolved via `Capacitor.convertFileSrc()` or native custom scheme handling.
Engineers MUST explicitly call `contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)` if a content URI is persisted beyond the current Activity lifecycle, catching `SecurityException` gracefully.
Engineers MUST explicitly call `contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)` if a content URI is persisted beyond the current Activity lifecycle, catching `SecurityException` gracefully.
Services MUST implement automatic cache eviction policies for sandboxed media replicas to avoid unbounded internal storage growth in long-running applications.
Services MUST implement automatic cache eviction policies for sandboxed media replicas to avoid unbounded internal storage growth in long-running applications.
Components NEVER store transient native pointers, `ParcelFileDescriptor`, or unclosed streams across asynchronous Capacitor plugin bridge boundaries.
Components NEVER store transient native pointers, `ParcelFileDescriptor`, or unclosed streams across asynchronous Capacitor plugin bridge boundaries.
Frequently Asked Technical Questions
Common questions developers face when configuring AI coding assistants for this stack:
Q:Why is Capacitor 7 Scoped Storage PhotoPicker Sandbox Fencing & Descriptor Recycling critical for AI coding assistants?
Enforces strict Scoped Storage fencing, explicit URI permission acquisition, and immediate native FileDescriptor recycling for Capacitor 7 running on modern Android target SDKs (34+). Prevents silent process death from kernel file descriptor exhaustion and invalid URI persistence failures across Android activity recreation. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.
Q:How does adopting this rule prevent AI hallucinations?
This rule explicitly declares what the AI must avoid (Leaking Transient Content URIs and Raw File Descriptors Across the Capacitor Web-Native Bridge) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.
Q:Which AI coding environments are supported?
This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).
Q:Can I combine this rule with other technology stacks?
Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.