Triggered when the user wants lifecycle management of OpenLoaf canvases / whiteboards: create, open, filter, duplicate, delete, rename, or change ownership. Typical phrases: "open a whiteboard", "create an architecture diagram canvas", "clean up unused whiteboards". **Not for**: data-driven chart visualization (→visualization-ops-skill), AI image or video generation (→cloud-media-skill), editing nodes inside an already-open canvas (handled by the canvas sub-agent).
77
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
| Tool | Responsibility | Read-only |
|---|---|---|
BoardQuery | Query the canvas list or a single canvas detail (mode: list / get) | Yes |
BoardMutate | Create / update / duplicate / delete a canvas (action: create / update / delete / duplicate / clear-unbound, etc.) | No |
Loading: Both are deferred tools. Before calling, activate their schemas with
ToolSearch(names: "BoardQuery,BoardMutate").
Pick by intent:
Want to see which canvases exist? → BoardQuery (mode: list)
Want to filter canvases by project? → BoardQuery (mode: list, with projectId)
Want to search canvases by keyword? → BoardQuery (mode: list, with search)
Want to find orphan canvases with no project? → BoardQuery (mode: list, with unboundOnly: true)
Want a canvas's details and nodes? → BoardQuery (mode: get, with boardId)
Want to create a new canvas? → BoardMutate (action: create)
Want to change a canvas's title/pin/owner? → BoardMutate (action: update)
Want to delete a canvas? → BoardMutate (action: delete) ← default
Want to permanently wipe it? → BoardMutate (action: hard-delete)
Want to duplicate a canvas? → BoardMutate (action: duplicate)
Want to clean up every orphan canvas? → BoardMutate (action: clear-unbound)Node editing inside a canvas (adding nodes, connecting edges, changing content) is done by a sub-agent or by the canvas editing tools — it is not directly performed by this skill. What you need to know:
BoardQuery { mode: "get" } returns the canvas's full node and edge information, useful for understanding current contentComplex scenarios require multiple skills working together:
ProjectQuery to understand the project structure, then BoardMutate { action: "create" } to create the canvas, and finally let the canvas editing agent add nodes and edges based on that structureTaskStatus to fetch the task list, then create the canvas and hand off layout to the editing agent1. Confirm the desired canvas title and owning project
2. BoardMutate (action: create, title: "...") → receive boardId
3. If it should belong to a project, include projectId at create time1. BoardQuery (mode: list) → fetch all canvases
2. Analyze which ones have no project and which may be duplicates
3. Report the current state to the user and propose a cleanup plan
4. BoardMutate (action: update, projectId: ...) → attach orphans to a project
5. BoardMutate (action: delete) → remove canvases no longer needed1. BoardQuery (mode: list, search: "keyword") → search matching canvases
2. BoardQuery (mode: get, boardId: "...") → fetch canvas detail (with nodes and edges)
3. Show the user a summary of the canvas contentCheck pageContext.boardId first (the canvas the user is currently viewing). If there is no context, search with BoardQuery (mode: list) first. Always confirm the correct boardId first.
Operating on the wrong canvas silently corrupts data — concretely: nodes get added to the wrong canvas, the original canvas's edge relationships get polluted, and the canvas the user sees no longer matches what was actually modified. This kind of damage raises no error; the user may notice the content is scrambled much later, and because the operation has already been saved, it cannot be recovered via undo (only by restoring from backup or rebuilding after hard-delete). So "confirm the boardId first" is not flow-OCD — it's protection against irreversible data confusion.
Default to delete (soft delete, recoverable). Users change their minds all the time. Only use hard-delete when the user explicitly says "wipe it", "permanently delete".
It deletes every canvas not attached to a project in one shot. Before running it, you must first call BoardQuery (mode: list, unboundOnly: true) and have the user confirm the list, to avoid accidentally nuking valuable standalone canvases.
Before any delete, hard-delete, or clear-unbound operation, show the user the list of canvases that will be affected. This follows the same principle as confirming recipients before sending an email — irreversible operations need a human in the loop.
a1ab5be
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.