humanloop
Pause agent execution to have the human validate decisions, choose between options, answer freetext, or comment on a document — via the `hl` CLI. Every interaction is a kickoff that returns a job handle immediately; collect the human's answer later with `hl job result`. Use for material design decisions, approval gates, picks between meaningful alternatives, and markdown doc review. Not for trivial yes/no confirmations the agent should decide itself.
What this skill does
# humanloop — Human-in-the-Loop Decision Skill
Use the `hl` CLI to ask the human a structured set of questions (a *deck*) or get freeform comments on a markdown doc (a *review*). It opens a TUI (auto-splits a tmux pane when `$TMUX` is set), persists progress to disk, and returns JSON.
Every interaction is a **kickoff**: the launch call (`hl deck ask`, `hl review open`) spawns the human's TUI in a detached pane and returns a `job_id` in well under a second — it does *not* wait for the human. You collect the answer separately with `hl job result`. See **[Long-running: kick off, then collect](#long-running-kick-off-then-collect)** — this is the single most important thing to get right, because a human may take many minutes or step away entirely.
## When to use this
Reach for `hl` when the next step materially depends on a human judgment you cannot make alone:
- **Design decisions** with real tradeoffs (Postgres vs SQLite, library choice, data model).
- **Approval gates** before an irreversible or expensive action (schema migration, mass refactor, deploy).
- **Picks between alternatives** where you have 2+ reasonable options and no strong reason to prefer one.
- **Batches of 2+ structured questions**. For a single freetext question, ask inline — `hl` is for batched, structured review.
## When NOT to use this
- Trivial yes/no the agent should answer itself (e.g. "should I write tests?" — yes).
- Questions with obvious correct answers given the code and context.
- Routine confirmations (Claude Code already prompts for destructive tool calls).
- Single freetext questions where a chat reply is lower friction.
## Audience and content philosophy
The deck is read by a busy, technical human. Write with **progressive disclosure** so the reader can stop at any layer:
| Field | Role | Guidance |
|-------|------|----------|
| `title` | Inbox label | Noun-phrase topic (≤4 words). The *thing* being decided, not the decision. `Database`, not `Use Postgres`. |
| `subtitle` | TL;DR | One plain-English sentence framing the choice or stakes. Action-ready if the call is obvious. No jargon, no library names without context. |
| `body` | ELI12 explanation | Plain language up top — audience is a smart engineer joining the codebase. Tuck anything denser (technical specifics, alternatives considered, edge cases) under a heading like `## Details` or `## Alternatives` so the reader can skip past. Every layer below the TL;DR is optional reading. |
| `options[]` | Genuine alternatives | Two or more real picks. Empty array = freetext-only. |
| `allowFreetext` | Comment + escape hatch | Set true when you want a comment alongside a choice, or to let the human write their own answer. |
**Avoid**: walls of jargon, raw schema dumps or stack traces in `body`, titles that bury the topic, subtitles that restate the title, options that are not real alternatives.
## Workflow
Every leaf reads **one JSON object from stdin** and writes one JSON object to stdout. There are no file-path arguments — pipe the input in.
1. Build the deck object (see the example below); validate it with `hl deck validate` if unsure.
2. **Kick off:** `echo '{"deck":{…}}' | hl deck ask` → returns `{job_id, dir, follow_up}` immediately. The human's TUI is now open in a pane; you are *not* blocked.
3. **Collect** (see [Long-running](#long-running-kick-off-then-collect)): `echo '{"job_id":"…","wait":true}' | hl job result` blocks until the human finishes, then prints the resolution. Run this **backgrounded**.
4. Parse the output. Match answers to questions by `id` — **never by index**, since the human can skip questions.
5. Act on the answers.
## Long-running: kick off, then collect
The human is slow and may walk away. Treat every interaction as fire-and-forget plus a deferred collect:
- **`hl deck ask` and `hl review open` return in <1s** with a `job_id`. They never wait for the human. The `follow_up` string in their output tells you the exact collect call.
- **Collect with `hl job result`** + `{"wait":true}`. This is the call that blocks until the human finishes (or `{"wait":false}` to poll once — returns `{error:"not_ready"}` exit 1 if they're not done).
- **Run the waiting collect as a backgrounded task — do not await it inline.** In Claude Code, set the Bash call to `run_in_background`; you will be notified when it completes, and you stay free to do other work meanwhile. Blocking the foreground on a human who might take 20 minutes (and overrunning the 10-minute command ceiling) is the failure this design exists to prevent.
- **Inspect without collecting:** `hl job status` → `{state: live|done|failed|canceled, kind, age_seconds, last_event}`. `hl job logs` streams JSONL events. `hl job cancel` is best-effort.
- **Mid-flight edits:** while a deck job is live, `hl deck update` rewrites its questions and the pane reloads within ~1s (answers to surviving ids are kept).
## Input example (pyramid content)
```json
{
"title": "Capture pipeline decisions",
"interactions": [
{
"id": "db",
"title": "Database",
"subtitle": "Postgres or SQLite for the new capture store?",
"body": "Two services will write at the same time, which is the crux.\n\nPostgres handles concurrent writes natively. SQLite serializes them — fine at low traffic, but we expect bursts.\n\n## Details\nSQLite WAL still serializes writers; Postgres uses MVCC.",
"options": [
{"id": "pg", "label": "Postgres"},
{"id": "sqlite", "label": "SQLite"}
],
"allowFreetext": true
},
{
"id": "retry",
"title": "Retry policy",
"subtitle": "How aggressively should we retry publish failures?",
"body": "Affects the reliability budget. Too aggressive and we hammer downstream during outages; too lax and transient blips become user-visible.",
"options": [],
"allowFreetext": true
}
]
}
```
## Output shape
`hl job result` for a deck job returns a resolution envelope; the `responses` array is what you act on:
```json
{
"responses": [
{ "id": "db", "selectedOptionId": "pg", "freetext": "Yes — concurrent writes are non-negotiable" },
{ "id": "retry", "freetext": "Exponential backoff capped at 5 attempts, then DLQ" }
],
"completedAt": "2026-04-20T15:23:00.000Z"
}
```
- `selectedOptionId` is present when the human picked one of the listed options.
- `freetext` is present when the human typed a comment or freetext answer.
- The human **can skip questions** — `responses` may be shorter than `interactions`. Always look up by `id`.
## Invocation
Every leaf is `hl <noun> <verb>`, reads one JSON object on stdin, writes one on stdout. `-h` on any node is the full spec.
```bash
# Deck (structured questions)
echo '{"deck":{…}}' | hl deck ask # kickoff → {job_id, dir, follow_up}
echo '{"deck":{…}}' | hl deck validate # preflight, no side effects
echo '{"job_id":"…","deck":{…}}' | hl deck update # rewrite a live deck; pane reloads
# Review (markdown doc feedback)
echo '{"file":"/abs/doc.md"}' | hl review open # kickoff → {job_id, output, follow_up}
# Collect / inspect any job
echo '{"job_id":"…","wait":true}' | hl job result # block for the human, then print result
echo '{"job_id":"…"}' | hl job status # state snapshot, never blocks
echo '{"job_id":"…","follow":true}'| hl job logs # stream JSONL events
echo '{"kind":"deck"}' | hl schema show # JSON Schema for an input type
```
Typical end-to-end flow:
```bash
# 1. Kick off — returns immediately with a job_id
JOB=$(echo '{"deck":{"interactions":[{"id":"db","title":"Database",
"subtitle":"Postgres or SQLite for the capture store?",
"body":"Concurrent writes are the crux. Postgres handles them natively; SQLite serializes.",
"options":[{"id":"pg","label":"Postgres"},{"id":"sqlite","label":"SQLite"}],
"allowFreetext":true}]}}' | hl deck ask | jq -r .job_id)
# 2. Collect — BACKGROUND this (thRelated in Design
contribute
IncludedLocal-only OSS contribution command center. Auto-refreshes the user's in-flight PR and issue state on invoke so conversations start with full context — no need to brief Claude on what's in flight. Helps the user find issues to contribute to on GitHub, builds per-repo dossiers of what each upstream expects (CLA, DCO, branch convention, AI policy, draft-first, review bots, issue templates), runs deterministic gates before any external action so AI-assisted contributions don't reach maintainers as slop. State is markdown-only: candidate files at ~/.contribute-system/candidates/, repo dossiers at ~/.contribute-system/research/, append-only event log at ~/.contribute-system/log.jsonl. No database, no cloud calls. Use when the user asks about their PRs / issues / contributions, wants to find new work to take on, claim an issue, build/refresh a repo's dossier, or draft a Design Issue or PR. Trigger with "/contribute", "what's my PR status", "find a contribution", "claim issue X", "draft a Design Issue for Y", "refresh dossier for Z".
architectural-analysis
IncludedUser-triggered deep architectural analysis of a codebase or scoped subtree across eight modes — information architecture, data flow, integration points, UI surfaces, interaction patterns, data model, control flow, and failure modes. This skill should be used when the user asks to "diagram this codebase," "map the architecture," "show the data flow," "give me an ERD," "trace control flow," "find the integration points," "verify the layout pattern," "audit the UX architecture," or any similar request whose primary deliverable is mermaid diagrams plus cited reports under docs/architecture/. Dispatches haiku/sonnet sub-agents in parallel for per-mode exploration, then verifies every citation mechanically before any node lands in a diagram. Not for one-off prose explanations of code (use code-explanation) or for high-level system design from scratch (use system-design).
mcp
IncludedModel Context Protocol (MCP) server development and tool management. Languages: Python, TypeScript. Capabilities: build MCP servers, integrate external APIs, discover/execute MCP tools, manage multi-server configs, design agent-centric tools. Actions: create, build, integrate, discover, execute, configure MCP servers/tools. Keywords: MCP, Model Context Protocol, MCP server, MCP tool, stdio transport, SSE transport, tool discovery, resource provider, prompt template, external API integration, Gemini CLI MCP, Claude MCP, agent tools, tool execution, server config. Use when: building MCP servers, integrating external APIs as MCP tools, discovering available MCP tools, executing MCP capabilities, configuring multi-server setups, designing tools for AI agents.
react-native-skia
IncludedDesign, build, debug, and optimise high-polish animated graphics in React Native or Expo using @shopify/react-native-skia, Reanimated, and Gesture Handler. Use when the user wants canvas-driven UI, shaders, paths, rich text, image filters, sprite fields, Skottie, video frames, snapshots, web CanvasKit setup, or performance tuning for custom motion-heavy elements such as loaders, hero art, cards, charts, progress indicators, particle systems, or gesture-driven surfaces. Also use when the user asks for fluid, glow, glass, blob, parallax, 60fps/120fps, or GPU-friendly animated effects in React Native, even if they do not explicitly say "Skia". Do not use for ordinary form/layout work with standard views.
plaid
IncludedProduct Led AI Development — guides founders from idea to launched product. Six capabilities: Idea (discover a product idea), Validate (pressure-test the idea against fatal flaws, problem reality, competition, and 2-week MVP feasibility), Plan (vision intake + document generation), Design (translate image references into a design.md spec), Launch (go-to-market strategy), and Build (roadmap execution). Use when someone says "PLAID", "plaid idea", "help me find an idea", "product idea", "idea from my business", "idea from my expertise", "plaid validate", "validate my idea", "pressure-test", "is this idea good", "find fatal flaws", "validate the problem", "plan a product", "define my vision", "generate a PRD", "product strategy", "plaid design", "design from image", "translate image to design", "create design.md", "extract design tokens", "plaid launch", "go-to-market", "launch plan", "GTM strategy", "launch playbook", "plaid build", "build the app", "start building", or "execute the roadmap".
nextjs-framer-motion-animations
IncludedAdds production-safe Motion for React or Framer Motion animations to Next.js apps, including reveal, hover and tap micro-interactions, whileInView, stagger, AnimatePresence, layout and layoutId transitions, reorder, scroll-linked UI, and lightweight route-content transitions. Use when the user asks to add, refactor, or debug Motion or Framer Motion in App Router or Pages Router codebases, especially around server/client boundaries, reduced motion, LazyMotion, bundle size, hydration, or route transitions. Avoid for GSAP-style timelines, WebGL or 3D scenes, heavy scroll storytelling, or CSS-only effects unless Motion is explicitly requested.