execute-task
Skill4 starsChanged 7 days agoMITView on GitHub
Implement one task (or a cohesion bundle) from a signed-off spec (Ready or Active): recompute the execution freshness gate, write the verifying test first, implement to green, run the project's full CI with adaptive retry, converge via the steps_convergence list (default /polish --nested), then open a draft PR referencing the brief, tasks, REQs, and tests. The execution workhorse of the planwright pipeline. Assumes the worktree already exists; never creates worktrees; merges or readies only through its helpers.
- Commits and pushes
6 other projects use a version of this.
Adopted by
Most recently taken up by
- devin-thomas/skillstheir own version, first seen Nov 8, 2026
- anombyte93/prd-taskmastertheir own version, first seen Nov 8, 2026
- Ronnasayd/aipptheir own version, first seen Oct 20, 2026
- igornfaustino/skillstheir own version, first seen Oct 11, 2026
- precise-alloy/ritustheir own version, first seen Oct 11, 2026
- adolfoaranaes12/BMAD-ENHANCEDtheir own version, first seen Jan 28, 2026
Other versions6 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 6
- anombyte93/prd-taskmaster★ 608same name
- adolfoaranaes12/BMAD-ENHANCED★ 2same name
- devin-thomas/skills★ 1same name
- igornfaustino/skills★ 1same name
- precise-alloy/ritus★ 1same name
- Ronnasayd/aipp★ 1same 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.
In this repository13 other files it gives its agents.
- builderSkill
- drainSkill
- inceptionSkill
- mission-controlSkill
- offloadSkill
- orchestrateSkill
- polishSkill
- resumeSkill
- self-reviewSkill
- spec-draftSkill
- spec-kickoffSkill
- spec-walkthroughSkill
- towerSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
15 rules. 0 are common, 5 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 6 edited versions we read keep these.
5
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 32
Invoking plugin scripts (REQ-D1.1, D-7): Call scripts/<name>.sh by the
- Distinctive: line 36
If a manifest doc does not resolve — at run start or its point of use — halt naming the missing doc and the chain consulted (REQ-K1.7).
- Very specific: line 54
Run once per invocation, in order.
- Very specific: line 231
Every commit this skill authors for the unit carries the Planwright-Task trailer spec-format defines under *Branch, worktree, and task-id …
- Very specific: line 241
Read test-spec.md for the unit's cited REQs first: each entry describes the verification path — what to test and which edge cases matter.
- Distinctive: line 277
When the diff touches a write-time trigger class — untrusted input, subprocess or shell construction, path handling, authorization, crypto, …
- Distinctive: line 289
When implementation is about to cross a catalogued decision domain the brief did not decide, the drift trigger fires: if the brief or spec …
- Very specific: line 303
Run the pre-ci point, then pre-flight step 9's command, saved to a mktemp file.
- Very specific: line 325
After CI passes, resolve the convergence point (*Points* step 1), then sync main once (merge-currency-guard REQ-B1.1, REQ-B1.4, D-4), an …
- Very specific: line 356
If implementation or convergence reveals the spec itself needs an edit, the meta-spec's writer prose (spec-format, *Sign-off records and …
- Very specific: line 386
Open or update a draft PR: If a PR already exists for the branch, update its body in place.
- Distinctive: line 458
Never: create a worktree; this skill runs inside one (D-37, D-44).
- Very specific: line 466
Never: write a meaning-class anchor entry.
- Distinctive: line 471
When something outside the unit's scope surfaces during implementation or convergence (complexity growth, an outdated pattern, a newly …
- Very specific: line 484
After the run completes (or halts), compare these instructions against the resolved doctrine docs (REQ-B3.2, D-42) — especially spec-format …
“Common” is measured: kept by at least 6 in 10 of the 6 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
/execute-task
The execution layer of the planwright pipeline (REQ-E1.1–REQ-E1.5): take one
ready unit (a single task or a cohesion bundle) from a Ready or Active spec with
a signed-off kickoff brief and carry it from a failing test to a draft PR.
/orchestrate dispatches it into a prepared worktree; a human may also run it
inside one. It works from the kickoff
brief, the durable contract (D-3), not by re-reading the spec; sign-off and
merge authorization are human gates (see Invariants).
Doctrine
This skill is procedure, not doctrine. Read the manifest's rule docs via
scripts/resolve-rule-doc.sh <doc-name> (under the resolved planwright root);
their definitions govern the concepts this skill names. Per
doctrine/instruction-hygiene.md, run-start entries load before work begins,
point-of-use entries at the named step or branch.
Invoking plugin scripts (REQ-D1.1, D-7). Call scripts/<name>.sh by the
resolved literal absolute path (never $VAR/scripts/<name>.sh), one plain
command per Bash call — doctrine/plugin-script-invocation.md.
If a manifest doc does not resolve — at run start or its point of use — halt
naming the missing doc and the chain consulted (REQ-K1.7). decision-domains
degrades gracefully instead: absent, note it in one line, skip the drift check,
and use engineering judgment.
Doctrine: run-start spec-format (lifecycle, anchors, freshness, commit trailer) Doctrine: run-start proportionality Doctrine: point-of-use research-rigor Doctrine: point-of-use security-posture Doctrine: point-of-use validation-rigor Doctrine: point-of-use finding-categorization Doctrine: point-of-use gate-wiring Doctrine: point-of-use decision-domains Doctrine: point-of-use custom-steps Doctrine: point-of-use venture-task
Pre-flight
Run once per invocation, in order. Any halt records the unit to the spec's
tasks.md ## Awaiting input section with the reason — on a v2 bundle as a
committed reference bullet on the task branch, **Task <id>** — <reason>, the
block staying in ## Tasks (D-3); in a holder or plain store,
scripts/halt-note.sh writes it uncommitted, named in the handoff
(custom-spec-location REQ-E1.9) — and ends the step (the gate-wiring pause
protocol's dispatched arm); attended, present and wait.
- Parse
$ARGUMENTS. AT-<n>ID and venture: followventure-taskinstead. Otherwise extract one or more task IDs (5,3.5, or5 6for a bundle), plus optional--resume <run>:<point>and bare<spec>(aliasspecs/<spec>, one trailing slash allowed). Validate each<id>against^[0-9]+(\.[0-9]+)?$, and the mapped identifier against the anchored identifier pattern^[a-z0-9][a-z0-9-]*$(≤64 chars, REQ-A1.8), refusing the reserved wordflight, before it appears in any path or command; a failing token is never interpolated. No task ID: halt and ask which task to execute. - Resolve the spec path, in order: (a) an explicit spec argument
(validated in step 1); (b) the branch name
parsed against
planwright/<spec>/task-<ids>(D-36); (c) the spec root's primary view (scripts/resolve-root.sh spec --primary,<root>below) when it holds exactly one bundle whoseStatus:isReadyorActive; (d) ask, listing the available bundles (underscore-prefixed reserved directories are not bundles). Verify the directory holdsrequirements.md,design.md,tasks.md, andtest-spec.md. - Resolve the run-start doctrine docs (above).
- Verify the spec is Ready or Active (see Invariants). Read the
**Status:**line inrequirements.md.Ready(signed off, no work started) andActive(work in flight) are both executable; refuse Draft, Done, Retired, and Superseded. The spec file staysReadyduring execution: Ready↔Active is derived, not stored. On Draft, halt and suggest/spec-kickoff. AReadyspec runs on the same terms as Active: the freshness gate (step 7) still applies (REQ-C1.3); the two gates compose. - Run the validator.
scripts/spec-validate.sh <root>/<spec>. On this dispatch path a missing or non-executable validator fails closed and halts (REQ-K1.7). A Ready or Active bundle's findings are errors: surface them and halt. - Verify the kickoff brief.
<root>/<spec>/kickoff-brief.mdmust exist and carry a final sign-off record with an anchor line (D-36). Absent, or partial (sections signed but no sign-off record, or a record without its anchor line — anchor-written-last makes a killed kickoff look absent, by design): halt and prompt/spec-kickoff. - Run the execution freshness gate (REQ-F1.9, REQ-F1.10, D-45; the
spec-formatanchor rules; fleet-hardening D-9). It stops execution against content changed since sign-off and against a stale localmain:- Fetch-before-gate (D-9, REQ-D1.1). Run
scripts/dispatch-fetch.sh --spec <spec> <primary-checkout>: it fetchesorigin(bounded, no local-mainadvance) and prints the anchor of the bundle's primary view (spec-formatRead surface per posture). Exit 0, or 3 (no-remote, offline) → gate against it; any other nonzero → do not silently proceed: park to Awaiting input. - Validate the entry (brief's most recent, from the primary view): it
parses, uses a sanctioned command form (any form on
spec-format's Sanctioned command forms list), a sanctioned writer (a/spec-kickoffsign-off or the markedClass: expression-onlyritual), and — meaning-class — a dispositionedLens-pass:. - Compare the recorded anchor against the one
dispatch-fetch.shrecomputed. Match → proceed. Mismatch → halt (remedy: a/spec-kickoffdelta re-walkthrough). No / unparseable / non-sanctioned / wrong-writer entry → halt (repair the record per REQ-F1.10). A pre-change entry (predating the header-**Status:**exclusion, or whole-file form) mismatches over unedited content; remedy: the one-time classify-then-self-re-anchor. Halts go to Awaiting input.
- Fetch-before-gate (D-9, REQ-D1.1). Run
- Read the brief slice and task block(s). From the brief: the signed-off
goal restatement, the task graph, and the unit's risk entries; from
tasks.md, each block's definition fields. Confirm every dependency is completed: in## Completed(v1), or derived Completed byscripts/orchestrate-state.sh(version 3: from the repository its block names, by default the work repository); else halt naming it, arepository-unresolvedone by alias. - Derive the full-CI command (D-19). Pick the most comprehensive guard the
repo ships, checking in order: a
mise.tomlaggregate task (planwright's own ismise run check); apackage.jsonci/testscript; aMakefileci/testtarget; alefthook.ymlpre-commitstack; a language toolchain's check. Prefer the aggregate over a bare test run. If none can be derived, ask. - Resolve
dispatch_isolation(D-5, REQ-C1.3). Runscripts/resolve-dispatch-isolation.sh(under the resolved planwright root) to read the knob through the four-layer overlay; it printsper-step(the assigned-decision default) orper-unitand applies the REQ-E1.4 by-layer malformed policy. A hard-fail (exit 4 — a malformed team-shared value or config; exit 5 — a broken install whose core default is unresolvable) is a stop condition: record totasks.mdAwaiting input and halt. A warn+degrade (an adopter/machine-local value degraded to the core default, exit 0) proceeds. Record the mode; it governs how Implementation and Convergence host this unit's steps (see Step isolation). - Update Last activity (v1); write no placement or
Status. On a format-version 2 bundle this step writes nothing — a v2 block carries no annotations, and derived execution state never produces commits (version keying, here and throughout this skill, reads the declaredFormat-version:as the scripts do; unparseable fails closed, never the v1 arm — D-7). On v1: the dispatch record (task branch + runtime marker) already makes the unit derivable as In progress, so write no section placement and noStatusline (REQ-B1.1, D-1); a block still in## Forward planwhile its branch is in flight is intentional snapshot lag, not corruption (REQ-B1.2). The only edit is the block's- **Last activity:** <today>annotation, anchor-excluded (spec-formatcanonical extraction) and not aStatusline, so it trips neither corruption guard. Commit it whencommit_on_state_moveis true (readconfig/defaults.ymloverridden by<repo>/.claude/planwright.local.yml, local wins; absent/malformed falls back to the default with a one-line warning). - Check every point, run
pre-implementation:scripts/resolve-steps.sh pre-implementation pre-ci convergence pre-pr post-pr --explain --check --unattended(pluspre-ready-flipunderready_flip_policy: unit-owner); a non-zero exit halts, naming only step ids.
Points (custom-steps, D-3)
This skill is the runner at its five in-run points; custom-steps owns the
contract. Issue one run id (scripts/step-record.sh new-run) per invocation.
--resume <run>:<point> runs start there, skipping what
scripts/step-run.sh resume --run <this-run> --from <run>:<point> prints. Run a point
in the worktree, the PLANWRIGHT_STEP_* context exported (a PR number
whenever one exists):
- Resolve it whole first:
scripts/step-run.sh resolve --run <run> <point> --unattendedexactly when the backend seam's launch record says headless, else--attended. Exit 1:ask, or attended all-refuserows, presents and waits for a repair and re-resolve; otherwise park. Exit 2, 4, or 5: a stop condition. - Host each step in order by its printed hosting, per the doc's
Hosting table, a skill or prompt step receiving the
--preambleblock:isolatedsessions launch through the backend seam (offload-dispatch) at theirexecute_steptier, recording the session id (a backend that cannot spawn degrades toin-session, recorded, a followingcontinueattaching to the unit's session);continueresumes the predecessor's id (behind a skip, the one its line names) or recordsfailed. Commands run throughstep-run.sh(backgrounded, waited in-turn):isolatedbycommand, session-hosted betweenbegin --owner $PPID, whose printedrunline the shell tool runs, andend. A refused context value (exit 6) isfailed. Past itstimeout, a session-owned step is stopped through the seam or no longer waited on (recording which), outcomefailed; anin-sessioncommand's goes to the shell tool. - Record each session step's outcome from its handoff through
step-record.sh write, which prints the next step'sPREV_RECORD(step-record.sh heads: the head move); askipline recordsskipped, codemissing. - Posture: a
haltedorfailedstep underon-failure: haltends the point and the unit through the pause protocol, the entry naming only the point, step id, outcome, and worktree-relative record path;continueproceeds. - Complete it (
step-record.sh write --completion, the ending head and each warning), a halted list included; a parked, asked, or unresolved point writes none.
Implementation
Step isolation (dispatch_isolation, REQ-C1.3, REQ-C1.4, D-5)
The mode resolved in pre-flight step 10 governs how this unit's steps — the implementation phase (test-first loop, research, security pass, CI), then every point's steps with no declared hosting — are hosted. It changes hosting, not work or order.
per-unit(strictly preserved): the whole unit runs in one session — implement, run CI, run each point's steps inline, then push and open the PR. Context carries across steps.per-step(the assigned-decision default): each step runs in its own fresh session, seeded by/resumefrom durable state alone (brief,tasks.mdsnapshot, git log, open PR), so context stays bounded and each review's perspective is uncontaminated by prior steps. Each step commits its work with thePlanwright-Task:trailer. Realization is the backend's job (D-2): a session-grade backend spawns a session per step; the terminal rung (D-3) approximates it with a context clear +/resumereseed; a backend doing neither degrades toper-unit(degrade capability, never safety).
Launch tier. A per-step session is a launch: resolve
scripts/allocation-apply.sh plan --key execute_step --backend <backend> --unit
<spec>:task-<id> --step <step> and apply per backend-capability-contract's
Applying a resolved tier. Exit 3 is withheld: do not launch; only exit 6
degrades. The terminal rung advertises none, inheriting the operator's
session.
Commit convention (REQ-C1.4, D-2)
Every commit this skill authors for the unit carries the
Planwright-Task trailer spec-format defines under Branch, worktree, and
task-id grammar, stamped by the helper:
scripts/planwright-commit-trailers.sh <spec>/<id> [<spec>/<id> ...] < <message-file> | git commit -F -Test-first development (REQ-E1.1, validation-rigor)
Read test-spec.md for the unit's cited REQs first: each entry describes the
verification path — what to test and which edge cases matter. Then, for every
piece of new behavior or bug fix the unit introduces:
- Write the test, grounded in the
test-spec.mdentry and theDone when:conditions. It must be specific enough to fail for the intended reason and pass only when the implementation is correct. - Run it and confirm it fails for the right reason — the failure message corresponds to the behavior being implemented, not a syntax, import, or unrelated error. A test that passes immediately, or fails for the wrong reason and cannot be isolated, is a stop condition.
- Implement to make the test pass, consulting the brief's goal restatement and risk register.
- Confirm the test passes — the same test, unchanged. Iterate on the implementation, never the test.
Validate the solution per validation-rigor: the targeted test, the wider
project suite (the CI step below), and the altitude check (fix the cause at the
right layer, not the symptom). A unit that is purely configuration,
documentation, or infrastructure with no testable behavior per test-spec.md
skips the loop; note in the PR body why no test was added.
Research Rigor (REQ-D1.5, research-rigor)
Research fires before implementation when a trigger holds — a new
dependency, an unfamiliar domain, a security-touching pattern, a
version-sensitive API, or a "how do mature projects do this" question. Consult
current sources in research-rigor's order, recency over model memory, with
its antipattern check before adopting a pattern. Record the
findings, tradeoffs, and sources in the brief's risk register, appended to a
named section — never overwriting existing rows, never as an anchor entry.
Declare the research depth's scoping per proportionality. A significant risk
the brief did not anticipate is a stop condition: record it and hand off.
Write-time security pass (REQ-D1.6, security-posture)
When the diff touches a write-time trigger class — untrusted input, subprocess
or shell construction, path handling, authorization, crypto, or serialization —
run a focused security pass on that risk class before opening the PR, distinct
from the general review lens, with Research Rigor consulted. Apply artifact
data-hygiene to everything committed (brief, risk register, observations log, PR
body): no secrets, credentials, internal hostnames, or sensitive detail. Work in
a hard-disqualifier zone (security-sensitive code, migrations or destructive
ops, CI config, lockfiles, secrets files) follows the gate-wiring pause
protocol rather than landing autonomously.
Decision-domains drift triggers (REQ-G1.8, decision-domains)
When implementation is about to cross a catalogued decision domain the brief did
not decide, the drift trigger fires: if the brief or spec already decides it,
proceed citing that decision; otherwise research per stake, then recommend (a
low-stake, reversible call, considerations recorded) or escalate (a
load-bearing or hard-disqualifier-adjacent call) rather than auto-defaulting. A
decision in an uncatalogued domain writes an observation (the catalog grows
through the drain loop). The catalogued domains are the prose seed unioned with
adopter/team/machine-local additions via scripts/resolve-catalog.sh
decision-domains (REQ-D1.1), so overlay domains trigger drift too. If
decision-domains did not resolve, note the skipped check and use engineering
judgment.
Run the full project CI (REQ-E1.2)
Run the pre-ci point, then pre-flight step 9's command, saved to a mktemp
file; each attempt is scripts/detached-run.sh start -- scripts/full-suite-run.sh
--run <run> -- bash <file>, polling status <run-dir> in-turn. A failed start,
died or never-started fails it as logic; finished 75 parks naming holders
in its log, unretried. The suite must pass before convergence.
Adaptive CI-failure handling (REQ-E1.2, D-25)
On a CI failure, classify it with scripts/classify-ci-failure.sh over the
attempt's log:
transient(network/DNS errors, registry failures, rate limits, timeouts): retry up to twice, waiting 30s before the first retry and 90s before the second. A retry that goes green proceeds; if both still fail, reclassify as logic and escalate.logic(assertion mismatches, type/compile/syntax errors, lint/format violations, test-runner failures): escalate immediately, never retried. Record the failure with the full CI output totasks.mdAwaiting input and halt (attended: surface and wait).
Convergence (REQ-E1.4, D-39; custom-steps REQ-E1.1)
After CI passes, resolve the convergence point (Points step 1), then sync
main once (merge-currency-guard REQ-B1.1, REQ-B1.4, D-4), an empty list
included: run scripts/converge-sync-main.sh; a non-zero exit halts the
unit, parking a park record's text; a resolve or repair record's text
overrides. The sync changes the head a later ready-flip lands on, never who flips.
Run the convergence steps (Points steps 2–5); steps_convergence is the
unit's convergence phase, core's default being polish with --nested. A
review step's --nested run returns its audit record without pushing or
opening a PR. Classify each handoff:
- Normal exit (converged, or handed off with queued forks):
appliedorpassed; fold its audit record — the four bucket tables (perfinding-categorization, whose Prose findings axis classes a prose-only fix expression-only or meaning-class), the declined log, the pending-sign-off checklist (attended or unattended, a Needs-sign-off fix is committed on the branch, never asked about first; prose-only ones batch into one commit per loop iteration undergate-wiring's commit discipline), and any queued Needs-human-judgment forks — into the PR body. A queued meaning-class spec fork ishaltedand stops PR creation whatever the posture: contract drift, governed by the meaning-class refusal below. - Safety stop (wider-suite failure, loop detection, iteration cap):
failed; the branch may be known-broken, so open no PR over it. - Hard-disqualifier finding left unresolved:
halted, for human direction.
A convergence finding whose fix edits this spec's anchored content is an in-flight amendment, never a direct edit: it takes the ritual below — the stale-anchor pre-flight first, then the expression-only lane or the meaning-class refusal.
In-flight amendments (D-19, REQ-A3.3, REQ-F1.10)
If implementation or convergence reveals the spec itself needs an edit, the
meta-spec's writer prose (spec-format, Sign-off records and content
anchors) governs what this skill owes. Pre-flight first: before the first
edit, recompute the anchor with the brief's most recent recorded command; a
mismatch, an absent or unparseable entry, and a failed recompute each block the
edit — surface the condition instead of editing on top of it. A blocked
edit takes its disposition from its route: a convergence finding queues as an
irreducible fork routed to the anchor repair, folded into the PR body; an edit
this task's own implementation work revealed is a stop condition — record
the unit to tasks.md Awaiting input and halt. With the pre-flight clean,
classify the edit on the amendment axis:
- Expression-only (a typo, ambiguity, or gap-fill consistent with the
accepted decisions): fix it in place in one commit with a dated
## Changelogentry, and a marked self-re-anchor entry to the brief's amendment log —Class: expression-only, citing the changelog line, anchor by the brief's recorded command form, written last. This is the one anchor entry an execution skill may write. - Meaning-class (contradicts an accepted decision, alters a REQ's meaning,
or adds a REQ/D-ID): contract drift — do not edit the contract from
execution. Halt, surface the drift with the conflicting reading, and route the
human to a
/spec-kickoffdelta re-walkthrough. There is no silent proceed.
PR creation (REQ-E1.5, D-21)
- Run the
pre-prpoint, then push the branch:git push origin <branch>(with-uon first push). On push orghauth failure, degrade gracefully (REQ-K1.6, REQ-K1.7): the local work is committed; record an Awaiting-input note intasks.mdnaming the pending step and the failure, surface it, and stop. Never retry into an opaque failure. Open or update a draft PR. If a PR already exists for the branch, update its body in place; otherwise
gh pr create --draftwith an explicit--titleand--body(headlessghprompts or fails without them). The title is conventional and passes the PR-title lint (scripts/check-commit-msgs.sh):feat(<scope>): <task title>or the fitting type. Assemble the body per the PR-body assembly section of thegate-wiringdoctrine (D-2). This skill supplies the summary inputs: the kickoff brief path relative to its repository or plain root, the task IDs, the REQs satisfied (from the taskCitations:), the test additions and what they verify, and implementation notes (key decisions). The audit record is the convergence steps' folded output plus every in-run point's table (step-record.sh render --run <id>,nonerows included). The approval act, never the ready flip, signs off pending-sign-off items; reject one before it by its printed recipe.Then run the
post-prpoint, the PR number now in its context; after its list and the re-fire pass (step-run.sh refire's lines, hosted with--refire-of, before post-pr's completion), re-emit the tables, and if a post-pr record moved the head fetch and regenerate the checklist (step-record.sh regenerate --base origin/<base> --head origin/<branch> --checklist-only) and re-emit the handoff; verify the PR is still a draft, else park naming the post-pr steps (custom-steps REQ-E1.2); a failed re-fire underhaltthen parks. Earlier points never re-run. Whenready_flip_policyresolvesunit-owner, runscripts/ready-flip.sh's header sequence. Undermerge_policy: policy-class,scripts/merge-admitted.sh's follows.- Annotate the unit (v1 bundles only). On a format-version 2 bundle no
annotation exists to write — skip this step. Update only the task
block's
- **Last activity:** <today>annotation; write noStatusline. Section placement is thetasks-pr-syncreconcile's sole job (REQ-B1.1, D-1); the reconcile preserves annotations untouched and does not author theStatustext. APR #<N> draftStatus here would race it: the hook is fail-soft on a busy lock, leaving the block in## Forward planwith the section/status contradictionscripts/check-ledger.shflags (REQ-E1.1, REQ-E1.2).
Hand off. Report: the unit and spec, the freshness-gate result, tests
written and CI outcome, step counts per point, the convergence summary, the verified anchor, the
push/PR outcome (or degradation note), and the human's decisions — the
pending-sign-off checklist and queued forks; print each trailered
commit's SHA and the command git log --format='%h
%(trailers:key=Planwright-Sign-Off,key=Planwright-Sign-Off-Rejected,separator=%x20)
%s' <base>..HEAD.
Apply artifact data-hygiene to everything surfaced.
Stop conditions (mandatory human handoff)
Halt and hand back when any of these fires, recording the unit to tasks.md
Awaiting input with the reason (the pre-flight halt protocol above); each is
described at its point of use: every pre-flight halt;
a test that cannot fail for the right reason; a CI logic failure, or transient
retries exhausted; research revealing a risk the brief did not anticipate;
contract drift (route to /spec-kickoff); Done when: or Deliverables:
admitting multiple valid interpretations; a point ending the unit (Points);
gh not authenticated or the push rejected.
Invariants
These hold at every step, each list rule labelled with its
doctrine/human-gates.md kind:
- Gate: never act on a spec neither Ready nor Active, nor bypass the freshness gate composing with it; no bypass flag (REQ-C1.1, superseding REQ-J1.2, D-33; D-2, D-3, REQ-F1.9, REQ-C1.3). Merge authorization is the human's; pushed history stays append-only.
- Policy: merge only under
merge_policy, flip only underready_flip_policy, through both header sequences above (D-21; human-gates REQ-C1.5, REQ-D1.4); reshape never-pushed commits only perunpushed_rewrite. - Contract: this skill owns push and the draft PR; no step pushes before
post-pr, merges, flips, or rewrites history (D-39; custom-steps REQ-D1.6). - Never create a worktree; this skill runs inside one (D-37, D-44).
- Never let
per-stepisolation weaken state-safety: everytasks.mdplacement move goes through the sibling reconcile under the per-spec lock, and no step session writes dispatch or progress state or opens a PR (REQ-C1.4). - Never skip the test-first loop for a behavior-introducing unit with a
test-spec.mdverification path (REQ-E1.1). - Never silently proceed past a meaning-class contract drift; route to
/spec-kickoff(REQ-A3.3). - Never write a meaning-class anchor entry; the only one this skill writes
is the marked
Class: expression-onlyself-re-anchor (REQ-F1.10).
Observations
When something outside the unit's scope surfaces during implementation or
convergence (complexity growth, an outdated pattern, a newly available
dependency feature, an uncatalogued decision domain), record it as its own
fragment through the shared helper: scripts/obs-record.sh --slug <topic>
--scope <repo> --text '<observation>' (resolved under the planwright root; it
writes into the spec root's _observations/entries/). Commit the fragment
within the iteration that produced it so the tree returns to clean; on a
non-zero helper exit, surface the failure rather than dropping it. Do not act on
observations during the unit; they are seed material for /spec-draft
(REQ-E2.1, REQ-H1.6).
Maintenance
After the run completes (or halts), compare these instructions against the
resolved doctrine docs (REQ-B3.2, D-42) — especially spec-format and
gate-wiring. If a concept this skill names changed meaning, gained or lost a
step, or moved between docs, record a drift observation via the shared helper
(scripts/obs-record.sh --slug skill-drift --scope <repo> --text
'skill-drift(execute-task): <what>', keeping the skill-drift(...) prefix),
commit it as its own chore commit, and tell the user. Do not edit this skill or
the doctrine docs to resolve the drift; /spec-draft owns folding drift into
spec amendments.
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.

