System overview

Members Only is a local Python boundary in which an AI agent can propose work, but the member remains the authority for sensitive actions. The system checks the proposal before execution, requires approval where needed, and records a safe result without copying the private payload into the trace.

Agent proposal→

Structured action, arguments, destination, and member context

Sensitivity inspector→

Credential, personal, private-message, and destination findings

Policy gate→

Allow, requires approval, or deny

Member approval→

Decision bound to the exact proposal digest

Capability manager→

Short-lived, one-use permission for the approved proposal

Action adapters→

Synthetic local actions plus an optional approved, read-only Obscura browser fetch

Trace and receipt→

Safe evidence of the decision and execution outcome

Runtime topology

RuntimeResponsibilitiesPrimary implementation
Agent callerSuggest an action with typed context. It does not receive authority from its own output.Proposal
Security layerInspect findings, apply policy, bind approval, and issue a capability.pipeline.py
Action adaptersRun a supported local action or approved read-only browser fetch after the final gate.adapters/
PersistenceKeep approvals, capabilities, redemption state, and receipts in local SQLite.storage.py
Trace recorderWrite safe state transitions without raw payload-like fields.receipts.py

The default demo is local and synthetic. The optional Obscura adapter can make an approved read-only network fetch when its executable is configured.

Authoritative proposal flow

01

Intent An agent submits a typed proposal naming the action, arguments, and destination.

02

Inspection The sensitivity layer returns finding types and locations without echoing secret values.

03

Decision Policy maps the findings and destination to allow, requires approval, or deny.

04

Approval The member approves the exact proposal. The approval stores a stable SHA-256 proposal digest.

05

Authorization A capability is issued and consumed immediately before the local adapter runs.

06

Receipt The result is recorded as a safe trace and receipt. A replay is denied.

Design invariantAgent text, UI state, or a copied capability never substitutes for policy and member authority.

Authority and privacy model

ConcernControlFailure behavior
Credential exposureDetect credential fields and secret-like values before policy.Deny before execution
Personal or private dataClassify sensitive fields and private message bodies without logging their contents.Require member approval
External destinationInclude destination risk in the policy decision and adapter boundary.Require approval or reject in local MVP
Changed proposalBind approval to a stable proposal digest.Approval no longer matches
Capability replayUse expiry plus persistent one-use redemption state.Block the second attempt
Trace leakageReject payload-like trace detail keys and record safe metadata only.Refuse unsafe trace data

Traces and receipts

The demo emits a trace for each important state change and creates a receipt for the final outcome. The record is designed to answer, “What happened?” without becoming a second copy of the sensitive content.

trace.jsonlsafe fields only
{
  "event": "sensitivity_checked",
  "proposal_id": "prop_demo_001",
  "finding_types": ["private_message"],
  "raw_payload": "omitted"
}

{
  "event": "execution_blocked",
  "proposal_id": "prop_demo_001",
  "reason": "capability_already_redeemed"
}
Trace

State transition, actor-safe identifiers, finding types, and decision reason.

Receipt

Action identity, execution result, and a bounded failure reason.

Omitted

Raw credentials, private message bodies, and payload-like detail.

Persistence

SQLite gives the local MVP durable security state across process restarts. The store keeps the decision record separate from the sensitive proposal content used to make it.

Data classStorageContinuity
ApprovalsSQLiteProposal digest remains auditable
CapabilitiesSQLite plus expiry checksRedemption state survives restart
ReceiptsSQLiteFinal outcome remains queryable
Trace streamJSONL recorderSafe event sequence can be reviewed locally

Build and delivery

01

Run Start the local CLI demo and inspect the event sequence.

02

Test Run the Python unit suite across the security boundary.

03

Review Open this static documentation site from the GitHub Pages artifact.

04

Extend Add one detector or adapter while preserving the same gate order.

Local demo

The repository includes a synthetic end-to-end run. It shows member approval, capability issuance, local execution, receipt creation, and replay blocking without making network requests.

$ PYTHONPATH=src python3 -m members_only.cli demo
first_execution=succeededreplay_attempt=deniednetwork_requests=0

Tests: PYTHONPATH=src python3 -m unittest discover -s tests -v

Approved browser fetch

ObscuraActionAdapter uses the Obscura CLI for one bounded action: browser_fetch. Because its destination is external, the policy requires member approval before the capability can be issued.

$ MEMBERS_ONLY_OBSCURA_BIN=/path/to/obscura PYTHONPATH=src python3 -c 'from members_only.adapters import ObscuraActionAdapter; print(ObscuraActionAdapter().executable)'

The repository has a live local fetch verification against https://example.com. It is not production deployment or proof of universal website compatibility.

Current boundaries

  • Local synthetic actions and one read-only Obscura browser fetch are implemented. Real external messages, payments, account changes, and browser form writes are not.
  • Obscura is an optional external browser engine, not part of the Members Only authority model.
  • Web MCP is intentionally excluded from this project scope.
  • Detectors are signals. They cannot guarantee that every sensitive value is found.
  • The member remains responsible for approving high-impact actions.
  • This documentation describes implementation evidence, not user adoption or commercial scale.