Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manage Happier sessions (list/status/send/wait/history/stop + execution runs) via the happier CLI JSON contract.
.claude/skills/happier-dev-happier-session-control/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 56% | 0% |
This skill enables an agent framework (for example OpenClaw) to control Happier sessions using the existing happier CLI in --json mode.
happier CLI is installed and authenticated.session (prefix-only):happier --server <profile-id-or-name> session list --jsonhappier --server-url <url> --webapp-url <url> session list --jsonAll JSON outputs are a pure-stdout envelope:
json{ "v": 1, "ok": true, "kind": "...", "data": {} }
or:
json{ "v": 1, "ok": false, "kind": "...", "error": { "code": "..." } }
Common error codes to handle:
not_authenticated: run happier auth login on the host (or mount/provide a valid HAPPIER_HOME_DIR).session_id_ambiguous: pick deterministically from error.candidates (prefer exact id; otherwise ask the user).session_not_found: call happier session list --json and retry.unsupported: feature disabled by server policy or backend doesn’t support the requested intent.Use an independent Happier session only when the user asks for new sessions or when an invoking workflow explicitly selects that topology. Native subagents remain the owner for in-session delegation.
When an independent session owns a complete work bundle:
initialMessage, descriptive title and tag, the intended repository path, and only user-selected or safely resolved machine/profile/backend/model options;read-only permission mode for diagnosis when the selected backend supports it, plus an explicit no-write constraint in the brief. Permission modes are backend-applied policy, not a universal security sandbox; do not overclaim enforcement;Use monitoring only when the user asks the parent to supervise, consolidate, or continue after the child. In that case, session.wait.idle, session.transcript.get, and session.message.send are optional follow-up tools, not part of the default spawn flow.
The Happier MCP action ids are:
session.spawn_new — accepts initialMessage, title, tag, path, machineId, profileId, backend/model selection, and permissionMode;session.wait.idle — optional monitoring;session.transcript.get — optional transcript retrieval;session.message.send — optional follow-up or correction.The MCP binding names are session_spawn_new, session_wait_idle, session_transcript_get, and session_message_send. When actions are unavailable, use the corresponding CLI JSON commands below where the needed options are supported, or report the missing capability instead of silently changing topology.
Check auth status without scraping human output:
bashhappier auth status --json
List sessions:
bashhappier session list --json
Inspect session status (server snapshot):
bashhappier session status <session-id-or-prefix> --json
Inspect session status with a best-effort live refresh:
bashhappier session status <session-id-or-prefix> --live --json
Create/load a session by tag:
bashhappier session create --tag <tag> --json
Send a message to a session:
bashhappier session send <session-id-or-prefix> "<message>" --json
Send a message and wait until the session is idle:
bashhappier session send <session-id-or-prefix> "<message>" --wait --timeout 300 --json
Wait for a session to become idle:
bashhappier session wait <session-id-or-prefix> --timeout 300 --json
Stop a session:
bashhappier session stop <session-id-or-prefix> --json
Read session history (compact is recommended for prompt stuffing):
bashhappier session history <session-id-or-prefix> --limit 50 --format compact --json
Start an execution run:
bashhappier session run start <session-id-or-prefix> --intent review --backend claude --json
List runs for a session:
bashhappier session run list <session-id-or-prefix> --json
Get a run:
bashhappier session run get <session-id-or-prefix> <run-id> --include-structured --json
Send input to a run:
bashhappier session run send <session-id-or-prefix> <run-id> "<message>" --json
Stop a run:
bashhappier session run stop <session-id-or-prefix> <run-id> --json
Execute an action on a run:
bashhappier session run action <session-id-or-prefix> <run-id> <action-id> --input-json '<json>' --json
Wait for a run to finish:
bashhappier session run wait <session-id-or-prefix> <run-id> --timeout 300 --json
Stream turn IO for a streaming run (e.g. intent=voice_agent):
bashhappier session run stream-start <session-id-or-prefix> <run-id> "<message>" --json happier session run stream-read <session-id-or-prefix> <run-id> <stream-id> --cursor 0 --json happier session run stream-cancel <session-id-or-prefix> <run-id> <stream-id> --json
List server profiles:
bashhappier server list --json
Current active server:
bashhappier server current --json
Add a server profile non-interactively:
bashhappier server add --name "My Server" --server-url https://example.com --webapp-url https://example.com --use --json
Switch active server:
bashhappier server use <id-or-name> --json
Remove a server profile:
bashhappier server remove <id-or-name> --force --json
Probe server reachability/version:
bashhappier server test [<id-or-name>] --json
Set a one-off custom server as active:
bashhappier server set --server-url https://example.com --webapp-url https://example.com --json
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 11,902 | 36,919 | +210% | 1 | 1 | 0% | 1,078 | 3,794 | +252% | 0 | 0 | — |
case-02 | fail→fail | 24,843 | 8,197 | -67% | 1 | 1 | 0% | 3,238 | 2,251 | -30% | 0 | 0 | — |
case-03 | fail→pass | 16,137 | 11,119 | -31% | 1 | 1 | 0% | 1,885 | 2,821 | +50% | 0 | 0 | — |
case-04 | fail→pass | 12,120 | 7,056 | -42% | 1 | 1 | 0% | 1,274 | 2,005 | +57% | 0 | 0 | — |
case-05 | fail→pass | 15,919 | 7,661 | -52% | 1 | 1 | 0% | 2,036 | 2,179 | +7% | 0 | 0 | — |
case-06 | fail→pass | 17,523 | 8,023 | -54% | 1 | 1 | 0% | 1,987 | 2,027 | +2% | 0 | 0 | — |
case-07 | fail→pass | 12,673 | 8,597 | -32% | 1 | 1 | 0% | 1,410 | 2,206 | +56% | 0 | 0 | — |
case-08 | fail→pass | 11,311 | 7,306 | -35% | 1 | 1 | 0% | 1,181 | 2,094 | +77% | 0 | 0 | — |
case-09 | fail→pass | 15,390 | 8,397 | -45% | 1 | 1 | 0% | 1,958 | 2,108 | +8% | 0 | 0 | — |
case-10 | fail→pass | 12,821 | 7,269 | -43% | 1 | 1 | 0% | 1,295 | 2,005 | +55% | 0 | 0 | — |
case-11 | fail→fail | 9,667 | 8,168 | -16% | 1 | 1 | 0% | 715 | 1,959 | +174% | 0 | 0 | — |
case-12 | pass→fail | 16,940 | 7,847 | -54% | 1 | 1 | 0% | 1,904 | 2,143 | +13% | 0 | 0 | — |
case-13 | pass→pass | 9,416 | 7,759 | -18% | 1 | 1 | 0% | 766 | 2,083 | +172% | 0 | 0 | — |
case-14 | fail→pass | 18,013 | 7,024 | -61% | 1 | 1 | 0% | 2,624 | 2,011 | -23% | 0 | 0 | — |
case-15 | fail→pass | 12,447 | 7,900 | -37% | 1 | 1 | 0% | 1,378 | 2,046 | +48% | 0 | 0 | — |
case-16 | fail→pass | 13,573 | 7,545 | -44% | 1 | 1 | 0% | 1,616 | 2,109 | +31% | 0 | 0 | — |
case-17 | fail→pass | 10,414 | 6,952 | -33% | 1 | 1 | 0% | 880 | 1,996 | +127% | 0 | 0 | — |
case-18 | fail→pass | 13,084 | 7,170 | -45% | 1 | 1 | 0% | 1,364 | 2,130 | +56% | 0 | 0 | — |
case-19 | fail→pass | 10,611 | 9,129 | -14% | 1 | 1 | 0% | 912 | 1,950 | +114% | 0 | 0 | — |
case-20 | pass→pass | 10,565 | 9,152 | -13% | 1 | 1 | 0% | 1,014 | 2,427 | +139% | 0 | 0 | — |
case-21 | pass→pass | 12,003 | 10,155 | -15% | 1 | 1 | 0% | 1,242 | 2,525 | +103% | 0 | 0 | — |
case-22 | pass→pass | 12,427 | 9,119 | -27% | 1 | 1 | 0% | 1,335 | 2,433 | +82% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/17/2026 | +79% |
| gemini-3.6-flash | verified | 8/13/2026 | +50% |
Other measured skills in the registry, with their headline benchmark lift.