How to enable your twin
Use this guide when you hold a program persona other than viewer and want your twin to do the plumbing of
your role between your decisions. You start on the program home with no twin; you end with a twin
active whose duties each run under a standing plan you approved, and a
panel that reads “Your twin · scientist · active · last pass … · next …”. Enabling a twin needs
program.twins.use; it is your own act, and nobody can do it for you. Every R3 surface described here carries
the status word designed until the R3 gates pass
(roadmap).
Three sentences are fixed as console copy and shown on the setup screen: “Your twin proposes. You decide.” / “Your twin never approves, signs or sends.” / “Paused. Nothing runs until you resume.” A twin is never a user, a signer, an approver or a sender; the tool catalogue refuses any tool with those verbs.
Prerequisites
- A program role that is
scientist,quality_reviewer,program_lead,program_ownerormanufacturing_specialist. Viewers have no twin; their home reads “Viewers have no twin. Nothing waits for you.” - On a partner program, a baseline row for the program in
CLAIMS-REGISTER.md; the button reads “Baseline recorded on<date>” or stays disabled with “Baseline pending” (409 baseline_missing). - Nothing else: your twin’s tool allowlist is computed from your own live permissions, so there is nothing to grant.
Open the twin panel
On the program home, the Twin panel sits under “Decisions waiting for you”. With no twin it offers
Set up your twin, which opens /p/<slug>/twin. If a phase-2 schedule of yours was moved here by the
migration, the panel already shows a twin paused with “Paused: a schedule
from phase 2 was moved to your twin; review it and resume”; continue with the same steps.
Step 1: what your twin will do
The persona’s default duties appear as cards, each naming its tools, the permission every tool exercises and,
where knowledge.fetch_document is used, the fetch cap you can lower (“Documents fetched per pass”, default
10). A duty whose permission you lack is disabled and names the key (“Needs review.sops.manage”). Untick any
duty you do not want. For a scientist the defaults are the weekly literature watch, notebook follow-through,
draft readiness, report scaffold, gap hygiene and information hand-offs to the lead; for a quality reviewer
SOP watch, hand-off intake, check triage and the requirement-set queue
(about personas and twins).
Step 2: when
Set the brief time (digest_time), the batch times, quiet hours and the proposal expiry (default 72 h).
Quiet hours hold delivery, not the record: a proposal filed at night is in your inbox at once and in your
e-mail after the window. One person, one clock: the time zone is users.settings.timezone.
Step 3: what it never does
The three fixed sentences, then one standing-plan approval per enabled duty. Choosing Enable calls
POST /programs/{program_id}/twins with TwinCreate {persona_key, duties, expiry_hours, digest_time, batch_times}; the API creates the twin, audits twin.create, and enqueues one planning-only twin_cycle
(input.phase = standing_plan) per duty. Each plan arrives on this screen as a detached plan_approval
naming the tools, sources, expected writes, budget.tool_calls, max_proposals_per_cycle,
max_fetches_per_cycle and cadence. Read it and choose Approve; the audit row records
permission_exercised = program.twins.use, the plan is copied to the trigger (standing_plan_json,
standing_plan_hash) and the duty becomes enabled. A duty without an
approved plan does not run.
Read the panel
“Your twin · scientist · active · last pass 07:10 · next 12:00 · 3 proposals waiting” with Pause,
Run now and Duties, and the transparency line “0 record writes without your approval. This week: 14
reads, 8 documents fetched, 6 proposals, 4 accepted, 1 edited, 1 declined, 1 brief written
(agent-generated, unsigned).” The counts are computed from records and link to the runs. Every twin run’s
footer reads “Started by schedule, event, hand-off or you under <Name>’s standing plan (approved <date>,
plan <hash prefix>)”.
Pausing, and what pauses it for you
Pause (POST .../twins/{twin_id}/pause, program.twins.use) stops every duty; the panel reads “Paused.
Nothing runs until you resume.” An owner or lead can pause your twin with a recorded reason
(program.twins.manage); the panel names the reason. The twin also pauses itself, in the same transaction as
the cause, when a permission a duty needs is removed (permission_lost), when you leave the program
(membership_lost) or are deactivated (user_inactive), when 80 percent of the monthly tool-call budget is
used (“Paused: 1,200 of 1,500 tool calls used this month”), and when more than half of at least ten decisions
in fourteen days were declines (“Paused: high decline rate, 6 of 10 declined in 14 days”). Removal from the
organisation retires it and withdraws its open items. Resume re-checks the standing plans first: a
changed tool list, permission set or agent version invalidates a plan’s hash and asks again.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Set up your twin is missing | you hold viewer, or no program persona | viewers have no twin; ask an owner or lead for the persona your work needs |
409 twin_active_exists | you already have an active twin in this program under another persona | one active twin per person and program; retire or pause the other first |
409 baseline_missing | the program is a partner program without a registered baseline | the baseline window (two full weeks on the phase-2 console) must be registered first |
A duty is disabled with “Needs <key>” | your persona lacks the permission the duty’s tool exercises | that duty is not for your role; the twin of the persona that holds the key proposes it (for example QA proposes checks) |
422 duty_unavailable | a duty template names an action outside TRIGGERABLE_ACTIONS | the template is refused by design; report it |
| The standing plan asks again | tools, permissions or the agent version changed | read the new plan and approve it; nothing ran in between |
Related
Source: PRODUCT-PLAN.md Part 7 sections 1, 2, 5 (standing plans, self-pause and backpressure) and 6 (onboarding a twin, twin panel); PRODUCT-CONTRACT.md sections 11.4 and 11.7; api/app/auth/permissions.py (program.twins.use, program.twins.manage); api/app/db/models/twin.py (TWIN_STATUSES, TWIN_PAUSED_REASONS, TRIGGERABLE_ACTIONS); api/scripts/designed-routes.json (POST /programs/{}/twins, .../pause, .../resume, .../run-now); web/lib/content.ts (consoleCopy, twinCopy); web/lib/api/types.ts (TwinCreate, TwinOut); decisions/0021-persona-twins.md