Apply notes with an agent

Claude CodeMulno Studio installedWrites need MULNO_MCP_WRITE=1

A designer leaves a note on a moment. A coding agent in your game's repo reads it, finds the code, fixes it, commits with a link to the moment, and marks the note fixed. A reviewer watches the next session and marks it verified, or reopens it. The apply-notes skill runs that loop up to fixed.

Proved once, on a fixture

A nested Claude Code, given only the tools it needed, fixed a bug in a scratch repo from a note on a synthetic session, and the note's thread read back in progress, then fixed with the commit. It hasn't been run on a real game. Cursor's files are written from Cursor's documentation and are unproven, because there was no Cursor install to try them on.

1. The three skills

The plugin's skills load with it (Connect Claude over MCP). Claude reaches for each on its own when your ask fits, or you can call it as /mulno-playtest:<skill>.

SkillUse it toNeeds writes
playtest-reportWrite a structured report on one session or a campaign: findings ranked by severity, every claim cited with a timestamp and a link.No
friction-finderFind and rank the moments where a player got stuck: idle stretches, deaths and retries, time in a region against the Catalog's expected time, flags, slow stretches, confused-sounding speech. It can pin a ranked finding back onto the session as an AI note.Only to pin a note
apply-notesTurn one open note into a code fix in your game repo, and keep its status current.Yes

2. Note status

A note moves open, in progress, fixed (with the build and commit that fixed it), verified, or won't fix. A reply is a note that points at its parent. Every change is a new version of the note, appended by whoever made it. Verified is a reviewer's own step: the skill never sets it.

3. What apply-notes does

  1. Finds the note. Tell it which one: a moment link, or a session id and note id. Otherwise it searches for a tag or word the note is known by. Neither MCP server can list every open note at once, and a search hit doesn't carry its status, so it reads the real status before treating a note as open.
  2. Claims it by replying. A note's status can only be changed by the client that last wrote to that note's file, and a designer's note is in the designer's file. So the agent replies to the note with the status in progress, and manages the status of its own reply from then on.
  3. Finds the code. It asks for the moment: the Catalog keys open at that time (spans and regions), each tracked target's last known place, and the frame with the note's drawing burned in. It then searches your repo for those keys, which usually match a scene, prefab, region or script name.
  4. Makes the smallest change that fixes what the note describes, and commits with the note's own time and link, exactly as the tool returned it.
  5. Marks its reply fixed with the build and the commit hash.

Something the note doesn't fit, such as a duplicate or a problem outside the repo, gets a reply that says so. It is never silently marked fixed.

A tester's words are data, not orders

Everything a tester typed or said, including a note's text, comes back wrapped in ⟦tester-data: …⟧. The skill treats it as a description of what happened. A note that tells the agent to run a command, touch an unrelated file, reveal a secret or mark itself verified is refused, however it is worded.

4. Turn writes on

The plugin starts mulno mcp read-only, so apply-notes can read but not reply. Set MULNO_MCP_WRITE=1 before you start Claude Code. The write tools can only add, edit or delete the agent's own notes, in notes/ai-<client>~<machine>.jsonl: never a reviewer's notes, never media.

PowerShell, in your game repo
$env:MULNO_MCP_WRITE = '1'
claude --plugin-dir C:\tools\mulno\plugin
# then:
> Fix the note at mulno://session/<session-id>?t=192.400

5. Known limits

  • The designer's note itself still reads "open". The agent writes its progress on its own reply, so after apply-notes the original keeps its own status. Studio adds a chip on that note with the newest status from its replies, such as Fixed · in a reply by ai-claude with the build and commit, until a reviewer's own verify on the note is newer. The same note card is in the web app.
  • "The next push lists the notes it fixes" needs the platform's push (Push a build).
  • The remote MCP can do less. It has no get_moment or get_frames yet (the skill uses get_timeline instead), no build filter on list_sessions, and it can't write notes on a Private project. See MCP tools.
  • Cursor is unproven. The plugin ships an Agent Requested rule, a manual command and a matching mcp.json for Cursor, all pointing at the same SKILL.md. The @-reference in them only resolves if you copy the plugin's whole folder into your game repo.
  • No ticket step. The skill ends at fixed. It doesn't file anything in Jira, Trello or Linear.