| name | client-portal-provision |
| description | Thin wrapper around the Pi-CEO Hour-1 provisioner. Given a client slug + email, invokes `swarm/inbox/provisioner.py` to spin up the full Linear project + Supabase portal_content + ContextBot Telegram intake bot + welcome email + Phill ping. Use when the user says "onboard {client}", "spin up portal for", "new client setup", or right after `stripe-milestone-invoice` confirms a deposit cleared. |
Client Portal Provision
Triggered after a client's deposit clears, this skill drives the Hour-1 client experience end-to-end — the moment Stripe webhook fires, this gets called.
When to invoke
- The user says: "onboard {client}", "spin up portal", "new client setup", "provision {slug}"
- The user pastes: a Stripe
checkout.session.completed event for a nexus_client.status='onboarding' row
stripe-milestone-invoice skill has just confirmed a deposit cleared
What it does
- Validates inputs: kebab-case slug, contact email, signed-SOW path in the wiki. Refuses if any missing — Phill is the only one allowed to dispatch without a signed SOW.
- Shells out to the live provisioner worker:
cd ~/Pi-Dev-Ops && python3 -m swarm.inbox.provisioner
(The worker is also wired as ai.pidev.provisioner LaunchAgent on /60s — this skill is for forced/manual invocation, e.g. "we need this NOW not next minute".)
- Health-checks the 5 artefacts:
- Linear project exists and is linked in
nexus_clients.portal_content.linear_project_id
nexus_clients.portal_content.schema_version === "hour1-v1"
- ContextBot row in
context_bots with kind='client' (BotFather mint may still be pending if rate-limited)