Distinguishes this from the other pi-plan extensions by foregrounding what's different (goals tracked to verified completion). Mechanical rename only, no behavior change: - package @wassname2/pi-plan -> @wassname2/pi-goals (+ repo url) - plan.md -> goals.md (the canonical file) - command /plan -> /goals - file H1 marker "# Plan:" -> "# Goals:", widget/session labels likewise - internal state keys pi-plan-* -> pi-goals-* Internal source filename (plan-file.ts) and identifiers (planDrafting, PlanDoc, setGoalStatus) keep "plan"; they're not user-visible. External burneikis/pi-plan references are left intact. Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
pi-goals
A pi extension for plan-driven, goal-tracked work in one
goals.md. Set up goals (with evidence and failure modes) in plan mode, work them, and sign a goal
off only when a read-only subagent has checked the evidence.
Successor to pi-lgtm, kept deliberately small: about burneikis/pi-plan plus the additions, goals with evidence, a sign-off check, a widget, and a reminder.
The form guides; it does not gate. The agent edits goals.md with its normal Edit tool. The one
blessed tool is CompleteGoal, which runs the sign-off check and records the result. The reminder,
the injected plan summary, and git/widget visibility carry the process. It trusts the agent's
judgement rather than guarding it.
Install
pi install npm:@wassname2/pi-goals
Or run without installing:
pi -e npm:@wassname2/pi-goals
Use
/goals add CSV export to the report view
- Plan. The agent explores read-only and writes goals into
goals.md(see format below). - Review. You get a menu: Ready, Edit (ask the agent to revise), Open in
$EDITOR, or Cancel. On Ready you choose whether to keep the current context or start fresh and compacted. - Work. Each turn the active goal is injected (so it survives compaction) and a reminder nudges
the agent to keep
goals.mdcurrent and work autonomously. When a goal'sdone_whenis met the agent callsCompleteGoal, which runsverifyand a read-only judge and, on accept, marks it done and logs it.
Other commands: /goals (print the goals), /goals clear (empty goals.md, history kept in git),
/goals judge <model-ref> (use a specific model for the sign-off judge; default is your current
model).
goals.md format
One file holds the objective, the goals, and a short append-only log.
# Goals: ship the cache layer
## Goal: [/] Implement cache layer
<!-- id: cache-layer-1 -->
done_when: p95 < 50ms on bench-X
verify: pytest tests/cache -q && python bench/p95.py --max-ms 50
- [x] wire cache client
- [ ] eviction policy
failure_modes:
- cache silently bypassed (hit-rate ~0, latency ok by luck)
- bench too small to exercise eviction
evidence:
- load-test.log p95=41ms; bench/p95.py exited 0
- cache hit-rate 0.93 in load-test.log (not bypassed)
## Log
- 2026-06-15 14:02 cache client wired; eviction next
- A goal is a
## Goal:header whose checkbox carries its state ([ ]open,[/]active,[x]done,[-]cancelled), then an<!-- id -->, one falsifiabledone_when:, an optionalverify:shell command,- [ ]subtasks, an optional shortfailure_modes:pre-mortem list, and anevidence:list. done_whenis the test, written at planning.evidenceis the proof, a-list the agent fills at completion pointing at durable artifacts;CompleteGoalreads it from the file.failure_modesis the pre-mortem.verify, when present, is the deterministic first stage of the sign-off.- The agent ticks subtasks, appends to
## Log, and sets the header checkbox ([/]when it starts a goal) as it works. OnlyCompleteGoalwrites[x]. Multiple goals may be active.
The sign-off check (CompleteGoal)
CompleteGoal(goal_id) is the one blessed completion path. It reads the goal's evidence: block
from goals.md (so the proof is git-tracked and human-reviewable before sign-off, not buried in a tool
call):
- If the goal has a
verify:command, it is run. A non-zero exit rejects immediately, with no model call. - Otherwise a read-only
pisubprocess (the judge) inspects theevidence:items against the repo and the named failure modes and returns a verdict. It re-derives from the artifacts the evidence points at rather than trusting the claim, so theevidence:list should name durable artifacts (saved logs, committed diffs, files). - On accept, the goal's header checkbox flips to
[x]and a## Logline is written. On reject, the goal stays open and the agent is told what is missing.
The judge defaults to your current model (guaranteed authorized and capable). Set a different one
with /goals judge <provider/model> for an independent cross-family check.
Prompts
All model-facing text lives in src/prompts.ts, in flow order, so the process is
easy to review end to end.
Develop
pi -e ./src/index.ts # load locally
npm test # vitest: parser + sign-off record logic
npm run typecheck
npm run lint
Not (yet) included
No autonomous re-prompt loop (an until-done-style loop judge). Autonomy comes from the reminder, not a harness. Plan-phase model stickiness is a documented next step.
License
MIT