Skip to main content
Glama

Project housekeeping

organize
Destructive

Housekeeping: change how the project is organized. It never edits a node's content; use node, knowledge or task for that. Actions: add_component: create a durable area of ownership that knowledge and tasks attach to; list the existing components first to avoid a duplicate. rename_topic: rename a topic tag on every node that carries it, for typos and casing. feedback: report how well the memory helped this conversation: a 0–10 score, one strength, one hindrance, one improvement. pause_rag: kept for older clients; automatic topic recall runs only where the memory runs locally, so here it reports that recall is unavailable and changes nothing. Call recall with your question whenever you need context from the graph.

Input Schema

NameRequiredDescriptionDefault

No arguments

Output Schema

NameRequiredDescriptionDefault
dataYesThe action-specific result returned by Stele.
actionYesThe action that produced this result.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / properties / data / additionalProperties
      Previous value: -trueNew value: +{}
  2. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      -    "properties": {
      -      "action": {
      -        "const": "add_component",
      -        "type": "string"
      -      },
      -      "body": {
      -        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "REQUIRED for add_component — short noun-phrase title.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "parent_id": {
      -        "anyOf": [
      -          {
      -            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      -      },
      -      "privacy_bypass": {
      -        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      -        "type": "boolean"
      -      },
      -      "privacy_false_positive": {
      -        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      -        "type": "boolean"
      -      },
      -      "privacy_judgement_id": {
      -        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      -        "type": "string"
      -      },
      -      "privacy_note": {
      -        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "parent_id",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      -    "properties": {
      -      "action": {
      -        "const": "rename_topic",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      -    "properties": {
      -      "action": {
      -        "const": "feedback",
      -        "type": "string"
      -      },
      -      "hindrance": {
      -        "description": "(feedback only) One place Stele was more friction than help.",
      -        "type": "string"
      -      },
      -      "improvement": {
      -        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "score": {
      -        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      -        "maximum": 10,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "session_id": {
      -        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      -        "enum": [
      -          "agent",
      -          "human"
      -        ],
      -        "type": "string"
      -      },
      -      "strength": {
      -        "description": "(feedback only) One concrete way Stele helped this session.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      -    "properties": {
      -      "action": {
      -        "const": "pause_rag",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle Stele printed in this conversation, in its recall note or notice. It identifies which local session to update and grants no access on its own.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "turns": {
      -        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "recall_session",
      -      "reason",
      -      "turns"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "organize action \"add_component\".",
      +    "properties": {
      +      "action": {
      +        "const": "add_component",
      +        "description": "Run the add_component action.",
      +        "type": "string"
      +      },
      +      "body": {
      +        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "REQUIRED for add_component — short noun-phrase title.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "parent_id": {
      +        "anyOf": [
      +          {
      +            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "parent_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "organize action \"rename_topic\".",
      +    "properties": {
      +      "action": {
      +        "const": "rename_topic",
      +        "description": "Run the rename_topic action.",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "organize action \"feedback\".",
      +    "properties": {
      +      "action": {
      +        "const": "feedback",
      +        "description": "Run the feedback action.",
      +        "type": "string"
      +      },
      +      "hindrance": {
      +        "description": "(feedback only) One place Stele was more friction than help.",
      +        "type": "string"
      +      },
      +      "improvement": {
      +        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "score": {
      +        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      +        "maximum": 10,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "session_id": {
      +        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      +        "enum": [
      +          "agent",
      +          "human"
      +        ],
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "(feedback only) One concrete way Stele helped this session.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "organize action \"pause_rag\".",
      +    "properties": {
      +      "action": {
      +        "const": "pause_rag",
      +        "description": "Run the pause_rag action.",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle Stele printed in this conversation, in its recall note or notice. It identifies which local session to update and grants no access on its own.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "turns": {
      +        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "recall_session",
      +      "reason",
      +      "turns"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      -    "properties": {
      -      "action": {
      -        "const": "add_component",
      -        "type": "string"
      -      },
      -      "body": {
      -        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "REQUIRED for add_component — short noun-phrase title.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "parent_id": {
      -        "anyOf": [
      -          {
      -            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      -      },
      -      "privacy_bypass": {
      -        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      -        "type": "boolean"
      -      },
      -      "privacy_false_positive": {
      -        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      -        "type": "boolean"
      -      },
      -      "privacy_judgement_id": {
      -        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      -        "type": "string"
      -      },
      -      "privacy_note": {
      -        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "parent_id",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      -    "properties": {
      -      "action": {
      -        "const": "rename_topic",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      -    "properties": {
      -      "action": {
      -        "const": "feedback",
      -        "type": "string"
      -      },
      -      "hindrance": {
      -        "description": "(feedback only) One place Stele was more friction than help.",
      -        "type": "string"
      -      },
      -      "improvement": {
      -        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "score": {
      -        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      -        "maximum": 10,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "session_id": {
      -        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      -        "enum": [
      -          "agent",
      -          "human"
      -        ],
      -        "type": "string"
      -      },
      -      "strength": {
      -        "description": "(feedback only) One concrete way Stele helped this session.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      -    "properties": {
      -      "action": {
      -        "const": "pause_rag",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "turns": {
      -        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "recall_session",
      -      "reason",
      -      "turns"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      +    "properties": {
      +      "action": {
      +        "const": "add_component",
      +        "type": "string"
      +      },
      +      "body": {
      +        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "REQUIRED for add_component — short noun-phrase title.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "parent_id": {
      +        "anyOf": [
      +          {
      +            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "parent_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      +    "properties": {
      +      "action": {
      +        "const": "rename_topic",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      +    "properties": {
      +      "action": {
      +        "const": "feedback",
      +        "type": "string"
      +      },
      +      "hindrance": {
      +        "description": "(feedback only) One place Stele was more friction than help.",
      +        "type": "string"
      +      },
      +      "improvement": {
      +        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "score": {
      +        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      +        "maximum": 10,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "session_id": {
      +        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      +        "enum": [
      +          "agent",
      +          "human"
      +        ],
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "(feedback only) One concrete way Stele helped this session.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      +    "properties": {
      +      "action": {
      +        "const": "pause_rag",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle Stele printed in this conversation, in its recall note or notice. It identifies which local session to update and grants no access on its own.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "turns": {
      +        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "recall_session",
      +      "reason",
      +      "turns"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      -    "properties": {
      -      "action": {
      -        "const": "add_component",
      -        "type": "string"
      -      },
      -      "body": {
      -        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "REQUIRED for add_component — short noun-phrase title.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "parent_id": {
      -        "anyOf": [
      -          {
      -            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      -      },
      -      "privacy_bypass": {
      -        "description": "true writes despite a privacy flag on a public project. Only meaningful after a flag; the user decides whether the content can be public.",
      -        "type": "boolean"
      -      },
      -      "privacy_false_positive": {
      -        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      -        "type": "boolean"
      -      },
      -      "privacy_judgement_id": {
      -        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      -        "type": "string"
      -      },
      -      "privacy_note": {
      -        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      -        "maxLength": 500,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "parent_id",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      -    "properties": {
      -      "action": {
      -        "const": "rename_topic",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      -    "properties": {
      -      "action": {
      -        "const": "feedback",
      -        "type": "string"
      -      },
      -      "hindrance": {
      -        "description": "(feedback only) One place Stele was more friction than help.",
      -        "type": "string"
      -      },
      -      "improvement": {
      -        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "score": {
      -        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      -        "maximum": 10,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "session_id": {
      -        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      -        "enum": [
      -          "agent",
      -          "human"
      -        ],
      -        "type": "string"
      -      },
      -      "strength": {
      -        "description": "(feedback only) One concrete way Stele helped this session.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      -    "properties": {
      -      "action": {
      -        "const": "pause_rag",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "turns": {
      -        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "recall_session",
      -      "reason",
      -      "turns"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      +    "properties": {
      +      "action": {
      +        "const": "add_component",
      +        "type": "string"
      +      },
      +      "body": {
      +        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "REQUIRED for add_component — short noun-phrase title.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "parent_id": {
      +        "anyOf": [
      +          {
      +            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag. Only meaningful after a flag; the user decides whether the content can be written.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "parent_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      +    "properties": {
      +      "action": {
      +        "const": "rename_topic",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      +    "properties": {
      +      "action": {
      +        "const": "feedback",
      +        "type": "string"
      +      },
      +      "hindrance": {
      +        "description": "(feedback only) One place Stele was more friction than help.",
      +        "type": "string"
      +      },
      +      "improvement": {
      +        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "score": {
      +        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      +        "maximum": 10,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "session_id": {
      +        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      +        "enum": [
      +          "agent",
      +          "human"
      +        ],
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "(feedback only) One concrete way Stele helped this session.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      +    "properties": {
      +      "action": {
      +        "const": "pause_rag",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "turns": {
      +        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "recall_session",
      +      "reason",
      +      "turns"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      -    "properties": {
      -      "action": {
      -        "const": "add_component",
      -        "type": "string"
      -      },
      -      "body": {
      -        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "REQUIRED for add_component — short noun-phrase title.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "parent_id": {
      -        "anyOf": [
      -          {
      -            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "parent_id",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      -    "properties": {
      -      "action": {
      -        "const": "rename_topic",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      -    "properties": {
      -      "action": {
      -        "const": "feedback",
      -        "type": "string"
      -      },
      -      "hindrance": {
      -        "description": "(feedback only) One place Stele was more friction than help.",
      -        "type": "string"
      -      },
      -      "improvement": {
      -        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "score": {
      -        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      -        "maximum": 10,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "session_id": {
      -        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      -        "enum": [
      -          "agent",
      -          "human"
      -        ],
      -        "type": "string"
      -      },
      -      "strength": {
      -        "description": "(feedback only) One concrete way Stele helped this session.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      -    "properties": {
      -      "action": {
      -        "const": "pause_rag",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "turns": {
      -        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "recall_session",
      -      "reason",
      -      "turns"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      +    "properties": {
      +      "action": {
      +        "const": "add_component",
      +        "type": "string"
      +      },
      +      "body": {
      +        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "REQUIRED for add_component — short noun-phrase title.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "parent_id": {
      +        "anyOf": [
      +          {
      +            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      +      },
      +      "privacy_bypass": {
      +        "description": "true writes despite a privacy flag on a public project. Only meaningful after a flag; the user decides whether the content can be public.",
      +        "type": "boolean"
      +      },
      +      "privacy_false_positive": {
      +        "description": "With privacy_bypass: true reports the privacy flag as wrong.",
      +        "type": "boolean"
      +      },
      +      "privacy_judgement_id": {
      +        "description": "With privacy_bypass: the judgement_id the privacy flag returned.",
      +        "type": "string"
      +      },
      +      "privacy_note": {
      +        "description": "With privacy_bypass: an optional short reason, kept with the bypass.",
      +        "maxLength": 500,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "parent_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      +    "properties": {
      +      "action": {
      +        "const": "rename_topic",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      +    "properties": {
      +      "action": {
      +        "const": "feedback",
      +        "type": "string"
      +      },
      +      "hindrance": {
      +        "description": "(feedback only) One place Stele was more friction than help.",
      +        "type": "string"
      +      },
      +      "improvement": {
      +        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "score": {
      +        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      +        "maximum": 10,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "session_id": {
      +        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      +        "enum": [
      +          "agent",
      +          "human"
      +        ],
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "(feedback only) One concrete way Stele helped this session.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      +    "properties": {
      +      "action": {
      +        "const": "pause_rag",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "turns": {
      +        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "recall_session",
      +      "reason",
      +      "turns"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed1 schema field changed
    • changedInput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "organize action \"add_component\".",
      -    "properties": {
      -      "action": {
      -        "const": "add_component",
      -        "description": "Run the add_component action.",
      -        "type": "string"
      -      },
      -      "body": {
      -        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "REQUIRED for add_component — short noun-phrase title.",
      -        "maxLength": 200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "parent_id": {
      -        "anyOf": [
      -          {
      -            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "parent_id",
      -      "name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "organize action \"rename_topic\".",
      -    "properties": {
      -      "action": {
      -        "const": "rename_topic",
      -        "description": "Run the rename_topic action.",
      -        "type": "string"
      -      },
      -      "from": {
      -        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "to": {
      -        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug",
      -      "from",
      -      "to"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "organize action \"feedback\".",
      -    "properties": {
      -      "action": {
      -        "const": "feedback",
      -        "description": "Run the feedback action.",
      -        "type": "string"
      -      },
      -      "hindrance": {
      -        "description": "(feedback only) One place Stele was more friction than help.",
      -        "type": "string"
      -      },
      -      "improvement": {
      -        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      -        "type": "string"
      -      },
      -      "project_slug": {
      -        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "score": {
      -        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      -        "maximum": 10,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "session_id": {
      -        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      -        "enum": [
      -          "agent",
      -          "human"
      -        ],
      -        "type": "string"
      -      },
      -      "strength": {
      -        "description": "(feedback only) One concrete way Stele helped this session.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "project_slug"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "organize action \"pause_rag\".",
      -    "properties": {
      -      "action": {
      -        "const": "pause_rag",
      -        "description": "Run the pause_rag action.",
      -        "type": "string"
      -      },
      -      "reason": {
      -        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      -        "type": "string"
      -      },
      -      "recall_session": {
      -        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "turns": {
      -        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "action",
      -      "recall_session",
      -      "reason",
      -      "turns"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"add_component\": Create a new component under `parent_id` (or at root if null). Components are STRUCTURAL hubs — knowledge and tasks attach to them. Before calling, run list(what=\"components\") and confirm a similar one doesn't already exist.",
      +    "properties": {
      +      "action": {
      +        "const": "add_component",
      +        "type": "string"
      +      },
      +      "body": {
      +        "description": "(add_component only) 1-3 paragraph charter (markdown).",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "REQUIRED for add_component — short noun-phrase title.",
      +        "maxLength": 200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "parent_id": {
      +        "anyOf": [
      +          {
      +            "description": "Shareable id: TASK-N (task), KNOW-N (knowledge), COMP-N (component), DOC-N (document), or NODE-N (any).",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "REQUIRED for add_component — parent component shareable id, or null for a root-level component."
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "parent_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"rename_topic\": Rename a topic across every knowledge AND task node in the active project, in one transactional update (deduped if a node already had `to`). For typos and casing fixes; for multi-source consolidations use destructive(action=\"merge_topics\"). Members-only.",
      +    "properties": {
      +      "action": {
      +        "const": "rename_topic",
      +        "type": "string"
      +      },
      +      "from": {
      +        "description": "REQUIRED for rename_topic — topic to replace. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "to": {
      +        "description": "REQUIRED for rename_topic — replacement topic. Must be non-empty.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"feedback\": Submit a short, structured reflection on how well Stele helped during a session: one strength, one hindrance, a 0–10 anchored score, and one sentence on what to improve. Keep every field about Stele itself — never include project, code, or customer detail. Both agents (reflecting on their own session) and people (their own feedback) submit through this; set `source` to distinguish them. All fields are optional, but the score is the most useful — it's the trend signal.",
      +    "properties": {
      +      "action": {
      +        "const": "feedback",
      +        "type": "string"
      +      },
      +      "hindrance": {
      +        "description": "(feedback only) One place Stele was more friction than help.",
      +        "type": "string"
      +      },
      +      "improvement": {
      +        "description": "(feedback only) One sentence on what would make Stele better — about Stele only, no project or code detail.",
      +        "type": "string"
      +      },
      +      "project_slug": {
      +        "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "score": {
      +        "description": "(feedback only) 0–10: how much Stele helped this session. Anchored — 0 = fought you all session · 5 = neutral, no effect · 10 = changed the outcome.",
      +        "maximum": 10,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "session_id": {
      +        "description": "(feedback only) The session being reflected on. Defaults to the current session.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "(feedback only) Who is giving this feedback: the agent reflecting on its own session ('agent', the default), or a person giving their own ('human').",
      +        "enum": [
      +          "agent",
      +          "human"
      +        ],
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "(feedback only) One concrete way Stele helped this session.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "project_slug"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "action=\"pause_rag\": Suspend automatic topic recall for a bounded number of upcoming prompts, then let it resume on its own. Use it inside a planning or review loop where you already have what you need. Your focus survives the pause — this is a mute, not a reset. There is no separate resume control: call it again with turns 0 to clear a pause early. Pausing is per-session, so a parallel session in the same repo is unaffected.",
      +    "properties": {
      +      "action": {
      +        "const": "pause_rag",
      +        "type": "string"
      +      },
      +      "reason": {
      +        "description": "REQUIRED for pause_rag — short reason for the pause, shown to the user in the countdown line.",
      +        "type": "string"
      +      },
      +      "recall_session": {
      +        "description": "REQUIRED for every recall control (activate_recall, deactivate_recall, pause_rag, recall_status) — the recall session handle from the awaiting-focus notice in this conversation. It identifies which local session to update and grants no access on its own.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "turns": {
      +        "description": "REQUIRED for pause_rag — number of upcoming prompts to skip automatic topic recall for. Must be >= 0. 0 clears an active pause immediately. No default.",
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "action",
      +      "recall_session",
      +      "reason",
      +      "turns"
      +    ],
      +    "type": "object"
      +  }
      +]
  7. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds real context beyond them: rename_topic rewrites the tag 'on every node that carries it' (bulk mutation scope), add_component creates a 'durable area of ownership', and pause_rag is a documented no-op that 'reports that recall is unavailable and changes nothing'. It does not cover the privacy_bypass/privacy_flag flow, which lives only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and the key exclusion, then gives one clause per action, so scanning is fast despite the length. It is a single dense paragraph rather than a bulleted action list, and the closing `recall` pointer is mildly off-topic, but no sentence is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-action tool with an output schema and full annotation coverage, the description accounts for every action including the vestigial pause_rag, so an agent knows what each branch does. The only gap is that the privacy-bypass workflow is left entirely to schema text, which is acceptable but not fully resolved here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter already carries a detailed description, so the schema does the heavy lifting. The description restates the feedback fields (score, strength, hindrance, improvement) but adds no format, default, or validation detail beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb+resource ('change how the project is organized') and immediately draws the boundary that matters: 'It never edits a node's content; use `node`, `knowledge` or `task` for that.' Each of the four actions is then named with its own verb and object, so an agent can distinguish this multiplexer from the sibling write tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage rules are explicit and actionable: use node/knowledge/task for content edits, 'list the existing components first to avoid a duplicate' before add_component, use rename_topic only 'for typos and casing', and route context needs to `recall`. It even flags that pause_rag exists only 'for older clients' and changes nothing, which prevents a wasted call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.