apply
Skill9 starsChanged 7 months agoMITView on GitHub
Use when implementing a Beat change — requires gherkin or proposal artifact to be done first
- Commits and pushes
25 other projects use a version of this.
Adopted by
Most recently taken up by
- priyansh1210/shirotheir own version, first seen Nov 8, 2026
- matthewwong525/WongStacktheir own version, first seen Nov 8, 2026
- galiprandi/job-seekertheir own version, first seen Nov 5, 2026
- hiddenjobs/job-search-mcptheir own version, first seen Nov 1, 2026
- ChadPapineau/espn-fantasy-football-mcptheir own version, first seen Nov 1, 2026
- ankul5/internship-hunt-skilltheir own version, first seen Nov 1, 2026
Used with
Projects with it also use outreach, track and 8 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
QuixiAISkilloutreach
Decide whether a message is worth someone's attention, then reach the user through the outbox, or people on a connected chat channel, on their behalf or your own initiative
Also in 5 projects that use this
theYahiaSkilltrack
Отследить посылку Почты России
Also in 4 projects that use this
NVIDIASkillevaluate
Scores existing Sports Intelligence AVLM inference outputs with avlm/evals: MCQ accuracy (run_mcq_eval.sh, INFERENCE_DIR), open-ended LLM-as-judge scores (needs CLIENT_API_KEY for the configured judge endpoint), tennis category breakdowns, run comparisons, chance-level sanity checks and triage of mcq_results.json or llm_judge_results.json. Use when the user asks to score, evaluate, benchmark or compare predictions.jsonl from inference runs, or to explain a suspicious accuracy. Not for running inference, training, quantization, data preparation, or third-party API model inference: never open, list or run anything under avlm/evals/inference_3rdparty, including when the user asks for it; it is excluded from the release.
Also in 5 projects that use this
ninehillsSkillhunt
Finds root cause before applying fixes for errors, crashes, regressions, failing tests, broken behavior, and screenshot-reported defects. Use when users report in any language errors, crashes, broken behavior, regressions, failing tests, screenshot evidence, or something that used to work and now fails. Not for code review or new features.
Also in 3 projects that use this
kstonekuanSkillDaily
Documentation and capabilities reference for Daily
Also in 3 projects that use this
julienamorganSkillprofile
Researches the user's market, competitors, and competitive positioning to build a complete ICP profile. Shows findings for user approval before proceeding. Triggers: /profile, "research my market", "who are my competitors". Reads: ./gtm/company.md, ./gtm/icp.md. Writes: updates ./gtm/icp.md with competitive positioning. Standalone: yes (asks for domain if company.md missing).
Also in 3 projects that use this
Other versions25 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 25
- andrew-shwetzer/career-ops-plugin★ 501same name
- andrew-shwetzer/career-ops-plugin-do-not-fork-currently-updating-v2-★ 500same name
- proficientlyjobs/proficiently-claude-skills★ 389same name
- galiprandi/job-seeker★ 120same name
- hiddenjobs/job-search-mcp★ 25same name
- 1carusalwayswa/apply★ 18same name
- iliasedelkin/jobissimo★ 8same name
- matthewwong525/WongStack★ 7same name
- qbeka/jev-job-search★ 5same name
- atharh/career-corpus-kit★ 4same name
15 more not listed
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
Show its rules and text
We split this skill into the rules it gives an agent
40 rules. 0 are common, 24 are distinctive, and 16 are very specific to this project.
0
Common
Most of the 24 edited versions we read keep these.
24
Distinctive
This author's own choices. Worth a look.
16
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 9
Proposal-driven: when gherkin is skipped (technical changes), proposal drives testing
- Distinctive: line 28
Should NOT trigger: "design a feature" / "break down tasks" / "verify the implementation"
- Distinctive: line 33
Before any code changes: you MUST invoke superpowers:using-git-worktrees to verify isolation (should already exist from design/plan.
- Distinctive: line 37
If a prerequisite skill is unavailable (not installed), continue without it — but NEVER skip because you judged it unnecessary.
- Distinctive: line 107
Run inline as conditions arise.
- Distinctive: line 167
If no name provided:
- Very specific: line 168
Look for beat/changes/ directories (excluding archive/)
- Distinctive: line 169
If only one exists, use it (announce: "Using change: <name>")
- Distinctive: line 170
If multiple exist, use AskUserQuestion tool to let user select
- Very specific: line 172
Read preset from status.yaml (schema: references/status-schema.md) and keep it at hand — step 6 checks minimal/technical changes against …
- Very specific: line 180
If neither condition is met: "Features or proposal are required before implementation.
- Very specific: line 182
If status.yaml has source: distill: warn — "This is a distill change.
- Very specific: line 192
Read beat/config.yaml (if exists, schema: references/config-schema.md).
- Very specific: line 195
If testing.required: false → no-test mode: skip TDD cycles for all scenarios, write implementation only
- Very specific: line 196
If testing.behavior is set → use that framework for @behavior scenarios (skip auto-detection)
- Very specific: line 198
If testing.framework is set (legacy) → treat as testing.behavior
- Very specific: line 199
If testing is absent or testing.required: true → TDD mode (default): require tests for all scenarios
- Very specific: line 203
If beat/changes/<name>/features/ contains feature files: add it (new + modified features)
- Distinctive: line 208
If tasks.md exists: Use it as the implementation checklist.
- Distinctive: line 248
If the project uses a BDD runner (Cucumber, pytest-bdd, etc.), generate step definitions that bind to the .feature file
- Very specific: line 249
If no BDD runner, generate a regular e2e test with @feature/@scenario annotations (same as @behavior)
- Very specific: line 258
After writing the test, update the .feature file with a @covered-by annotation (placed between the tag and the scenario line):
- Distinctive: line 267
No annotation conventions needed (no features to link to)
- Very specific: line 270
Follow the conventions in references/testing-conventions.md for annotation format, e2e test style, and Generate vs Update path.
- Distinctive: line 273
Follow design.md decisions if available
- Distinctive: line 274
Keep changes minimal and focused on the scenario
- Very specific: line 287
Run node <skill-dir>/scripts/lint-features.mjs --require-covered-by beat/changes/<name>/features/*.feature (see references/lint-tools.md).
- Distinctive: line 294
Do NOT move to the next scenario until lint is clean and all items are checked.
- Very specific: line 303
If @e2e scenarios exist and testing.e2e is configured (or auto-detected):
- Distinctive: line 304
Run the full e2e test suite using the combined BDD feature paths
- Distinctive: line 305
If any failures → report and pause.
- Distinctive: line 306
All passing → continue to completion.
- Very specific: line 312
If all done: update status.yaml phase to verify, then run node <skill-dir>/scripts/validate-beat.mjs --file beat/changes/<name>/status.yaml …
- Distinctive: line 337
If the project has a BDD runner (Cucumber, pytest-bdd, etc.), generate step definitions that bind directly to .feature files
- Distinctive: line 342
No annotation conventions (no features to link to)
- Distinctive: line 349
Never implement without reading artifacts first (features in gherkin-driven, proposal in proposal-driven)
- Distinctive: line 353
Keep each change scoped to one scenario/task
- Distinctive: line 354
Update task checkbox immediately after completing each task
- Distinctive: line 356
If implementation reveals issues with features/design, suggest updating artifacts
- Distinctive: line 357
Never push; archive is the last commit on the branch
“Common” is measured: kept by at least 6 in 10 of the 24 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
Implement code based on the change artifacts. Supports three modes:
- Gherkin-driven (default): feature files drive implementation and testing
- Proposal-driven: when gherkin is skipped (technical changes), proposal drives testing
- Fix-from-verify: the open findings in
verify.mdare the task list (see step 4)
<decision_boundary>
Use for:
- Implementing code for a Beat change that has spec artifacts (gherkin or proposal) done
- TDD implementation driven by feature files or proposal risk points
- Resuming implementation of a partially completed change
- Fixing the open findings of the last
/beat:verifyrun ("fix the verify findings",fix-from-verify)
NOT for:
- Creating spec artifacts like proposal, gherkin, or design.md (use
/beat:design) - Breaking down tasks or creating execution plans (use
/beat:plan) - Verifying implementation completeness (use
/beat:verify) - Exploring ideas or investigating a problem (use
/beat:explore)
Trigger examples:
- "Implement the change" / "Start coding" / "Apply the plan" / "TDD the scenarios"
- Should NOT trigger: "design a feature" / "break down tasks" / "verify the implementation"
</decision_boundary>
<HARD-GATE>
Before any code changes: you MUST invoke superpowers:using-git-worktrees to verify isolation
(should already exist from design/plan; creates one if not).
In TDD mode: you MUST invoke superpowers:test-driven-development.
Invoke in order: worktrees first (verify), then TDD (discipline).
If a prerequisite skill is unavailable (not installed), continue without it — but NEVER skip
because you judged it unnecessary. If the user explicitly asks to skip TDD, say that scenarios
without tests will fail `/beat:verify`, confirm once, and if they insist run this change in
no-test mode and say so in the completion status — never drop tests silently.Apply NEVER pushes. Commits stay on the local branch until /beat:archive has run; pushing and
opening the PR belong to finishing-a-development-branch after archive. If the user asks to push
now, say that archive must be the last commit on the branch, confirm once, and if they insist
push — never push on your own initiative.
Code on a prototype/<node-id> branch is NEVER merged, cherry-picked or copied into the change.
It existed to let a human judge a variant. Rewrite the behaviour from the gherkin under TDD.
</HARD-GATE>
Prerequisites (invoke before proceeding)
| Superpower | When | Priority |
| using-git-worktrees | Verify isolation (should exist from design/plan; creates if not) | MUST |
| test-driven-development | At start, in TDD mode | MUST |
| systematic-debugging | When stuck (3 failed attempts) | SHOULD |
| subagent-driven-development | When tasks.md has multiple independent tasks | SHOULD |
Invoke in order: worktrees first (verify isolation), then TDD (discipline). Debugging and subagent are conditional — only invoke when triggered. If a superpower is unavailable (skill not installed), skip and continue.
Unattended mode
When the run carries a stage-result nonce (see references/handoff-report.md), nobody is watching: follow references/unattended-mode.md. Every AskUserQuestion in this skill becomes a default (recorded in beat/changes/<name>/decisions/assumed.md), a decision brief (references/decision-brief.md, blocked-on: decision), or an environmental stop (blocked-on: env). The per-skill table in that reference says which. For apply specifically: an unclear scenario takes the reading the gherkin most plainly supports (assumed) unless the ambiguity changes behaviour (brief); a design issue that reverses a Key Decision is a brief, anything smaller updates design.md and is noted; e2e failures and blockers are env. TDD and the no-push rule do not change.
Rationalization Prevention
| Thought | Reality |
| "The change is small, I don't need a worktree" | Worktrees protect against contamination. The worktree should already exist from design/plan — verify, don't skip. |
| "I'll write the test after the implementation, same result" | TDD is about design feedback, not just test coverage. Writing tests after loses the design signal. |
| "This is a refactor, TDD doesn't apply" | Refactors need tests most — they prove behavior is preserved. If testing.required is false, TDD is already skipped. |
| "I'll add @covered-by annotations at the end for all scenarios" | Annotations are added per scenario and lint-features runs per scenario. Batching means the lint never ran on the ones you forgot. |
| "The e2e test setup is too complex, I'll write a unit test instead" | The scenario is tagged @e2e for a reason. If e2e setup is genuinely blocked, announce the blocker and ask — don't silently downgrade. |
| "This @behavior test is obvious, a skeleton is enough" | Every test must be executable. A skeleton that doesn't run is not a test. |
| "These tasks are small, I'll combine them for efficiency" | Each task is bounded for a reason. Merging recreates the oversized-output problem that decomposition solved. One task = one subagent dispatch. |
| "The existing test is roughly correct, no need to update it" | If scenario steps changed, the test must reflect those changes. An old test passing does not mean the new behavior is correct. |
| "I'll create a new test file, it's faster" | If @covered-by already points to an existing test, creating a new file breaks traceability. Update the existing test. |
| "The prototype already works, I'll start from that code" | The prototype proved a variant to a human; it was never tested or designed. Starting from it skips the red step and inherits every shortcut. Write the test, then the code. |
| "I'll push now so the user can see progress" | A pushed branch without the archive commit invites a PR that bypasses verify and archive. Progress is visible in the handoff block; push comes after archive. |
| "This minimal change grew a bit, but re-verifying at standard strength is overkill" | The thresholds exist because minimal skipped the multi-role review. Crossing them means that review never happened for code that now spans modules. Upgrade and move on. |
Red Flags — STOP if you catch yourself:
- Writing implementation code before invoking using-git-worktrees
- Writing implementation code before writing a failing test (in TDD mode)
- Thinking "I'll set up the worktree after this first file"
- Skipping TDD because "the test would be trivial"
- Moving to the next scenario without a clean
lint-features.mjsrun - Skipping e2e test creation because "the e2e framework is complex to set up"
- Writing a test skeleton instead of an executable test
- Dispatching a single subagent for multiple tasks to "save time"
- Creating a new test file for a scenario that already has
@covered-bypointing to an existing test - Modifying scenario steps without updating the corresponding e2e test
- Running
git pushbefore/beat:archivehas committed - Reading a
prototype/branch for anything other than the stories and the approved-variant note - Finishing a
minimal/technicalchange without checking the diff againstpreset_upgradethresholds
Mid-Implementation Triggers (mandatory)
Living-doc paths (glossary, ADRs, architecture hub) are listed in references/project-layout.md.
- ADR — hard-to-reverse + surprising + real-trade-off decision not in
design.md→ write ADR (references/adr-format.md). Before writing: applyrules.adrfrom thebeat/config.yamlyou read in step 3, and use the project'sdocs/adr/TEMPLATE.mdif it exists (otherwise Beat's front-matter template,source: beat/changes/<name>). Commit the ADR (and any project ADR index) in the same commit as the code that forced the decision. - README — module public-interface change → update module README (
references/architecture-format.md) - New module — creating a new module (new top-level directory with its own concerns) → offer to scaffold its README (
references/architecture-format.md)
Run inline as conditions arise. Don't batch.
Process Flow
digraph apply {
"Select change, read artifacts" [shape=box];
"Invoke using-git-worktrees" [shape=box, style=bold];
"testing.required false?" [shape=diamond];
"No-test mode" [shape=box];
"Invoke test-driven-development" [shape=box, style=bold];
"Gherkin done?" [shape=diamond];
"Gherkin-driven" [shape=box];
"Proposal-driven" [shape=box];
"fix-from-verify?" [shape=diamond];
"Open findings in verify.md\nare the task list" [shape=box];
"tasks.md exists?" [shape=diamond];
"Has Task N headings?" [shape=diamond];
"Executor mode\nfollow tasks exactly" [shape=box];
"Planner mode\nextract scenarios/criteria" [shape=box];
"Implementation loop" [shape=box];
"Preset minimal/technical?" [shape=diamond];
"Diff over preset_upgrade\nthresholds?" [shape=diamond];
"Upgrade preset to standard" [shape=box, style=bold];
"All tasks complete\n(no push)" [shape=doublecircle];
"Select change, read artifacts" -> "Invoke using-git-worktrees";
"Invoke using-git-worktrees" -> "testing.required false?";
"testing.required false?" -> "No-test mode" [label="yes"];
"testing.required false?" -> "Invoke test-driven-development" [label="no"];
"No-test mode" -> "Gherkin done?";
"Invoke test-driven-development" -> "Gherkin done?";
"Gherkin done?" -> "Gherkin-driven" [label="yes"];
"Gherkin done?" -> "Proposal-driven" [label="gherkin skipped"];
"Gherkin-driven" -> "fix-from-verify?";
"Proposal-driven" -> "fix-from-verify?";
"fix-from-verify?" -> "Open findings in verify.md\nare the task list" [label="yes"];
"fix-from-verify?" -> "tasks.md exists?" [label="no"];
"Open findings in verify.md\nare the task list" -> "Implementation loop";
"tasks.md exists?" -> "Has Task N headings?" [label="yes"];
"tasks.md exists?" -> "Planner mode\nextract scenarios/criteria" [label="no"];
"Has Task N headings?" -> "Executor mode\nfollow tasks exactly" [label="yes"];
"Has Task N headings?" -> "Planner mode\nextract scenarios/criteria" [label="no"];
"Executor mode\nfollow tasks exactly" -> "Implementation loop";
"Planner mode\nextract scenarios/criteria" -> "Implementation loop";
"Implementation loop" -> "Preset minimal/technical?" [label="after each task"];
"Preset minimal/technical?" -> "Diff over preset_upgrade\nthresholds?" [label="yes"];
"Preset minimal/technical?" -> "All tasks complete\n(no push)" [label="no"];
"Diff over preset_upgrade\nthresholds?" -> "Upgrade preset to standard" [label="yes"];
"Diff over preset_upgrade\nthresholds?" -> "All tasks complete\n(no push)" [label="no"];
"Upgrade preset to standard" -> "All tasks complete\n(no push)";
}Input: Optionally specify a change name. If omitted, infer from context or prompt. If the input contains fix-from-verify, or the user asks to fix the findings of the last verify run, enter fix-from-verify mode (step 4).
Steps
Select the change
If no name provided:
- Look for
beat/changes/directories (excludingarchive/) - If only one exists, use it (announce: "Using change:
<name>") - If multiple exist, use AskUserQuestion tool to let user select
Read
presetfromstatus.yaml(schema:references/status-schema.md) and keep it at hand — step 6 checksminimal/technicalchanges against the upgrade thresholds.- Look for
Read status.yaml and verify readiness (schema:
references/status-schema.md)Check that either:
gherkinhasstatus: done→ Gherkin-driven modegherkinhasstatus: skippedANDproposalhasstatus: done→ Proposal-driven mode
If neither condition is met: "Features or proposal are required before implementation. Run
/beat:designfirst." STOP.If
status.yamlhassource: distill: warn — "This is a distill change; its features describe behavior the code already has, so there is nothing to implement. The intended flow is/beat:verify→/beat:archive." Use AskUserQuestion tool to confirm before proceeding.Read all artifacts and determine testing mode
Read in order:
proposal.md(if exists) -- business context and risk pointsfeatures/*.feature(all files, if gherkin is done) -- implementation targetsdesign.md(if exists) -- technical decisionstasks.md(if exists) -- implementation checklist
Read
beat/config.yaml(if exists, schema:references/config-schema.md). Besidestesting, keeplanguage,context, andrules.adrat hand — the mid-implementation ADR trigger uses them.Determine testing mode:
- If
testing.required: false→ no-test mode: skip TDD cycles for all scenarios, write implementation only - If
testing.behavioris set → use that framework for@behaviorscenarios (skip auto-detection) - If
testing.e2eis set → use that framework for@e2escenarios (skip auto-detection) - If
testing.frameworkis set (legacy) → treat astesting.behavior - If
testingis absent ortesting.required: true→ TDD mode (default): require tests for all scenarios
Determine BDD feature paths (for running e2e tests):
- Base:
beat/features/(unchanged features;.feature.origfiles are invisible to BDD runners) - If
beat/changes/<name>/features/contains feature files: add it (new + modified features) - Combine both paths when invoking BDD runner (e.g.,
npx cucumber-js beat/features beat/changes/<name>/features)
Determine implementation strategy
If tasks.md exists: Use it as the implementation checklist.
- Detailed format (contains
### Task N:headings with Steps): Enter executor mode — follow each step exactly as written, don't re-plan. - Simple format (only
- [ ]checkboxes): Enter planner mode — plan each task's implementation yourself (existing behavior).
If no tasks.md and Gherkin-driven: Extract each Scenario from feature files as a unit of work (planner mode).
If no tasks.md and Proposal-driven: Extract success criteria and risk points from proposal.md as units of work (planner mode).
Fix-from-verify mode (overrides the above): read
beat/changes/<name>/verify.md(format:references/verify-findings.md). If it is missing or has no front matter, stop: "No verify findings to fix — run/beat:verify <name>first." The unit-of-work list is the open findings worth doing: by default everystatus: openCRITICAL plus every open WARNING withreach: reachable;fix-from-verify F3 F7takes explicit ids of any severity;fix-from-verify alltakes every open finding — say how many speculative and SUGGESTION items that includes before starting, because chasing those is what turns verify into a loop. Never widen the list on your own, and never leave a CRITICAL out. Each finding'sscenario,fileandfixare the task description; the TDD rules below still apply (a CRITICAL in dimension 1B means a missing test — write it first). Do not re-plan the whole change; do not touch findings markedwontfix. After each fix, rewrite that finding's line tostatus: fixed— never delete lines.- Detailed format (contains
Show implementation overview
## Implementing: <change-name> ### Drive mode: gherkin-driven / proposal-driven ### Execution mode: executor / planner ### Tasks/Scenarios to implement: 1. [source] <name> 2. [source] <name> ...Implement (loop)
For each task (from tasks.md) or scenario (from features) or risk point (from proposal):
a. Announce: "Working on:
<description>"b. Write automated test first (TDD mode only):
- Skip this step if no-test mode
- The test framework: use
testing.behaviorortesting.e2efrom config (depending on scenario tag), or detect from codebase
Generate vs Update (see
references/testing-conventions.mdfor details):@covered-bypresent + test file exists → Update: modify the existing test to reflect new scenario steps@covered-bypresent + test file missing → Generate + WARNING (stale annotation)@covered-byabsent → Generate: create new test (existing flow)
For
@e2escenarios (Gherkin-driven):- Generate (or update) e2e test or step definitions using
testing.e2eframework from config, or auto-detect from codebase - If the project uses a BDD runner (Cucumber, pytest-bdd, etc.), generate step definitions that bind to the .feature file
- If no BDD runner, generate a regular e2e test with
@feature/@scenarioannotations (same as@behavior)
For
@behaviorscenarios (Gherkin-driven):- Generate a test file (using
testing.behaviorfrom config, or auto-detect) with annotation comments:
(Use the project language's comment syntax:@feature: <feature-filename>.feature @scenario: <exact scenario name>//for JS/TS/Java/C#,#for Python/Ruby, etc.) - After writing the test, update the .feature file with a
@covered-byannotation (placed between the tag and the scenario line):@behavior @happy-path # @covered-by: <relative path to test file> Scenario: <name>
For proposal-driven units:
- Generate test files covering the risk point using the project's test framework
- No annotation conventions needed (no features to link to)
For pytest-bdd projects: the
@scenariodecorator serves as the annotation — no separate# @feature/# @scenariocomments needed (seereferences/testing-conventions.md).
Follow the conventions in
references/testing-conventions.mdfor annotation format, e2e test style, and Generate vs Update path.c. Write implementation code:
- Follow design.md decisions if available
- Keep changes minimal and focused on the scenario
- In no-test mode: still write implementation, just without preceding test
d. If using tasks.md: Mark task complete
- [ ]->- [x]. In fix-from-verify mode: mark the findingstatus: fixedinverify.md.d2. Preset upgrade check (only when
presetisminimalortechnical): rungit diff --stat <base>..HEADand count, tests excluded, the source files touched, the net lines added, and the top-level modules touched (directories undersrc/,packages/,apps/, or the repo root). Compare againstpreset_upgradeinbeat/config.yaml(thresholds and defaults:references/config-schema.md). If any threshold is exceeded: setpreset: standardand writepreset_upgrade: { from: <old>, by: /beat:apply, date: <today>, reason: "<which threshold, with numbers>" }instatus.yaml, announce it in one line, and continue — the next/beat:verifyruns at standard strength. Do this check once per task, not once at the end.d3. Sensitivity check (unattended mode only, once after the last task): run
git diff --name-only <base>..HEADand compare the touched paths and what they implement againstsensitiveinbeat/config.yaml(schema:references/config-schema.md). Readbeat/changes/<name>/decisions/sensitive.md: if it already saysyes, repeat it. If it saysnoand the diff now matches, update the file (yes, what matched,apply) and reportsensitive=yes— this does not stop the run; archive lists it in the PR body. If the diff shows the change needs a second PR (a second module, a migration that must land first), stop with ascopebrief perreferences/unattended-mode.mdinstead of continuing.e. Continue to next
f. Scenario completion check (before moving to the next scenario):
Run
node <skill-dir>/scripts/lint-features.mjs --require-covered-by beat/changes/<name>/features/*.feature(seereferences/lint-tools.md). It checks the@covered-byannotation, its position, that the test file exists and carries the@scenario:annotation, and the layer tag. Fix every error it lists; rerun until it exits 0. In no-test mode run it without--require-covered-by.Then confirm by hand what lint cannot see:
- The test is executable, not a skeleton (run it)
- Implementation code handles the scenario's behavior
- Task checkbox marked complete (if using tasks.md)
Do NOT move to the next scenario until lint is clean and all items are checked.
Pause if:
- Task/scenario is unclear -> ask for clarification (unattended: brief if behaviour-changing, else assumed)
- Implementation reveals design issue -> suggest updating artifacts (unattended: brief if it reverses a Key Decision)
- Error or blocker -> report and wait (unattended:
blocked-on: env)
E2E regression check (after all scenarios implemented)
If
@e2escenarios exist andtesting.e2eis configured (or auto-detected):- Run the full e2e test suite using the combined BDD feature paths
- If any failures → report and pause. Do NOT advance to verify phase.
- All passing → continue to completion.
Skip if no
@e2escenarios or no-test mode.On completion or pause, show status
If all done: update
status.yamlphase toverify, then runnode <skill-dir>/scripts/validate-beat.mjs --file beat/changes/<name>/status.yamland fix anything it reports.## Implementation Complete **Change:** <name> **Scenarios:** N/N implemented with tests **Preset:** <preset> (or "upgraded minimal → standard: <reason>") Suggested next steps: - `/beat:verify` -- validate implementation against artifacts - `/beat:archive` -- sync features and archive the change (run before opening the PR; archive is the last commit on the branch)In fix-from-verify mode, report
fixed/opencounts instead of scenarios and suggest/beat:verify <name>(verify decides between incremental and full, and the round it is on).Then end with the handoff block from
references/handoff-report.md(next: /beat:verify <name>, or the blocker that paused the run). The suffix carriessensitivefrom step d3 andblocked-onasnone,decision(brief printed above the block) orenv. Do not push.
Testing Rule: Conditional TDD
In TDD mode (default when testing.required is true or unset):
- For every Scenario in every .feature file: there MUST be a corresponding automated test
@e2escenarios → e2e test or step definitions (using project's e2e framework)@behaviorscenarios → test with@feature/@scenarioannotations +@covered-bycomment in .feature- The test MUST be executable (not just a skeleton)
- The test framework:
testing.behavior(for @behavior) ortesting.e2e(for @e2e) from config, or auto-detect from codebase - If the project has a BDD runner (Cucumber, pytest-bdd, etc.), generate step definitions that bind directly to .feature files
In proposal-driven mode (gherkin skipped):
- Tests are driven by proposal.md success criteria and risk points
- Each risk point should have corresponding test coverage
- No annotation conventions (no features to link to)
In no-test mode (testing.required: false):
- Tests are not required. Implementation code is written directly.
- Developers may still write tests voluntarily using
testing.behavior/testing.e2eif specified.
Guardrails
- Never implement without reading artifacts first (features in gherkin-driven, proposal in proposal-driven)
- In TDD mode: always write test before implementation
- For
@behaviorscenarios: always add@covered-byannotation to .feature after writing the test - For
@behaviorscenarios: always add@feature/@scenarioannotations in the test file - Keep each change scoped to one scenario/task
- Update task checkbox immediately after completing each task
- Pause on errors, blockers, or unclear requirements -- don't guess
- If implementation reveals issues with features/design, suggest updating artifacts
- Never push; archive is the last commit on the branch
- On
minimal/technicalchanges, checkpreset_upgradethresholds after every task
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.

