Provision, Test, And Hand Off¶
Provisioning is more than creating a client ID. For an agent-built SigID integration, the deliverable is a reproducible developer workspace: identity resources, a working human login path, test personas and application state, and a deliberate ownership transfer.
What SigID Provisions¶
sigid-cli setup creates the SigID-owned substrate:
| Resource | Purpose |
|---|---|
| Agent identity and local signing key | Authenticates the integrating agent |
| Sandbox organization | Bounds the pre-production workspace and its limits |
| Tenant environment and issuer | Holds login policy, users, branding, and applications |
| OAuth application | Supplies the client ID, redirect contract, and optional once-only secret |
| Tenant-scoped agent token | Lets the agent manage the sandbox within its scopes |
| Fixture human | Exercises the real hosted human authorize path |
| Optional operator invitation | Adds a human co-owner, but does not transfer the agent |
SigID does not provision the integrating application's own sample data. A document, signature request, project, or inbox row lives in that application. The integrating agent must create that data through the application while acting as a fixture human, then record how the developer can reach it.
The Delivery Sequence¶
1. Provision The Sandbox¶
sigid-cli setup \
--idp "$SIGID_IDP" \
--name docs-signing-agent \
--redirect-uri http://localhost:3000/auth/callback
Capture the non-secret resource identifiers from the result: agent_id,
organization_id, application_id, client_id, tenant issuer, and tenant ID.
The CLI writes the first once-only fixture credential to the gitignored,
owner-only .dev/sandbox-fixture.env file.
2. Prepare The Hosted Experience¶
The tenant Branding studio is at Dashboard → Branding → Theme. A human
operator can preview changes on every plan after accepting the handoff. Saved
hosted-login customization requires the tenant branding entitlement; Starter
is the first self-serve paid plan that includes it. An agent-only sandbox cannot
attach billing, and a sandbox fixture has no Dashboard authority. The agent can
prepare the desired values and assets, but must not claim that branding was
previewed or saved before a human operator participates.
The API shape used by the Dashboard is:
PATCH /api/v1/control-plane/tenants/{tenant_id}/config
Authorization: Bearer <organization-authorized token>
Content-Type: application/json
{
"config": {
"branding": {
"app_name": "Acme Sign",
"logo_url": "https://cdn.example.com/acme-sign.svg",
"theme": {
"colors": {
"primary": "#2457E6",
"primary_hover": "#1946C7"
},
"radii": {
"scale": "soft",
"card": "12px"
},
"button_style": "flat"
}
},
"login_page": {
"methods": ["passkey", "password"],
"preferred_method": "passkey"
}
}
}
Use an absolute https logo URL outside local development. Logo URLs accept
only http or https; invalid URLs and unsafe theme values are not rendered.
A save without the entitlement returns 402 payment_required with
feature: "branding".
The first sandbox authorize test therefore uses default SigID branding. After handoff, the developer can preview the prepared design while the organization is still sandbox-tier. Activation retires all fixture humans. After activation and plan selection, save the branding and repeat authorize testing with a normal invited or self-registered test user, not the retired fixture credentials.
3. Test As Human Personas¶
Agent principals manage the integration; they are not human OIDC test users. Bootstrap supplies one ordinary fixture human. Create up to five active fixture humans per sandbox tenant when the application needs multiple roles:
POST /api/v1/sandbox/fixture-users
Authorization: Bearer <tenant token with users:manage>
Idempotency-Key: <new UUID>
Each response returns a generated @test.sigid.dev email and password once.
Use the fixture accounts through the application's normal Sign in button so
hosted login, consent, callback handling, token validation, and application
authorization all run on the production-shaped path. Never use the fixture
accounts to accept an operator handoff; fixtures cannot receive organization
authority.
For role-driven applications, give each fixture a named purpose, for example:
| Persona | Application state to create | Developer check |
|---|---|---|
| Document owner | Draft document and signature request | Open the recorded document URL |
| Signer | Pending signature task | Open the inbox and sign the draft |
| Viewer | Read-only shared document | Confirm editing is denied |
4. Preserve A Reproducible Test Manifest¶
Create .dev/sigid-test-handoff.md or an equivalent secret-free artifact and
deliver it with the handoff. Include:
# SigID test handoff
- Issuer: https://tenant.example
- Client ID: ...
- Application: ...
- Fixture credentials: .dev/sandbox-fixture.env (sent separately)
- Persona: document-owner – fixture user ID ...
- Test URL: http://localhost:3000/documents/...
- Expected state: draft with one pending signer
- Reproduce: sign in, open the URL, invite the signer persona, verify read-only viewer denial
Do not put passwords, bearer tokens, client secrets, or the handoff token in the manifest. If the application cannot provide a durable deep link, record exact navigation and deterministic seed steps. This is the bridge between SIGID's identity handoff and application-owned sample data.
5. Transfer The Agent And Resources¶
After integration and testing, issue an operator handoff:
sigid-cli handoff \
--idp "$SIGID_IDP" \
--organization-id "$SIGID_ORGANIZATION_ID" \
--agent-id "$SIGID_AGENT_ID" \
--application-id "$SIGID_APPLICATION_ID"
Send the returned fragment-bearing link only to the intended developer. The link expires after seven days and is single-use. The developer signs in with their own human SigID account and accepts. Acceptance:
- transfers
agent.owner_user_idto that human; - grants organization co-ownership by default; and
- grants the application-targeted
developerrole for every supplied--application-id.
Use sigid-cli invite only when the human should gain resource access without
owning the agent. Temporary human-to-agent AAL2 delegation is also separate; a
handoff does not create it.
6. Preview, Activate, Save, And Retest Branding¶
The accepting developer opens Dashboard → Branding → Theme and previews the
prepared app name, logo, theme, and login-method configuration while the
organization is still sandbox-tier. When ready for production, the human owner
completes the separate AAL2 activation ceremony and selects a plan with the
branding entitlement before saving.
Activation intentionally retires the sandbox fixture accounts. Create or invite a normal production test user, repeat the hosted authorize/callback flow, and update the test manifest with the production-safe test path. Never carry a standing sandbox demo password into production.
Handoff Checklist¶
- The real hosted authorize/callback path passes with a fixture human.
- Multiple application roles use separate fixture humans, not agent accounts.
- Application-owned sample data has a deep link or deterministic seed recipe.
- Fixture credentials remain in a private, gitignored file or secret channel.
- The accepting human previewed app name, logo, theme, and login methods.
- Saved branding was tested after activation and entitlement with a normal non-fixture user.
- The handoff includes every application the developer must manage.
- The developer accepted with their own human account and reproduced the test.