openreachtech/hora-core/hora-spec
Claude Code and agent skill by openreachtech/hora-core
- community
Checking that the SKILL.md file is still in the repository.
Write one version's spec, in conversation, through stage 0 and seven stages. Reads what already exists first, so nobody dictates a running product from memory; from the second version on it writes a diff. Invoked by /hora when a version has no spec, by /hora-plan when a finding needs design work, or directly.
Install
npx vskill@latest install openreachtech/hora-core/hora-specSKILL.md
hora-spec
The author. Turn what somebody wants into specs/<version>/spec.md, in conversation, and write it in the format the rest of Hora Kit reads.
Read ../hora/references/structure.md first. `../hora/references/asking.md` fixes how anything is put to a person — a check, a proposal or a question. `references/principles.md` holds the thinking this skill applies, `references/investigation.md` what stage 0 reads, and `references/stages.md` is the authority on stage 0 and the seven stages.
/hora-spec does no design of its own. Stage 0 it runs itself; seven skills do the rest, in order:
| Stage | Skill | Fixes | |
|---|---|---|---|
| 0 | — (this skill) | what already exists — the repositories, the documents, and what they show | |
| 1 | `/hora-spec-usecases` | who uses this, and what each of them completes end to end | |
| 2 | `/hora-spec-horizon` | what this release builds, what is foreseen for later, what is never built | |
| 3 | `/hora-spec-nonfunctional` | how many users, how heavy, how available, how long kept | |
| 4 | `/hora-spec-backend` | the repositories and servers, the data model, the operations, what runs as a job | |
| 5 | `/hora-spec-frontend` | the screens each use case passes through, and what each screen calls | |
| 6 | `/hora-spec-security` | who may call each operation, and what happens when someone else does | |
| 7 | `/hora-spec-review` | whether the whole document holds together, and every use case is satisfiable |
Why this skill exists
A blank spec plus a format document is a writing assignment. The format is exacting — use cases and acceptance criteria per feature, the kind of every operation, two different kinds of out-of-scope, an id that may never change — so a person handed it writes the parts they find easy and leaves /hora-plan to ask about the rest, one question at a time.
And nobody should be asked to dictate a product that already runs. Twenty existing features described from memory come out as the ones somebody remembers, and silence reads exactly like "there is nothing there". The system is the better witness for what it does, so stage 0 reads it and puts the reading back as something to correct. What no system can witness is what anybody wanted (references/investigation.md).
The line this skill must not cross
| What it is | What happens to it | |
|---|---|---|
| a requirement, a constraint or a decision stated in the conversation | write it into `specs/`. This is the skill's entire job | |
| something read off a repository or a document | put it up as a check — "I read it as this; is that right?" Written once it is confirmed or corrected | |
| something asked for in `request/` | draft it into the section that owns it and put it up as a proposal. Written once they approve the words | |
| an improvement, an alternative or a gap this skill thought of | propose it, marked as a proposal. It becomes spec text only once the person says yes | |
| a requirement nobody stated and nobody approved | never written (../hora/references/structure.md, invariant 2) |
The check and the two kinds of proposal are different acts and must never sound alike. A check asks whether the skill read the system correctly; a proposal asks whether to do something the system does not do. Stated in the same voice, a proposal becomes an existing fact. `../hora/references/asking.md` is the authority.
Invariant 2 was never "a human must type it". It is that no requirement enters `specs/` without a human having read the exact words. A skill that drafts a section, shows it in full, and writes it only after the person says yes protects exactly what the invariant protects.
Proposing is required, not merely allowed. The gaps in a request are invisible from inside it. What is forbidden is the proposal that goes in silently.
Say which is which, every time. Where a stage assumed something in order to keep moving, the assumption is stated in the same breath and recorded (spec-assumption).
Approval is per section, at the end of the stage that wrote it
Step 3 stays in prose, never in the question tool. An option labelled "approve" is precisely what lets somebody not read the words (../hora/references/asking.md). The individual checks and proposals inside the conversation default to the tool, with the likely answer offered first.
| Granularity | Why not | |
|---|---|---|
| per line | twenty approvals for one section is a burden nobody carries twice | |
| per section | what this skill uses. A section is the smallest unit that means anything on its own | |
| per document | a whole spec approved with one "yes" is a spec nobody read, and the record says otherwise |
A section the person redirects is redrafted and shown again. Never write "most of it" and note the disagreement.
`/hora-plan`'s per-edit rule is unchanged, and the two do not compete. A one-line hole found while planning is settled there. A finding that needs design work comes back here, to the stage that owns it (references/stages.md, "What sends a run back into a stage").
The order of the stages is a rule
Each stage's answers are the next stage's input. The alternative costs the work twice.
- A data model designed before the use cases are fixed is designed twice, and the second time there is already a migration written against the first
- A table designed before the user counts are known is designed for the wrong number, and nothing in it says so
- A screen designed before the operations exist invents operations, which then exist only in the screen
Going back is normal, and it is not a failure. A stage that turns up something an earlier one got wrong says so, names the stage, and the run returns there. Stage 7 exists to do exactly this. references/stages.md holds which stage each kind of shortfall returns to.
No stage may write another stage's section. Stage 4 does not write use cases; stage 1 does not choose a column type. The two exceptions are both stage 6's: a refusal is a behavior, so it belongs in the owning section's <!-- acceptance --> block; and the security rows of Non-functional requirements, which land in stage 3's table because a reader looks for every non-functional line in one place (references/stages.md).
Where it writes, and what it must not touch
specs/<version>/spec.md, and the version's feature files | written by this skill, one approved section at a time | |
specs/skeleton/spec.md | copied from, never written to. This skill does the copying, and only for the first version | |
specs/<version>/request/ | read, never written to and never tidied up. It stays as they wrote it | |
specs/<older version>/ | never. Past versions are frozen | |
.hora/spec/<version>/_stages.md | this skill's own record of where it got to. One that already exists is added to, never replaced — a split of the previous version may have left a handoff in it (../hora-spec-horizon/SKILL.md, "Splitting a version under way") | |
.hora/spec/<version>/_assets.md | what stage 0 read, where from, and at what commit (references/investigation.md) | |
.hora/spec/<version>/_divergence.md | where the documents and the code disagree. Stage 0 writes the rows, unrouted; the stage that owns a row's subject writes its `Routed to` (references/investigation.md) | |
.hora/questions/<version>/open.md | appended to, like any other skill | |
.hora/tasks/, .hora/contracts/, .hora/glossary.md | never. They are /hora-plan's | |
| code, tests, any implementation repository | read, never written. Nothing read becomes a requirement on its own | |
| git, in any repository | never. /hora owns every git operation |
Fixing the version, and starting the file
Step 3 is a copy, not a draft. The skeleton lands as it ships: headings and table headers. Every value in it arrives through a stage's conversation.
Step 4 is why it is not copied twice. The skeleton's empty headings mean "the body carries over" under the diff rule, so copying it into a later version writes twenty sections that say nothing while looking like they were written.
A version whose `spec.md` already has content is edited, never restarted. Read what is there, work out which stages it already satisfies, record that in _stages.md, and enter the first stage that is not satisfied. A spec somebody wrote by hand is a spec at stage 7, not stage 1.
Stage 0 still runs, even then. A hand-written spec says nothing about which documents exist or what the repositories hold.
Never write into a past version's directory. A fix that belongs to a released version goes into the version being written now, as a full replacement of that section.
The second version onward
A released product's next version is one or two features on top of twenty that already work, and the seven stages must not make somebody re-agree to the twenty. Run head-on, stage 3 asks for user counts settled a release ago and stage 6 asks who may call operations nobody has touched — and a person answering those for the third time answers without reading.
Nothing about the format changes. What changes is how much of it this version writes (../hora/references/spec-format.md, "From the second version on, write a diff").
A stage passes by carry-over, and says so
A stage whose section nothing in this version touches is passed, with the reason written — it is not skipped, and it is not n/a.
Carrying over is a check, never an assumption. The stage states what the previous version fixed, in the words it fixed it in, and asks whether what this version adds changes it.
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-spec/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-spec)