Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a119cf-56d0-7fa3-840b-eb8732e1db0b
86 lines
5.5 KiB
Markdown
86 lines
5.5 KiB
Markdown
# Scoped transactional callers — source review, 2026-10-08
|
||
|
||
The receiver can isolate explicitly admitted callers while retaining the existing
|
||
single-caller startup path until deployment admission. The initial source increment changed no runtime. The tested image is now
|
||
deployed in the existing single-caller mode; see caller-deployment-2026-10-08.md.
|
||
Scoped policy admission and new caller activation remain separate.
|
||
|
||
Set EMAIL_CONNECT_CALLERS_FILE to an owner-controlled read-only JSON policy file.
|
||
If present, invalid policy fails startup before ledger migration; there is no
|
||
fallback to EMAIL_CONNECT_INGEST_TOKEN. Schema version1 has a callers list (1–32).
|
||
Each entry needs caller_id, source, absolute token_file, bindings (exact
|
||
[tenant, client] pairs), operations, templates, rate_per_minute, burst and
|
||
max_payload_bytes. Credentials are independently delivered files; inline tokens,
|
||
shared tokens and duplicate caller IDs are rejected. Tokens never enter policy
|
||
receipts or repr output. Limits are positive integers: rate <=6000/minute,
|
||
burst <=600 requests, payload <=128KiB. These are implementation ceilings,
|
||
not approved runtime quotas.
|
||
|
||
Operations: send, delivery-status, status, verify, consume, cancel, suppress,
|
||
unsuppress. Send templates are only family_member.invited and
|
||
family_invitation.resent. Payload source must match the authenticated policy;
|
||
verification and invitation tenant/client pairs must be explicitly admitted.
|
||
Each caller's invitation IDs, verification reservations and handles are isolated.
|
||
An event's immutable payload cannot change on retry. Status exposes a caller-local
|
||
opaque reference and transport evidence, never raw provider diagnostics.
|
||
Confirmed temporary non-acceptance can retry; permanent rejection is terminal;
|
||
uncertain acceptance remains terminal for automatic retry across restart.
|
||
Historical failed invitations lacking retry evidence also remain terminal.
|
||
|
||
A persisted atomic SQLite token bucket counts authorized requests, including
|
||
status, validation failures and duplicates. Concurrent connections and restarts
|
||
share its allowance. Changing caller identity resets its budget; admission must
|
||
treat that as a quota/security change. Backward wall-clock movement grants no
|
||
extra tokens. Oversized requests are rejected before reading their bodies.
|
||
Public health only proves receiver liveness; authenticated status is separately
|
||
admitted and consumes allowance.
|
||
|
||
Suppression is global recipient protection. suppress/unsuppress are privileged
|
||
platform operations, to admit only for a named operations owner, never generic
|
||
application callers. They do not inspect mailboxes or automatically classify
|
||
bounces. Sender identity/TLS remain governed by the existing SMTP provider;
|
||
caller policy does not grant arbitrary subjects/bodies/From or a bulk-mail API.
|
||
|
||
## Existing original caller and rollback
|
||
|
||
Only caller_id/source user-engine may explicitly adopt legacy verification rows
|
||
(adopt_legacy_verifications=true). Its granted binding pairs still constrain
|
||
consume/cancel. legacy_invitation_binding may explicitly admit one binding for
|
||
old invitation payloads lacking tenant/client, and preserves old event keys and
|
||
accepted receipts. Reserved ec2_ input IDs cannot collide with scoped storage IDs.
|
||
There is no inferred legacy adoption. Removing or narrowing a policy immediately
|
||
denies its operations without deleting transport/idempotency evidence.
|
||
|
||
Startup adds caller_id to verification rows, error/retryable to send_attempts,
|
||
and caller_buckets. Capture fingerprints include all six tables; old five-table
|
||
captures remain readable. Rehearsal source preserves scoped accepted/uncertain
|
||
verification reservations and budgets without provider calls. Capture/rehearsal helper source pins are repinned together to the deployed
|
||
eb3e7b68 immutable image. Their current guarded capture still requires explicit
|
||
archive admission; scoped policy activation remains a separate operation.
|
||
Do not downgrade after new-schema rows exist without an admitted compatible
|
||
recovery plan; old receiver code can lose retry restrictions or fail inserts.
|
||
|
||
## Validation and outstanding admission
|
||
|
||
Synthetic caller/legacy tests:66 passed, zero skips, network-denied app gate.
|
||
Full owner suite including loopback GreenMail and scoped ledger rehearsal:
|
||
148 passed, zero skips. Receiver/caller module and caller-test Ruff checks pass.
|
||
No live recipient, identity, token, handle or message body is a fixture.
|
||
|
||
EMAIL-WP-0008-T03 retains admission: choose actual caller/binding/template and
|
||
operation sets, quotas, separate token custody/delivery, original-user-engine
|
||
transition, platform sender/reply/bounce responsibilities, exact image/schema
|
||
rollout and rollback, and independent ledger offsite recovery. Existing live
|
||
EMAIL-WP-0007-T03/T04 and RPF-WP-0053-T05/T06 retain archive admission and atomic
|
||
credential-pair custody. CSOC-WP-0015-T01/T02/T04 retain productive flow and
|
||
owner-spanning browser acceptance. Source checks alone close none of these gates.
|
||
|
||
## Original product-workplan closure — 2026-10-08
|
||
|
||
The user explicitly closed CSOC-WP-0008 and CSOC-WP-0010 after registering
|
||
residual workplans. They are finished historical records, no longer acceptance
|
||
trackers. Product communication execution and acceptance now belong to
|
||
CSOC-WP-0015; EMAIL-WP-0008-T03, EMAIL-WP-0007 and RPF-WP-0053 retain their
|
||
canonical runtime/custody tasks. Existing personal recovery acceptance and the
|
||
receiver revision7 deployment remain evidenced. No pending owner requirement
|
||
is waived or marked satisfied by the original workplans' administrative closure.
|