On_Board

On Board Tools

On Board exposes 30 MCP tools. Most work starts with memory_onboard.

Agent lifecycle

memory_onboard

Primary entry point for every agent session. Joins the project and returns compact current context: collision check, latest handoff summary, tickets, pinned critical memory, and next commands.

Use when: starting work, returning after /compact, or recovering from NOT ON BOARD.

Common fields:

Role guidance:

Ticket control uses roles. The creator can always cancel or terminate its own ticket. main, lead, and reviewer hold coordinator authority and can cancel or terminate any ticket — that authority does not depend on the creator being offline. The agent that claimed a ticket can cancel its claimed work (cancel only, not terminate). No other role gains control from a missing creator: an absent creator does not promote utility, worker, or any other role into ticket control.

memory_agent_join

Lower-level join call. Use only if you already have the briefing and need to rejoin before writes or ticket mutations.

memory_get_briefing

Read project context without necessarily joining.

Useful modes:

memory_checkpoint

Write a mid-work checkpoint. Use every 10-15 minutes during long work.

Include summary, remaining tasks, branch, and blockers.

memory_handoff

Finish a session cleanly. Write what changed, what remains, warnings, and touched files.

Handoff is one of the moves that ends your active session, so rejoin with memory_onboard before calling more write/ticket tools.

memory_wait_for_event

Park until a peer acts, then return everything pending. The listening half of On Board: instead of a human relaying messages, you block in one call until another agent creates a ticket, changes a status, or assigns work.

Fields:

Behavior:

After a hit, act on the events, then call it again to re-arm. See the listen MCP prompt for the standard loop.

Persistent memory

memory_write

Write durable project memory after meaningful actions.

Memory types:

Use related_files, related_tickets, and tags when they help the next agent search.

Critical memory:

memory_unpin

Unpin a memory without deleting it. The entry stays in memories.json with its full content, marked unpinned and demoted to priority=1; unpin_reason records why. Use it when a pinned decision no longer applies but the history still matters. memory_write(retracts=<memory_id>) is the linking alternative: the new entry unpins the target and references it both ways.

memory_read

Read recent memory. Supports filters by type, tag, agent, time window, and limit.

Common use:

memory_read({"since_minutes": 30, "limit": 20})

Ranked keyword search over active memories.

Use when looking for prior decisions, known bugs, or previous work on a file.

memory_search_vector

Local vector-style search over memory text. It is optional and local-first.

Use normal memory_search first unless semantic matching is specifically useful.

Shows linkage between memories, tickets, agents, and files.

Useful filters:

Ticket queue

Tickets are the cross-agent workflow layer. They live as files under .agent-mem/tickets/.

Basic lifecycle:

open -> claimed -> in_progress -> submitted -> reviewing -> closed

Rejected tickets reopen with fix instructions instead of dying. Each rejection round is archived under tickets/rejected/<ticket_id>/attempt-<N>/ (the rejected spec, the submission under review, and <ticket_id>-rejected.md with the notes and fix instructions), so a second attempt never overwrites the first. The ticket itself reopens as open at its canonical path.

memory_create_ticket

Create work for another agent.

Required fields:

Optional fields:

assigned_to is an exact, case-sensitive stable agent name — cursor-coder, codex-main — never a platform such as cursor or codex. Leave it out to put the ticket in the open queue any joined agent can claim; a named ticket can only be claimed by that exact agent, or by a coordinator.

memory_claim_ticket

Claim a ticket before doing the work. Use this so other agents do not duplicate the same task.

A ticket assigned to a specific agent can only be claimed by that agent (exact, case-sensitive name match); mentioning a platform in assigned_to does not make the ticket claimable by every agent on it. Unassigned tickets stay a free-for-all queue, and a coordinator may claim past the assignment.

memory_submit_ticket

Submit completed work for review.

Creates tickets/review/<ticket_id>-submit.md and moves the ticket to submitted.

Include summary, changed files, and reviewer notes.

Submitting normally ends your active session (auto-handoff) so the reviewer can pick the work up. Two cases keep you on board instead: pass stay_active=true when you are listening for the verdict, and you are also held when you still owe a review on another ticket sitting in submitted. If you were handed off, the next write/ticket call returns NOT ON BOARD — call memory_onboard again.

memory_review_ticket

Approve or reject a submitted ticket.

Use verdict="approve" when evidence is good; the ticket closes and the spec plus submission move to tickets/closed/.

Use verdict="reject" with concrete fix_instructions when work needs another pass; the ticket reopens and that attempt is archived under tickets/rejected/<ticket_id>/attempt-<N>/.

Reviewing does not end your own session: the reviewer stays active after an approve or a reject, so you can adjudicate the next submission without re-onboarding. A rejection that lands while the executor is parked in memory_wait_for_event wakes it with the notes and fix instructions.

Only a disinterested party adjudicates: an agent that executed a ticket may not also approve or reject it. If you did the work yourself and no other agent is available, pass allow_self_review=true — you must own the ticket or hold a main/lead/reviewer role, and the ticket is permanently stamped SELF-REVIEWED — no independent check in the audit.

memory_list_tickets

List open tickets by default. Can filter by status or assignee, and can include closed/rejected tickets.

memory_cancel_ticket

Cancel a ticket that should no longer be done. Allowed for the creator, a coordinator (main/lead/reviewer), or the agent that claimed it.

memory_terminate_ticket

Force-terminate a ticket. This is destructive and should be rare. Allowed for the creator or a coordinator — not for a claimed agent, and not for utility or other roles just because the creator is unavailable.

Project context and setup

memory_init

Initialize .agent-mem/ for a new project.

Use once per project.

memory_bootstrap

Bootstrap memory for an existing project by scanning common project files, git history, directory structure, and config files.

Use this instead of memory_init when adopting an existing repo.

memory_status

Quick status report: project, agents, memory counts, and latest activity.

memory_doctor

Checks setup health and common data problems.

Use after setup, after strange agent behavior, or before blaming the model.

memory_update_state

Write small project state values, such as current phase, owner, or default workflow notes.

memory_context_dirs

List external context directories configured with AGENT_MEM_CONTEXT_DIRS.

memory_context_read

Read a file from configured context directories.

Use this for docs/specs that should not live inside the project repo.

Compaction and archive

memory_token_usage

Estimate memory size and briefing token cost.

Use when briefings are getting too long.

memory_prepare_compaction

Preview old memories that can be compacted.

This does not modify files.

memory_compact

Archive older raw memories after a digest exists.

Compaction rewrites memory files only. It does not end your session or change your agent status — stay on board and keep calling write/ticket tools afterwards.

Recommended flow:

memory_prepare_compaction()
memory_write(memory_type="context", title="Digest: ...", content="...")
memory_compact()

memory_search_archive

Search archived raw memories after compaction.

Resources

On Board exposes three read-only MCP resources (application/json) on a verified 4.2+ runtime. They never create or modify a board, and they return bounded projections — not raw memory bodies. An existing working 4.1.1 install keeps working unchanged and simply does not expose them.

URI Contents
onboard://project Initialized flag plus project description/tech-stack previews
onboard://tickets Whole-board ticket counts plus bounded open items and totals
onboard://memory/summary Memory totals, pinned count, and per-type counts

Read them with any MCP client that supports resources.

Cache hints: catalog versus data

Every resources/read result is live board state and carries a private ttlMs 0 hint — none of the three resources is cacheable, including onboard://project (the project file is mutable too). Only the static response catalogs (server/discover, tools/list, prompts/list, resources/list, and resources/templates/list) carry a private ttlMs 60000 hint, because they change only when the code does. Keep the two apart: the 60000 ms hint applies to the catalog listing, never to a resource read.

Change notifications are capability-dependent

When a client supports resource subscriptions and runs in a mode that honors them, the server sends a coalesced ResourceUpdated invalidation notice for any of the three resources. A process-local watcher stats the shared board files behind them (project.json, tickets/_index.json, memories.json) every 2 seconds and publishes an update for each whose fingerprint changed. The scan runs only while at least one listener is attached and stops when none is; with no listeners there is no stat scan at all.

This is a cache-invalidation hint only. Keep the three layers distinct:

Use the resources to cheaply refresh context; use memory_wait_for_event when an agent must be woken by a peer.

Minimal agent loop

For normal coding work:

memory_onboard(...)
memory_read({"since_minutes": 30})
memory_write(...)       # after meaningful discovery/change
memory_checkpoint(...)  # long sessions only
memory_handoff(...)

For delegated work:

memory_create_ticket(...)
memory_claim_ticket(...)
memory_submit_ticket(...)
memory_review_ticket(...)

If an agent loses context, starts repeating work, or claims it cannot see prior decisions, run:

memory_status()
memory_get_briefing({"mode": "brief"})
memory_search({"query": "the topic or file name"})