",
"scripts": {
"dev": "astro dev",
diff --git a/public/_redirects b/public/_redirects
index 9d09a6b..194b7aa 100644
--- a/public/_redirects
+++ b/public/_redirects
@@ -33,6 +33,14 @@
/canopy/docs/adr/0001-recipes/index.md /canopy/docs/ 301
/canopy/docs/agents.md /canopy/docs/agents/ 301
/canopy/docs/cli-reference.md /canopy/docs/cli-reference/ 301
+/canopy/docs/graphs-ensembles.md /canopy/docs/graphs-ensembles/ 301
+/canopy/docs/graphs-execution.md /canopy/docs/graphs-execution/ 301
+/canopy/docs/graphs-hooks-and-queues.md /canopy/docs/graphs-hooks-and-queues/ 301
+/canopy/docs/graphs-isolation.md /canopy/docs/graphs-isolation/ 301
+/canopy/docs/graphs-nodes.md /canopy/docs/graphs-nodes/ 301
+/canopy/docs/graphs-operations.md /canopy/docs/graphs-operations/ 301
+/canopy/docs/graphs-sharing.md /canopy/docs/graphs-sharing/ 301
+/canopy/docs/graphs-templates.md /canopy/docs/graphs-templates/ 301
/canopy/docs/graphs.md /canopy/docs/graphs/ 301
/canopy/docs/index.md /canopy/docs/ 301
/canopy/docs/installation.md /canopy/docs/installation/ 301
@@ -41,9 +49,7 @@
/canopy/docs/mcp-tools.md /canopy/docs/mcp-tools/ 301
/canopy/docs/quickstart.md /canopy/docs/quickstart/ 301
/canopy/docs/rag.md /canopy/docs/rag/ 301
-/canopy/docs/recipes.md /canopy/docs/recipes/ 301
/canopy/docs/tui.md /canopy/docs/tui/ 301
-/canopy/docs/usage-patterns.md /canopy/docs/usage-patterns/ 301
/canopy/docs/workflows/ /canopy/docs/graphs/ 301
/demostage/docs/commands.md /demostage/docs/commands/ 301
/demostage/docs/decisions/browser-events.md /demostage/docs/ 301
diff --git a/public/llms.txt b/public/llms.txt
index e6d5ead..0eae83c 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -52,10 +52,16 @@ Different problems, one method: take work that lives in fragile, manual procedur
- [Agents](https://univerlab.org/canopy/docs/agents/index.md): Interactive PTY agents, background cron/watcher agents, terminal sessions and seed identities. Canopy documentation — A graph engine for AI coding agents
- [Intelligence & Sync](https://univerlab.org/canopy/docs/intelligence-and-sync/index.md): The project-scoped knowledge graph and multi-agent workspace coordination. Canopy documentation — A graph engine for AI coding agents — every harness, one
- [Graphs](https://univerlab.org/canopy/docs/graphs/index.md): The DAG graph engine — specs, nodes, edges, gates and lifecycle. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
-- [Usage Patterns](https://univerlab.org/canopy/docs/usage-patterns/index.md): The shapes a graph can take, what each one is good at, and where each one breaks. Canopy documentation — A graph engine for AI coding agents — every harness
-- [Recipes](https://univerlab.org/canopy/docs/recipes/index.md): Graphs built end to end — the actual calls, the actual prompts, and what breaks. Canopy documentation — A graph engine for AI coding agents — every harness, one
+- [Template Variables](https://univerlab.org/canopy/docs/graphs-templates/index.md): Placeholders in agent prompts and check commands. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [Ensembles](https://univerlab.org/canopy/docs/graphs-ensembles/index.md): Parallel, cascade and round-robin member groups, crews, and availability. Canopy documentation — A graph engine for AI coding agents — every harness, one
+- [Execution](https://univerlab.org/canopy/docs/graphs-execution/index.md): Commit rights, self-reports, retries, the execution limit, lifecycle, deterministic commits and spec notes. Canopy documentation — A graph engine for AI coding
+- [Isolation](https://univerlab.org/canopy/docs/graphs-isolation/index.md): Sandboxes, concurrency, and named mutexes. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [Hooks and Queues](https://univerlab.org/canopy/docs/graphs-hooks-and-queues/index.md): Event-keyed hooks, the standalone spec backlog, and spec queues. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [Sharing Graphs](https://univerlab.org/canopy/docs/graphs-sharing/index.md): Export and import, validate before you share, and install a graph. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [Node Documents](https://univerlab.org/canopy/docs/graphs-nodes/index.md): Reusable node documents: install, list, add, remove. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [Graph Operations](https://univerlab.org/canopy/docs/graphs-operations/index.md): Archive and restore, node run history, the event log, and engine tuning. Canopy documentation — A graph engine for AI coding agents — every harness, one
- [RAG Pipeline](https://univerlab.org/canopy/docs/rag/index.md): Local-first semantic search over your own documents. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
-- [MCP Tools](https://univerlab.org/canopy/docs/mcp-tools/index.md): All 117 MCP tools exposed by the canopy daemon, by category. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
+- [MCP Tools](https://univerlab.org/canopy/docs/mcp-tools/index.md): All 34 MCP tools exposed by the canopy daemon, by category. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
- [CLI Reference](https://univerlab.org/canopy/docs/cli-reference/index.md): Every canopy command and flag. Canopy documentation — A graph engine for AI coding agents — every harness, one workflow.
### TeXForge
diff --git a/src/__tests__/canopy-arrows.test.ts b/src/__tests__/canopy-arrows.test.ts
new file mode 100644
index 0000000..6913524
--- /dev/null
+++ b/src/__tests__/canopy-arrows.test.ts
@@ -0,0 +1,168 @@
+/**
+ * Canopy's plate arrowheads (FR4): every flow edge across the hero's shapes
+ * carries a marker-end, and the built /canopy/ pages ship the plate's marker
+ * vocabulary on the autonomous graph (ag) and the catalogue plate (cp).
+ *
+ * Part 1 dresses real SVG paths through the same shared module the hero's
+ * drawEdges calls (HERO_SHAPES + flowPath + markerFor) — the 18s loop is
+ * client script, so the unit level is where the shapes are assertable.
+ * Part 2 reads the built dist/ HTML with the repo's "run npm run build"
+ * convention (canopy-remote-catalogue.test.ts).
+ */
+import { existsSync, readFileSync } from 'node:fs';
+import { join } from 'node:path';
+import { EDGE, HERO_SHAPES, flowPath, markerDefs, markerFor, type E, type Shape } from '../lib/canopy-graph';
+
+const root = join(__dirname, '..', '..');
+const SVG_NS = 'http://www.w3.org/2000/svg';
+
+function built(page: string): string {
+ const file = join(root, 'dist', page);
+ if (!existsSync(file)) {
+ throw new Error(`dist/${page} not found — run \`npm run build\` before \`npm test\`.`);
+ }
+ return readFileSync(file, 'utf8');
+}
+
+/** One svg's full markup, found by its class (Astro appends scope classes). */
+function svgBlock(html: string, cls: string): string {
+ const start = html.indexOf(`class="${cls}`);
+ if (start === -1) throw new Error(`svg .${cls} not found`);
+ const open = html.lastIndexOf('