openreachtech/hora-core/hora-hotfix
Claude Code and agent skill by openreachtech/hora-core
- community
Checking that the SKILL.md file is still in the repository.
Fix one urgent defect and ship it through six gates, giving up the acceptance review but writing down everything it gave up. Invoked directly as /hora-hotfix when a live product is broken and the normal /hora route is too slow.
Install
npx vskill@latest install openreachtech/hora-core/hora-hotfixSKILL.md
hora-hotfix
Fix one defect. Ship it. Write down what you skipped.
Read ../hora/references/structure.md and ../hora/references/commits.md first. This skill is read-only on `specs/`. It reports a spec problem; it never fixes one.
Runs at the root of the hora repository, like every other hora skill. Every git command runs in the main session.
What this skill is
/hora-build takes one feature through eighteen checkpoints. This skill takes one defect through six gates. It is not a short version of `/hora-build`. The unit of work is different, so the gates are different.
| What it gives up | reach — the acceptance review, the browser run, the UX audit, the scenario list, the version's own criteria, /hora-spec and /hora-plan | |
| What it never gives up | one failing test, the full unit suites, lint on the files it touched, the git rules, the record | |
| Where the skipped work goes | .hora/hotfix/<hotfix-id>.md, as a written debt. /hora-plan turns it back into real work later ("Paying the debt back", below) | |
| What it changes in the normal route | nothing. /hora-accept and the eighteen checkpoints are untouched, so a version's own acceptance is exactly as strict as before |
This is a lever, and it follows the rule every lever follows (../hora/references/structure.md, "Where a lever lives"). It reduces work. It may not reduce verification, and it may not reduce what is recorded. A run that gave up a step pays for it in the record.
The six gates
A gate has one exit condition. Run them in order. No gate starts until the one before it is done.
| Gate | Runs in | Exit condition | ||
|---|---|---|---|---|
| H1 | Admit | the main session, in conversation | this fix has none of the properties that stop a hotfix, or a person chose a way forward. The one sentence saying what "fixed" means is written | |
| H2 | Reproduce | an implementer agent | a test exists that fails, and it fails because of this defect | |
| H3 | Fix | an implementer agent | H2's test passes, the change is the smallest one that does that, and lint passes on the files it touched | |
| H4 | Blast radius | the main session | the unit suites pass in every repository — in full, or narrowed against a stated reason and the fact it rests on — and every step this fix's touched surface forces has run | |
| H5 | Record | the main session | .hora/hotfix/<hotfix-id>.md is written, and says what was skipped, which features were touched, and what happens to bad data already written | |
| H6 | Land | the main session | hotfix/<hotfix-id> is merged into main, and the catch-up is handed to /hora |
The `<hotfix-id>` is a short kebab-case name for the defect — session-expiry-blank, not fix-1. Propose one at H1 and get it confirmed.
H1. Admit
This gate is where most of the value is. A hotfix that should have been a release is the failure this gate exists to stop.
Six properties stop a hotfix
When one of them holds, do not refuse. Show the choices
A refusal helps nobody at three in the morning. Work out a real alternative for this defect first, then put the choices to the person (../hora/references/asking.md — this is a proposal, not a check).
Never work out the alternative in general terms. "There is usually a code-only version" is not usable. Name the file and the change.
The destructive half never rides on a hotfix. Option 3 exists so the work is recorded when a person decides to do it anyway. Without it, the same thing happens with no record at all.
A schema change may ride along if all three hold
When all three hold, the migration can be applied first and the code after it, so no deploy has to be atomic.
Repairing bad rows is not a migration. A migration file replays in every environment forever. Do the repair as a one-off script a person runs and can undo from a backup, and record it under data-damage:.
Then get the one sentence
Ask the person: what has to be true for this to count as fixed? One sentence.
Never work this out yourself. It states what the product should do, which only a person may state (../hora/references/structure.md, invariant 2). That sentence is this run's whole acceptance criteria.
H2. Reproduce
Write the test before the fix. Match the equipped skills covering where a test goes and how it is written, then hand the work to an implementer agent.
The test must fail, and it must fail for this defect. A test that fails for any reason proves nothing.
Name no cause until one command has run that test and failed. A cause named first bends the test toward it. Record it in H5 as reproduced-by:, beside the test it ran, never in place of it. Under reproduced: no it is the command that took the measurement.
Some defects cannot be caught by a test. Record them as "How to record a defect no test can catch", below, says.
[wing] How to record a defect no test can catch
Record `reproduced: no` with the reason, and put a measurement in the record instead, the number before and the number after. A performance problem, or a bug that only appears with production data, is the usual case.
H3. Fix
Make the smallest change that turns H2's test green. No refactoring, no new abstraction, no tidying up on the way past.
Match the equipped skills covering the code being changed, and hand the work to an implementer agent. Run lint from inside that repository, on the files it touched (../hora/references/structure.md, "Where a per-repository command runs").
If a test fixture needs an explicit row id, use the equipped skill covering exclusive row-id allocation: clear its stale lock, allocate one prefix, and use it. Nothing holds that lock across invocations, so one still standing at the start of a run is leftover.
H4. Blast radius
Always, at every run
Run the unit suites in full, in every repository, from inside each one. They are cheap and their failures are exact. They are the only regression net this run has.
Never weaken a test to make the suite pass. No test skipped, deleted, loosened or waited out.
What the touched surface forces
| The fix touched | This cannot be skipped | |
|---|---|---|
| authentication, authorization or a caller filter | a read-only security audit, scoped to the change | |
| a shared module, or a conflict-proof file | the full unit suites. suites: partial is not allowed here | |
| data that gets written to the database | a written answer for the rows the bug already wrote (data-damage:) | |
| the schema | the four steps below |
Narrowing the suites
`suites: partial` needs a stated reason, and it is never the default. It is forbidden where the fix touched a shared module or a conflict-proof file. Record the reason and which suites did not run.
The reason says why those suites were not run, never why they could not fail. That needs the one fact the skipped suites rest on, proven by a command. Name what the fix cannot reach, run the command that shows it, and record both with the result.
A fact no command can prove is recorded as `unproven`. The run still lands, and the debt carries the fact (H5).
H5. Record
Write .hora/hotfix/<hotfix-id>.md. The record is what pays for everything this run skipped, so nothing here is optional.
`suites: partial` adds one line, the fact H4 proved or could not:
A schema change adds four more lines, and the last one names the destructive half that was left behind:
The verdict word is landed, never passed
`/hora-accept` owns the words `passed`, `reach:` and `passed over <n> of <m> features; <k> not accepted`, and readers match those strings (../hora-accept/SKILL.md, "Recording the result"). A hotfix record uses none of them. It says landed, and nothing downstream can mistake it for an acceptance.
touches: names feature ids, and it is checked with a person
Which features the changed files belong to is a label, so it may be worked out from the code (../hora/references/structure.md, invariant 2). Put the answer up as a check before writing it. It decides which checkpoints get reopened later, so a wrong one loses the debt.
Where no feature id fits — a shared file, or code no spec describes — write `touches: none (<what it was>)`.
H6. Land
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingkit/skills/hora-hotfix/SKILL.md
Popularity
- Repository stars
- 56
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/openreachtech/hora-core/hora-hotfix)