changedInput schema / anyOf
Previous value: -[
- {
- "additionalProperties": false,
- "description": "action=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
- "properties": {
- "action": {
- "const": "context",
- "type": "string"
- },
- "depth": {
- "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
- "maximum": 3,
- "minimum": 0,
- "type": "integer"
- },
- "hub_edge_limit": {
- "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
- "exclusiveMinimum": 0,
- "maximum": 50,
- "type": "integer"
- },
- "max_entries": {
- "description": "(context only) Cap on returned nodes (default 30, max 100).",
- "exclusiveMinimum": 0,
- "maximum": 100,
- "type": "integer"
- },
- "node_id": {
- "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
- "minLength": 1,
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- },
- "query": {
- "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
- "minLength": 1,
- "type": "string"
- },
- "seed_limit": {
- "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
- "exclusiveMinimum": 0,
- "maximum": 50,
- "type": "integer"
- },
- "topic": {
- "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
- "properties": {
- "action": {
- "const": "provenance",
- "type": "string"
- },
- "max_hops": {
- "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
- "maximum": 8,
- "minimum": 0,
- "type": "integer"
- },
- "node_id": {
- "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
- "minLength": 1,
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- },
- "query": {
- "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
- "properties": {
- "action": {
- "const": "briefing",
- "type": "string"
- },
- "environment": {
- "additionalProperties": false,
- "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
- "properties": {
- "auto_rag_available": {
- "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
- "type": "boolean"
- },
- "hooks_available": {
- "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
- "type": "boolean"
- },
- "skills_available": {
- "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
- "type": "boolean"
- }
- },
- "type": "object"
- },
- "intent": {
- "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
- "minLength": 1,
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
- "properties": {
- "action": {
- "const": "claim_history",
- "type": "string"
- },
- "node_id": {
- "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug",
- "node_id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
- "properties": {
- "action": {
- "const": "workspace",
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- },
- "workspace": {
- "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug",
- "workspace"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
- "properties": {
- "action": {
- "const": "stats",
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
- "properties": {
- "action": {
- "const": "loop",
- "type": "string"
- },
- "base": {
- "description": "Base git ref (default main).",
- "minLength": 1,
- "type": "string"
- },
- "branch": {
- "description": "Worker branch git ref (default HEAD).",
- "minLength": 1,
- "type": "string"
- },
- "node_id": {
- "description": "Task whose declared Check and Check paths form the loop contract.",
- "pattern": "^TASK-\\d+$",
- "type": "string"
- },
- "project_slug": {
- "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action",
- "project_slug",
- "node_id"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
- "properties": {
- "action": {
- "const": "rag_status",
- "type": "string"
- },
- "recall_session": {
- "description": "The recall session handle from the awaiting-focus notice. Without it this reports only that automatic topic recall is unavailable here.",
- "minLength": 1,
- "type": "string"
- }
- },
- "required": [
- "action"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "description": "action=\"context\": Walk the project graph from FTS (or topic-tag) seeds and return a scored neighborhood — not just flat search hits. Use BEFORE starting non-trivial work on a topic: it surfaces decisions, blockers, and prior lessons connected via edges that don't themselves contain the search keywords. Unlike search (flat FTS, no traversal), this seeds via FTS then follows edges, scoring by category + relation + recency. Hub nodes contribute only their most-recent edges, so a root component doesn't drag in the whole project. Bodies are truncated to ~400 chars and the total payload is capped at ~30k chars (lowest-scored non-seed nodes dropped, `_truncated: true` set); call fetch with the short id for a full body.",
+ "properties": {
+ "action": {
+ "const": "context",
+ "type": "string"
+ },
+ "depth": {
+ "description": "(context only) BFS depth from seeds (default 1, max 3). 0 returns just seeds; 1 follows one edge.",
+ "maximum": 3,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "hub_edge_limit": {
+ "description": "(context only) Soft limit: nodes with more edges than this contribute only their N most-recent edges (default 12).",
+ "exclusiveMinimum": 0,
+ "maximum": 50,
+ "type": "integer"
+ },
+ "max_entries": {
+ "description": "(context only) Cap on returned nodes (default 30, max 100).",
+ "exclusiveMinimum": 0,
+ "maximum": 100,
+ "type": "integer"
+ },
+ "node_id": {
+ "description": "(context/provenance only) Shareable id (TASK-N/KNOW-N/COMP-N/DOC-N) to seed by: the node's title becomes the FTS query, then the walk proceeds from there. Use to expand the neighborhood around a specific node without already knowing good search terms. Overrides `query`.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "query": {
+ "description": "(context/provenance only) FTS query, in the same syntax as keyword search. Either query or topic must be set.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "seed_limit": {
+ "description": "(context only) Cap on seed nodes from FTS / topic match (default 10).",
+ "exclusiveMinimum": 0,
+ "maximum": 50,
+ "type": "integer"
+ },
+ "topic": {
+ "description": "(context only) Topic tag to seed by (case-insensitive exact match on the topics array). Skips FTS — use when you want a clean topic-scoped neighborhood.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"provenance\": Walk the graph linearly from a seed and return a single ordered lineage answering 'why is X the way it is?'. At each hop it follows the strongest un-visited edge (fulfills > caused-by/supersedes > contradicts/blocks > mentions/relates-to), stopping at a risk-category node, when edges run out, or at max_hops. Use this when you want a cited chain you can narrate; use inspect(action=\"context\") for a broad unordered neighborhood to reason against. Supply exactly ONE of `node_id` (a shareable id) or `query` (free text resolved to the top FTS hit) — both or neither is a hard error.",
+ "properties": {
+ "action": {
+ "const": "provenance",
+ "type": "string"
+ },
+ "max_hops": {
+ "description": "(provenance only) Walker depth cap (default 5, max 8). 0 returns just the seed.",
+ "maximum": 8,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "node_id": {
+ "description": "Starting node — shareable id (TASK-N | KNOW-N | COMP-N | DOC-N | NODE-N). Exactly one of `node_id` or `query` must be set.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "query": {
+ "description": "Free-text 'why' prompt — resolved to a starting node via FTS top-1 hit. Exactly one of `node_id` or `query` must be set.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"briefing\": Return a compact, stateless briefing that teaches a visiting agent how to use Stele safely for the current project — for hosted/remote clients (ChatGPT, Claude web, Cursor, Codex, Gemini) that connect via MCP but lack hooks, skills, or automatic recall. The response is a PURE READ: it does NOT set an active project or store any session state, so every subsequent tool still requires project_slug explicitly. Call once at the start of a session or task when nothing is being surfaced to you automatically.",
+ "properties": {
+ "action": {
+ "const": "briefing",
+ "type": "string"
+ },
+ "environment": {
+ "additionalProperties": false,
+ "description": "(briefing only) Describes which Stele harness features the calling client has. All fields default to false/unknown when absent — the safest assumption for hosted clients.",
+ "properties": {
+ "auto_rag_available": {
+ "description": "True if this client can point automatic recall at a topic and receive related context on later turns. False/absent → the briefing tells the agent to look things up with recall itself, every time.",
+ "type": "boolean"
+ },
+ "hooks_available": {
+ "description": "True if the host client runs Stele lifecycle hooks (recall, session_start, etc.). False/absent → the briefing includes manual fallback instructions.",
+ "type": "boolean"
+ },
+ "skills_available": {
+ "description": "True if the host client can invoke Stele skills (e.g. /stele:start). False/absent → the briefing instructs the agent to follow protocol manually.",
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "intent": {
+ "description": "(briefing only) Short description of the current request or goal (e.g. 'review launch plan', 'fix the auth bug'). When provided, the briefing includes intent-specific next-call suggestions with project_slug already filled in.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"claim_history\": Full append-only claim history for a task — every claim/release/complete/cancel with agent, model, session, worktree, and operator lineage. Capped at 200 events.",
+ "properties": {
+ "action": {
+ "const": "claim_history",
+ "type": "string"
+ },
+ "node_id": {
+ "description": "(claim_history only) Task shareable id (e.g. TASK-42).",
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug",
+ "node_id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"workspace\": Fetch one workspace by NAME or uuid, including its branch associations and whether it's active for this session.",
+ "properties": {
+ "action": {
+ "const": "workspace",
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ },
+ "workspace": {
+ "description": "(workspace only) The workspace to fetch — its NAME (e.g. \"Billing\") or its uuid. NOT a short-id (workspaces aren't nodes).",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug",
+ "workspace"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"stats\": One-call overview of the active project — counts, top topics, overdue deadlines (any active knowledge with a past due_at), likely-abandoned tasks (claimed > 24h ago), and recent activity. Cheaper than running list(what=\"components\") + list_tasks + search separately.",
+ "properties": {
+ "action": {
+ "const": "stats",
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"loop\": Fail closed unless trusted local Git proves the branch left every declared Check path untouched. Exit 0 certifies oracle integrity, 1 names protected paths the branch modified, and 2 means unknown. Changed files are computed locally; callers cannot supply them.",
+ "properties": {
+ "action": {
+ "const": "loop",
+ "type": "string"
+ },
+ "base": {
+ "description": "Base git ref (default main).",
+ "minLength": 1,
+ "type": "string"
+ },
+ "branch": {
+ "description": "Worker branch git ref (default HEAD).",
+ "minLength": 1,
+ "type": "string"
+ },
+ "node_id": {
+ "description": "Task whose declared Check and Check paths form the loop contract.",
+ "pattern": "^TASK-\\d+$",
+ "type": "string"
+ },
+ "project_slug": {
+ "description": "Project slug, e.g. \"acme-app\" — list(what=\"projects\") returns yours.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action",
+ "project_slug",
+ "node_id"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "description": "action=\"rag_status\": Report this session's automatic topic recall: whether a focus is set, what it is, and whether recall is paused. Use it when you are unsure whether the context you are being shown still matches the work — if the focus names last hour's task, replace it.",
+ "properties": {
+ "action": {
+ "const": "rag_status",
+ "type": "string"
+ },
+ "recall_session": {
+ "description": "The recall session handle Stele printed in this conversation. Without it this reports only that automatic topic recall is unavailable here.",
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "required": [
+ "action"
+ ],
+ "type": "object"
+ }
+]