diff --git a/AGENTS.md b/AGENTS.md index 16c342f4a..bb230cc36 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -54,7 +54,8 @@ plannotator/ │ └── extra/ # EXTRA skills — NOT default-installed (except Kiro); add via `npx skills add backnotprop/plannotator/apps/skills/extra --global` │ ├── plannotator-compound/ # Research analysis agent (map-reduce over denied plans) │ ├── plannotator-setup-goal/ # Goal package scaffolder for /goal workflows -│ └── plannotator-visual-explainer/ # Visual HTML generator (plans, diagrams, PR explainers) with Plannotator theming +│ ├── plannotator-visual-explainer/ # Visual HTML generator (plans, diagrams, PR explainers) with Plannotator theming +│ └── plannotator-markup/ # Agent answers as annotations on a document (external-annotations API driver) ├── packages/ │ ├── server/ # Shared server implementation │ │ ├── index.ts # startPlannotatorServer(), handleServerReady() @@ -633,6 +634,8 @@ interface Block { Text highlighting uses `web-highlighter` library. Code blocks use manual `` wrapping (web-highlighter can't select inside `
`).
 
+**Anchoring an annotation to the document.** An external annotation quotes the markdown SOURCE (that is what `/api/plan` serves) and is pinned by searching the RENDERED DOM, so the two diverge wherever the renderer consumes syntax, drops a delimiter, or draws text of its own. That divergence has no inverse worth writing: `packages/ui/utils/renderedText.tsx` runs the real renderer (`parseMarkdownToBlocks` → `BlockRenderer` → `renderToStaticMarkup` into an inert `