agentleFS
ravidsrkravidsrk/agent-skills/skills/finish-line/SKILL.md

finish-line

Skill1 starsChanged 23 days agoMITView on GitHub

Drives an AI-built product that has docs, specs or GitHub issues but was never finished to verified launch-readiness, fully autonomously — no questions or approvals mid-run. It learns what the product is only from the docs and the running app (every claim quotes its source; an independent verifier approves it), audits what works, freezes a hash-locked definition of done, then works it item by item with Playwright / Maestro visual checks, a verifier subagent and tamper checks against skipped or weakened tests, up to a release candidate on a preview. Every issue found is researched until fixed. Starts over cleanly when a run misread the product. Use when the user says "finish this product", "take it to launch", "do it autonomously", "don't ask me", "verify what actually works", "the AI says it's done but it isn't", "audit my half-built app", "test everything visually", "it misunderstood my product, start over", or has many unfinished AI-coded products and must pick one to ship.

  • Pipes a download into a shell
  • Reads credentials
  • Installs packages

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 2 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    No docs or spec at all: write the PRD first, then come back

    line 31
  2. Distinctive:

    Never run the build loop without the protocol: the laws in its §0 are what keep the result honest.

    line 52

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Finish Line

Coding agents start products well and stall in the last 20%: closed issues stand in for working features, the agent that wrote the code also grades it, long sessions drift, and "done" means the agent said so. This skill makes completion a property of the running software, not the transcript. It first writes down what the product is — only from its docs and what the running app does, every claim quoting its source, unknowns listed instead of guessed — and has an independent verifier check that against the docs. Then it freezes a definition of done built on that brief, works it one item at a time, and lets an item pass only with screenshots, a passing test, a verdict from a separate verifier, and a clean tamper check.

Fully autonomous. No step waits for a person. The agent decides with a fixed procedure and logs every decision in DECISIONS.md; the independent verifier approves or rejects changes to the definition of done; the runner reverts sessions that game the gate, pauses items that stall and brings them back as research rounds, retries a failing CLI, re-checks owner actions, and accepts a finished state only when the ledger proves it. Every issue found is resolved: defects found anywhere become ledger items, and an item that resists is never abandoned — it returns in research rounds that go deeper each time (docs, library source, issue trackers, the web) until it passes. The only things left to the owner — keys, accounts, production, DNS, store listings, merging — are collected in OWNER_ACTIONS.md, each with a check that reopens the work by itself once it's done.

State lives in .finish/ inside the product repo, so every session resumes where the last one stopped.

When to use

  • A product has docs (PRD, specs, implementation plan, issues) and code, but isn't launched
  • An agent keeps claiming completion that the app doesn't back up
  • The user wants it finished without being asked questions every iteration
  • The user wants every feature tested visually, end to end, against the docs
  • Several half-built products exist and one has to be picked and shipped

When NOT to use

  • No docs or spec at all: write the PRD first, then come back
  • A single bug fix or one feature: just do it
  • Pure libraries or CLIs: still usable with api / command verify methods, but skip the visual parts

Setup

Tools: git, jq, a headless agent CLI. Web: npm i -g @playwright/cli (repo-level Playwright installs happen in Phase 0). Mobile: Maestro (curl -Ls "https://get.maestro.mobile.dev" | bash) and an emulator/simulator. Recommended: Docker (real local Postgres/Redis/Mailpit/MinIO), gh, gitleaks.

Optional env, passed through to every session: FINISH_GIT_NAME, FINISH_GIT_EMAIL (commit identity), FINISH_NO_AI_TRAILERS=1 (no AI attribution in commits/PRs), FINISH_UNTIL=P1|P2 (keep going past P0), FINISH_MAX_AMENDMENTS (5), FINISH_COMPANIONS=auto|off|install, FINISH_KEEP_HOOKS=1.

Optional companions: scripts/companions.sh install adds community skill packs pinned to reviewed commits — superpowers and Addy Osmani's agent-skills by default; Matt Pocock's skills and gstack on request. See Companion skills below.

How to run it

SituationDo this
Many products, none shippedscripts/portfolio.sh <folder>, then the triage prompt in references/portfolio-triage.md. Exactly one FINISH-NEXT.
Finish one product, unattended (recommended)scripts/finish.sh <repo> — fresh agent session per loop until LAUNCH_READY or READY_FOR_OWNER.
A run misread the product; start overscripts/finish.sh --fresh <repo> — sets every previous run aside (archived, nothing deleted) and starts the review again from the docs. A run an older version of the skill started is set aside this way on its own (FINISH_KEEP_RUN=1 keeps it).
You are the agent, in a live sessionRead references/protocol.md in full and run one session of it in the product repo, with FINISH_SKILL_DIR = this skill's folder. Don't ask the user anything — decide per its §7. Then stop; the next session resumes from .finish/.

Never run the build loop without the protocol: the laws in its §0 are what keep the result honest.

The workflow

PhaseSTATUSWhat happensExit
0 AuditAUDITINGscripts/scaffold.sh; the product brief from the docs, before the code — one claim per fact, each quoting its source, unknowns listed (ledger.sh brief checks every quote); discover usable credentials and CLI logins; make it boot with real local infra; fill the gate; sweep for stubs and fakes; walk every documented feature and screenshot it: WORKS / PARTIAL / FAKE / BROKEN / MISSINGAUDIT.md committed
1 FreezeFREEZINGTurn the brief into ledger.json: P0 = the core promise end to end in the brief's terms (sign-up, payment, return visits only when the docs have them), plus the launch gates the brief shows apply. Every item cites its brief claims; Given/When/Then criteria. ledger.sh validate → ledger.sh lock → the verifier approves brief and ledger against the docs (freeze mode) → lockFREEZE + LEDGER.lock committed
2 BuildBUILDINGledger.sh next → test first → smallest real fix → verify.sh --quick → look at it at 375×812 and 1440×900 → verifier subagent → ledger.sh pass or fail (3 strikes → stuck, a pause → research rounds until it passes); defects found along the way → ledger.sh issuenothing in scope failing or stuck
3 ReleaseRELEASINGFresh-clone proof, full regression, Lighthouse, preview deploy, first-user pass by the verifier, LAUNCH_REPORT.md, ledger.sh done-checkLAUNCH_READY or READY_FOR_OWNER

What replaces asking the owner

Situation that used to need a personAutonomous path
Understanding what the product isThe brief, from the docs and the running app only: quotes checked by ledger.sh brief, open questions listed as unknowns and never built on, approved by the verifier before the freeze (Law 11)
A judgment call (ambiguous spec, missing design, which library)Decision procedure in protocol §7 → one line in DECISIONS.md → act
The definition of done is wrong or too bigledger.sh amend: additions apply at once; anything else needs the verifier's APPROVE against the docs; capped
tamper.sh flags a legitimate changeledger.sh amend --rebaseline, same review
A key, account or production step is missingledger.sh owner <ID> "<action>" "<check>" → the verifier approves it in owner mode (and rejects engineering work dressed up as an owner action) → owner --apply; work continues; the item reopens by itself when the check passes
An item won't convergefail ×3 → stuck (a pause) → ledger.sh round: unlimited research rounds, each a deeper step (reproduce → primary sources → others' reports → isolate → change approach → re-scope by amendment → fresh angle), logged in .finish/research/<ID>.md. Never handed to the owner as "needs an engineer": ledger.sh owner refuses that
A defect turns up (verifier, first-user pass, Lighthouse, security review, while working)ledger.sh issue adds it as an I-### item at once; fixed and verified like any item, never parked in LATER.md
A session games the gate or claims a false finishThe runner reverts it (new commits, nothing lost), tells the next session why, and continues
Sessions stop making progressThe runner pauses the current item as stuck and moves on; when nothing else is failing it opens the least-tried stuck item's next research round
P0 is doneFINISH_UNTIL=P1 makes the runner open the next scope itself

Companion skills

Installed community skills help at named protocol steps — superpowers' TDD, debugging and verification-before-completion; Addy Osmani's review, security, performance and launch checklists; gstack's browser and read-only QA, security and benchmark skills; Matt Pocock's tdd, diagnosing-bugs and code-review as fallbacks. companions.sh detect writes .finish/companions.json (slot → exact skill name) and the session invokes each only at its step (protocol §2.2, Law 9). They never decide anything: the ledger, the gate, tamper and the verifier do. Every runner session runs under a policy that denies each pack's asking, planning, publishing and merging skills, turns hooks off, and puts gstack in its no-human mode; the verifier has no Skill tool and skips CLAUDE.md. Details, pins and licenses: references/companions.md.

Scripts

ScriptDoes
scripts/finish.sh [--fresh] [repo]Autonomous runner. --fresh sets previous runs aside first. Env: MAX_SESSIONS (40), STALL_LIMIT (3), FINISH_UNTIL (P0), FINISH_MAX_TRIPS (3), FINISH_BACKOFF (60), FINISH_OWNER_CHECK_TIMEOUT (60), FINISH_MAX_DRY (9), FINISH_COMPANIONS (auto), FINISH_KEEP_HOOKS, FINISH_KEEP_RUN, CLAUDE_MODEL, FINISH_AGENT. Every session runs under the companion policy (--settings). One runner per repo (lock in .git/). Exit 0 LAUNCH_READY/READY_FOR_OWNER · 2 the agent commits nothing at all · 3 session cap · 4 too many reverted sessions · 5 agent CLI keeps failing.
scripts/fresh.sh [repo]Sets every previous run aside: archives it at branch finish-line-archive/<stamp>, then one commit on finish-line returns the tree to the default branch without .finish/ or Finish Line's tests (merging the default branch if it moved on); ignored leftovers move to .git/finish-line-archive/<stamp>/. No history rewritten.
scripts/companions.shdetect · show · policy [--runner] · settings · install [pack…] · list. Finds installed community packs and fills the protocol's companion slots; builds the deny-and-no-hooks policy every session runs under; installs packs pinned by commit SHA from companions/ (finish-line's own marketplace).
scripts/scaffold.sh [--web]Phase 0: creates .finish/ (with RUN, which marks the skill version that started the run), vendors ledger.sh / tamper.sh / lib.sh into .finish/bin/, installs verify.sh, the verifier agent, .claude/settings.local.json (no permission prompts, questions or plan mode in interactive sessions) and (web) the Playwright config + fixture. Preserves configured gates; checks compatibility before refreshing unfrozen bin. See references/upgrades.md.
scripts/upgrade-gate.sh--check compatibility before distributing newer scripts; --propose prints the exact known-selector repair; --apply installs it before freeze only. Frozen/custom upgrade procedure: references/upgrades.md.
.finish/bin/ledger.shbrief · validate · status · next · show · specs · pass · fail · stuck · round · issue · open · reopen · regress · owner · owner-check · done-check · amend · migrate · state · criteria · run-commands · lock · freeze-check · check. brief checks every claim's quote against its source; lock freezes only with the verifier's approval of exactly this brief and ledger. Mutations touch only status/attempts/evidence/notes; a verdict is bound to the code STATE it checked.
.finish/bin/tamper.shFails on skipped/focused tests, tautologies, deleted tests, weakened specs, test-config filter or coverage-threshold edits, new lint/type/coverage/scanner suppression comments, grown scanner ignore files, any post-freeze change to verify.sh or the product brief, edited frozen files.
scripts/portfolio.sh [dir]Offline table of every repo under a folder.

Common gotchas

GotchaFix
The run misread the productscripts/finish.sh --fresh <repo>. Read .finish/PRODUCT.md early in the new run: if a claim is wrong, the doc it quotes is unclear — fix the doc and start fresh again.
The runner started fresh by itself after an upgradeThe run was started by a version without the checked brief. It's archived (git log finish-line-archive/<stamp>); FINISH_KEEP_RUN=1 keeps such a run instead.
Runner exits 0 with READY_FOR_OWNERDo what .finish/OWNER_ACTIONS.md lists (add a key, log in a CLI), rerun. No marking needed; the checks reopen the items.
Runner exits 4Three sessions had to be reverted. .finish/PROGRESS.md has a Runner note for each; look for the pattern.
Runner exits 2FINISH_MAX_DRY (9) sessions in a row committed nothing, not even research notes — the agent itself isn't working (its CLI, or it can't run at all). Read the last .finish/logs/session-*.log.
Runner exits 3 with items unresolvedThey weren't abandoned: rerun with a higher MAX_SESSIONS; .finish/research/ has every round so far.
Runner exits 5The agent CLI itself kept failing (auth, rate limit) even with backoff. Fix the CLI, rerun.
ledger.sh pass refusesIt says why: missing screenshots, no PASS report, code changed since the verifier's STATE, tamper failing, spec with no assertions. Fix that; never work around it.
Uncommitted changes before a runThe runner stashes them (never .env* files) — git stash list.
Laptop sleeps mid-runmacOS: caffeinate -i scripts/finish.sh <repo>.
--dangerously-skip-permissionsThe default runner uses it. Run in a container, VM, or a separate OS user without production credentials.
A companion skill wants to ask, plan or shipLaw 9: take its recommended option and log it; its gated skills are denied by the session policy anyway.
Your own hooks don't fire during a runRunner sessions turn hooks off. FINISH_KEEP_HOOKS=1 keeps them.
CI runs verify.sh on a shallow clonetamper.sh needs the freeze commit: actions/checkout with fetch-depth: 0.

References

  • references/protocol.md — the per-session protocol (laws, phases, decision procedure, owner actions). The runner sends it as the prompt.
  • references/upgrades.md — checked legacy gate repair, custom-gate refusal and frozen upgrade boundaries.
  • references/ledger.md — precedence, P0/P1/P2 cut, launch gates, schema, freeze, amendments.
  • references/verification.md — init.sh, local infra, verify.sh commands per stack, spec rules, playwright-cli, tamper rules.
  • references/portfolio-triage.md — choosing the one product to finish.
  • references/companions.md — which community skills are used at which step, which are denied and why, the session policy, pins, licenses, limits.
  • companions/ — catalog.json (packs, slots, deny lists) and .claude-plugin/marketplace.json (finish-line's marketplace, every plugin pinned to a commit).
  • templates/ — verify.sh, finish-verifier.md (+ finish-verifier.history: hashes of shipped versions, so the runner only refreshes unmodified copies), claude-settings.local.json (+ .history, so only finish-line's own copy is ever merged into), e2e/ (config, fixture, example spec), maestro/ example flow, ledger.example.json, product.example.json (the brief it is built on).

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.