You help an agent's human use the Immersive Commons PICO lending program end-to-end. The fleet is 8 PICO 4 Ultra Enterprise units (IC1..IC8) on Floor 10 of Frontier Tower SF; through 2026-06-14 they do not leave the floor.
This skill is the agent walkthrough. The human-facing canonical doc is at https://www.immersivecommons.com/floor10/headsets/handling (markdown variant: /floor10/headsets/handling.md).
Pre-flight (every session)
Token check. Need FLOOR10_AGENT_TOKEN with at minimum headsets:read. Member writes also need headsets:lend and/or headsets:report_damage. Operator triage needs admin:headsets_review. Smoke probe:
curl -H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \
-X POST -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"tools/call","params":{"name":"ic_headsets_list_inventory","arguments":{}}}' \
https://www.immersivecommons.com/api/mcp
200 + a tools/call result = good. 401 = no/bad token. 403 = scope missing.
Identity check. The human's IC tier (ic-member minimum for lending) is enforced server-side via the agent token's bound Clerk identity. If the human isn't ic-member, the lend tools will refuse and the agent should walk them through ic_request_tier first (see the ic-onboarding skill).
The four common flows
A. "Lend me a PICO"
Order matters — each step gates the next.
Check waiver freshness.
{ "name": "ic_headsets_check_waiver", "arguments": {} }
Response state is one of fresh | stale-version | expired | missing.
fresh → skip to step 3.
stale-version / expired / missing → continue to step 2.
Sign the waiver. The agent supplies the human's name + email + signed_typed string (the human's actual typed name). Phone + telegram are optional but recommended. Don't fabricate values — surface the form fields to the human and let them dictate.
{
"name": "ic_headsets_sign_waiver",
"arguments": {
"name": "Jane Founder",
"email": "jane@example.com",
"phone": "+1...",
"telegram": "@janef",
"signature_typed": "Jane Founder",
"photo_consent": "yes"
}
}
Returns { ok, record_id, expires_at }. Hard rules: the agent does NOT supply the ring field — the server derives it from the live tier. The agent does NOT fabricate the typed signature — that's the human's actual keystroke string.
Browse inventory.
{ "name": "ic_headsets_list_inventory", "arguments": {} }
Filter to status: "available". If none available, surface what's in the queue and tell the human; do NOT try to bypass the gate.
Checkout.
{ "name": "ic_headsets_checkout", "arguments": { "unit_id": "IC1" } }
Returns { ok, lend_id, due_back_at } on success. Error kinds:
no_waiver → loop back to step 1 (race; sign waiver expired between check and checkout).
already_lending (with existing_lend_id) → human already has a lend out; surface it.
unit_not_found / unit_not_available → race; re-list inventory and pick another.
Surface the lend_id and due_back_at to the human. Default due_back_at is end-of-floor-day OR +4h from checkout, whichever is sooner.
B. "Return my lend"
Find the active lend.
{ "name": "ic_headsets_get_my_lend", "arguments": {} }
Returns { lend: LendRecord | null }. If null, tell the human they have no active lend.
Confirm condition with the human. Ask: "clean return, or any damage / hygiene flag?"
Submit return.
{
"name": "ic_headsets_return",
"arguments": { "lend_id": "lnd_...", "damaged": false }
}
On clean return (damaged: false), unit goes back to the available pool. On damaged: true, the unit auto-flips to out-of-service AND the agent MUST follow up with ic_headsets_report_damage so the incident details land (otherwise the unit sits OOS with no triage record).
C. "Report damage on a unit"
Any IC member can file (the borrower, a witness, ops staff). The damage form is permissive on roles but strict on content — description must be 20+ chars and specific.
{
"name": "ic_headsets_report_damage",
"arguments": {
"unit": "IC2",
"type": "lens",
"description": "Visible scratch on the right lens center, about 3mm long. Borrower confirms it was there at handover. Discovered during the post-flight inspection.",
"reporter_name": "Jane Founder",
"reporter_role": "borrower",
"reporter_contact": "@janef",
"lend_id": "lnd_...",
"photo": "data:image/jpeg;base64,..."
}
}
Fields:
type: one of lens | shell | controller | battery | hygiene | loss | near-miss | other. Pick the closest match; other is fine when none fit.
reporter_role: ops-staff | borrower | member (witness).
lend_id (optional but useful): if present, the lend record's damage_flag + damage_incident_id get back-filled.
photo (optional but strong): base64 data URL, capped at ~5MB raw. Decline to attach if the human doesn't have one — text-only reports still triage.
Returns { ok, incident_id }. The Telegram fanout fires within 60 seconds via node-side ic-notify. Do NOT tell the human "operations was paged instantly" — tell them "within a minute."
D. Operator triage (operator-only)
If the human is an IC operator and is asking about the queue:
{ "name": "ic_headsets_admin_list_active_lends", "arguments": {} }
{ "name": "ic_headsets_admin_list_open_incidents", "arguments": { "limit": 50 } }
Mutation verbs:
ic_headsets_admin_mark_oos — pull a non-lent unit from rotation. Args: { unit_id, reason }.
ic_headsets_admin_clear_oos — return a unit to the available pool. Refuses if an open incident exists on it — resolve the incident first.
ic_headsets_admin_force_return — close a stuck lend (member unreachable, end-of-day cleanup). Args: { lend_id, reason }. Releases the per-member NX lock so the borrower can lend again.
ic_headsets_admin_resolve_incident — triage verdict + audit note. Args: { incident_id, verdict, resolution }. Verdicts:
absorbed — IC eats the cost (waiver §11 good-faith).
willful-misuse — member charged. Unit stays OOS.
resolved — back to rotation, no charge. Auto-clears OOS as a side effect.
Always ask the operator for the resolution note. Don't invent one.
Hard rules
- Do not invent typed signatures. The
signature_typed field is the human's actual keystrokes. If the human won't type it themselves, abort — agents that synthesize signatures break the audit trail.
- Do not fabricate incident descriptions. If the human can't describe the damage, surface the standard categories and let them pick, but the prose must come from them or from a photo the agent can describe.
- Do not bypass the waiver step. A
no_waiver error from ic_headsets_checkout means the human MUST sign before the lend will work. There's no override.
- Do not transport off-floor. Through 2026-06-14, the lending program is floor-only. The waiver §9 is explicit; off-floor use is willful misuse under §11.
- Do not retry on
unit_not_available / already_lending. These are race-loss states. Re-fetch inventory and either pick a different unit OR surface the existing lend to the human.
- Surface incident IDs. When the agent files damage, tell the human the
incident_id and that Ray will see it on Telegram within a minute. Don't promise immediate triage.
Quickstart for fresh agents
- Token: see the
ic-onboarding skill for the RFC 8628 device-code flow. Request scope set: ["read:public", "membership:read", "headsets:read", "headsets:lend", "headsets:report_damage"] for a full member-side token.
- Smoke probe:
ic_headsets_list_inventory over MCP. 200 = good.
- Loop the four flows above on demand.
Related skills
ic-onboarding — RFC 8628 device-code signup; how the human authorizes scopes.
ic-events — Sister surface; same auth model.
ic-signed-agent — Optional Ed25519 signed-request upgrade so a leaked bearer alone is useless.
Discovery surfaces
1---2name: ic-headsets3description: Walk an IC member's agent through the PICO 4 Ultra Enterprise lending lifecycle — check waiver status, sign waiver if needed, browse inventory, check out a unit, return it, file a damage report. Operator-tier agents can additionally triage active lends, mark / clear out-of-service, force-return stuck lends, and resolve incidents. Use when the human says "lend me a PICO", "I want to borrow a headset", "check the PICO inventory", "return IC1", "file damage on IC2", "what's still out", or any flavor of "headset / VR / PICO" against the Immersive Commons program. Requires an IC agent token with scopes from `headsets:read` (read-only) up through `headsets:lend` + `headsets:report_damage` (member writes) and `admin:headsets_review` (operator). Official immersivecommons.com skill.4---56You help an agent's human use the Immersive Commons PICO lending program end-to-end. The fleet is 8 PICO 4 Ultra Enterprise units (`IC1`..`IC8`) on Floor 10 of Frontier Tower SF; through 2026-06-14 they do not leave the floor.78This skill is the agent walkthrough. The human-facing canonical doc is at https://www.immersivecommons.com/floor10/headsets/handling (markdown variant: `/floor10/headsets/handling.md`).910## Pre-flight (every session)11121. **Token check.** Need `FLOOR10_AGENT_TOKEN` with at minimum `headsets:read`. Member writes also need `headsets:lend` and/or `headsets:report_damage`. Operator triage needs `admin:headsets_review`. Smoke probe:13 ```bash14 curl -H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \15 -X POST -H "content-type: application/json" \16 -d '{"jsonrpc":"2.0","id":"1","method":"tools/call","params":{"name":"ic_headsets_list_inventory","arguments":{}}}' \17 https://www.immersivecommons.com/api/mcp18 ```19 200 + a tools/call result = good. 401 = no/bad token. 403 = scope missing.20212. **Identity check.** The human's IC tier (`ic-member` minimum for lending) is enforced server-side via the agent token's bound Clerk identity. If the human isn't `ic-member`, the lend tools will refuse and the agent should walk them through `ic_request_tier` first (see the `ic-onboarding` skill).2223## The four common flows2425### A. "Lend me a PICO"2627Order matters — each step gates the next.28291. **Check waiver freshness.**30 ```jsonc31 { "name": "ic_headsets_check_waiver", "arguments": {} }32 ```33 Response `state` is one of `fresh` | `stale-version` | `expired` | `missing`.34 - `fresh` → skip to step 3.35 - `stale-version` / `expired` / `missing` → continue to step 2.36372. **Sign the waiver.** The agent supplies the human's name + email + signed_typed string (the human's actual typed name). Phone + telegram are optional but recommended. Don't fabricate values — surface the form fields to the human and let them dictate.38 ```jsonc39 {40 "name": "ic_headsets_sign_waiver",41 "arguments": {42 "name": "Jane Founder",43 "email": "jane@example.com",44 "phone": "+1...",45 "telegram": "@janef",46 "signature_typed": "Jane Founder",47 "photo_consent": "yes"48 }49 }50 ```51 Returns `{ ok, record_id, expires_at }`. Hard rules: the agent does NOT supply the `ring` field — the server derives it from the live tier. The agent does NOT fabricate the typed signature — that's the human's actual keystroke string.52533. **Browse inventory.**54 ```jsonc55 { "name": "ic_headsets_list_inventory", "arguments": {} }56 ```57 Filter to `status: "available"`. If none available, surface what's in the queue and tell the human; do NOT try to bypass the gate.58594. **Checkout.**60 ```jsonc61 { "name": "ic_headsets_checkout", "arguments": { "unit_id": "IC1" } }62 ```63 Returns `{ ok, lend_id, due_back_at }` on success. Error kinds:64 - `no_waiver` → loop back to step 1 (race; sign waiver expired between check and checkout).65 - `already_lending` (with `existing_lend_id`) → human already has a lend out; surface it.66 - `unit_not_found` / `unit_not_available` → race; re-list inventory and pick another.67 Surface the `lend_id` and `due_back_at` to the human. Default `due_back_at` is end-of-floor-day OR +4h from checkout, whichever is sooner.6869### B. "Return my lend"70711. **Find the active lend.**72 ```jsonc73 { "name": "ic_headsets_get_my_lend", "arguments": {} }74 ```75 Returns `{ lend: LendRecord | null }`. If `null`, tell the human they have no active lend.76772. **Confirm condition with the human.** Ask: "clean return, or any damage / hygiene flag?"78793. **Submit return.**80 ```jsonc81 {82 "name": "ic_headsets_return",83 "arguments": { "lend_id": "lnd_...", "damaged": false }84 }85 ```86 On clean return (`damaged: false`), unit goes back to the available pool. On `damaged: true`, the unit auto-flips to `out-of-service` AND the agent MUST follow up with `ic_headsets_report_damage` so the incident details land (otherwise the unit sits OOS with no triage record).8788### C. "Report damage on a unit"8990Any IC member can file (the borrower, a witness, ops staff). The damage form is permissive on roles but strict on content — `description` must be 20+ chars and specific.9192```jsonc93{94 "name": "ic_headsets_report_damage",95 "arguments": {96 "unit": "IC2",97 "type": "lens",98 "description": "Visible scratch on the right lens center, about 3mm long. Borrower confirms it was there at handover. Discovered during the post-flight inspection.",99 "reporter_name": "Jane Founder",100 "reporter_role": "borrower",101 "reporter_contact": "@janef",102 "lend_id": "lnd_...",103 "photo": "data:image/jpeg;base64,..."104 }105}106```107108Fields:109- `type`: one of `lens` | `shell` | `controller` | `battery` | `hygiene` | `loss` | `near-miss` | `other`. Pick the closest match; `other` is fine when none fit.110- `reporter_role`: `ops-staff` | `borrower` | `member` (witness).111- `lend_id` (optional but useful): if present, the lend record's `damage_flag` + `damage_incident_id` get back-filled.112- `photo` (optional but strong): base64 data URL, capped at ~5MB raw. Decline to attach if the human doesn't have one — text-only reports still triage.113114Returns `{ ok, incident_id }`. The Telegram fanout fires within 60 seconds via node-side ic-notify. Do NOT tell the human "operations was paged instantly" — tell them "within a minute."115116### D. Operator triage (operator-only)117118If the human is an IC operator and is asking about the queue:119120```jsonc121{ "name": "ic_headsets_admin_list_active_lends", "arguments": {} }122{ "name": "ic_headsets_admin_list_open_incidents", "arguments": { "limit": 50 } }123```124125Mutation verbs:126- `ic_headsets_admin_mark_oos` — pull a non-lent unit from rotation. Args: `{ unit_id, reason }`.127- `ic_headsets_admin_clear_oos` — return a unit to the available pool. Refuses if an open incident exists on it — resolve the incident first.128- `ic_headsets_admin_force_return` — close a stuck lend (member unreachable, end-of-day cleanup). Args: `{ lend_id, reason }`. Releases the per-member NX lock so the borrower can lend again.129- `ic_headsets_admin_resolve_incident` — triage verdict + audit note. Args: `{ incident_id, verdict, resolution }`. Verdicts:130 - `absorbed` — IC eats the cost (waiver §11 good-faith).131 - `willful-misuse` — member charged. Unit stays OOS.132 - `resolved` — back to rotation, no charge. Auto-clears OOS as a side effect.133134Always ask the operator for the resolution note. Don't invent one.135136## Hard rules137138- **Do not invent typed signatures.** The `signature_typed` field is the human's actual keystrokes. If the human won't type it themselves, abort — agents that synthesize signatures break the audit trail.139- **Do not fabricate incident descriptions.** If the human can't describe the damage, surface the standard categories and let them pick, but the prose must come from them or from a photo the agent can describe.140- **Do not bypass the waiver step.** A `no_waiver` error from `ic_headsets_checkout` means the human MUST sign before the lend will work. There's no override.141- **Do not transport off-floor.** Through 2026-06-14, the lending program is floor-only. The waiver §9 is explicit; off-floor use is willful misuse under §11.142- **Do not retry on `unit_not_available` / `already_lending`.** These are race-loss states. Re-fetch inventory and either pick a different unit OR surface the existing lend to the human.143- **Surface incident IDs.** When the agent files damage, tell the human the `incident_id` and that Ray will see it on Telegram within a minute. Don't promise immediate triage.144145## Quickstart for fresh agents1461471. Token: see the `ic-onboarding` skill for the RFC 8628 device-code flow. Request scope set: `["read:public", "membership:read", "headsets:read", "headsets:lend", "headsets:report_damage"]` for a full member-side token.1482. Smoke probe: `ic_headsets_list_inventory` over MCP. 200 = good.1493. Loop the four flows above on demand.150151## Related skills152153- `ic-onboarding` — RFC 8628 device-code signup; how the human authorizes scopes.154- `ic-events` — Sister surface; same auth model.155- `ic-signed-agent` — Optional Ed25519 signed-request upgrade so a leaked bearer alone is useless.156157## Discovery surfaces158159- Agent card: https://www.immersivecommons.com/.well-known/agent-card.json160- Aiia manifest: https://www.immersivecommons.com/.well-known/ai-agent.json161- MCP discovery: https://www.immersivecommons.com/.well-known/mcp.json162- llms.txt URL map: https://www.immersivecommons.com/llms.txt163- Human-facing handling rules: https://www.immersivecommons.com/floor10/headsets/handling164- Markdown variant: https://www.immersivecommons.com/floor10/headsets/handling.md