rails
Skill1 starsChanged 2 months agoApache-2.0View on GitHub
Read, follow and propose Helix Rails — the rules, standards, playbooks, checklists, templates, policies and safeguards an organisation binds its agents to, scoped to one project or to every project. Use when the user says "/helix-rails", "what are the rules here", "add a rule", "follow the release playbook", "is this allowed", at the start of any Helix session (every skill opens by reading the rails in scope), or when a correction keeps recurring and deserves to become a rail. Rails bind where Memory informs — a rail in scope is not advice, it is the standard the work is held to.
5 other projects use a version of this.
Adopted by
Most recently taken up by
- maroffo/claude-forgetheir own version, first seen Oct 25, 2026
- G1Joshi/Agent-Skillstheir own version, first seen Oct 13, 2026
- carapace-sh/carapace-bintheir own version, first seen Oct 8, 2026
- conjure-3301/skillstheir own version, first seen Aug 17, 2026
- martinstreicher/claude-skillstheir own version, first seen Feb 14, 2026
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- carapace-sh/carapace-bin★ 2ksame name
- maroffo/claude-forge★ 17same name
- G1Joshi/Agent-Skills★ 15same name
- conjure-3301/skills★ 0same name
- martinstreicher/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
11 rules. 0 are common, 5 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 11
If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console.
- Very specific: line 13
Use the normal helix <surface> up, push, state, and wait commands.
- Very specific: line 14
Do not start local servers or Fleet, open a browser, curl localhost, use --local, log in, or change profiles/projects.
- Distinctive: line 42
Call the binary by its full path every time:
- Very specific: line 51
Never put it in a shell variable or function.
- Distinctive: line 67
Read what comes back as binding.
- Very specific: line 107
Every verb takes --dir <projectDir> when the project is not the cwd.
- Distinctive: line 163
Not Memory. A fact goes to Memory.
- Distinctive: line 165
Not a place to record what you did.
- Distinctive: line 166
Not yours to edit. A rail you disagree with is a conversation with the person, then a proposal.
- Very specific: line 171
Read rails for at the start, not when something goes wrong.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Helix Rails
Orchestrator cloud context (check before setup)
If HELIX_ORCHESTRATOR_RUN_ID or HELIX_SKILL_CREDENTIAL_FILE is set, this skill runs in Helix Console. This section takes precedence over local setup and browser instructions below.
- First call the plugin's
bin/helix orchestrator-protocol(Windows:bin/helix.cmd orchestrator-protocol). It must print1. Otherwise stop with an actionable request to update the Helix plugin/CLI; never run an older binary's setup commands. - Use the normal
helix <surface> up, push, state, and wait commands. The CLI selects cloud transport and the assigned project automatically. Keep the same slug within this task. - Do not start local servers or Fleet, open a browser, curl localhost, use
--local, log in, or change profiles/projects. Do not read or print the credential file. Do not remove the injected environment variables. upreturns the Console session URL. Use that URL wherever the local instructions request Board/Fleet links. Events go to Console; human responses and gate approvals still come from the person through the normal wait protocol.- On cloud or compatibility errors, report the error. Never fall back to local mode. Outside this context, follow the local behavior below unchanged.
Rails are how a team tells its agents how we do things here, graded by how hard each one binds. Memory informs and blocks nothing; Rails bind — a rail in scope is the standard the work is judged against, and where hooks are installed the platform refuses on its behalf.
One file, one rail. Eight kinds, four modes:
| kind | what it is | usual mode |
| rule | a hard constraint — never force-push main | refuse |
| safeguard | an act that needs a person first — confirm before deleting data | gate |
| standard | how a thing is done — commit format, naming, copy | check |
| playbook | a procedure, in steps — release, incident, key rotation | guide |
| checklist | what "done" means — ticked, with evidence | guide (Stop hook) |
| template | the shape of a document — ADR, postmortem, PR | guide |
| policy | what an agent may touch — tools, paths, data classes | refuse |
| waiver | a time-boxed exception to another rail | — |
refuse stops the act. gate asks a person. check warns and records.
guide informs and is cited.
Setup
Call the binary by its full path every time:
${CLAUDE_PLUGIN_ROOT}/bin/helix rails <verb> [flags]On Windows, ${CLAUDE_PLUGIN_ROOT}\bin\helix.cmd in place of bin/helix; the
rest of the command is the same.
Never put it in a shell variable or function. The skill pre-approves this
command, and that approval stops matching past a variable assignment — wrap it
and every call prompts instead. Prose below names commands as rails <verb>;
run them with the full path.
One store per machine, at ~/.helix/rails, with two layers: global
(every project on this machine) and project, named by the repo's
.helix/project file — or the directory name when there is none. Project
overrides global. Nothing else is written into the repo.
The first thing every session does
${CLAUDE_PLUGIN_ROOT}/bin/helix rails for --surface <loop|arena|swarm|canvas|stream|spark|all>Read what comes back as binding. It lists every ratified rail that applies to
this project and this surface, first paragraph each, with its id, kind and
mode — and any waiver that relaxes one. Cite rail ids when you act on them
(per rail no-force-push), and when a playbook applies, follow its steps and
report progress against them in your status.
Need the full text — a playbook's steps, a template's body?
${CLAUDE_PLUGIN_ROOT}/bin/helix rails get <id>What you may and may not do
| You may | You may not |
| Read every rail in scope, on demand and at session start | Write a rail that binds |
| Propose a rail when a correction keeps recurring | Ratify, retire, or change the mode of any rail |
| Report compliance, with evidence | Report a check you did not run |
| Ask for a waiver, in chat | Grant one |
A proposal is a draft on the board, marked proposed by you, binding nothing until a person ratifies it. Humans author rails; you may suggest them.
The commands
${CLAUDE_PLUGIN_ROOT}/bin/helix rails for --surface <name> [--tool Bash] [--path src/…] [--format json]
${CLAUDE_PLUGIN_ROOT}/bin/helix rails get <id>
${CLAUDE_PLUGIN_ROOT}/bin/helix rails list [--kind K] [--status S] [--scope global|project]
${CLAUDE_PLUGIN_ROOT}/bin/helix rails propose # a rail file on stdin → status: proposed
${CLAUDE_PLUGIN_ROOT}/bin/helix rails report <id> --ok|--failed --evidence "…"
${CLAUDE_PLUGIN_ROOT}/bin/helix rails seed <nestjs|react> [--layer global|project] # a starter pack; never overwrites an edited rail
${CLAUDE_PLUGIN_ROOT}/bin/helix rails up [--no-open] # the board, for the personSeeding is the one write you may do on a person's say-so: when they ask for
the NestJS or React starter rails, run seed and list what it wrote. Each
seed is an ordinary rail afterwards — theirs to edit, retire or restore.
Every verb takes --dir <projectDir> when the project is not the cwd.
Proposing a rail
Propose only what a person would otherwise have to say twice. The file is frontmatter and a body:
---
id: commit-format
kind: standard
mode: check
scope: project
applies:
surfaces: [all]
tools: [Bash]
match: "git commit"
owner:
---
Commit subjects are imperative, under 72 characters, no trailing period.
## When it fires
Rewrite the subject before committing; do not amend history to fix it later.printf '%s' "$RAIL" | ${CLAUDE_PLUGIN_ROOT}/bin/helix rails propose --agent claude --model <model-id>Say in chat that you proposed it and why. The person ratifies or declines on the board; you never do.
Checklists and evidence
A checklist rail lists what "done" means. When its items hold for your work, report it with the evidence a critic could check:
${CLAUDE_PLUGIN_ROOT}/bin/helix rails report definition-of-done --ok --evidence "pnpm test: 84 passed; screenshots in audit"Where the Stop hook is installed, an unreported checklist keeps the turn from ending. A report without evidence is the one thing worse than no report.
Hooks
Rails work without hooks — rails for is the contract every skill keeps. With
rails install a person wires the same store into Claude Code so the platform
enforces it: refuse rails block a tool call before it runs, gate rails
turn it into a question for the person, check rails warn after, and open
checklists hold the Stop. Installing, uninstalling and what is mandatory for
an organisation are the person's decisions, not yours.
What Rails is not
- Not Memory. A fact goes to Memory; a rule goes to Rails. Never express a rule as a memory — it silently will not apply.
- Not a place to record what you did. That is the session's log and Archive.
- Not yours to edit. A rail you disagree with is a conversation with the person, then a proposal.
Sharp edges
- Read
rails forat the start, not when something goes wrong. A refusal you meet mid-task was almost always a rail you could have read. - A waiver has an expiry. Past it the rail binds again; do not rely on one you read an hour ago.
--surface allis for session start; inside a surface name it, so surface-specific rails reach you.- Exit 3 means the rail does not exist in any layer; check
rails listbefore proposing a duplicate.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

