openreachtech/hora-core/hora-build
Claude Code and agent skill by openreachtech/hora-core
- community
Checking that the SKILL.md file is still in the repository.
Build one feature by taking it through the eighteen checkpoints — spec, backend, frontend, acceptance — in order, one gate at a time. Runs at the root of the hora repository, one feature per invocation. Invoked by /hora, or directly as /hora-build.
Install
npx vskill@latest install openreachtech/hora-core/hora-buildSKILL.md
hora-build
Take one feature through the eighteen checkpoints, in order.
Read ../hora/references/structure.md (the layout, the invariants, where and how a command runs) and references/checkpoints.md (the checkpoint list itself) before starting. This skill is read-only on `specs/`; checkpoint 1 is where a problem found there is routed to the two skills that may write it (references/checkpoints.md, checkpoint 1).
One feature at a time, never two
Nothing here ever runs alongside another feature's checkpoints. One feature goes from checkpoint 1 to checkpoint 18, and only then does the next one start:
| a feature reaches acceptance while its author still remembers it | rather than at the end of the version, alongside twenty others | |
| a break shows up in the run that caused it | checkpoint 18's unit suites cover every feature so far, so a regression fails immediately | |
| one branch per repository is open at a time | no shared, uncommitted state between two features to untangle |
Where to start
If a backend row is declared, and an equipped skill covers exclusive row-id allocation, clear that allocator's lock unconditionally before touching any checkpoint (its own file describes clearing a stale lock). Nothing holds that lock across invocations, so one still standing at the start of a run is leftover.
Then allocate this feature's id prefix once through that skill, before its first implementing checkpoint, and hand that same prefix to every agent that works in the backend row. The allocator returns the same prefix for the same requester however often it is asked, so allocating here costs one call and leaves the lock free — where several units run at once, asking for themselves would queue them behind each other's lock.
Report the decision in one line before starting work, as in "building #attendance, from checkpoint 6 of 18". Inside a frontend gate the line names its row: "building #attendance, from checkpoint 11 (frontend-admin) of 18".
In a file that carries several frontend gates, step 4 takes the first `[ ]` in file order, so the rows run in target order and 18 runs once, after the last (references/checkpoints.md, "A feature that names several frontend rows carries one frontend gate per row").
A feature whose only open checkpoint is 18 writes no code, and cuts no branch. That is what a section declaring <!-- built: frontend --> looks like on adoption: everything up to the acceptance gate is marked not-applicable, so this skill goes straight to /hora-accept.
Step 2 skips an entry whose checkpoint 18 is covered by the sweep entry. Where every specified feature carries built:, /hora-plan collapses the per-feature gates into a single adoption sweep (../hora-plan/SKILL.md, "collapses to one sweep"). Taking one anyway would run the twenty individual gates the collapse exists to replace.
A listed feature is never entered, and it has nothing to resume from. A section carrying <!-- baseline: inventoried --> sits under ## Not accepted with no checkbox, so step 2 skips it with no special case (../hora-plan/SKILL.md, "_plan.md — the order"). Its eighteen empty boxes are not a feature nobody started — the feature file's provenance header says which of the two this is, and opening one rebuilds code that is already serving users.
If no feature is ready and some are unfinished, and no open question holds any of them back, that is a dependency cycle or a reference to an `id` that does not exist. Raise it as a contradiction question (blocking: yes) and stop.
A listed feature is not one of the unfinished ones. It carries no checkbox, so a version with nothing left but listed entries is finished rather than deadlocked (../hora/SKILL.md, "Deciding where you are").
A `depends` naming a listed feature is satisfied by the running code, never by a checkbox. Read it as satisfied, and read the dependent's own Rests on: #<id> (not accepted) line for what its pass rests on.
[wing] Whether a feature is ready to build
Yes, where its entry in `_plan.md` is `[ ]` and every one of its `depends` is satisfied: [x] in this version, finished in an earlier one (look back through past versions in .hora/tasks/ for a revived feature's dependencies), or listed. /hora takes its next feature from this section through step 2 above. /hora-fast takes one from here too, and opens a gate earlier where the section below says yes.
[wing] Whether a gate may open while a dependency is unfinished
Yes, where every unfinished dependency has reached what this step waits on. Only /hora-fast reads this section. /hora builds one feature to acceptance before the next, so a feature it picks has no unfinished dependency.
| This feature's | Opens once each unfinished dependency has | |
|---|---|---|
| spec gate (1, 2) and checkpoints 3 to 8 | nothing, once /hora-fast's foundation is fixed | |
| checkpoint 9 | merged its backend gate into release/<version> | |
| frontend gate (10 to 17), in each row | merged its frontend gate in the same row, where it has one | |
| acceptance gate (18) | passed its own 18, which finishes it |
What the dependent's backend uses from its dependency is in the foundation before either opens. The contracts, the shared tables, the master seed and every module /hora-plan marked Imports: are built there, and /hora-plan walked every use case through the contracts field by field. Checkpoint 9 walks the use cases as actual calls, so it is the first step that needs the dependency's running code.
A dependent's tests reach its dependency through the foundation, never through the dependency's operations. A row they need in a dependency's table is seeded in the dependent's own band (references/checkpoints.md, checkpoint 5), and the call itself is walked at checkpoint 9.
A dependency's later gate that changes code a dependent built on reopens the dependent. Clear the dependent's first checkpoint that reads the changed code, in every row whose code reads it, with reopened-by: dependency.
Running one checkpoint
The line is written where the box is, so neither goes without the other. The shapes above are all a pass or a send-back needs; /hora-progress holds the rules behind them — what n counts, what may be said between two lines — and is read wherever one of those is in doubt. Step 0 is what catches a line that was missed: a box with no line behind it is written up before the next checkpoint starts, never left for the closing report.
Step 10's split matters. The checkbox is written the moment the checkpoint passes, so an interrupted run resumes at the right place; the commit happens once per gate, so git log .hora/ stays readable (../hora/references/commits.md, "Committing .hora/").
[wing] How to lint a checkpoint's files
cd into this checkpoint's repository, then `npx eslint --fix` on exactly the files it touched, every unit's together, then `npx eslint` on the same files for what remains. --fix clears the mechanical violations without an agent round trip; only what it cannot fix is worth one.
[wing] How to test a checkpoint's files
From that same repository, `npx jest` on exactly the files this checkpoint wrote, with the output written to a file and read from there (below).
Step 3 — matching a checkpoint to the skills that cover it
`references/checkpoints.md` names no package skill, and it never may (../hora/references/structure.md, "No hora file ever names one of those skills"). So the match is made here, once per checkpoint, against what is actually equipped:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingkit/skills/hora-build/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-build)