Standalone VPS
This page owns the standalone deployment and end-to-end profile for a docs-aware Reach on an operator-controlled VPS. Turn owns the compact application sequence; A2A, Tether, and Veil retain protocol, private-reachability, and hostile-ingress law.
Designed, not deployable
The Composition Portfolio is
Designed. No Reach/Discord adapter, corpus pipeline, local Ward guest admission/task Sigil,
Mirror Persona binding, general Privacy Cut and Portal Egress Gate, durable Reach or
ServiceJobAttempt@1 records, A2A transport, remote IAM, deployment-manifest compiler, Tether
provider, or Veil provider ships. This profile is an implementation and acceptance target, not
permission to expose the current loopback application or send Discord material to a remote
provider.
One restricted deployment
reach.vps.public@1 is a versioned reference deployment profile of the Reach Composition. The VPS
is a standalone, restricted LychD body with its own Vessel, Workers, local Ward, and deployment-
local Phylactery for required Core Run, Ward, queue, and Reach state.
It is not the operator's home Vessel and has no route to the home database, private Context, Altar,
model services, Podman socket, Reactor, host authority, reusable home credential, or ambient Sigil.
After admission, local Ward may mint one secret-free, task-scoped Sigil; that Sigil expires with
the task and never crosses a model or A2A call.
The first E2E profile is outbound-only and guest/public-only. It answers a question eligible for public disclosure from one admitted Discord Habitat using one admitted public corpus. It has no Tether, Veil, callback listener, inbound A2A, published Agent Card, private home data, enrolled caller powers, or dynamic peer discovery. A request needing private Context, a missing privacy boundary, or authority outside this profile refuses.
An enrolled/private Reach attachment is a separate later profile revision. It requires delivered remote Ward IAM and an exact private backend contract; guild membership or account fluency cannot activate it.
Enforced service and secret split
Operator provisioning creates one non-root, non-login Reach host account and the platform floor.
The accepted ApplicationDeploymentManifest@1
then pins every row as a distinct rootless unit/container identity with exact image, command,
dependency order, mounts, network namespace, resource ceilings, and secret files; Scribe alone may
materialize it. Host account creation and cross-user lifecycle are outside Reach authority. No
shared Pod, environment, credential bundle, or writable volume substitutes for a typed local
request, inbox, or outbox.
| Service | May hold or do | Must not receive |
|---|---|---|
| Discord edge | bot token; outbound Gateway; outbound Discord REST; emit validated events; consume one-delivery intents | corpus, provider/peer credentials, policy authority, general database write, public listener |
| Reach core | turn policy; local task-scoped Sigil; read-only active corpus; typed Phylactery port | bot token, long-lived provider/peer bearer, arbitrary Internet, corpus staging |
| Portal/A2A egress adapter | exact provider/peer credentials and destinations; execute one egress-admitted attempt | bot token, Sigil, raw private Context, dynamic routing, general proxying |
| Corpus refresher | allowlisted public-source network; bounded staging; atomic snapshot publication | bot/provider/peer credentials, application records, content-directed network |
| Local Phylactery | Core Run/Ward/queue plus Reach records, outboxes, dedupe, checkpoints, and admitted migrations | public or Tether listener, home-database replication, ambient service access |
| Intercom ingress, separate later profile | hostile decode; peer authentication; replay fence; bounded durable inbox | bot/provider credentials, Discord delivery path, direct work or effect authority |
| Veil, separate later profile | TLS, canonical ingress, exact route and coarse limit | application bearer, database, corpus writer, delivery authority |
| Tether, separate later profile | exact WireGuard peer and routes | default route, application credential, authorization decision |
Each egress-adapter instance serves one provider or peer trust class and receives only its own credential reference and short-lived occurrence grant. The Reach core supplies the admitted payload and decision identity, never its Sigil or another adapter's bearer.
Every local request uses an exact typed port over mutually authenticated transport. The manifest pins distinct service Principals and credentials, audience, message/object types, expiry, replay fence, and receiver authorization; caller-supplied identity is discarded. Unauthenticated loopback, a shared bearer, container DNS, or possession of a network route is never workload identity. Cross-service impersonation must fail even after one non-owning service is compromised.
The host firewall reinforces those edges and denies cloud metadata and private-network egress except declared local service paths; another profile must declare any future Tether route. This split limits ordinary lateral movement; it does not defeat root, VPS-control-plane, or operator-account compromise. Those failures can expose every secret and retained payload on the machine.
Public corpus contract
Reach owns source eligibility, interpretation, evidence selection, and citation judgment. The acquisition adapter follows the bounded destination and hostile-data law of Web Acquisition; the static site and a read-only checkout alone are not retrieval.
A refresh admits only Git repositories addressed by canonical HTTPS URLs or canonical HTTPS
static origins; git://, SSH/SCP, local/file origins, credential helpers, and ambient credentials
are refused. Source policy binds allowed paths, an operator-admitted commit or verified immutable
release provenance, content digests, builder/parser/index revisions, and file, byte, expansion,
depth, and work ceilings. Movement of a mutable branch is candidate discovery, never activation
authority. Checkout and build disable hooks, submodules, smudge/LFS processing, and content-directed
network access. They reject escaping symlinks, unsupported media, malformed encodings, and archive,
decompression, or parser bombs. Index construction is network-free. Failure leaves the previous
snapshot active; only a completely validated and admitted staging generation activates atomically.
PublicCorpusSnapshot@1 records source identities, immutable revision and content digests,
accepted paths, tool revisions, build receipt, activation time, and freshness state. Retrieved
passages remain attributed, instruction-fenced data—never prompt instructions, executable policy,
or proved truth. reach.vps.public@1 sets fresh_until to 24 hours after activation. After it
passes, Reach settles DEPENDENCY_UNAVAILABLE rather than silently treating the last snapshot as
current. An operator may separately admit a frozen historical snapshot only for an explicitly
historical question whose answer displays that revision.
CorpusEvidenceBundle@1 binds one snapshot; passage identifiers and digests; canonical URLs and
sections; and retrieval, passage-count, token, and total-size ceilings. Only this bounded bundle,
not the checkout or index, may enter a remote task. A claimed citation must bind to one selected
passage; an absent, altered, or unbound citation refuses validation.
First E2E contract: one public Discord question
- Receive. Discord edge accepts an outbound-Gateway event and validates application, guild, channel or thread, trigger, byte limit, and adapter revision.
- Reserve. Reach atomically inserts
DiscordEventAdmission@1under(platform, adapter revision, application id, event kind, external event id)plus payload digest before cognition. Exact replay under the same Habitat/owner partition returns its existing turn or terminal status; changed-content or cross-partition reuse is a security fault. - Admit. Local Ward assigns guest/public-only authority under
(platform, application, guild, channel-or-thread, external-subject). A guest receives no retained personal history. Ward mints a task-scoped local Sigil only after this mapping. - Ground. Reach selects one active
PublicCorpusSnapshot@1, retrieves bounded attributed passages, and seals oneCorpusEvidenceBundle@1. - Form. The exact Pattern and Run assemble labelled Context. When policy requires a Privacy Cut, missing lineage, the Cut, its verifier, or its receipt refuses remote formation.
- Admit egress. Immediately before the first outbound byte, Security's trusted Portal Egress
Gate issues a fresh exact
EgressDecisionbinding Principal/Sigil, Run and attempt, provider or peer, destination, purpose, canonical payload digest, labels, policy and transformation receipt, expiry, and budgets. Retry, fallback, redirect, resume, payload, actor, model, peer, or destination change requires another decision. - Call. The egress adapter persists
ServiceJobAttempt@1for a model call, or uses the Intercom task/outbox record for one enrolled, authenticated, task-authorized A2A peer. It moves the record toSUBMITTINGbefore transmission and receives no local Sigil or undisclosed raw Context. - Quarantine. The return is attributed untrusted input. Reach checks protocol/schema, size, terminal status, task correlation, citations, privacy, and output class before adoption.
- Commit. One Phylactery transaction commits
ReachTurn@1andDiscordDeliveryIntent@1(PENDING)with effect id, payload digest, and deterministic nonce. Over its authenticated claim port, Discord edge obtains one generation-fenced lease; the ledger persistsCLAIMED, thenSUBMITTING, before the edge performs Discord REST withenforce_nonce=true. The edge has no database credential. - Settle. Reach records
ReachDelivery@1with effect id, payload digest, platform status, nonce, claim generation, and Discord message id when known through the authenticated settlement port. A pre-SUBMITTINGexpired claim may be reclaimed under the same intent. After a lost acknowledgement, an exact retry with the same nonce is permitted only inside Discord's documented uniqueness window; outside that window or without matching payload it becomesUNKNOWNand is not resent.
DiscordEventAdmission
-> Run / Pattern revision
-> PublicCorpusSnapshot + CorpusEvidenceBundle
-> Context lineage + Cut receipt + EgressDecision
-> ServiceJobAttempt or Intercom task/outbox
-> ReachTurn + DiscordDeliveryIntent
-> ReachDelivery
The chain correlates external event, turn, Run/station attempt, provider request or A2A task/message/idempotency identities, delivery effect, payload digest, and Discord message id. A provider completion string, HTTP success, or fluent answer cannot replace any committed edge.
| Record | Terminals |
|---|---|
ReachTurn@1 |
SUCCEEDED, REFUSED, DEPENDENCY_UNAVAILABLE, EXPIRED, FAILED, INDETERMINATE |
ReachDelivery@1 |
NOT_ATTEMPTED, KNOWN_SENT, KNOWN_REJECTED, UNKNOWN |
DiscordDeliveryIntent@1 uses PENDING -> CLAIMED -> SUBMITTING -> KNOWN_SENT |
KNOWN_REJECTED | UNKNOWN. Claim identity, generation, lease, and attempt history remain durable.
Crash after SUBMITTING is possible external effect, never a reclaimable unsent claim.
Outbound A2A without an inbound edge
The first A2A path pins one A2A 1.0 adapter and binding, enrolled peer identity, authentication, task schema, destination, and budgets. Public or registry Agent Cards are advertisements, not enrollment, current authority, destination admission, or availability truth.
The first independent interoperability receipt closes one polling case:
| Field | reach.vps.public@1 A2A receipt |
|---|---|
| protocol | A2A 1.0, HTTP+JSON binding, adapter and schema fixture digests pinned |
| peer | one pre-enrolled Principal, canonical HTTPS origin, Agent Card digest, server certificate identity, and task authorization named by the receipt |
| authentication | mutual TLS with distinct audience-bound client credential; no bearer in payload |
| task | reach.public_corpus_answer@1; one text query plus one CorpusEvidenceBundle@1; text/structured response only; files, artifact URLs, tools, teaching, and continuation refused |
| operations | non-blocking POST /message:send returning a Task, then GET /tasks/{id} only; a direct Message, stream, or push notification is outside this receipt |
| polling | every 2 seconds, at most 20 polls, 45-second absolute task deadline; transport retry never creates another message/task identity |
| ceilings | one task; 32 KiB request; 256 KiB response; eight evidence passages; 2,000-character query; profile-pinned token and spend ceilings |
| adoption | authenticated expected task/context identity, current peer authorization, first terminal, quarantine, schema/citation validation |
The receipt must replace every peer value with an observed independent endpoint; a placeholder or
same-process fake proves only conformance. A model Portal is a separate E2E case using the same
Context, egress, ServiceJobAttempt@1, quarantine, and delivery boundaries.
Reach commits the task and outbox before send, then parks the calling Invocation in Durable
Stasis. The client uses the outbound response, polling, or an outbound stream; push callbacks are
disabled. Every update is authenticated, correlated, checked against current peer/revocation
policy, and adopted first-terminal-wins before quarantine. SUCCEEDED, REFUSED, FAILED,
EXPIRED, REVOKED, CANCELLED, and LOST remain distinct; silence is not success and an unknown
post-submit effect is never silently repeated.
The 1.0 adapter maps TASK_STATE_COMPLETED, TASK_STATE_REJECTED, TASK_STATE_FAILED, and
TASK_STATE_CANCELED to SUCCEEDED, REFUSED, FAILED, and CANCELLED. The one-shot public task
refuses TASK_STATE_INPUT_REQUIRED or TASK_STATE_AUTH_REQUIRED without sending new user
credentials. Local deadline, current peer revocation, and irreconcilable remote loss settle
EXPIRED, REVOKED, and LOST; transport silence maps to none of them by itself.
Later inbound profiles stay separate:
| Profile | Exact boundary |
|---|---|
| Callback-only client | Veil may route a notification only to isolated Intercom ingress; it may update one existing outbound task after authentication, replay fencing, task/token correlation, current authorization, and durable admission. |
| Full A2A server | A distinct server profile needs Veil, Ward, Intercom durable inbox/outbox, Workers, quotas, and its own result path. A new peer task is not a Reach/Discord turn. |
Incoming peer work never creates a Discord delivery. In particular, publishing an Agent Card or opening a task route cannot grant a foreign peer use of the bot identity.
Destination and abuse boundary
Every corpus, Portal, artifact, and A2A destination is admitted as a canonical HTTPS origin, port,
path, and purpose without ambient proxy or credentials. Resolution rejects loopback, private,
link-local, multicast, unspecified, cloud-metadata, and mixed public/private results. The admitted
address stays pinned through connection; connected peer, TLS certificate, SNI, and Host must
match. Each redirect and new connection is independently resolved and admitted.
Before any provider or peer response reaches Reach core, its egress adapter enforces status and content-type policy; header, wire-byte, expanded-byte and expansion-ratio bounds; chunk count and size; stream duration and idle time; JSON depth/items; parse/token work; and total result limits. Violation closes the response and returns a typed dependency failure without parsing further.
The initial profile also bounds Gateway events per application/guild/channel/subject, concurrent turns, evidence bytes, provider/A2A response bytes, tokens, time, retries, and spend. Later ingress adds pre-auth connection, header, compressed and expanded body, JSON depth/item, signature-work, and time limits; per-IP, peer, route, and global quotas; bounded durable queues and streams; and separate CPU, memory, process, disk, and connection ceilings. Overload refusal cannot evict Gateway heartbeat, committed Discord delivery, or recovery work.
Retention and provider custody
The initial profile uses these maximums; an operator may shorten them. Longer retention is a new declared policy decision, not a logging default.
| Material | Maximum and retained form |
|---|---|
| raw Discord event/query | 24 hours after terminal; up to 7 days only while reconciliation is unresolved, then digest and minimum admission fields |
| caller/admission evidence | 30 days; partition, policy, decision and abuse facts without copied profile content |
| evidence bundle and every terminal turn | 30 days; structural terminal record plus exact selected public passages or their independently retrievable digests and refs |
| raw egress payload or quarantined return | 24 hours after terminal; up to 7 days for INDETERMINATE, then decision/result digests and receipts |
| delivery and external idempotency identities | 90 days; event/effect ids, payload digest, status, and Discord message id |
| edge address and coarse abuse log | 7 days, access-controlled and minimized |
| corpus snapshots | active plus previous generation; evidence retained with a turn remains separately bounded above |
General telemetry contains no raw prompts, passages, results, credentials, or pseudonym maps. Provider-side storage, training, region, subcontractor, and deletion behavior is part of destination policy and must be admitted before egress; local deletion cannot erase a provider's copy.
These maximums bind replicas, exports, encrypted backups, VPS snapshots, journals, swap, and crash dumps as well as live rows. Raw payloads and credentials are disabled in core dumps and service journals; swap is encrypted or disabled. The deployment manifest either disables backups and declares total Phylactery loss unrecoverable, or pins an encrypted off-host backup/expiry/restore profile whose decryption key remains offline. Unrecoverable ledger loss disables Reach until external effects within the idempotency horizon are reconciled; a fresh database cannot declare old Discord or A2A effects absent. Decommission destroys volumes and expires every secondary copy.
Restart, uncertainty, and compromise
A replay returns the committed admission or turn. Failed corpus refresh keeps the previous active
snapshot and degrades freshness. Failure proved before submission may create a fresh attempt and
fresh EgressDecision; possible post-submit failure is INDETERMINATE until reconciled. Parked A2A
work survives restart as protocol identities and checkpoint, never as a provider SDK object.
Unknown Discord delivery is not retried without independent effect evidence.
Suspected service compromise revokes its leases and credentials, quarantines outputs, taints related tasks and deliveries, and preserves only bounded secret-free correlation evidence. Root, operator-account, or VPS-control-plane compromise instead requires:
- stop Reach and withdraw Veil routes, callback DNS, and any Agent Card;
- revoke Discord, provider, A2A signing/authentication, Tether, Veil/ACME, operator/session, and source/deployment credentials that could have crossed the host;
- mark in-flight calls, callbacks, and deliveries tainted or uncertain and reconcile their external ids with Discord, providers, and peers;
- destroy and reprovision from a trusted pinned image rather than restart the compromised host;
- restore only independently verified non-secret records, rebuild the corpus from admitted origins, issue disjoint credentials, and re-enroll from zero authority.
Acceptance gates
Repository tests must prove event and payload identity collision, replay, partition isolation,
Privacy Cut and EgressDecision binding, destination/redirect rebinding attacks, malicious corpus
paths and parser bombs, malicious chunked/compressed/deep provider responses, provider/A2A timeout
at each commit boundary, quarantine, task revocation at every lifecycle edge, restart, overload
separation, and Discord claim/nonce reconciliation and expiry without duplication.
A live-host receipt must name exact source and image revisions, OS/systemd/Podman, service users,
the selected ApplicationDeploymentManifest@1 and compiler receipt, units, mounts, local mTLS
Principals/credentials and cross-service impersonation refusals, networks, firewall and DNS, secret
projections, resource ceilings, corpus generation, Mirror/Ward binding, external adapter revisions,
reboot, credential absence across services, backup/restore or declared-loss behavior,
reconciliation, shutdown, and a clean rebuild/rotation drill. None of those gates promotes delivery
by prose; only the evidence owners and State of Work may do that.