From hw
Manage the persistent lightweight Patch track for small fixes that should not open a full milestone.
npx claudepluginhub hypoxanthineovo/hypo-workflow --plugin hwThis skill uses the workspace's default tool permissions.
📌 输出语言规则:
Creates minimal patch plans for targeted code fixes from reviews or bugs, analyzing with git/grep and templating precise changes with validation steps.
Automates bug fixes and small code changes autonomously from invocation to merged PR. No questions gate, spec generation, or planning—for quick, well-defined updates in 1-3 files.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
📌 输出语言规则: 读取 config.yaml → output.language
Use this skill when the user invokes /hw:patch or /hypo-workflow:patch.
Patch is a persistent side track for small issues, cleanups, and hot observations that do not deserve their own milestone. It is independent of the pipeline state machine and persists across Cycles.
Canonical Patch directory:
.pipeline/patches/When examples say patches/P001-fix-login.md, interpret it as .pipeline/patches/P001-fix-login.md.
Supported forms:
/hw:patch "描述" [--severity critical|normal|minor]/hw:patch list [--open] [--severity critical|normal|minor]/hw:patch close P{NNN}/hw:patch fix P{NNN} [P{NNN} ...]/hw:patch accept P{NNN}/hw:patch reject P{NNN} "feedback"# P001: 修复登录页 CSS 错位
- 严重级: normal
- 状态: open
- 发现于: C2/M3
- 创建时间: 28日 11:30
- 改动: (待填写)
- 测试: (待填写)
- 关联: (无)
- resolved_by: null
- related: []
- supersedes: []
Use output.language for labels when generating new content, but preserve the existing file's language when editing it.
Patch numbers are global and never reset across Cycles.
.pipeline/patches/ if it does not exist.P[0-9][0-9][0-9]-*.md.P001, P002, and so on.For /hw:patch "描述" [--severity ...]:
normalcritical, normal, minor.pipeline/cycle.yaml exists and status is active, use C{cycle.number}.pipeline/state.yaml has a current milestone or prompt index, append /M{N}discovered_in as (无) or implicit C1 only in display textoutput.timezone..pipeline/patches/P{NNN}-{slug}.md.For /hw:patch list:
.pipeline/patches/P*.md files.Filters:
--open: include only 状态: open--severity critical|normal|minor: include only matching severityIf no patches match, say so directly.
For /hw:patch close P{NNN}:
状态: open with 状态: closed.output.timezone.When a milestone resolves one or more Patches, update resolved_by with C{N}/M{N} and close the Patch only when the milestone actually delivered the fix.
Use /hw:patch fix P001 to repair one Patch immediately, or /hw:patch fix P001 P003 P007 to repair several Patches in sequence. Patch fix is a lightweight execution lane, not a Milestone and not a TDD pipeline run.
❌ 绝对禁止:
✅ 必须做到:
For each requested Patch, run these six steps strictly in order:
.pipeline/patches/P{NNN}-*.md, parse title, description, discovered_in, and severity. If the Patch status is already closed, report an error for that Patch and skip mutation.open, and continue to the next requested Patch.git commit -m "fix(P001): <Patch title>". For batch fixes, do not combine Patch commits..pipeline/PROGRESS.md board tables, and append a lifecycle event to .pipeline/log.yaml.When Step 6 succeeds, update or append these fields in the Patch file while preserving existing notes:
- 状态: closed
- 修复时间: 29日 14:30
- 改动: src/scheduler.py:120 — 修正条件判断逻辑
- 测试: ✅ 回归通过(38/38)
- commit: `a1b2c3d`
Use output.language and output.timezone for generated prose and time formatting. Preserve the existing Patch language if it is already clear.
Update .pipeline/PROGRESS.md as a board-style summary:
Patch 轨道时间线.pipeline/log.yamlExample timeline row:
| 14:30 | Patch | P001 closed | 修复登录页 CSS 错位 |
Do not append standalone one-line progress entries to the bottom of PROGRESS.md.
Append a .pipeline/log.yaml lifecycle event with:
type: patch_fixpatch: P001status: closedcommit: <hash>summary: <one-line change summary>tests: <test command and result>Patch fix must never write .pipeline/state.yaml and must never generate report.md.
For /hw:patch fix P001 P003:
3/4 修复成功,P003 失败(测试未通过).discovered_in: Cycle and milestone where the Patch was foundresolved_by: Cycle and milestone or Patch that resolved itrelated: related Patch IDssupersedes: older Patch IDs replaced by this Patchiteration: current repair attempt numberacceptance_requested_at: when manual Patch acceptance was requestedaccepted_at: when the Patch was accepted and closedrejection_refs: structured feedback files under .pipeline/patches/feedback/Patch acceptance is Patch-track state only. It must never write .pipeline/state.yaml.
Patch metadata may use these statuses:
openpending_acceptanceclosedrejectedWhen manual acceptance mode is active, Patch fix Step 6 ends by setting:
- status: pending_acceptance
- iteration: 1
- acceptance_requested_at: 2026-05-03T01:20:00+08:00
/hw:patch accept P001:
.pipeline/patches/P001-*.md.status: pending_acceptance.status: closed.accepted_at.patch_accept to .pipeline/log.yaml..pipeline/PROGRESS.md./hw:patch reject P001 "feedback":
.pipeline/patches/P001-*.md.status: pending_acceptance..pipeline/patches/feedback/P001-rejection-<timestamp>.yaml.status: open.iteration.rejection_refs.patch_reject to .pipeline/log.yaml..pipeline/PROGRESS.md.acceptance.reject_escalation_threshold or higher, recommend escalation to a Cycle.The feedback file must include problem, reproduce_steps, expected, actual, context, iteration, and created_at. A compatibility feedback field may be present for older readers.
The next /hw:patch fix P001 must read rejection_refs and inject the structured rejection context before editing.
Patches are not archived when a Cycle closes. They stay in .pipeline/patches/ and can be injected into future planning with /hw:plan --context patches or cycle.context_sources: [patches].
skills/cycle/SKILL.md — active Cycle detectionskills/plan-discover/SKILL.md — Patch context injectionreferences/config-spec.md — output language and timezone defaultsSKILL.md — root command routing