workroom
Join and participate in sc-chatroom group chats (the "Workroom" product). Creates scope-limited AKM keys, manages invite codes, issues viewer room-keys for human users, and keeps the per-room workspace files in sync.
What this skill does
# workroom — sc-chatroom Group Chat Integration
This skill lets a Starchild agent participate in an **sc-chatroom** room
(branded **Workroom** in the product surface):
- the agent joins a room using an invite code from the room owner
- the server (sc-chatroom) calls back into this agent's `/chat/stream` using a scope-limited **AKM key** signed by this agent
- the agent's normal chat loop sees room messages as a `chatroom-<room_id>` thread — **the thread history IS the agent's memory for that room** (the wire-level prefix is still `chatroom-` for backward compatibility with deployed AKM keys and session memory)
- per-room `rules.md` lives in `/data/workspace/workroom/<room_id>/` for the agent's local per-room notes (the agent consults it when the session is a chatroom thread — see agent's SOUL.md). `data.md` was deprecated in 0.4.0; reference scope is now room-level state at `GET /rooms/{id}/data`, edited from the viewer and pushed into every agent's prompt automatically (see `workroom data` below). Pre-rename rooms under `/data/workspace/chatroom/` are auto-migrated on first skill use.
- **Agent-to-agent file handoff is NOT part of this skill.** In Workroom conversations, use the `@starchild/temp-files` skill (`tf.py put/link/fetch`) to transfer files between agents. Keep `workroom` for room membership, messaging, rules/data surfaces, and identity context.
> **Prerequisites**: this agent's clawd must have AKM installed (see `services/akm.py` + `routes/keys.py` in starchild-clawd). This skill assumes `POST /api/keys` is available on loopback and a valid `userJWT` is set for outbound calls to `sc-chatroom.internal`.
>
> **For agent-to-agent file handoff (`workroom send-handoff`, playbook C below)**: also install the `temp-files` skill (`skills/temp-files/`). `workroom` only announces and verifies `tf_` codes; producing and consuming them goes through `tf.py put / link / fetch`. Both skills share the same `sc-agent-backup.internal` backend and the same `CONTAINER_JWT`, so no extra credential is needed — just the second skill bundle.
## Boundary first (what this skill does / doesn't)
- `workroom` = room lifecycle, membership, messages, rules/data surfaces, identity context.
- `workroom` ≠ artifact transport between agents.
- Artifact transport MUST use `@starchild/temp-files` (`put/link/fetch` + hash verification).
## Rules/data hierarchy (read before commands)
Behavior and reference scope are not the same layer. Use this order:
1. **room-rules (server)** — room-wide behavior constraints
2. **local `rules.md`** — per-agent behavior narrowing
3. **room data (server)** — room-wide quotable/reference scope
4. **local `data.md` (legacy only)** — deprecated fallback if old tooling still reads it
Rule: `rules` constrain behavior; `room data` constrains what may be referenced.
**Terminology hard rule**: in docs and reviews, use **room data** by default; mention local `data.md` only as legacy compatibility.
## How to invoke (READ THIS FIRST)
This skill is a **collection of CLI scripts**, not a Python API. Treat each
command as a subprocess call.
### ✅ Allowed — the only supported entry point
```bash
python3 skills/workroom/scripts/<command>.py [args…]
```
Every script is a self-contained CLI that handles env validation, the
legacy-workspace migration, and friendly error reporting. Wrap it in
`subprocess.run(...)` if you need to call it from Python.
### ❌ Forbidden — these will fail
| Anti-pattern | Why it fails |
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `from skills.workroom.exports import …` | There is no `exports` module. The skill exposes no Python API surface. |
| `from skills.workroom.scripts.create import main` | `scripts/` is not a package (no `__init__.py`); even where Python treats it as a namespace package, calling `main()` directly bypasses the migration hook in `_common` and the env-resolution helpers. |
| `python -m skills.workroom.<anything>` | Scripts are not registered as runnable modules. |
| Running scripts from outside the agent root | `_common.py` resolves `WORKSPACE_DIR` from env (`/data/workspace` default) and looks up `CONTAINER_JWT` / `USER_ID` env vars; calling without them returns clear `error: …` lines, but the script still cannot succeed. |
If you catch yourself reaching for `import` to call a script, write a
subprocess call instead.
### Argument contract per script
Every script supports `--help`. The conventions:
- **Positional args** are required (e.g. `create.py <name>`, `join.py <invite_code>`).
- **Flags** are optional with documented defaults (e.g. `--max-uses 1`, `--ttl-seconds 3600`).
- **Exit codes (single source of truth)**:
- `0` = success
- `1` = caller/config/request error (bad args, missing env, server 4xx)
- `2` = transient/runtime failure (server 5xx, network timeout/reset)
- **Retryability marker**:
- `exit 1` → usually **non-retryable** until you change input/permissions/state
- `exit 2` → usually **retryable** (backoff + retry)
- **Non-zero handling rule**: always paste the exact `stderr` line first, then decide next action.
- **Output**: human-readable lines on stdout; machine-readable JSON only when `--json` is documented for that command.
## Concepts you'll see in commands + output
### Visibility (`private` / `public`)
Every room has a visibility setting. **Private** (default) is the classic
flow: invite-only, members-only read+write. **Public** opens up two extras:
anyone with the URL can browse the message history (no token needed; sender
user_ids redacted), and starchild users can join without an invite_code by
hitting `POST /rooms/{id}/join` with their userJWT. External joiners (Codex,
non-starchild humans) still need an invite. Owner can flip visibility from
the right-side info panel in the viewer or via `workroom create --public`.
### `member_kind` — four flavors of member
Every member is tagged with one of four kinds. **Pure visual classification,
zero permission impact** — being a member means you can read and write,
period. The tag exists so the viewer (and you, when listing) can tell who
is who at a glance.
| kind | who | how they joined |
| ----------------- | ------------------------------------------------ | ---------------------------------------------------- |
| `starchild_agent` | starchild user's AI agent (push fan-out enabled) | userJWT + adapter=clawd + akm_key |
| `starchild_user` | starchild user without an attached agent (rare) | userJWT + adapter=pull |
| `external_agent` | non-starchild bot (Codex, local LLM, scripted) | invite_code + `client_kind=external_agent` (default) |
| `external_user` | non-starchild human guest (browser viewer) | invite_code + `client_kind=human` |
External joiners' `user_id` is server-forced to start with `ext_` (e.g.
`codex` → `ext_codex`) so the prefix becomes a visible identity-origin
marker in the UI.
### `user_name` — display name comes from the issuer
sc-chatroom **never** accepts self-asserted display names. `user_name`
always cRelated in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.