Core System Architecture Part 136 — Anonymous Network Extension Data Governance, Data Access Mediation, Information-Flow Control, Retention, Deletion, Export & Privacy-Preserving Extension Data Architecture

SIAR — Secure, Local-First, Multi-Transport Communication Platform

Series: Core System Architecture
Part: 136
Status: Architecture specification
Primary language: Rust
Builds on: Core System Architecture Parts 37, 42, 56, 67, 74, 81, 84–85, 94–95, 123–135

Primary purpose: define SIAR's extension data-governance architecture for mediated data access, information-flow labeling, source/sink control, extension-owned storage, derived data, retention, deletion, export, backup/restore, anti-resurrection, privacy-aware synchronization, uninstall/revocation cleanup, and auditability without creating a hidden data lake or surveillance path.


1. Purpose

Extension permissions are only half of the problem.

Even when an extension is allowed to read or write data, the platform must still answer:

What kind of data is being accessed?
Where may it flow?
How long may it be retained?
Can it be exported?
Can it be synced?
Can derived data outlive the source?
What happens after uninstall?
What happens after user deletion?
Can backups resurrect deleted extension data?

The governing principle is:

Extension data access should be mediated by explicit data-class and information-flow policy, with retention, export, deletion, synchronization, and derived-data rules enforced independently from mere permission possession.


2. Architectural Position

                  PLATFORM / USER DATA
                         │
                         ▼
                 DATA ACCESS BROKER
                         │
              ┌──────────┼──────────┐
              │          │          │
           LABEL       POLICY      SCOPE
              │          │          │
              └──────────┼──────────┘
                         ▼
                 EXTENSION RUNTIME
                         │
              ┌──────────┼──────────┐
              │          │          │
           STORAGE     NETWORK    EXPORT
              │          │          │
              └──────────┼──────────┘
                         ▼
                 LIFECYCLE GOVERNANCE
                         │
                         ▼
             RETAIN / DELETE / MIGRATE

3. Core Separation

Keep distinct:

permission
data class
data source
data sink
retention policy
derived data
storage ownership
export right
sync right
deletion obligation

4. Non-Goals

Part 136 does not create:

extension-accessible raw data lake
unbounded metadata warehouse
permission = indefinite retention
derived-data exemption from deletion
shared extension storage by default
silent cloud sync of local extension data

5. Data Identity

#![allow(unused)]
fn main() {
pub struct ExtensionDataObjectId(pub [u8; 16]);
}

Opaque and scoped.


6. Data Class

#![allow(unused)]
fn main() {
pub enum ExtensionDataClass {
    Public,
    OperationalMetadata,
    ContactMetadata,
    ConversationMetadata,
    MessageContent,
    AttachmentMetadata,
    AttachmentContent,
    Presence,
    DeviceMetadata,
    LocationCoarse,
    Diagnostics,
    TenantAdministrative,
    SecretReference,
}
}

7. Data Sensitivity

#![allow(unused)]
fn main() {
pub enum DataSensitivity {
    Public,
    Internal,
    Private,
    Sensitive,
    Secret,
}
}

8. Hard Rule

Sensitivity and permission are distinct.


9. Data Ownership Domain

#![allow(unused)]
fn main() {
pub enum DataOwnershipDomain {
    UserOwned,
    TenantOwned,
    ExtensionOwned,
    PlatformOperational,
}
}

10. Hard Rule

Ownership affects export/deletion authority.


11. Data Source

#![allow(unused)]
fn main() {
pub enum ExtensionDataSource {
    Conversation,
    Message,
    Attachment,
    Contact,
    Presence,
    FilePicker,
    Clipboard,
    Camera,
    Microphone,
    TenantDirectory,
    ExtensionStorage,
    ExternalNetwork,
}
}

12. Data Sink

#![allow(unused)]
fn main() {
pub enum ExtensionDataSink {
    ExtensionMemory,
    ExtensionStorage,
    ExternalNetwork,
    FileExport,
    Clipboard,
    Notification,
    TenantRecord,
    UserVisibleUi,
}
}

13. Hard Rule

Source permission does not imply sink permission.


14. Information-Flow Label

#![allow(unused)]
fn main() {
pub struct ExtensionDataLabel {
    pub class: ExtensionDataClass,
    pub sensitivity: DataSensitivity,
    pub ownership: DataOwnershipDomain,
    pub retention: RetentionClass,
}
}

15. Retention Class

#![allow(unused)]
fn main() {
pub enum RetentionClass {
    Ephemeral,
    Session,
    ShortLived,
    UserControlled,
    TenantPolicy,
    Durable,
}
}

16. Hard Rule

Retention class travels with data unless explicitly transformed.


17. Taint Model

Data entering extension runtime receives a label.


18. Hard Rule

Labels are platform-owned metadata, not extension claims.


19. Information-Flow Decision

#![allow(unused)]
fn main() {
pub enum InformationFlowDecision {
    Allow,
    AllowWithTransformation,
    Deny,
    RequireConsent,
    RequireAdminApproval,
}
}

20. Information-Flow Rule

#![allow(unused)]
fn main() {
pub struct InformationFlowRule {
    pub source_class: ExtensionDataClass,
    pub sink: ExtensionDataSink,
    pub decision: InformationFlowDecision,
}
}

21. Hard Rule

Flow policy evaluated independently from capability grant.


22. Example

MessageContent → ExtensionMemory = allow with grant
MessageContent → ExtensionStorage = require retention policy
MessageContent → ExternalNetwork = enhanced approval/certification
SecretReference → ExternalNetwork = deny

23. Data Access Broker

#![allow(unused)]
fn main() {
pub trait ExtensionDataAccessBroker {
    async fn read(
        &self,
        request: ExtensionDataReadRequest,
    ) -> Result<LabeledData, ExtensionDataGovernanceError>;

    async fn write(
        &self,
        request: ExtensionDataWriteRequest,
    ) -> Result<(), ExtensionDataGovernanceError>;
}
}

24. Hard Rule

Extensions do not directly access platform persistence.


25. Read Request

#![allow(unused)]
fn main() {
pub struct ExtensionDataReadRequest {
    pub runtime: ExtensionRuntimeId,
    pub source: ExtensionDataSource,
    pub object: DataObjectRef,
    pub purpose: DataUsePurpose,
}
}

26. Data Use Purpose

#![allow(unused)]
fn main() {
pub enum DataUsePurpose {
    Display,
    Transform,
    Send,
    Archive,
    Sync,
    Export,
    AnalyzeLocal,
}
}

27. Purpose Binding

Hard rule.


28. No "Any Purpose"

Hard rule.


29. Purpose Change

Requires policy reevaluation.


30. Labeled Data

#![allow(unused)]
fn main() {
pub struct LabeledData {
    pub label: ExtensionDataLabel,
    pub payload: BrokeredPayload,
}
}

31. Brokered Payload

Prefer handles/streams for large content.


32. Hard Rule

Inline values are bounded.


33. Data Minimization

Broker may return:

subset
redacted version
coarse timestamp
pseudonymous ID
aggregated representation

instead of the full source object.


34. Data Projection

#![allow(unused)]
fn main() {
pub enum DataProjection {
    Full,
    MetadataOnly,
    Redacted,
    Pseudonymous,
    Aggregated,
}
}

35. Hard Rule

Minimal necessary projection is the default.


36. Contact / Presence / Device Metadata

Prefer:

opaque contact refs
relationship-scoped presence
normalized device metadata

instead of raw source metadata.


37. Network Metadata

Raw IP/topology data is unavailable unless explicitly authorized and compatible with active privacy mode.


38. Data Sink Broker

#![allow(unused)]
fn main() {
pub trait ExtensionDataSinkBroker {
    async fn emit(
        &self,
        runtime: ExtensionRuntimeId,
        data: LabeledData,
        sink: ExtensionDataSink,
    ) -> Result<(), ExtensionDataGovernanceError>;
}
}

39. External Network Sink

Highest scrutiny for sensitive data.


40. Exfiltration Policy

#![allow(unused)]
fn main() {
pub struct ExfiltrationPolicy {
    pub source: ExtensionDataClass,
    pub destination: NetworkOrigin,
    pub allowed: bool,
    pub approval: ExfiltrationApproval,
}
}

41. Exfiltration Approval

#![allow(unused)]
fn main() {
pub enum ExfiltrationApproval {
    None,
    UserConsent,
    AdminApproval,
    CertificationRequired,
}
}

42. Hard Rule

External destinations are origin-bound where practical.


43. Secret Data

Secret-class material cannot use ordinary external sinks.


44. Secret References

Extensions should receive use-without-reveal handles/capabilities where possible.


45. Extension Storage

Storage is namespaced.

#![allow(unused)]
fn main() {
pub struct ExtensionDataNamespace {
    pub extension: ExtensionId,
    pub tenant: Option<TenantId>,
    pub device: Option<DeviceId>,
}
}

46. Hard Rules

no cross-extension namespace access
no cross-tenant namespace access

47. Storage Class

#![allow(unused)]
fn main() {
pub enum ExtensionStorageClass {
    Ephemeral,
    Cache,
    DurableLocal,
    DurableSynced,
}
}

48. DurableSynced

Requires explicit sync eligibility.


49. Local-First Default

Extension-owned data defaults to local storage unless synchronization is explicitly part of the capability contract.


50. Stored Object

#![allow(unused)]
fn main() {
pub struct ExtensionStoredObject {
    pub id: ExtensionDataObjectId,
    pub label: ExtensionDataLabel,
    pub created_at: Timestamp,
    pub expires_at: Option<Timestamp>,
}
}

51. Retention Policy

#![allow(unused)]
fn main() {
pub struct ExtensionRetentionPolicy {
    pub class: ExtensionDataClass,
    pub max_duration: Option<Duration>,
    pub delete_on_uninstall: bool,
    pub user_configurable: bool,
}
}

52. Hard Rule

Permission does not imply retention.


53. Retention Deadline

Enforced automatically.


54. No "Forever" Default

Hard rule.


55. User / Tenant Controls

Users may shorten retention.

Tenant policy may impose stricter retention.


56. Derived Data

Derived data includes:

summaries
indexes
embeddings
thumbnails
transcodes
aggregates

57. Derived Data Record

#![allow(unused)]
fn main() {
pub struct ExtensionDerivedData {
    pub id: ExtensionDataObjectId,
    pub sources: BTreeSet<ExtensionDataObjectId>,
    pub derivation: DerivationClass,
    pub label: ExtensionDataLabel,
}
}

58. Derivation Class

#![allow(unused)]
fn main() {
pub enum DerivationClass {
    Index,
    Summary,
    Thumbnail,
    Transform,
    Aggregate,
    Embedding,
}
}

59. Hard Rules

derived sensitivity does not automatically decrease
derived retention defaults to no longer than source retention
source deletion propagates to derived data

60. Explicit Declassification

Only reviewed transformations may lower sensitivity.


61. Anti-Resurrection

Deleted source must not reappear from:

cache
index
sync replica
backup
derived artifact

62. Deletion Epoch

#![allow(unused)]
fn main() {
pub struct ExtensionDeletionEpoch(pub u64);
}

Monotonic.


63. Deletion Tombstone

#![allow(unused)]
fn main() {
pub struct ExtensionDeletionTombstone {
    pub object: ExtensionDataObjectId,
    pub epoch: ExtensionDeletionEpoch,
    pub deleted_at: Timestamp,
}
}

64. Hard Rule

Older synchronized/restored state can never override a newer deletion epoch.


65. Deletion Reason

#![allow(unused)]
fn main() {
pub enum ExtensionDeletionReason {
    UserRequest,
    RetentionExpired,
    PermissionRevoked,
    ExtensionUninstalled,
    TenantPolicy,
    AccountDeletion,
}
}

66. Deletion Workflow

create tombstone
stop new access
delete primary object
delete derived objects
clear caches/indexes
propagate deletion
verify

67. Deletion Receipt

#![allow(unused)]
fn main() {
pub struct ExtensionDeletionReceipt {
    pub object: ExtensionDataObjectId,
    pub epoch: ExtensionDeletionEpoch,
    pub verified_components: BTreeSet<DeletionComponent>,
}
}

68. Deletion Components

#![allow(unused)]
fn main() {
pub enum DeletionComponent {
    PrimaryStore,
    Cache,
    Index,
    DerivedData,
    SyncReplica,
    ExportStaging,
}
}

69. Cryptographic Erasure

Supported for encrypted extension data where appropriate.


70. Data Export

User/tenant-owned extension data should be exportable where the product contract promises portability.


71. Export Scope

#![allow(unused)]
fn main() {
pub enum ExtensionExportScope {
    AllExtensionData,
    SelectedObjects,
    TenantScoped,
    UserScoped,
}
}

72. Export Format

Versioned and documented.

Preferred internal bundle:

RON manifest
+
Postcard data

JSON only where external interoperability requires it.


73. Export Manifest

#![allow(unused)]
fn main() {
pub struct ExtensionExportManifest {
    pub extension: ExtensionId,
    pub version: ExtensionExportVersion,
    pub objects: Vec<ExtensionExportEntry>,
    pub generated_at: Timestamp,
}
}

74. Export Entry

#![allow(unused)]
fn main() {
pub struct ExtensionExportEntry {
    pub object: ExtensionDataObjectId,
    pub class: ExtensionDataClass,
    pub digest: Digest,
}
}

75. Hard Rule

Export authority is separate from ordinary read permission.


76. Bulk Export

High sensitivity; explicit approval/audit where required.


77. Export Staging

Temporary encrypted storage with automatic expiry.


78. Import

Imports validate:

schema
ownership
size bounds
integrity
compatibility
deletion epochs

79. Hard Rule

Import cannot resurrect an object deleted at a newer epoch.


80. Backup Eligibility

#![allow(unused)]
fn main() {
pub enum ExtensionBackupEligibility {
    Excluded,
    LocalBackupOnly,
    EncryptedBackup,
}
}

81. Hard Rules

no live capability tokens in backup
no plaintext secrets in backup
restore restores data, not authority

82. Retired Extension Restore

Old data can become:

migrated
export-only
quarantined

Never auto-run retired code.


83. Uninstall Data Disposition

#![allow(unused)]
fn main() {
pub enum ExtensionUninstallDataDisposition {
    DeleteImmediately,
    RetainFor(Duration),
    ExportThenDelete,
}
}

84. Uninstall Ordering

revoke runtime grants
cancel background work
stop runtime
apply data disposition
verify cleanup

85. Revoked Extension

Security revocation may preserve data in quarantine while denying the extension runtime all access.


86. Platform-Controlled Export During Quarantine

Permitted if policy allows.


87. Extension Data Sync

Optional and explicit.


88. Sync Policy

#![allow(unused)]
fn main() {
pub struct ExtensionSyncPolicy {
    pub allowed: bool,
    pub scope: ExtensionSyncScope,
    pub encryption_required: bool,
}
}

89. Sync Scope

#![allow(unused)]
fn main() {
pub enum ExtensionSyncScope {
    DeviceSet,
    Tenant,
    UserAccount,
}
}

90. Hard Rules

device-local data does not silently sync
capability tokens never sync
cross-tenant sync is forbidden

91. Sync Conflict Strategy

#![allow(unused)]
fn main() {
pub enum ExtensionDataConflictStrategy {
    LastWriterWins,
    MergeSet,
    MergeMap,
    ApplicationResolved,
    RejectConcurrent,
}
}

92. Hard Rule

Last-writer-wins is allowed only where semantics tolerate it.


93. Sync Encryption

Sensitive extension data uses E2EE where required by data classification.


94. Federation

Extension data does not federate by default.


95. External SaaS Boundary

An authorized third-party service is an external sink.


96. Hard Rule

SIAR cannot promise deletion from a third party after authorized disclosure; that boundary must be shown truthfully.


97. Data Processing Declaration

Each extension declares:

classes read
classes stored
classes sent externally
retention

98. Data Declaration

#![allow(unused)]
fn main() {
pub struct ExtensionDataDeclaration {
    pub reads: BTreeSet<ExtensionDataClass>,
    pub stores: BTreeSet<ExtensionDataClass>,
    pub external_sinks: BTreeSet<ExtensionDataClass>,
    pub retention: BTreeMap<ExtensionDataClass, RetentionClass>,
}
}

99. Runtime Enforcement

Observed brokered flow cannot exceed declared flow.


100. Update Diff

A new data class, storage behavior, sink, or retention expansion requires review.


101. Marketplace / Consent Integration

Install/update UX should display:

what the extension reads
what it stores
what it sends outside SIAR
how long it retains data

102. Data Flow Graph

Logical technical graph only.

Nodes:

source
transform
store
sink

103. No User Social Graph

Hard rule.


104. Data Flow Edge

#![allow(unused)]
fn main() {
pub struct ExtensionDataFlowEdge {
    pub source: DataFlowNodeId,
    pub sink: DataFlowNodeId,
    pub data_class: ExtensionDataClass,
    pub policy: InformationFlowDecision,
}
}

105. Practical Information-Flow Baseline

Use platform labels on brokered values/handles plus sink validation.

Full dynamic taint tracking is not required for the first production version.


106. High-Assurance Extensions

May require stronger static/dynamic flow analysis.


107. Local AI Processing

Allowed only within declared source/sink/data-class policy.


108. External AI API

Treated as an external network sink.


109. No Silent Cloud Fallback

Hard rule.


110. Cache Governance

Caches inherit source labels.

Cache TTL ≤ source retention.


111. Cache Invalidation

Triggered by:

source deletion
permission revocation
tenant policy change
privacy mode change

112. Index Governance

Indexes inherit source sensitivity and deletion obligations.


113. Derived Artifact Cleanup

The following must be considered during deletion:

search indexes
embeddings
thumbnails
previews
transcodes
summaries

114. Observability Data

Extension runtime/technical metrics are separate from extension user data.


115. Metrics Cardinality

Bounded.

No user IDs by default.


116. Audit

Audit high-value events such as:

bulk export
high-risk external sink approval
retention policy expansion
deletion failure

Do not log every normal read by default.


117. Data Governance Policy

#![allow(unused)]
fn main() {
pub struct ExtensionDataGovernancePolicy {
    pub version: ExtensionDataPolicyVersion,
    pub flow_rules: Vec<InformationFlowRule>,
    pub retention_rules: Vec<ExtensionRetentionPolicy>,
}
}

Signed and versioned.


118. Policy Epoch

#![allow(unused)]
fn main() {
pub struct ExtensionDataPolicyEpoch(pub u64);
}

Monotonic and anti-rollback.


119. Policy Tightening

A stricter policy can immediately reduce future flow and trigger reconciliation of existing stored data.


120. Reconciliation Action

#![allow(unused)]
fn main() {
pub enum ExtensionDataReconciliationAction {
    Keep,
    Relabel,
    Delete,
    Quarantine,
    RequireExport,
}
}

121. Extension Data Inventory

#![allow(unused)]
fn main() {
pub struct ExtensionDataInventory {
    pub extension: ExtensionId,
    pub classes: BTreeMap<ExtensionDataClass, ExtensionDataInventoryStats>,
}
}

122. Inventory Statistics

#![allow(unused)]
fn main() {
pub struct ExtensionDataInventoryStats {
    pub object_count: u64,
    pub bytes: u64,
    pub oldest: Option<Timestamp>,
    pub newest: Option<Timestamp>,
}
}

Aggregate only; no private-content enumeration.


123. Quota Pressure

Quota exhaustion may:

reject new writes
evict caches first
prompt export/delete

It must not silently delete durable user-owned data.


124. Data Integrity

#![allow(unused)]
fn main() {
pub enum ExtensionDataIntegrityState {
    Verified,
    Suspect,
    Corrupt,
    Unknown,
}
}

Unknown is not Verified.

Corrupt data is quarantined rather than silently served.


125. Schema Migration

#![allow(unused)]
fn main() {
pub struct ExtensionDataMigrationPlan {
    pub extension: ExtensionId,
    pub from_schema: SchemaVersion,
    pub to_schema: SchemaVersion,
    pub reversible: bool,
}
}

126. Migration Requirements

dry-run
bounded impact estimate
checkpoint
integrity verification
rollback/forward-recovery semantics

127. Forward-Only Migration

Requires backup/checkpoint and stronger qualification.


128. Data Rights UX

Users/admins should be able to inspect:

approximate stored size
data classes
retention
external-sharing declaration
export action
delete action

without exposing internal schema complexity.


129. Delete-All Extension Data

Platform-controlled action.


130. Honest Delete UX

Explain:

what SIAR will delete
what may remain in backups until expiry
what an external third party may still retain

Never claim “deleted everywhere” unless that is actually verified.


131. Account / Tenant Deletion

Extension-owned user/tenant data participates in the same deletion orchestration.


132. Relationship Revocation

May require reevaluating retained relationship-derived data.


133. Privacy-Mode Change

May trigger:

access reduction
cache purge
derived-data purge
sync restriction

134. Maximum Anonymity

Avoid durable peer-sensitive metadata unless explicitly necessary and allowed.

Anonymous-session data may be ephemeral-only.


135. Cross-Session Correlation

Prohibited unless explicitly required and privacy-compatible.


136. Export In Anonymous Mode

Must not leak hidden route, topology, peer, or implementation metadata.


137. Governance API

#![allow(unused)]
fn main() {
pub trait ExtensionDataGovernanceService {
    fn policy_for(
        &self,
        extension: ExtensionId,
    ) -> Result<ExtensionDataGovernancePolicy, ExtensionDataGovernanceError>;

    fn inventory(
        &self,
        extension: ExtensionId,
    ) -> Result<ExtensionDataInventory, ExtensionDataGovernanceError>;
}
}

138. Deletion Service

#![allow(unused)]
fn main() {
pub trait ExtensionDeletionService {
    async fn delete(
        &self,
        extension: ExtensionId,
        scope: ExtensionDeletionScope,
        reason: ExtensionDeletionReason,
    ) -> Result<ExtensionDeletionReceipt, ExtensionDataGovernanceError>;
}
}

139. Export Service

#![allow(unused)]
fn main() {
pub trait ExtensionExportService {
    async fn export(
        &self,
        extension: ExtensionId,
        scope: ExtensionExportScope,
    ) -> Result<ExtensionExportBundle, ExtensionDataGovernanceError>;
}
}

140. Information-Flow Service

#![allow(unused)]
fn main() {
pub trait ExtensionInformationFlowService {
    fn evaluate(
        &self,
        label: &ExtensionDataLabel,
        sink: &ExtensionDataSink,
        purpose: DataUsePurpose,
    ) -> Result<InformationFlowDecision, ExtensionDataGovernanceError>;
}
}

141. Error Taxonomy

#![allow(unused)]
fn main() {
pub enum ExtensionDataGovernanceError {
    DataClassDenied,
    PurposeDenied,
    SinkDenied,
    RetentionExceeded,
    ExportNotAllowed,
    DeletionBlocked,
    TombstoneConflict,
    PolicyStale,
    CrossTenantAccess,
    IntegrityFailure,
    ScopeViolation,
    Unauthorized,
    Internal,
}
}

142. Observability

Safe metrics:

bytes by extension/data class
deletion backlog
retention expirations
export count
policy denial class

No user identity.


143. Data Governance SLOs

Examples:

retention expiry applied within target
deletion propagation within target
tombstone reconciliation within target
high-risk export receipts complete

144. Security SLO

0 secret-class data exported through ordinary sink
0 cross-tenant extension data access
0 deleted data resurrected from sync/backup

145. Privacy SLO

0 extension data lake outside declared namespace
0 derived private data retained past source deletion without explicit policy
0 user identity in extension technical metrics by default

146. Failure Modes

retention drift
derived-data orphaning
backup resurrection
external exfiltration
cross-tenant mixup

147. Retention Drift

Handled by reconciliation job + policy epoch.


148. Derived-Data Orphaning

Handled by source lineage + delete propagation.


149. Backup Resurrection

Prevented by deletion epochs/tombstones.


150. External Exfiltration

Prevented by source/sink policy + origin binding.


151. Cross-Tenant Mixup

Prevented by explicit tenant context in every storage key/query.


152. Testing

Need siar-extension-data-testkit.

Required scenarios:

message read without network-export permission
attachment export
retention expiry
extension uninstall
backup restore after deletion
privacy-mode escalation

153. Source/Sink Test

MessageContent → ExternalNetwork fails without enhanced authorization.


154. Retention Test

Expired object is deleted within policy target.


155. Derived Data Test

Source deletion removes linked index/embedding/thumbnail.


156. Tombstone Test

Older synchronized replica cannot resurrect deleted object.


157. Backup Test

Restore respects newer deletion epoch.


158. Cross-Tenant Test

Tenant A extension cannot read Tenant B namespace.


159. Export Test

Bulk export requires explicit export authority.


160. Quarantine Test

Revoked extension cannot access preserved quarantined data.


161. Reinstall Test

Retained data does not silently reactivate runtime access.


162. Policy Change Test

New stricter policy reconciles already-stored objects.


163. Privacy Mode Test

Maximum anonymity purges prohibited peer-sensitive cache.


164. Sync Test

Raw capability tokens never synchronize with extension data.


165. Fuzzing

Fuzz:

data labels
flow rules
retention policies
export manifests
deletion tombstones

166. Property Tests

Properties:

source permission can never imply sink permission
derived data can never outlive source retention unless explicitly allowed
deleted object can never reappear from older sync/backup state
cross-tenant namespace access can never succeed

167. Formal Verification Targets

Strong candidates:

source→sink flow policy
retention expiry
deletion epoch anti-resurrection
cross-tenant namespace isolation

168. Kani Candidate

Label/sink/retention/tombstone invariants.


169. TLA+ Candidate

read → store → derive → sync → delete → restore

170. Loom Candidate

Concurrent:

read/write
deletion
policy refresh
sync reconciliation

171. Performance

Data-governance checks sit on broker paths.

Target:

precompiled flow table
bounded labels
indexed retention metadata
batched expiry work

172. Hard Rule

No unbounded provenance traversal on the hot path.


173. Derived-Lineage Store

Maintained asynchronously for deletion propagation.


174. Storage

Separate:

extension namespaces
data labels
retention metadata
derived lineage
deletion tombstones
export manifests
sync metadata

Secrets remain separate.


175. No Shared User Data Warehouse

Hard rule.


176. Partitioning

By:

extension
tenant
device
data class

No behavioral-analytics partition.


177. Crate Layout

Recommended:

crates/
├── siar-extension-data-core/
├── siar-extension-data-broker/
├── siar-extension-data-labels/
├── siar-extension-infoflow/
├── siar-extension-storage/
├── siar-extension-retention/
├── siar-extension-deletion/
├── siar-extension-export/
├── siar-extension-data-sync/
├── siar-extension-data-observability/
└── siar-extension-data-testkit/

178. siar-extension-data-core

Owns:

ExtensionDataClass
DataSensitivity
DataOwnershipDomain
ExtensionDataGovernanceError

179. siar-extension-data-broker

Mediated reads/writes/projections.


180. siar-extension-data-labels

Labels/retention/source/sink metadata.


181. siar-extension-infoflow

Source→sink policy and data-flow evaluation.


182. siar-extension-storage

Namespaced local/synced extension storage.


183. siar-extension-retention

Expiry/reconciliation policy.


184. siar-extension-deletion

Tombstones, derived deletion, anti-resurrection.


185. siar-extension-export

Portable bundles and export authorization.


186. siar-extension-data-sync

Optional encrypted sync/conflict handling.


187. siar-extension-data-observability

Aggregate storage/deletion/flow health only.


188. siar-extension-data-testkit

Flow/retention/deletion/export/privacy tests.


189. Security, Privacy & Correctness Invariants

Mandatory:

1. Extension permission, data class, data source, data sink, purpose, ownership, retention, export, synchronization, and deletion authority are distinct concepts and can never be inferred from one another implicitly.
2. Every platform→extension read and extension→sink write is mediated by brokers that apply active authorization, data-class labels, purpose binding, scope, information-flow policy, and privacy-mode restrictions.
3. Reading sensitive data never implies permission to persist, export, sync, notify, copy to clipboard, or send it externally; source and sink authority are evaluated independently.
4. Extension storage is namespaced by extension and tenant/device context, with no cross-extension or cross-tenant access and local-first storage as the default unless sync is explicitly authorized.
5. Retention is explicit, bounded, and independent of read permission; durable copies, caches, indexes, thumbnails, embeddings, summaries, and other derived objects inherit source retention/sensitivity unless a reviewed declassification policy says otherwise.
6. Deletion creates monotonic tombstone/epoch state that propagates to primary stores, caches, derived data, sync replicas, export staging, and backup restore logic so older state cannot resurrect deleted extension data.
7. Uninstall, revocation, account deletion, tenant deletion, privacy-mode changes, and retention expiry all have explicit data-disposition behavior; revoked code cannot retain access merely because data is preserved for export or forensic purposes.
8. Exports are separate privileged operations with versioned manifests, scoped authorization, encrypted temporary staging, bounded lifetime, and truthful disclosure of any data already transferred to external third parties.
9. Backups and restores preserve extension data only according to explicit eligibility and never restore live capability tokens, plaintext secrets, retired extension execution authority, or state older than a deletion epoch.
10. External network, AI, webhook, file, clipboard, and other sinks are treated as explicit information-flow boundaries; no extension may silently move local/private data to a broader sink than the manifest, consent, policy, and certification permit.
11. Extension data inventories, metrics, audit, and observability are aggregate and technical; they cannot become a shared data lake, behavioral profile, private-content index, user surveillance system, or developer/publisher scoring mechanism.
12. Extension data governance integrates with permissions, runtime brokers, marketplace declarations, consent UX, compatibility, sync, backup/restore, deletion, export, assurance, audit/compliance, risk/PIR, tenant policy, and privacy modes without creating a side channel around SIAR's security, privacy, anonymity, or local-first guarantees.

190. Initial Production Scope

Implement first:

typed extension data classes/sensitivity/ownership
source/sink model
brokered labeled reads/writes
data minimization projections
source→sink information-flow policy
origin-bound external network flows
namespaced local extension storage
storage quotas
retention classes/policies
derived-data lineage
deletion tombstones/epochs
cache/index/thumbnail/embedding delete propagation
uninstall/revocation data disposition
portable export bundles
encrypted export staging
backup eligibility/restore rules
optional encrypted extension-data sync
cross-tenant isolation
policy reconciliation
aggregate data inventory
privacy-safe data metrics
extension-data testkit

Then add:

richer information-flow labels
formal declassification rules
portable cross-device extension data migration
high-assurance dynamic tainting for selected extensions
data-flow visualization
privacy-preserving retention proofs
formal anti-resurrection verification

191. Definition of Done

Part 136 is complete when:

  • extension data classes/sensitivity/ownership are typed;
  • all reads/writes go through data brokers;
  • source and sink authority are separate;
  • storage namespaces isolate extension/tenant contexts;
  • retention is explicit and enforced;
  • derived data inherits source lifecycle by default;
  • deletion tombstones prevent resurrection;
  • cache/index/embedding/thumbnail cleanup is covered;
  • export is a separate privileged path;
  • backups restore data but not stale authority;
  • extension sync is explicit and encrypted where required;
  • external sinks obey flow policy;
  • no hidden extension data lake or behavioral profile exists;
  • flow/retention/deletion/export/privacy/fuzz/formal tests are specified.

192. Final Architecture

                 PLATFORM / USER DATA
                        │
                        ▼
                  DATA ACCESS BROKER
                        │
             ┌──────────┼──────────┐
             │          │          │
           LABEL      PURPOSE     SCOPE
             │          │          │
             └──────────┼──────────┘
                        ▼
                  EXTENSION RUNTIME
                        │
             ┌──────────┼──────────┐
             │          │          │
          STORAGE     NETWORK     EXPORT
             │          │          │
             └──────────┼──────────┘
                        ▼
                  DATA LIFECYCLE
                        │
                        ▼
             RETAIN / DELETE / MIGRATE

Extension-data safety model:

mediated data access
+
explicit source/sink policy
+
data-class labels
+
namespaced storage
+
bounded retention
+
derived-data lineage
+
anti-resurrection deletion
+
scoped export/sync

not:

let a read permission imply permanent storage and internet export, keep derived copies forever, restore deleted data from backups, and call it extension flexibility

193. Final Principle

Extension data governance is trustworthy when the platform can answer not only who may read data, but also where that data may go, how long it may live, what may be derived from it, and how completely it can be deleted.

The correct model is:

classify the data
+
mediate every access
+
separate source from sink authority
+
minimize what is exposed
+
bound storage and retention
+
track derived data
+
propagate deletion everywhere
+
export/sync only through explicit policy
+
never let extensions accumulate a hidden data lake

This architecture gives SIAR a privacy-preserving extension data foundation for mediated access, information-flow control, storage, retention, deletion, export, sync, derived-data lifecycle, and anti-resurrection guarantees while preserving the anonymity, local-first, least-authority, marketplace, extension-runtime, permission, and anti-surveillance guarantees established across Parts 34–135.