Skip to main content
Add feedback templates under prompts in Plannotator’s config.json. Plan and document feedback use the plan and annotate sections. Code review uses the separate review section. The default file is ~/.plannotator/config.json. If PLANNOTATOR_DATA_DIR is set, use <PLANNOTATOR_DATA_DIR>/config.json instead. Plannotator reads the file again when it generates the next supported feedback message, so you do not need to restart it.

Plan and document feedback

Use prompts.plan for an agent’s plan-review decision:
Keep {{feedback}} in a template that should return your annotations. If you remove it, the template still runs, but the exported annotations are omitted from the message. Use prompts.annotate when a supported agent wrapper formats annotations on a file, folder, or assistant message:
OpenCode, Pi, and Amp wrappers apply the configurable annotate templates. Direct plannotator annotate and plannotator annotate-last commands return exported feedback without applying those templates. Direct approval text is fixed to The user approved.. The --json and --hook options use structured output. No current feature reads annotate.approved.

Code-review feedback

Use prompts.review for the result of plannotator review, including local changes, pull requests, and merge requests:
A review.denied override replaces only the built-in suffix. It leaves the annotations unchanged. Plannotator adds the suffix only when the submitted review has annotations. These settings do not change the instructions used by Ask AI or by an AI review job launched inside code review. Those jobs use their own prompts and any enabled global Agent Skills.

Agent-specific overrides

Place an override under runtimes inside the relevant section:
Supported runtime names are claude-code, amp, droid, kiro-cli, opencode, copilot-cli, pi, codex, and gemini-cli. For any key, Plannotator chooses the first non-blank string in this order:
  1. prompts.<section>.runtimes.<runtime>.<key>
  2. prompts.<section>.<key>
  3. A built-in value for that runtime, when one exists
  4. The built-in general value
An empty or whitespace-only string is treated as unset. A misspelled or unavailable {{placeholder}} remains unchanged in the returned message. A missing or malformed config file falls back to built-in behavior; malformed JSON also writes a warning to standard error.

Placeholder values

Verify your change

  1. Add a short marker such as [custom-plan-feedback] to one template.
  2. Run the matching supported flow. For example, request a plan change for plan.denied, send an annotated code review for review.denied, or annotate a file through OpenCode, Pi, or Amp for annotate.fileFeedback.
  3. Check the message returned to the agent or printed by plannotator review for the marker and the expanded placeholders.
  4. Remove the marker after confirming the correct key and runtime were selected.
If the marker does not appear, confirm the config path, JSON syntax, runtime name, and selection order. See Configuration and Environment variables for the data-directory setting. Last verified against Plannotator OSS v0.23.1 and source commit da5e0102 on July 18, 2026. Maintained by the Plannotator project.
Last modified on July 19, 2026