Interest signup
What it does
Applications are agent-only. Submission starts email confirmation11. A person must follow the email link in a browser to confirm signup. Confirmation does not reserve a seat.¶
An agent applies for a person through the joinInterest capability.
A capability is one named action with shared value definitions and a server-side implementation.
Call it through MCP, POST /api/joinInterest, or the command-line interface (CLI). MCP27 means Model Context Protocol, which lets an agent discover and call tools.¶
The agent view of /tokenmaxx carries a fresh page ticket and the application steps. Ask the questions, show an editable card, and submit only what the person approves. Refusals return the same answer as success, and the person still confirms by email.¶
SubscriberIntake and SubscriberConfirm are ports in core: interfaces for starting email confirmation and confirming a signup. packages/subscriber-delivery provides the adapter, the implementation that connects those interfaces to external delivery.
The Worker chooses and supplies that implementation when it starts.¶
See hexagonal architecture19. List signup is separate from account authentication16.¶
The standard
- A person must confirm their email before joining.¶
- Consent is explicit: the person approves the agent’s exact card and contact permission. An agent must not infer permission to subscribe someone from their address or an unrelated request.¶
- Agent application refusals receive a neutral answer rather than revealing whether an address is on file. Expired confirmation links have deliberate refusal responses. Retired submission endpoints return 410 without capturing or delivering an application.¶
- Provider details remain outside core;
no-core-adaptersenforces that boundary.¶ - An agent application needs a fresh page ticket, contact consent, and the person’s approval of the exact application data. A ticket works once.¶
Applicant identity
joinInterest accepts optional name and x fields.
The name trims whitespace and allows 1–100 characters. This keeps preferred names short.
Skipped fields and historical applications omit both keys.¶
- The X field accepts a handle or profile URL and stores
https://x.com/handlein lowercase. Handles allow 1–15 ASCII letters, digits or underscores, including existing short handles. It refuses status, intent and navigation URLs.¶ - X documents the 15-character limit and the allowed characters. Its current account-renaming guidance requires more than four characters. This field reads existing profiles rather than registering usernames.¶
- Identity is stored in protected form in the application’s
startedevent, which records the start of an application. It uses the same contact key as the answers. Erasure removes that key and its rows.¶ - Only the authenticated application reader reads the protected identity. The delivery request is unchanged and carries neither field.¶
- Capability observers receive identity fields with their values removed. Request analytics18, trace spans, and logs never receive those values. A trace span records an operation’s timing and outcome.¶
- MCP request tracing is disabled in the protocol implementation for modern and legacy protocols.
The protocol’s
tools/callspan records raw parameters before the capability observer can remove sensitive values.¶
Operator commands
Set INTEREST_OPERATOR_TOKEN through the local environment schema. Keep its value private.¶
rat-stack intake list --submission-id <id>reads one application.¶rat-stack intake erase --submission-id <id>erases local contact data and sealed answers.¶rat-stack intake redeliver --submission-id <id>retries a ready application with its original submission ID.¶
Repeat --submission-id to provide an ordered batch. Redelivery processes one ID at a time.¶
- Only ready contacts without an abuse hold can be sent by default. Erased contacts appear as missing.¶
- Add
--dry-runto inspect every named ID without sending or changing state. Eligible rows saywould_send.¶ - Add
--include-refusedonly for explicitly approved IDs whose refusal came from a verified availability failure. This per-call option repairs named refused contacts to ready before delivery. It never permits held or accepted contacts.¶ - The live batch stops at the first skipped, refused, or retry outcome. The result lists IDs not attempted.¶
- Each row contains the pre-run state in
previousStateand the resultingstate.¶ - The response contains submission IDs, outcomes, and states. It contains no email addresses or answers.¶
The operator route is POST /operator/interest/applications/redeliver. It uses the same bearer token as erasure.¶
If the command fails, read application states before retrying. A failed request can have completed part of the batch.¶
A scorer outage alone saves a ready contact without sending. The response tells the person that confirmation is delayed.¶
Non-holding signals can accompany that outage: ticket_instant, no_answers, jev_off, and jev_clear.
Real abuse holds and unknown signals keep the contact held, even with a scorer outage.¶
Use redelivery after the outage is fixed. The saved submission ID stays unchanged.¶
Rate refusals return a busy message and save nothing. The agent waits one minute and retries once.¶
How to check
- Read
apps/site/src/interest/routes.tsfor email confirmation,retired-routes.tsfor 410 responses, andpackages/core/src/join-intake.tsfor agent applications. The only published signup capability isjoinInterest.¶ - Run
pnpm --filter @rat-stack/core testfor lifecycle behavior andpnpm --filter @rat-stack/site testfor submission and confirmation integration tests.pnpm --filter @rat-stack/subscriber-delivery testchecks the adapter contract.¶ - With an authorized test address, approve an agent application, receive the confirmation email, follow its link, and confirm. Source and local tests alone do not prove inbox delivery or the external list state.¶
- Check OpenAPI for
joinInterestand read the agent view of /tokenmaxx for the application steps. Do not bypass confirmation.¶
Sources
- Agent join intake. GitHub joelhooks/rat-stack. Ticket check, scoring, contact storage, and the uniform answer for agent applications. Accessed 2026-10-01.
- Interest lifecycle machine. GitHub joelhooks/rat-stack. Local pending, confirmation, and capture states. Accessed 2026-10-01.
- Subscriber intake port. GitHub joelhooks/rat-stack. Interface for starting email confirmation. Accessed 2026-10-01.
- Subscriber confirmation port. GitHub joelhooks/rat-stack. Interface for confirming a signup. Accessed 2026-10-01.
- Subscriber delivery adapter. GitHub joelhooks/rat-stack. External delivery implementations outside core. Accessed 2026-10-01.
- Interest HTTP routes. GitHub joelhooks/rat-stack. Retired submission endpoints, email confirmation, and result routing. Accessed 2026-10-01.
- Interest handlers. GitHub joelhooks/rat-stack. Neutral answers, mode choices, and delivery composition. Accessed 2026-10-01.
Last changed 2026-10-12 in 8fa3c6d. Source on GitHub. Change log.
Linked from
- A clean playground. rat-stack does real work with packages that stay easy to add and remove.
Interest signup keeps delivery in an adapter package outside core.
- Agent guide. An Effect stack so pure (aspirational) Kit Langton will blush.
Interest signup — Agent-only applications start email confirmation through interfaces owned by core and delivery implemented in a separate package.
- An agent applied through Markdown and HTTP. One observed application used the Markdown page and llms.txt, then one POST; confirmation followed 88 seconds later.
Interest signup keeps the consent and email-confirmation rules.
- Change log. What changed in the files served here, newest first.
Interest signup — edited: fix: answer honestly on intake rate limits and scorer outages
- Full agent guide. An Effect stack so pure (aspirational) Kit Langton will blush.
- HATEOAS. Links in a representation tell its reader what to do next; rat-stack applies that idea to agent-facing pages and responses.
Interest signup records the current consent and confirmation boundary.
- Hexagonal architecture. Ports name the application's jobs; adapters connect them to the outside world.
Interest signup records the agent-only application path and email confirmation boundary.¶
- Hosted agent interfaces. Discovery documents, HTTP, MCP, A2A, and bounded code mode expose the public reference to agents.
Interest signup has its own consent and email-confirmation rules.¶
- One capability, every surface. A schema-typed contract and one handler feed every interface rat-stack keeps.
Analytics shows a separate infrastructure cartridge; interest signup shows core ports with a delivery adapter outside core.
- Rat Stack systems | rat-stack. The systems rat-stack ships, the standard each keeps, and how to check it.
Interest signup — Agent-only applications start email confirmation through interfaces owned by core and delivery implemented in a separate package.
- rat-stack. An Effect stack so pure (aspirational) Kit Langton will blush.
- Source change history (log.md). The generated change log as Markdown.
Interest signup — edited: fix: answer honestly on intake rate limits and scorer outages