request-human-input
Decide whether a blocking situation needs human input; compose a mobile-first prompt with ≤ 3 quick-reply options + a stated timeout default; parse a free-text reply back into a structured decision. v0 reasoning-only — delivery (Telegram / WhatsApp) lives in JobClaw's HITL MCP, not here. Always persists requests/<id>.json in compose mode.
- License 许可
- MIT
- 最近更新
- 2026-06-09
- Stars
- ★ 7
- Forks
- 1
01 前言 Front Matter
- name
- request-human-input
- description
- Decide whether a blocking situation needs human input; compose a mobile-first prompt with ≤ 3 quick-reply options + a stated timeout default; parse a free-text reply back into a structured decision. v0 reasoning-only — delivery (Telegram / WhatsApp) lives in JobClaw's HITL MCP, not here. Always persists requests/<id>.json in compose mode.
- when_to_use
- Use when a flagged answer-application-questions item, an `escalate` triage row, or any ambiguous / irreversible action needs a human. Two modes: compose (no reply) → produce the question; parse (reply given) → interpret it.
- allowed-tools
- Read, Write
- user-invocable
- true
03 SKILL.md 正文
request-human-input
Pause the loop, ask one clear thing, resume on reply. Hard rules: ../_shared/RULES.md.
Two modes
Compose mode (default — no --reply)
Decide if the situation needs human input. If yes, produce a mobile-first prompt + ≤ 3 options + a timeout default. Always writes requests/<id>.json so the the optional JobClaw agent's HITL MCP can pick it up.
Parse mode (--reply "<text>")
Match the reply to an option (case-insensitive prefix + fuzzy). Return a structured decision; mark the request file resolved.
Inputs (compose)
situation— 1–3 sentences. The blocker.policy— freeform string. Escalation rules (e.g., "Escalate any irreversible action; auto-proceed on captcha if MFA backup is configured").context_attachments[](optional) — file paths (screenshot, log) the human can review.request_id(optional) — caller-provided; else generate a 12-char hex slug.
Inputs (parse)
--request_id— which request the reply is for.--reply— the user's verbatim reply string.
Method (compose)
-
Decide if a human is needed. Apply the
policytext tosituation. Output{needs_human: bool, reason}. Iffalse, exit cleanly — no question, no file. -
If needed, compose the prompt (mobile-first):
- Stem — ≤ 1 sentence, ≤ 120 chars. The question itself.
- Options — 1–3 quick-reply labels, each ≤ 24 chars. Verb-led.
- Default on timeout — what JobClaw does if the human doesn't reply:
skip | queue | retry | abort. Defaultabortfor irreversible actions. - Context snippet — 1 line (e.g. "Captcha at Workday submit for Mercury, screenshot attached"). No more.
-
Persist. Always write
requests/<request_id>.json:{ "request_id": "...", "created_at": "ISO-8601", "situation": "...", "policy": "...", "prompt": "string ≤ 120 chars", "options": [{ "label": "string ≤ 24 chars", "value": "string" }], "timeout_default": { "after_minutes": 30, "action": "skip|queue|retry|abort" }, "context_refs": ["path/or/url"], "status": "open" }
Method (parse)
- Load
requests/<request_id>.json. - Match
replytooptions[*].label(case-insensitive prefix, then fuzzy). If no match → treat asfree_text. - Emit:
{ "request_id": "...", "chosen_option": "<value> | null", "free_text": "<verbatim reply> | null", "parsed_decision": "string — one of options[].value OR a normalized free_text", "resolved_at": "ISO-8601" } - Mark the request file
status: resolvedand append theresolutionblock. Do not delete the file — the optional JobClaw agent's HITL MCP owns cleanup.
Output
- Compose: prompt block on stdout (stem · options · timeout default · context refs) + the file at
requests/<request_id>.json. - Parse: the decision JSON on stdout + the updated request file.
Anti-patterns
- More than 3 options.
- Stems > 120 chars (mobile UX dies).
- Multi-question prompts ("Should I skip AND send the email?"). Decompose.
- Assuming a delivery channel (Telegram / WhatsApp specifics). Those belong in the HITL MCP.
- Long context dumps in the stem — link to a path instead.
- Emoji.
Rubric
- [ ] Stem ≤ 120 chars; options ≤ 24 chars; ≤ 3 options.
- [ ]
timeout_default.actionis explicit and conservative for irreversible actions (defaultabortwhen in doubt). - [ ]
requests/<id>.jsonalways written in compose mode; never deleted in parse mode. - [ ] In parse mode, an unmatched reply falls through to
free_text, not a guessed option.
Next steps
Question composed/parsed. Resume the action that triggered it.
04 同仓库更多 Skills
write-outreach
Write a short, profile-grounded cold outreach message to a recruiter, hiring manager, or potential referrer — LinkedIn DM or email — with one clear CTA and no flattery.
write-cover-letter
Produce a job-specific, profile-grounded cover letter in markdown — ≤ 350 words, ≤ 1 page, three paragraphs (hook → two quantified proofs → fit close). Reuses keywords from a prior tailor-resume sidecar when present. Writes a JSON sidecar reserved for a future /render-resume --kind cover-letter (rendercv).
triage-inbox
Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company / role / dates / links / asks / deadline / sentiment), and suggest the next action. Writes inbox/triage-<YYYY-MM-DD>.json — consumed by infer-status and draft-reply.
tailor-resume
Produce a job-specific, ATS-optimized resume from the user's master profile and a target job — reordering, reframing, and surfacing the most relevant real experience and keywords. Enforces a content rubric (bullet shape, length, parallel grammar, metric coverage), then renders a polished PDF by default (via render-resume) and visually QAs it. Never fabricates.
score-fit
Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched/missing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.
review-render
Visually QA a rendered resume PDF and auto-fix layout/content defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.