owner-desk
Skill2 starsChanged 9 days agoMITView on GitHub
Give the human owner a live board, a Claude artifact with its own small database, for everything only they can decide or do. Each decision or task gets its own card, with a recommended answer, answer buttons, steps to tick, text to copy and files; the owner answers from their phone whenever they like, the answer wakes the agent through a comment, and the agent acts and archives the item. Use this whenever an agent has several open questions or owner-only tasks (approvals, uploads, sign-ins, purchases, account changes), when the owner says questions get lost or buried in chat, when they ask for a dashboard, inbox, to-do board, decision board or "desk" for what's waiting on them, or when a chief-of-staff or manager session needs a home for its "waiting for the owner" list.
In this repository5 other files it gives its agents.
- build-review-loopSkill
- chief-of-staffSkill
- compress-promptSkill
- restart-readySkill
- side-sessionSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. About 0 are common, 10 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈10
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 19
A main-loop session: Only a main-loop session can hold a watch.
- Very specific: line 48
Check it once: ArtifactData list on the collection items.
- Distinctive: line 50
Write the link into a file in the project (the status page, or the project's notes), so a fresh session can find it.
- Distinctive: line 60
On a "Send all" comment: read every comment thread on the cards it names first (an earlier thread can change what an answer means), re-read …
- Distinctive: line 67
read the desk at the start of every turn.
- Distinctive: line 68
ask the owner to say "desk" in chat after answering.
- Very specific: line 105
Add new items with ArtifactData.
- Distinctive: line 107
If you also work from a chat list of open questions (as the chief of staff does), keep both the same: the same number, the same words.
- Distinctive: line 108
Write each item so it stands on its own: what is being decided, what changes either way, and what you recommend.
- Very specific: line 110
To attach a file: read the whole file first, then upload it with Artifact (url of the board, asset: true) and link it as /_blob/<asset id>.
- Distinctive: line 117
When a comment wakes you, or at the start of a turn:
- Distinctive: line 122
If the item isn't saved as answered, but the comment carries an answer, the comment is the owner's newer word.
- Very specific: line 171
If another session published the board, read it first (Artifact read) and build on what comes back.
- Distinctive: line 173
Keep anything the owner marks (read, seen, ticked) in the database, never in browser storage: it has to hold on every device.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Owner desk
Questions in chat get buried, and the owner has to answer when the agent asks, not when they have time. The desk moves them out of the chat into a board: a Decisions tab and a Tasks tab with every open item, a yellow Urgent tab only when something can't wait, a Decided tab for answered ones, a Later tab for what can wait, and an Archive for what's done. On a phone or iPad, the owner swipes sideways to move between tabs. The owner answers there; you read the answers, act, and archive.
What this needs
- Claude artifacts with the
dbandcommentscapabilities, on claude.ai or in the Claude desktop app. Addassetsif items will carry attached files, or if the owner should be able to attach screenshots to their questions. Tools:
Artifact, to publish the board and upload files;ArtifactData, to write and read items;ArtifactComments, to watch the board and answer the comments that wake you.
Load them with ToolSearch when they're deferred.
- A main-loop session. Only a main-loop session can hold a watch; a subagent can't.
Without these, say so and keep the questions in chat as a numbered list. Don't pretend there's a board.
Who writes to it
One session only:
- the chief of staff, if there is one (see the chief-of-staff skill);
- otherwise, the session that works with the owner.
Two writers would number items twice and archive each other's work.
Create the board
Fill in the template,
assets/desk.html. It has three placeholders:{{TITLE}}: the board's name, two to four words, such as "Recipe App Desk";{{EYEBROW}}: a small line above the title, such as "Recipe app · from the chief of staff";{{AGENT}}: who reads the answers, as it reads mid-sentence: "the chief of staff", or "Claude". Plain words only, with no quotes.
For example:
sed -e 's/{{TITLE}}/Recipe App Desk/g' -e 's/{{EYEBROW}}/Recipe app · from the chief of staff/g' -e 's/{{AGENT}}/the chief of staff/g' <skill>/assets/desk.html > desk.htmlPublish it with the
Artifacttool:capabilities: {"db": {}, "user": {}, "comments": {}}, plus"assets": {}if items will carry files;icon: "inbox";- a one-line
description.
Publishing also starts this session watching the board.
- Check it once:
ArtifactDataliston the collectionitems. It's empty, and the page says "Nothing needs you." - Give the owner the link, and say the board is private to them.
- Write the link into a file in the project (the status page, or the project's notes), so a fresh session can find it.
Opened outside Claude, in a plain browser, the page shows made-up example items with a note saying so. That's for previews and screenshots; it never writes anything.
Be woken by answers
A database write doesn't wake you; a comment sent to Claude does.
- Answers wait for "Send all". An answer, or a task marked done, on an ordinary item is saved with
wakePending: trueand a shortwakeLine("Yes (+ note)", "CHANGED to No"), and wakes nothing yet. A bar at the bottom of the page lists them; when the owner presses it, one comment comes, anchored on the desk's title, with a line per answer ("№ 12 · Open the beta this Friday? → Yes (+ note)"). The page then clearswakePending. Ten answers wake you once, not ten times. - Urgent items and questions still go at once, as a short comment in the item's own thread, for example "№ 16 · Stop build 1.1? Answer: Stop it now".
- On a "Send all" comment: read every comment thread on the cards it names first (an earlier thread can change what an answer means), re-read each card, act on all of them in that one turn, and reply once.
- That comment wakes the session watching the board.
- Publishing starts the watch, but it's only a watch once
ArtifactCommentswatch(with nourl) lists the board as connected, with auto-replies armed. - A fresh session must watch again, with
ArtifactCommentswatchand the board'surl. Auto-replies arm only when the owner gave that link in their own message, so the link goes in the restart prompt the owner pastes. - The page tells the owner which case they're in: "…is told the moment you answer", or "Saved here; … reads it at its next check".
- If comments can't reach you (they're off, or no session is watching), fall back on these:
- read the desk at the start of every turn;
- ask the owner to say "desk" in chat after answering;
- offer a scheduled check, only if the owner wants one.
An item
Each item is one document in the collection items. Its document id is its handle: use q<number> for decisions and t-<word> for tasks. Use plain words throughout, since the owner may read it on a phone.
| Field | Written by | What it holds |
kind | you | "decision", "task", or "beta" for feedback from a tester (see below) |
status | both | "open"; the page sets "answered"; you set "archived" |
later | you | true parks it on the Later tab |
urgent | you | true puts it on a yellow Urgent tab and at the top of the Overview. Only for what can't wait: a deadline today, or something broken for users |
num | you | a running number, the same one you use in chat; never reused |
title | you | the question itself, answerable with the choices, or the task as an action |
body, bullets | you | short paragraphs and points: why it matters, what it affects. Always lists, even for one paragraph: the page mends a plain text, but an older copy of it blanked a whole tab |
recommendation | you | your answer first, then the reason, in one or two sentences |
choices | you | two to four answers; defaults to Yes / No |
steps, stepsDone | you; page | a task's steps, and the ones ticked (indexes) |
copies | you | [{label, text}]: text the owner will paste somewhere |
links | you | [{label, url, note}]: guides, pages, attached files |
images | you | [{url, caption}]: screenshots shown on the card as small thumbnails; a tap opens them full size |
from | you | which session asked |
priority | you | 1 first; sorts the open items |
created | you | when you posted it (ISO time) |
answer | page | {choice, note, at} |
asks | page; you | [{q, at, via, images, a, aAt}]: the owner's questions about the item; you fill in a and aAt. images lists screenshots the owner attached, as /_blob/<id>: fetch each with Artifact read (url the board, path the bare id, one per call) |
wakePending, wakeLine, wakeSentAt | page | an answer saved but not sent yet, its one-line summary, and when "Send all" sent it; leave them alone |
thread | page | the comment thread the page uses for this item; leave it alone |
outcome, archived | you | what happened, in one line; when you archived it |
Tester feedback (kind: "beta") gets its own tab and never counts as something that needs the owner, whatever its flags; it stays there when answered, until you archive it. It's a decision with these extra fields: tester (a name or a label; real names only on a private desk, never in a repo or an example), build, date, said (their words, as they wrote them) and testerQuestions (questions the owner can send back; the owner replies to testers themselves). body holds how the session that read it understands it, and from names that session. Attach the tester's screenshots as files in links.
assets/example-items.json holds eight made-up items, as ArtifactData batch writes. Use them to try a board, never on the owner's real one.
Post items
- Add new items with
ArtifactData. Usesetfor a new document, andbatchfor more than two. Never republish the page to change items. - Then say in chat what you added, with a link to each item:
<board url>#<doc id>opens its tab and scrolls to it. - If you also work from a chat list of open questions (as the chief of staff does), keep both the same: the same number, the same words.
- Write each item so it stands on its own: what is being decided, what changes either way, and what you recommend.
- A task lists the exact steps, the text to paste in
copies, and the guide inlinks. - To attach a file: read the whole file first, then upload it with
Artifact(urlof the board,asset: true) and link it as/_blob/<asset id>. - To show a screenshot on the card: upload it the same way and put it in
imageswith a one-line caption, rather than inlinks. - A test item on a live board can get answered. Title it "TEST ITEM", and delete it pinned to the version you read; if the version moved, read it again first.
- Never put passwords, keys or private records in an item. A task that needs a secret says where to type it, never what it is.
Read, act, archive
When a comment wakes you, or at the start of a turn:
ArtifactDataqueryonitemswithwhere: [["status", "==", "answered"]]. Read each item'sanswerand any newasks. An item withwakePending: trueis answered but not sent yet: act on it like the others.- Act on the answer. With a chief of staff, relay the owner's choice and note verbatim to the session that asked.
- The comment and the item normally agree.
- If the item isn't saved as answered, but the comment carries an answer, the comment is the owner's newer word. Write it into the item yourself.
- Archive the item:
updateit withstatus: "archived", a one-lineoutcome("The builder moved the beta to Friday"), andarchived(the time). Pin every write withif_version, so an answer the owner changes meanwhile isn't overwritten. - Answer each open entry in
askson the same item. Send the wholeasksarray back, withaandaAtfilled in, pinned withif_version. - Reply in the comment thread with one line ("Got it: moving the beta to Friday"), then resolve the thread (
ArtifactCommentsreply, thenresolve).
- A batch write fails whole if one card moved (the owner answered again, or an automatic reply bumped its version). Query again and resend, rather than writing the rest one by one.
- Read every automatic reply in the desk's threads against the files, and correct it in its thread. On a real desk they have said work was "going ahead" when nothing was being built, misread a card, and invented a mock-up nobody made.
Park an item with later: true, and bring it back with later: false. A decided item can stay on Later until it's time to act on it. Archive instead of deleting: the Archive is the record of what was decided. Delete only on the owner's word.
Status and Roadmap (optional)
Two more tabs show the owner where the project stands, between the Overview and the items. Each appears once you write its document to the collection board, and updates live. Write each with ArtifactData (set the first time, then update pinned with if_version). assets/example-board.json holds a made-up pair.
board/status: where every session stands. Update it each time you check on the team; a chief of staff writes it whenever it updates its status page.
| Field | What it holds |
updated | when you last checked (ISO time); the page shows how long ago |
oneLine | where the project stands, in one sentence |
sessions | [{name, state, doing, last, restart}], a row per session. state is a word or two ("Working", "Waiting", "Stopped at a limit"), and the page colours it. restart starts with "Yes" when it's a good moment to restart that session |
done | what finished since the last update, a line each |
next | [{who, what}]: the next steps, the owner's too (who: "you") |
The Status tab counts the owner's urgent and open items by itself; don't repeat them in oneLine.
board/roadmap: the plan, stage by stage. Update it when a stage or one of its items moves.
| Field | What it holds |
updated | when you last changed it |
headline | where the project is in its plan, in one sentence |
stages | [{id, name, state, when, summary, items}], in order. state is done, now, next or later; items are [{text, state}] with done, now or next. The stage marked now opens at the top |
Updates (optional)
An Updates tab lists what changed, one entry per pull request, in the collection updates. Add an entry only after the reviewer passed it and it merged, never when the builder finishes. The tab shows how many are new. The owner marks each one read (saved in the database, so it holds on every device), and read entries move to an "Updates archive" tab at the far right. assets/example-updates.json holds three made-up entries.
| Field | Written by | What it holds |
pr, title | you | the pull request's number and a plain title |
merged, reviewed | you | when it merged (ISO time), and the reviewer's verdict ("PASS") |
changes | you | what changed, a line each, in words the owner uses |
summary, build, note, url | you | optional: one sentence, the build it ships in, a remark, a link |
read, readAt | page | set when the owner marks it read; leave them alone |
Change the page
- Republish the page only to change the page itself. Pass the same capabilities, or omit
capabilitiesto keep them. - If another session published the board, read it first (
Artifactread) and build on what comes back. - The items live in the database, so they survive a republish.
- Keep anything the owner marks (read, seen, ticked) in the database, never in browser storage: it has to hold on every device.
- A collection other than
itemsredraws the page only on its own tab; elsewhere, redraw just the tab rail, or a live write wipes a half-typed answer. - To test without signing in, serve a local copy from 127.0.0.1 with a stand-in
window.claude.use("db")that supportscollection().onSnapshotanddoc().update. Load a copy of the real items, and compare every tab before and after the change.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

