Skip to content

Review the inbox

Ask about this page ChatGPT Gemini Claude

AI-generated knowledge doesn’t enter the searchable library on capture. It lands in the inbox (triage) with a 24-hour review window, where a human decides what’s worth keeping. Reviewing the inbox is how the memory stays clean: accept the entries that help future agents, refine the rough ones, and drop the junk. Don’t accept blindly — every accepted entry is something an agent will trust later.

This page is a rule you write for your agent, and a task a human does in the app. For why the gate exists, see The inbox (triage).

  1. List what’s waiting. list_triage returns entries pending review. Filter to focus.

    list_triage(filter?, limit=20, offset?, include_content?)
    list_triage(filter: "overdue")

    filter accepts all, mine, or overdue. Non-admins see only their own captured entries; admins see the org queue. The empty state is plain:

    { "status": "success", "total": 0, "count": 0, "entries": [] }

    A populated entry carries its proposed type, title, tags, source, and review deadline:

    {
    "id": "triage_…",
    "entry_type": "WORK_OUTPUT",
    "title": "Escalate KB misses to a human",
    "tags": ["mcp", "routing"],
    "author": { "name": "Jordan Lee" },
    "source_provider": "claude",
    "review_due_at": "2026-06-17T22:55:07.392Z",
    "created_at": "2026-06-16T22:55:07.392Z"
    }
  2. Inspect one item. Read the full content before deciding with get_triage_item.

    get_triage_item(triage_id)
  3. Refine it (optional). If the entry is useful but rough, ask Halyard to propose cleanup edits, then apply the one you want.

    suggest_triage_edits(triage_id, instruction)
    apply_triage_suggestion(triage_id, message_id)
    suggest_triage_edits(triage_id: "triage_…", instruction: "Tighten the title and add the affected tool name to the tags.")

    suggest_triage_edits returns proposed revisions; apply_triage_suggestion commits the one you pick by message_id.

  4. Decide. Apply a knowledge classification, dismiss, or delete:

    apply_triage_classification(triage_id, classification: {kind: "knowledge", entry_type?}, reason?, title?, content?, tags?)
    dismiss_triage(triage_id, reason?)
    delete_triage_item(triage_id)
    • Apply classification — files the reviewed entry in the searchable library. Use classification.kind: "knowledge"; set classification.entry_type to change its type. Optional title, content, and tags let you make small final edits.
    • Dismiss — rejects it but keeps an audit record. Use this for entries that aren’t worth keeping but you want a trace of.
    • Delete — removes junk that shouldn’t remain at all. Use sparingly; dismiss is usually the right call.

For work classification, use list_triage(kind: "work_classification") and the returned work-classification:<eventId> IDs. Apply {kind: "work_stream", work_stream_id: "…"} to assign a stream, or {kind: "unmatched"} when no stream fits. Applying a decision does not run a classification evaluation. Knowledge edits and deletion do not apply to these work items.

Triage the inbox deliberately; never accept an entry you haven't read.
1. list_triage(filter: "mine") to see what you captured that's pending. Admins can
use filter: "all" or "overdue" for the org queue.
2. get_triage_item(triage_id) and read the full content before deciding.
3. If the entry is useful but rough: suggest_triage_edits(triage_id, instruction) then
apply_triage_suggestion(triage_id, message_id) — or override fields at accept time.
4. apply_triage_classification(triage_id, classification: {kind: "knowledge"}) to file it
(fix title/tags or classification.entry_type if needed);
dismiss_triage(triage_id, reason) to reject with an audit record;
delete_triage_item(triage_id) only for true junk.