Core System Architecture Part 135 — Anonymous Network Extension Permission Model, Consent UX, Delegated Authority, Capability Attenuation, Scope Review & Privacy-Preserving Authorization Architecture
SIAR — Secure, Local-First, Multi-Transport Communication Platform
Series: Core System Architecture
Part: 135
Status: Architecture specification
Primary language: Rust
Builds on: Core System Architecture Parts 45, 56, 68, 69, 81–85, 130–134
Primary purpose: define SIAR's extension authorization architecture for permission classes, capability requests, user/admin consent UX, delegated authority, capability attenuation, scope review, one-shot grants, time-bounded permissions, update re-consent, revocation propagation, tenant policy overlays, anonymous-mode restrictions, and privacy-preserving permission governance.
1. Purpose
Installing an extension should never mean:
"grant everything this package might ever want"
Extension authorization must answer:
What does this extension want?
Why does it want it?
Who is allowed to approve it?
For how long?
For which conversations, files, tenants, devices, or APIs?
Can authority be narrowed?
What happens after an update adds new scopes?
Can authority be revoked immediately?
Can managed policy reduce grants further?
The governing principle is:
Extension authority must be explicit, scoped, reviewable, attenuable, revocable, and visible to the user or administrator, with no ambient privilege and no silent scope expansion.
2. Architectural Position
EXTENSION MANIFEST
│
▼
REQUESTED SCOPES
│
┌─────────┼─────────┐
│ │ │
USER ADMIN POLICY
│ │ │
└─────────┼─────────┘
▼
GRANT DECISION
│
▼
ATTENUATED CAPABILITY
│
▼
RUNTIME BROKER
│
▼
USE / REVIEW / REVOKE
3. Core Separation
Keep distinct:
requested permission
approved permission
effective permission
delegated permission
runtime capability token
platform OS permission
user consent
tenant policy
4. Non-Goals
Part 135 does not create:
all-or-nothing install consent
permanent hidden permissions
ambient admin authority
user-consent screens that obscure scope
extension-controlled permission text
5. Permission Identity
#![allow(unused)] fn main() { pub struct ExtensionPermissionId(pub [u8; 16]); }
6. Permission Class
#![allow(unused)] fn main() { pub enum ExtensionPermissionClass { ConversationRead, ConversationWrite, MessageContentRead, MessageSend, AttachmentRead, AttachmentWrite, PresenceRead, ContactLookup, FileRead, FileWrite, NetworkExternal, NetworkLocal, NotificationPost, ClipboardRead, ClipboardWrite, CameraUse, MicrophoneUse, DeviceManagement, DiagnosticsRead, TenantAdministration, } }
7. Fine-Grained By Default
Hard rule.
8. No AllAccess
Hard rule.
9. Requested Permission
#![allow(unused)] fn main() { pub struct RequestedExtensionPermission { pub permission: ExtensionPermissionClass, pub requested_scope: ExtensionScopeRequest, pub rationale: PermissionRationale, } }
10. Rationale
Human-readable purpose text.
11. Publisher Cannot Hide Rationale
Hard rule.
12. Rationale Is Not Authority
Hard rule.
13. Permission Scope
#![allow(unused)] fn main() { pub enum ExtensionScopeRequest { AnyAuthorizedConversation, Conversation(SdkConversationId), CurrentConversation, SelectedFiles, ExtensionStorageOnly, SpecificOrigins(BTreeSet<NetworkOrigin>), Tenant(TenantId), LocalDevice, } }
14. Scope Must Match Permission Type
Hard rule.
15. Effective Grant
#![allow(unused)] fn main() { pub struct ExtensionPermissionGrant { pub grant_id: ExtensionPermissionGrantId, pub extension: ExtensionId, pub permission: ExtensionPermissionClass, pub scope: EffectiveExtensionScope, pub lifecycle: GrantLifecycle, pub authority: GrantAuthority, } }
16. Effective Scope
#![allow(unused)] fn main() { pub enum EffectiveExtensionScope { Conversation(SdkConversationId), ConversationSet(BTreeSet<SdkConversationId>), FileSet(BTreeSet<BrokeredFileHandle>), NetworkOrigins(BTreeSet<NetworkOrigin>), Tenant(TenantId), LocalDevice, ExtensionStorage, } }
17. No Broader Scope Than Requested
Hard rule.
18. Attenuation
Approved scope may be narrower than requested scope.
19. Hard rule.
20. Grant Lifecycle
#![allow(unused)] fn main() { pub enum GrantLifecycle { OneShot, Session, UntilRestart, Until(Timestamp), Persistent, } }
21. Sensitive Permissions Prefer Shorter Lifetimes
Hard rule.
22. One-Shot Permission
Examples:
select one file
send one attachment
post one notification
23. Hard rule.
24. Persistent Permission
Requires explicit user/admin approval.
25. Hard rule.
26. Permission Sensitivity
#![allow(unused)] fn main() { pub enum PermissionSensitivity { Low, Moderate, High, Critical, } }
27. Sensitivity Policy
Examples:
NotificationPost → Low
ConversationRead → Moderate
MessageContentRead → High
MicrophoneUse → High
TenantAdministration → Critical
28. Hard rule.
29. Permission Approval Authority
#![allow(unused)] fn main() { pub enum GrantAuthority { User, TenantAdmin, PlatformPolicy, DevicePolicy, } }
30. No Extension Self-Approval
Hard rule.
31. User Consent
Applies to user-owned resources/capabilities.
32. Tenant Admin Consent
Applies to managed/organizational resources.
33. Platform Policy
Can restrict, never broaden.
34. Device Policy
Can further restrict device access.
35. Hard rule.
36. Effective Authorization
requested
∩ user/admin approval
∩ tenant policy
∩ platform policy
∩ privacy mode
∩ runtime state
37. Hard rule.
38. Deny Dominates
If any applicable authority denies, final result denies.
39. Hard rule.
40. Permission Decision
#![allow(unused)] fn main() { pub enum ExtensionPermissionDecision { Allow, AllowAttenuated, Deny, AskUser, AskAdmin, } }
41. No Implicit Allow On Unknown
Hard rule.
42. Consent UX
The consent screen must answer:
what data/resource
what action
what scope
why
for how long
which privacy modes affected
43. Hard rule.
44. Human-Readable Permission Description
Generated by platform, not package alone.
45. Hard rule.
46. Example
Bad:
"Needs account access"
Good:
"Read message content in the conversations you select"
47. Hard rule.
48. Permission Grouping
Can group related low-risk permissions.
49. High-risk permissions always individually visible.
50. Hard rule.
51. No Dark Pattern Consent
Prohibited:
preselected high-risk scopes
misleading colors
buried deny action
false urgency
52. Hard rule.
53. Consent Receipt
#![allow(unused)] fn main() { pub struct ExtensionConsentReceipt { pub extension: ExtensionId, pub grants: Vec<ExtensionPermissionGrantId>, pub approved_at: Timestamp, pub context_digest: Digest, } }
54. Hard rule.
55. Consent Context
Should include:
package version
permission set
privacy mode
policy version
56. Hard rule.
57. Re-Consent Trigger
Needed when:
new permission class
scope broadens
lifecycle becomes longer
data class expands
network origins expand
privacy-mode behavior changes
58. Hard rule.
59. No Re-Consent For Pure Scope Reduction
Hard rule.
60. Permission Diff
#![allow(unused)] fn main() { pub struct PermissionDiff { pub added: Vec<RequestedExtensionPermission>, pub removed: Vec<RequestedExtensionPermission>, pub broadened: Vec<PermissionScopeChange>, pub narrowed: Vec<PermissionScopeChange>, } }
61. Hard rule.
62. Update Review
Before activating extension update, platform computes permission diff.
63. Hard rule.
64. Scope Expansion Update
Cannot auto-activate.
65. Hard rule.
66. Capability Attenuation
A broad approved capability can be attenuated to narrower downstream capability.
67. Example
Read selected conversations
→ Read conversation A only
→ Read message metadata only
68. Hard rule.
69. Delegated Capability
#![allow(unused)] fn main() { pub struct DelegatedExtensionCapability { pub parent_grant: ExtensionPermissionGrantId, pub child_scope: EffectiveExtensionScope, pub child_lifecycle: GrantLifecycle, pub audience: CapabilityAudience, } }
70. Hard rule.
71. Delegation Invariants
Child capability must be:
same or narrower permission
same or narrower scope
same or shorter lifetime
same or narrower audience
72. Hard rule.
73. Capability Audience
#![allow(unused)] fn main() { pub enum CapabilityAudience { Runtime(ExtensionRuntimeId), BackgroundJob(ExtensionBackgroundJobId), Broker(BrokerId), } }
74. Hard rule.
75. No Delegation To Another Extension By Default
Hard rule.
76. Cross-Extension Delegation
If ever allowed, requires explicit brokered contract.
77. Hard rule.
78. Delegation Depth
Bounded.
79. Hard rule.
80. Capability Chain
#![allow(unused)] fn main() { pub struct CapabilityDelegationChain { pub root: ExtensionPermissionGrantId, pub links: Vec<DelegatedExtensionCapability>, } }
81. Hard rule.
82. Revocation Propagation
Revoking parent invalidates all descendants.
83. Hard rule.
84. Grant Epoch Integration
Part 134.
85. Hard rule.
86. Consent vs Authorization
Consent does not replace authorization.
87. Authorization does not imply consent where consent required.
88. Hard rule.
89. OS Permission Integration
Camera/mic/file/clipboard may also require OS/platform permission.
90. Triple Gate
extension grant
∩ platform permission
∩ user/admin approval
91. Hard rule.
92. File Picker Permission
Prefer user-selected brokered handles.
93. Hard rule.
94. Folder Access
Separate broader permission.
95. Hard rule.
96. Clipboard Read
High sensitivity.
97. Hard rule.
98. Clipboard Write
Separate permission.
99. Hard rule.
100. Camera/Microphone
Session-scoped by default unless policy explicitly allows persistence.
101. Hard rule.
102. Network Permission
External networking requires origin-scoped approval.
103. Hard rule.
104. Wildcard Origin
High sensitivity.
105. Hard rule.
106. Local Network Access
Separate permission due discovery/privacy impact.
107. Hard rule.
108. Anonymous Network Access
Separate capability.
109. Hard rule.
110. Extension Cannot Choose Less Private Route
Hard rule.
111. Privacy Mode Overlay
#![allow(unused)] fn main() { pub enum ExtensionPrivacyModePolicy { Standard, Private, Anonymous, MaximumAnonymity, } }
112. Each mode may reduce effective permissions.
113. Hard rule.
114. Maximum Anonymity Restrictions
Potentially deny:
PresenceRead
ContactLookup
NetworkLocal
DiagnosticsRead
detailed device metadata
115. Hard rule.
116. Privacy Mode Change
If user raises privacy level, effective permission set may shrink immediately.
117. Hard rule.
118. Lowering Privacy Mode
Does not automatically restore previously withheld high-risk permission.
119. Hard rule.
120. Managed Tenant Policy
Tenant admin may define:
allowed extension classes
allowed publishers
maximum permission sensitivity
disallowed data classes
network restrictions
121. Hard rule.
122. Tenant Policy Overlay
#![allow(unused)] fn main() { pub struct TenantExtensionPermissionPolicy { pub tenant: TenantId, pub denied_permissions: BTreeSet<ExtensionPermissionClass>, pub restricted_origins: BTreeSet<NetworkOrigin>, pub max_persistent_sensitivity: PermissionSensitivity, } }
123. Hard rule.
124. Tenant Policy Cannot Broaden User Capability
Hard rule.
125. Personal vs Managed Context
Keep separate.
126. Hard rule.
127. Device Policy
Example:
camera disabled
clipboard disabled
local network disabled
128. Hard rule.
129. Device Policy Cannot Be Overridden By Extension Consent
Hard rule.
130. Permission Request Timing
Ask just in time where practical.
131. Hard rule.
132. Install-Time vs Runtime Consent
Install-time:
broad architecture-level permissions
Runtime:
specific file
specific conversation
specific mic session
133. Hard rule.
134. Avoid Permission Fatigue
Do not ask repeatedly for identical denied scopes without meaningful reason/state change.
135. Hard rule.
136. Remembered Denial
Scoped locally.
137. Hard rule.
138. No Behavioral Pressure
Do not nag based on inferred likelihood to accept.
139. Hard rule.
140. Permission Review Center
User/admin can inspect:
extensions
active grants
scope
lifetime
last-used coarse state
privacy-mode restrictions
141. Hard rule.
142. Last Used
If shown, coarse and local where possible.
143. Hard rule.
144. No Detailed Permission Usage Timeline By Default
Hard rule.
145. Permission Revocation
Can revoke:
one scope
one permission class
all runtime grants
entire extension
146. Hard rule.
147. Revocation State
#![allow(unused)] fn main() { pub enum ExtensionGrantState { Active, Suspended, Revoked, Expired, } }
148. Hard rule.
149. Immediate Runtime Effect
Part 134 grant epoch update.
150. Hard rule.
151. In-Flight Requests
Must revalidate before side-effect commit.
152. Hard rule.
153. Permission Expiry
Time-bound grant automatically expires.
154. Hard rule.
155. Expiry Notification
May notify extension/user if useful.
156. Hard rule.
157. No Auto-Renewal Of High-Risk Permission
Hard rule.
158. Renewal
Requires explicit policy/consent.
159. Hard rule.
160. Background Job Permissions
Background jobs inherit attenuated subset only.
161. Hard rule.
162. Example
interactive extension: ConversationRead + MessageSend
background job: ConversationRead(metadata only)
163. Hard rule.
164. Job Audience Binding
Capability token tied to job ID.
165. Hard rule.
166. Offline Permissions
Local grants may remain usable offline for local resources.
167. Hard rule.
168. Remote Policy Staleness
Never broadens access.
169. Hard rule.
170. Offline Revocation
Locally known revocation applies immediately.
171. Hard rule.
172. Policy Reconciliation
On reconnect:
fetch signed policy
compare epochs
apply restrictive changes
invalidate stale grants
173. Hard rule.
174. Permission Registry
#![allow(unused)] fn main() { pub struct ExtensionPermissionRegistry { pub version: ExtensionPermissionRegistryVersion, pub permissions: BTreeMap<ExtensionPermissionClass, PermissionDefinition>, } }
175. Hard rule.
176. Permission Definition
#![allow(unused)] fn main() { pub struct PermissionDefinition { pub sensitivity: PermissionSensitivity, pub allowed_scopes: BTreeSet<PermissionScopeKind>, pub default_lifecycle: GrantLifecycle, pub consent_required: bool, } }
177. Hard rule.
178. Signed / Versioned
Hard rule.
179. Anti-Rollback
Permission policy epoch monotonic.
180. Hard rule.
181. Permission Policy Epoch
#![allow(unused)] fn main() { pub struct ExtensionPermissionPolicyEpoch(pub u64); }
182. Hard rule.
183. Policy Rollback
Cannot re-enable removed permissions.
184. Hard rule.
185. Permission Description Registry
Platform-owned canonical user-facing descriptions.
186. Hard rule.
187. Localization
Descriptions translatable.
188. Hard rule.
189. Accessibility
Consent UX accessible.
190. Hard rule.
191. Permission Explanation
Can include:
requested
effective
denied
reason
policy source
192. Hard rule.
193. Explainability Service
#![allow(unused)] fn main() { pub trait ExtensionPermissionExplainService { fn explain( &self, extension: ExtensionId, permission: ExtensionPermissionClass, ) -> Result<PermissionExplanation, ExtensionAuthorizationError>; } }
194. Hard rule.
195. Permission Decision Service
#![allow(unused)] fn main() { pub trait ExtensionAuthorizationService { fn evaluate( &self, request: ExtensionAuthorizationRequest, ) -> Result<ExtensionAuthorizationDecision, ExtensionAuthorizationError>; } }
196. Request
#![allow(unused)] fn main() { pub struct ExtensionAuthorizationRequest { pub extension: ExtensionId, pub runtime: ExtensionRuntimeId, pub permission: ExtensionPermissionClass, pub requested_scope: ExtensionScopeRequest, pub privacy_mode: ExtensionPrivacyModePolicy, } }
197. Hard rule.
198. Grant Service
#![allow(unused)] fn main() { pub trait ExtensionGrantService { fn create( &self, grant: ExtensionPermissionGrant, ) -> Result<ExtensionPermissionGrantId, ExtensionAuthorizationError>; fn revoke( &self, grant: ExtensionPermissionGrantId, ) -> Result<(), ExtensionAuthorizationError>; } }
199. Hard rule.
200. Delegation Service
#![allow(unused)] fn main() { pub trait ExtensionDelegationService { fn attenuate( &self, parent: ExtensionPermissionGrantId, scope: EffectiveExtensionScope, lifecycle: GrantLifecycle, audience: CapabilityAudience, ) -> Result<DelegatedExtensionCapability, ExtensionAuthorizationError>; } }
201. Hard rule.
202. Consent Service
#![allow(unused)] fn main() { pub trait ExtensionConsentService { fn request_consent( &self, request: ConsentRequest, ) -> Result<ConsentDecision, ExtensionAuthorizationError>; } }
203. No Headless Auto-Consent For Sensitive User Permissions
Hard rule.
204. Managed Headless Context
Admin policy may pre-authorize only within explicitly managed scopes.
205. Hard rule.
206. Consent Request
#![allow(unused)] fn main() { pub struct ConsentRequest { pub extension: ExtensionId, pub requested: Vec<RequestedExtensionPermission>, pub package: ExtensionPackageId, pub privacy_mode: ExtensionPrivacyModePolicy, } }
207. Hard rule.
208. Consent Decision
#![allow(unused)] fn main() { pub enum ConsentDecision { Approved(Vec<ExtensionPermissionGrantId>), ApprovedAttenuated(Vec<ExtensionPermissionGrantId>), Denied, } }
209. Hard rule.
210. Permission Scope Review
Scope changes require diff-aware review.
211. Hard rule.
212. Scope Review Result
#![allow(unused)] fn main() { pub enum ScopeReviewResult { NoChange, Narrowed, ExpandedRequiresConsent, ExpandedForbiddenByPolicy, } }
213. Hard rule.
214. Install-Time Review
Shows full requested permission set.
215. Hard rule.
216. Update-Time Review
Shows only meaningful diffs + resulting full effective set.
217. Hard rule.
218. Runtime Just-In-Time Prompt
Possible for:
file picker
camera session
microphone session
conversation access
219. Hard rule.
220. Consent Prompt Rate Limit
Avoid abuse/nagging.
221. Hard rule.
222. Extension Prompt Abuse
Repeated spam can trigger temporary deny/quarantine.
223. Hard rule.
224. Privilege Escalation Attempts
Examples:
requesting wildcard after repeated denials
probing unauthorized scope IDs
using multiple permissions to reconstruct restricted data
225. Hard rule.
226. Authorization Abuse Detection
Based on technical authorization violations, not user content.
227. Hard rule.
228. Capability Composition
Two individually allowed permissions may combine into higher privacy risk.
229. Hard rule.
230. Sensitive Combination Policy
Examples:
ContactLookup + NetworkExternal
MessageContentRead + NetworkExternal
ClipboardRead + NetworkExternal
may require stronger consent/review.
231. Hard rule.
232. Permission Combination Rule
#![allow(unused)] fn main() { pub struct PermissionCombinationRule { pub permissions: BTreeSet<ExtensionPermissionClass>, pub minimum_review: PermissionCombinationReview, } }
233. Review Level
#![allow(unused)] fn main() { pub enum PermissionCombinationReview { Normal, EnhancedConsent, AdminReview, CertificationRequired, } }
234. Hard rule.
235. Exfiltration Boundary
High-risk source + external network sink may require explicit declaration.
236. Hard rule.
237. Data Flow Grant
#![allow(unused)] fn main() { pub struct ExtensionDataFlowGrant { pub source_permission: ExtensionPermissionClass, pub sink_permission: ExtensionPermissionClass, pub approved: bool, } }
238. Hard rule.
239. Information Flow Mediation
Broker may tag data class.
240. Hard rule.
241. Data Classification
Examples:
Public
Metadata
PrivateContent
Secret
242. Hard rule.
243. Secret Data
Never exportable through extension data flow without specialized broker.
244. Hard rule.
245. Clipboard As Source/Sink
Treat explicitly.
246. Hard rule.
247. File Content As Source
High-risk if network sink exists.
248. Hard rule.
249. Network Response As Input
Untrusted.
250. Hard rule.
251. Audit Receipt
Record high-value permission changes.
252. Hard rule.
253. Audit Events
Examples:
high-risk grant created
admin scope approved
scope expanded
grant revoked
policy blocked grant
254. Hard rule.
255. No Audit Of Every Benign Broker Call
Hard rule.
256. Privacy-Preserving Audit
No private content.
257. Hard rule.
258. Permission Telemetry
Safe aggregate:
permission class
allow/deny
extension class
policy source
259. No user identity.
260. Hard rule.
261. Consent Analytics
Do not optimize consent UX to manipulate acceptance rates.
262. Hard rule.
263. No "Conversion Rate" For High-Risk Permissions
Hard rule.
264. Product Experimentation
Part 93.
Never experiment with weaker disclosure for permission consent.
265. Hard rule.
266. User Review Center Data
Stored local-first where possible.
267. Hard rule.
268. Multi-Device Grants
Default: device-local grant unless explicitly account/tenant scoped.
269. Hard rule.
270. Cross-Device Permission Sync
If supported, sync signed grant intent, not raw capability token.
271. Hard rule.
272. New Device
Does not blindly inherit device-sensitive grants.
273. Hard rule.
274. Device-Sensitive Grants
Examples:
camera
microphone
local files
clipboard
local network
must be re-approved per device where appropriate.
275. Hard rule.
276. Account Recovery
Part 57.
Recovered account does not restore live extension capability tokens.
277. Hard rule.
278. Fresh Device Security State
Required.
279. Hard rule.
280. Backup/Restore
Permission metadata may be restored as history, but active device-sensitive grants should revalidate.
281. Hard rule.
282. Extension Uninstall
Revokes all active grants.
283. Hard rule.
284. Extension Reinstall
Does not automatically restore high-risk permissions.
285. Hard rule.
286. Package Re-Signing
Does not imply permission continuity unless same trusted extension identity and policy allows.
287. Hard rule.
288. Publisher Transfer
Requires re-review of sensitive persistent grants.
289. Hard rule.
290. Extension Identity Transfer
High risk.
291. Hard rule.
292. Ownership Change
Potentially trigger user/admin notification.
293. Hard rule.
294. Permission Compatibility
Part 129.
Permission registry version independent from SDK version.
295. Hard rule.
296. Unknown Permission Code
Deny.
297. Hard rule.
298. Deprecated Permission
May map to narrower replacements.
299. Hard rule.
300. Removed Permission
Cannot be requested by new package.
301. Hard rule.
302. Permission Version
#![allow(unused)] fn main() { pub struct ExtensionPermissionSchemaVersion(pub u32); }
303. Hard rule.
304. Policy Compilation
Human-readable RON → typed runtime policy.
305. Hard rule.
306. Example RON Policy
(
permission: "MessageContentRead",
sensitivity: "High",
allowed_scopes: ["Conversation", "ConversationSet"],
default_lifecycle: "Session",
consent_required: true,
)
307. Hard rule.
308. Policy Precedence
hard platform invariant
> privacy mode
> device policy
> tenant policy
> user/admin grant
> extension request
309. Hard rule.
310. No Lower Layer Can Broaden Higher Restriction
Hard rule.
311. Permission Decision Trace
Useful for debugging:
requested
allowed by manifest
allowed by certification
allowed by tenant
allowed by privacy mode
approved by user/admin
effective scope
312. Hard rule.
313. No Secret Policy Detail Leakage To Extension
Extension sees coarse denial reason where necessary.
314. Hard rule.
315. User/Admin Explanation Can Be Richer
Hard rule.
316. Extension-Facing Error
#![allow(unused)] fn main() { pub enum ExtensionAuthorizationDenial { PermissionNotDeclared, ScopeNotGranted, ConsentRequired, PolicyDenied, PrivacyModeDenied, GrantExpired, GrantRevoked, } }
317. Hard rule.
318. No Enumeration Through Error Detail
Hard rule.
319. Authorization Hot Path
Must be fast.
320. Use:
compiled policy
grant epoch
local cache
typed lookup
321. Hard rule.
322. No Remote Authorization Lookup In Every Broker Call
Hard rule.
323. Cached Grant State
Epoch-bound.
324. Hard rule.
325. Revocation Push
Update local cache immediately.
326. Hard rule.
327. Authorization Store
Separate:
grant metadata
consent receipts
delegation chains
policy epochs
scope review records
revocation records
328. Hard rule.
329. Secrets Not Stored Here
Hard rule.
330. Partitioning
By:
extension
tenant
device
permission class
331. No user-behavior analytics partition.
332. Hard rule.
333. Permission Review UX States
#![allow(unused)] fn main() { pub enum PermissionReviewUiState { Summary, Details, ScopeSelection, DurationSelection, Confirm, Completed, } }
334. Hard rule.
335. Scope Selection UX
Examples:
this conversation
selected conversations
all conversations allowed by tenant policy
selected files
one session
336. Hard rule.
337. Duration Selection UX
Examples:
once
this session
until restart
24 hours
always
338. Persistent option hidden/disabled if policy forbids.
339. Hard rule.
340. High-Risk Confirmation
Require explicit confirmation after scope/duration review.
341. Hard rule.
342. Admin Bulk Approval
Allowed only for managed contexts.
343. Must remain scope-bounded.
344. Hard rule.
345. Admin Cannot Approve Personal Context Access
Hard rule.
346. Tenant Boundary
No grant crosses tenant boundary.
347. Hard rule.
348. Federation Boundary
Extension grant in one federation domain does not confer authority in another.
349. Hard rule.
350. External Integration Boundary
SDK integration grants and local extension grants are separate records.
351. Hard rule.
352. Permission Migration
If permission model changes:
map old grants to equal/narrower new grants
or
require re-consent
353. Hard rule.
354. Never Widen During Migration
Hard rule.
355. Legacy Grant
#![allow(unused)] fn main() { pub struct LegacyPermissionGrant { pub old_permission_code: u32, pub mapped_to: Option<ExtensionPermissionClass>, } }
356. Hard rule.
357. Unmappable Legacy Grant
Expires/requires review.
358. Hard rule.
359. Permission Revocation List
Could include extension/package-wide emergency deny.
360. Hard rule.
361. Emergency Policy
Can only restrict.
362. Hard rule.
363. Crisis Mode
Part 119.
Incident command may restrict extension permissions temporarily.
364. Cannot broaden.
365. Hard rule.
366. Support/Diagnostics
Support can explain permission state but cannot approve on behalf of user/admin unless explicitly authorized managed process.
367. Hard rule.
368. Marketplace Integration
Part 133.
Install/update screens derive permission data from canonical registry + manifest.
369. Hard rule.
370. Runtime Integration
Part 134.
Effective grants compile into runtime broker policy.
371. Hard rule.
372. SDK Integration
Part 130.
SDK capability requests map to extension permission registry.
373. Hard rule.
374. Portal/Toolchain Integration
Parts 131–132.
Developer tooling can inspect requested permissions but cannot self-approve production grants.
375. Hard rule.
376. Assurance Integration
Part 125.
Permission behavior requires contract/security/privacy tests.
377. Hard rule.
378. Archive Integration
Part 126.
High-value policy/consent/certification evidence archived.
379. Hard rule.
380. Knowledge Graph Integration
Part 123.
Trace:
permission
→ requirement
→ policy
→ broker
→ tests
381. Hard rule.
382. Risk Integration
Part 121.
Overbroad permission is explicit risk.
383. Hard rule.
384. PIR Integration
Part 120.
Permission incident creates tighter policy/test.
385. Hard rule.
386. Testing
Need extension-authorization testkit.
387. Test Scenarios
single-conversation read grant
microphone session grant
tenant admin extension
scope-expanding update
privacy-mode escalation
388. No Ambient Access Test
Installed extension with zero grants cannot access brokered resources.
389. Scope Attenuation Test
Request all conversations, approve one conversation → only one accessible.
390. Lifetime Test
Session grant expires at session end.
391. One-Shot Test
File read grant consumed once.
392. Delegation Test
Child scope cannot exceed parent.
393. Delegation Lifetime Test
Child cannot outlive parent.
394. Revocation Test
Parent revoke invalidates descendants immediately.
395. Update Diff Test
New network origin requires renewed consent.
396. Privacy Mode Test
Maximum anonymity removes forbidden permissions.
397. Tenant Policy Test
Tenant deny overrides user approval.
398. Device Policy Test
OS/device deny overrides extension grant.
399. Data Flow Test
MessageContentRead + NetworkExternal triggers enhanced review.
400. Migration Test
Legacy grant maps only equal/narrower.
401. Reinstall Test
High-risk persistent permission not automatically restored.
402. Recovery Test
Recovered account/device receives fresh runtime grants.
403. Privacy Test
No detailed grant-use timeline required.
404. Fuzzing
Fuzz:
permission manifests
scope expressions
delegation chains
consent receipts
policy overlays
405. Property Tests
Properties:
effective grant can never exceed requested scope
delegated capability can never exceed parent permission/scope/lifetime
denied platform/tenant/privacy policy can never be overridden by consent
scope-expanding update can never activate without required review
406. Formal Verification Targets
Strong candidates:
policy precedence
capability attenuation
delegation/revocation
grant lifecycle
407. Kani Candidate
scope/lifetime/precedence invariants.
408. TLA+ Candidate
request → consent → grant → delegate → use → revoke/expire.
409. Loom Candidate
concurrent broker call + parent grant revocation + policy refresh.
410. Performance
Authorization is hot-path work.
411. Target:
constant-time or indexed grant lookup
epoch check
compiled scope test
412. Hard rule.
413. No Unbounded Scope Evaluation
Hard rule.
414. Scope Set Bounds
Limit selected conversation/file/origin sets.
415. Hard rule.
416. Large Scope
Use policy-backed aggregate scope rather than giant raw ID list.
417. Hard rule.
418. Cache
Cache effective grant snapshot by runtime/grant epoch.
419. Hard rule.
420. Cache Invalidated On:
revocation
privacy-mode change
tenant-policy change
device-policy change
extension update
421. Hard rule.
422. Crate Layout
Recommended:
crates/
├── siar-extension-authz-core/
├── siar-extension-permission-registry/
├── siar-extension-consent/
├── siar-extension-scope/
├── siar-capability-attenuation/
├── siar-extension-delegation/
├── siar-extension-policy-overlay/
├── siar-extension-permission-review/
├── siar-extension-authz-observability/
└── siar-extension-authz-testkit/
423. siar-extension-authz-core
Owns:
ExtensionPermissionClass
ExtensionPermissionGrant
GrantLifecycle
ExtensionAuthorizationError
424. siar-extension-permission-registry
Canonical permission definitions/schema/versioning.
425. siar-extension-consent
Consent receipts/prompt decisions/re-consent.
426. siar-extension-scope
Scope modeling/intersection/validation.
427. siar-capability-attenuation
Parent→child narrowing rules.
428. siar-extension-delegation
Audience-bound delegated capabilities.
429. siar-extension-policy-overlay
Privacy/device/tenant/platform precedence.
430. siar-extension-permission-review
Install/update/review-center UX models.
431. siar-extension-authz-observability
Aggregate permission policy health only.
432. siar-extension-authz-testkit
scope/delegation/revocation/privacy/formal tests.
433. Security, Privacy & Correctness Invariants
Mandatory:
1. Extension installation, manifest request, user/admin consent, effective authorization, delegated capability, runtime token, and OS/device permission are distinct states and cannot be conflated.
2. Effective extension authority is always the intersection of manifest request, user/admin approval, tenant/device/platform policy, privacy mode, runtime grant state, and current policy epoch; deny dominates.
3. No extension receives an "all access" permission, ambient administrator authority, unrestricted filesystem/network/device capability, or broader scope than explicitly requested and approved.
4. Delegated capabilities can only attenuate permission, scope, lifetime, and audience; child capabilities can never exceed or outlive their parent and are invalidated when parent authority is revoked.
5. Scope-expanding extension updates require diff-based review and renewed consent/admin approval where required; silent permission growth and auto-activation are prohibited.
6. Sensitive device permissions such as camera, microphone, clipboard, files, and local network require both SIAR authorization and applicable OS/user permission, with session/one-shot grants preferred where feasible.
7. Privacy-mode, tenant-policy, device-policy, and emergency-policy changes can only reduce extension authority; lowering a restriction later does not automatically restore previously withheld high-risk grants.
8. Permission combinations that create materially stronger exfiltration or surveillance risk—such as private-content read plus unrestricted network—receive explicit enhanced review/certification rather than being assessed only permission-by-permission.
9. Revocation, expiry, uninstall, account/device recovery, publisher/ownership transfer, and policy migration invalidate or re-review sensitive grants so stale authority cannot survive lifecycle transitions.
10. Consent UX uses platform-controlled, truthful, accessible permission descriptions with visible scope/lifetime and no dark patterns, hidden high-risk permissions, consent-rate optimization, or repeated manipulative prompting.
11. Permission telemetry, audit, review-center state, and consent records are minimized and technical; they cannot become detailed user-behavior timelines, developer/publisher scoring, or surveillance of how people use extensions.
12. Extension authorization integrates with marketplace manifests, SDK capabilities, runtime brokers, compatibility, tenant/device/privacy policies, assurance, certification, risk/PIR, account recovery, backup/restore, and emergency governance without creating a side channel around SIAR's security, privacy, anonymity, or tenant boundaries.
434. Initial Production Scope
Implement first:
typed permission registry
permission sensitivity
requested vs effective scope
one-shot/session/time-bounded/persistent grants
platform-owned permission descriptions
install-time consent UX model
runtime JIT consent
scope attenuation
delegation chains
grant epochs
privacy/device/tenant policy overlays
scope-diff review on update
permission review center
grant revoke/expiry
background-job audience binding
sensitive permission combination rules
data-flow source/sink review
multi-device device-local grant semantics
uninstall/reinstall/recovery invalidation
RON permission policy compilation
authorization hot-path cache
privacy-safe permission metrics
extension-authz testkit
Then add:
cross-device signed grant-intent sync
richer information-flow labels
formal delegation-chain proofs
policy simulation/explain tools
enterprise permission templates
offline policy bundles
automated exfiltration-risk rule generation
435. Definition of Done
Part 135 is complete when:
- permission classes are typed and fine-grained;
- requested and effective authority are separate;
- effective authority is an intersection of all policy layers;
- deny dominates;
- grant scopes/lifetimes are explicit;
- delegated capabilities only attenuate;
- parent revoke invalidates descendants;
- high-risk consent UX is explicit and accessible;
- scope-expanding updates require re-consent;
- privacy/tenant/device policy can immediately reduce access;
- device-sensitive grants are appropriately local/session-bound;
- reinstall/recovery does not resurrect stale high-risk permissions;
- exfiltration-risk permission combinations are reviewed;
- no permission telemetry becomes behavioral surveillance;
- scope/delegation/privacy/fuzz/formal tests are specified.
436. Final Architecture
EXTENSION MANIFEST
│
▼
REQUESTED PERMISSIONS
│
┌──────────┼──────────┐
│ │ │
USER ADMIN POLICY
│ │ │
└──────────┼──────────┘
▼
EFFECTIVE GRANTS
│
▼
ATTENUATED TOKENS
│
▼
RUNTIME CAPABILITY BROKER
│
▼
USE / EXPIRE / REVOKE / REVIEW
Authorization safety model:
fine-grained permissions
+
explicit scope/lifetime
+
user/admin consent
+
policy intersection
+
capability attenuation
+
delegation revocation
+
scope-diff review
+
privacy-mode restriction
not:
install once, grant everything forever, let updates silently add permissions, and assume user consent overrides platform or tenant security policy
437. Final Principle
Extension permissions are trustworthy when authority is visible, narrow, temporary where possible, and continuously revalidated.
The correct model is:
declare what is requested
+
explain why and where
+
let the user/admin choose scope
+
intersect with platform/privacy/tenant policy
+
attenuate delegated authority
+
review permission diffs on update
+
expire and revoke immediately
+
never allow consent UX to become a mechanism for hidden privilege escalation
This architecture gives SIAR a privacy-preserving extension-authorization foundation for permission modeling, consent UX, delegated capabilities, attenuation, scope review, revocation, managed policy overlays, anonymous-mode restrictions, and secure update authorization while preserving the anonymity, local-first, least-authority, marketplace, SDK, extension-runtime, and anti-surveillance guarantees established across Parts 34–134.