agentleFS
nodealchemynodealchemy/powernode-platform/.claude/skills/campaign/SKILL.md

campaign

Skill4 starsChanged 18 days agoMITView on GitHub

Start, drive, monitor, and stop an Autonomous Improvement Campaign — a durable, repeatable wrapper around the dev-improve loop

8 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

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

  • 0

    Common

    Most of the 7 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 4

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Stop conditions / halt: if the campaign is terminal, should_stop?

    line 45
  2. Very specific:

    Refill if dry: if the campaign loop has no queued task, discover within scope — /improve discover <scope> (verify-before-offer gate), …

    line 47
  3. Distinctive:

    If discovery is dry and nothing is pending → snapshot + report queue-empty + STOP.

    line 50
  4. Very specific:

    Drive one task: run the /dev-loop <campaign-loop> iteration body on the campaign's loop (pull → re-verify claim → branch campaign/<id> → …

    line 51
  5. Very specific:

    Park, don't stall: when blocked on something above your decision_authority (live-credential, irreversible external, business-policy/pricing …

    line 56
  6. Distinctive:

    Core-purity: never make a core file depend on a private extension.

    line 92

“Common” is measured: kept by at least 6 in 10 of the 7 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.

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

/campaign — Autonomous Improvement Campaigns

A campaign is a durable, named, repeatable improvement run. It replaces the hand-authored standing prompt + ~/.claude plan files: a run becomes start(config). The campaign owns its scope/posture/decision-authority/stop-conditions, the Ralph loop(s) it drives, a decision log, an async parked-questions queue, and a progress ledger. /campaign run is the Ralph-pattern loop body — drive it repeatedly with /loop /campaign run <id>.

Dual surface — platform agents call the same actions through the MCP tools platform.campaign_start, platform.campaign_status, platform.campaign_answer_question, platform.campaign_stop and platform.campaign_resume.

Usage

/campaign start <name>     # create a campaign + its dedicated loop (interactive config)
/campaign run [<id>]       # drive ONE improvement iteration for the campaign (loop body)
/campaign status [<id>]    # progress + open questions + recent decisions (all, or one)
/campaign answer <id>      # answer a parked question to unblock the campaign
/campaign stop <id>        # stop the campaign + pause its loops + record a summary
/campaign resume <id>      # request a resume (human-confirmed; parks until a person approves)

start <name>

Surface the config, then create. Confirm these with the operator if not given:

  • scope — which tree/area (e.g. a private extension, server/, worker/); stays in configuration.
  • posture/ordering — bugs-first, dead-code, test-gaps, quality; free text in configuration.
  • decision_authority — how much the loop decides vs parks (see table below). Default trusted.
  • stop_conditions — e.g. { "max_failed": 3, "completion_pct": 100 }. Optional.

Call platform.campaign_start(name:, description:, decision_authority:, configuration:, stop_conditions:). It creates the Ai::Campaign and a dedicated campaign-scoped Ralph loop (branch campaign/<id>), starts the campaign, and snapshots initial progress. Report the campaign id + loop branch.

run [<id>]

One in-scope improvement, end to end — this is the loop body (compose, don't reinvent):

  1. Read the campaign: platform.campaign_status(<id>) (or the most recent active campaign if id omitted). Honour decision_authority, configuration scope/posture, and stop_conditions.
  2. Stop conditions / halt: if the campaign is terminal, should_stop? is met, or an emergency_halt / kill-switch is active → report and STOP (end /loop if active).
  3. Refill if dry: if the campaign loop has no queued task, discover within scope — /improve discover <scope> (verify-before-offer gate), approve the next in-scope offer (individually, never batch — CLAUDE.md bulk rule), which promotes a task onto the campaign loop. If discovery is dry and nothing is pending → snapshot + report queue-empty + STOP.
  4. Drive one task: run the /dev-loop <campaign-loop> iteration body on the campaign's loop (pull → re-verify claim → branch campaign/<id> → test-first red → minimal fix → verify → commit on the loop branch, STAGE-only, no push, no Claude attribution → report).
  5. Record the decision: log what was decided (unblock/skip/build/remove/defer/policy) to the campaign so the operator sees the reasoning, not just the diff.
  6. Park, don't stall: when blocked on something above your decision_authority (live-credential, irreversible external, business-policy/pricing value), park_question! on the campaign and move on or stop — never guess. Parked questions are answered async via /campaign answer.
  7. Snapshot progress so the ledger + dashboard reflect the new state.

status [<id>]

platform.campaign_status(<id>) (or list active campaigns). Show completion %, task counts, open questions, and the recent decision log. Read-only.

answer <id>

List the campaign's open questions (status), then platform.campaign_answer_question(<id>, question_id:, answer:). The answer unblocks the next /campaign run for that area.

stop <id>

platform.campaign_stop(<id>, summary:) — pauses the campaign's loop schedules and marks the campaign completed with your summary. Use when scope is drained or the operator calls it.

resume <id>

Resumes a stopped or auto-completed campaign, optionally with updated stop_conditions (for example a higher max_failed). The action is human-confirmed: platform.campaign_resume(<id>, stop_conditions:) from any MCP caller parks as a pending approval, and a person confirms it from their own session (the approval queue, the campaign's Resume button, or POST /api/v1/ai/campaigns/:id/resume). The requester's MCP client cannot confirm its own request. Stop values must be valid for their type, and a resume never removes a stop condition.

Decision authority

LevelThe loop decides…It parks…
supervisedalmost nothingevery non-trivial fork
monitoredlow-risk, reversible itemsanything ambiguous
trusted (default)design/architecture per best practice; implements test-first/staged, mocks externalsonly irreversible-external / live-credential / business-policy-value
autonomouseverything reversibleonly live-credential / irreversible-external

Posture (inherits the loop body's rules)

  • STAGE-only during a run — commit on the campaign branch, never push/land unless the operator says so.
  • Test-first bug reproduction; minimal change tracing to the task; no scope creep.
  • Core-purity: never make a core file depend on a private extension; extension findings stay extension-scoped.
  • Crypto-material safety absolute; bulk-op confirmation for >5 items; 3-strikes → stop & ask.
  • One improvement per run. Park genuine forks rather than guessing.

See autonomous-campaigns convention (tag guidance-autonomous-campaigns) for the model/driver/tool reference and the rationale.

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.