{
  "schema": "sonny.docs.tool-metadata/v1",
  "qualification": {
    "version": "0.12.7",
    "source_commit": "192e590345c6a4bf1ef8f72b043b318084ea84d6",
    "binary_sha256": "45a7ae62c66c15693790de1905b72502b75e7889682e4e58cbb4e88756ba6879",
    "command": "sonny tools inventory --format json",
    "exit": 0,
    "scope": "Installed Linux declaration metadata in a private environment; not execution or service/client/platform qualification",
    "raw_stdout_sha256": "1408af1b913344e9b8d7b8f7a72537754a9e53932ae183c498fd901d29abd885"
  },
  "metadata": {
    "schema": "sonny.tool-inventory/v1",
    "sonny_version": "0.12.7",
    "sonny_commit": "192e590345c6a4bf1ef8f72b043b318084ea84d6",
    "core": [
      "tool_search",
      "tool_exec",
      "think",
      "read_file",
      "edit_file",
      "write_file",
      "delete_file",
      "exec",
      "find",
      "todo_add",
      "todo_update",
      "todo_list",
      "todo_delete",
      "spawn_agent",
      "agent_search",
      "wait"
    ],
    "unlocked": [
      {
        "trigger": "spawn_agent",
        "tools": [
          "get_agent_process",
          "get_agent_output",
          "list_agent_processes",
          "integrate_agent_changes"
        ]
      },
      {
        "trigger": "exec",
        "tools": [
          "job_output",
          "job_kill"
        ]
      }
    ],
    "searchable": [
      {
        "name": "arch_check",
        "exec_name": "local.arch_check",
        "summary": "Parse, normalize, structurally validate, and run the security analyzer over an architecture-DSL (.arch) document.",
        "parameters": [
          "name",
          "source"
        ],
        "required": [
          "source"
        ]
      },
      {
        "name": "canary_evidence",
        "exec_name": "local.canary_evidence",
        "summary": "Run Go tests; report evidence origin and eligibility.",
        "parameters": [
          "allow_dirty",
          "argv",
          "preflight"
        ],
        "required": [
          "argv"
        ]
      },
      {
        "name": "canary_index",
        "exec_name": "local.canary_index",
        "summary": "Build or refresh the CANARY token index (.canary/canary.db) by scanning the workspace."
      },
      {
        "name": "canary_migrate",
        "exec_name": "local.canary_migrate",
        "summary": "Preview migration with plan=true; apply with expected_plan_id to guard reviewed inputs.",
        "parameters": [
          "expected_plan_id",
          "plan",
          "plan_details",
          "plan_limit",
          "plan_offset",
          "tracking_mode"
        ]
      },
      {
        "name": "canary_next",
        "exec_name": "local.canary_next",
        "summary": "Select the next actionable CANARY requirement token (priority-aware, dependency-aware).",
        "parameters": [
          "aspect",
          "status"
        ]
      },
      {
        "name": "canary_onboard",
        "exec_name": "local.canary_onboard",
        "summary": "Read-only CANARY adoption analysis of this workspace: languages, directories, entry points, token count, configured requirement-ID sources, next id, suggested next steps.",
        "parameters": [
          "limit"
        ]
      },
      {
        "name": "canary_search",
        "exec_name": "local.canary_search",
        "summary": "Keyword search over the indexed CANARY tokens (requirement id, feature, aspect, keywords).",
        "parameters": [
          "limit",
          "query"
        ],
        "required": [
          "query"
        ]
      },
      {
        "name": "canary_verify",
        "exec_name": "local.canary_verify",
        "summary": "Verify claimed requirements against recorded evidence at HEAD (canary's evidence model: only origin=executed, non-dirty, PASS records count).",
        "parameters": [
          "claims_path"
        ]
      },
      {
        "name": "canary_view",
        "exec_name": "local.canary_view",
        "summary": "One-call hierarchical aggregate for one requirement id: status counts, declared-completion %, features, files, tests, dependencies, drift.",
        "parameters": [
          "limit",
          "req_id"
        ],
        "required": [
          "req_id"
        ]
      },
      {
        "name": "ci_list_jobs",
        "exec_name": "local.ci_list_jobs",
        "summary": "Parse .gitlab-ci.yml (including local includes, as used by the devnw ci-catalog) and list the stages, jobs, each job's stage/image/script/allow_failure, and any remote includes that were not merged.",
        "parameters": [
          "config_file",
          "work_dir"
        ]
      },
      {
        "name": "ci_run_job",
        "exec_name": "local.ci_run_job",
        "summary": "Run a GitLab CI job's `script` lines locally (joined with && so it stops on the first failure).",
        "parameters": [
          "config_file",
          "job",
          "timeout",
          "work_dir"
        ],
        "required": [
          "job"
        ]
      },
      {
        "name": "conv_dataset",
        "exec_name": "local.conv_dataset",
        "summary": "Turn a collected corpus into optimizer training/testing data: harvest windows, split by parent conversation (deterministic, contamination-verified), and write train.suite.yaml + test.suite.yaml + spli\u2026",
        "parameters": [
          "corpus",
          "limit",
          "out_dir",
          "rules",
          "test_ratio",
          "turns"
        ],
        "required": [
          "corpus",
          "out_dir"
        ]
      },
      {
        "name": "conv_sources",
        "exec_name": "local.conv_sources",
        "summary": "Report which local AI-assistant conversation sources have data on this machine (claude, codex, copilot, gemini, continue, cursor, sonny; aider opt-in).",
        "parameters": [
          "include_aider"
        ]
      },
      {
        "name": "create_archive",
        "exec_name": "local.create_archive",
        "summary": "Create a bounded ZIP, TAR, tar.gz, or single-stream gzip file from explicit workspace sources.",
        "parameters": [
          "format",
          "limits",
          "output_path",
          "sources"
        ],
        "required": [
          "format",
          "output_path",
          "sources"
        ]
      },
      {
        "name": "data_convert",
        "exec_name": "local.data_convert",
        "summary": "Mutation destinations must be literal relative paths in the admitted workspace; absolute paths and link aliases are refused.",
        "parameters": [
          "comment",
          "delimiter",
          "expected_absent",
          "expected_digest",
          "formula_policy",
          "from",
          "header",
          "output_delimiter",
          "output_header",
          "output_path",
          "path",
          "quote",
          "sheet",
          "skip_malformed",
          "to",
          "typed"
        ],
        "required": [
          "output_path",
          "path"
        ]
      },
      {
        "name": "data_diff",
        "exec_name": "local.data_diff",
        "summary": "Compare two CSV, TSV, PSV or any single-character-delimited file, JSON, JSONL/NDJSON or YAML (multi-document streams included) files (left = old, right = new) confined to the workspace root.",
        "parameters": [
          "array_key",
          "comment",
          "delimiter",
          "format",
          "header",
          "ignore_columns",
          "key",
          "left",
          "left_delimiter",
          "left_format",
          "left_header",
          "max_changes",
          "quote",
          "right",
          "right_delimiter",
          "right_format",
          "right_header",
          "skip_empty_keys"
        ],
        "required": [
          "left",
          "right"
        ]
      },
      {
        "name": "data_edit",
        "exec_name": "local.data_edit",
        "summary": "Mutation destinations must be literal relative paths in the admitted workspace; absolute paths and link aliases are refused.",
        "parameters": [
          "args",
          "comment",
          "delimiter",
          "dialect",
          "document",
          "dry_run",
          "engine",
          "expected_absent",
          "expected_digest",
          "expression",
          "format",
          "formula_policy",
          "header",
          "ops",
          "output_path",
          "path",
          "quote",
          "skip_malformed"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "data_inspect",
        "exec_name": "local.data_inspect",
        "summary": "Inspect a CSV, TSV, PSV or any single-character-delimited file, JSON, JSONL/NDJSON or YAML (multi-document streams included) file confined to the workspace root without reading its content.",
        "parameters": [
          "comment",
          "delimiter",
          "format",
          "header",
          "path",
          "quote"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "data_query",
        "exec_name": "local.data_query",
        "summary": "Evaluate a jq (gojq) or yq (mikefarah/yq v4) expression over a CSV, TSV, PSV or any single-character-delimited file, JSON, JSONL/NDJSON or YAML (multi-document streams included) file confined to the w\u2026",
        "parameters": [
          "args",
          "as",
          "comment",
          "compact",
          "delimiter",
          "engine",
          "expression",
          "format",
          "header",
          "input",
          "input_format",
          "max_results",
          "null_input",
          "path",
          "quote",
          "raw_output",
          "slurp",
          "typed"
        ],
        "required": [
          "expression"
        ]
      },
      {
        "name": "data_read",
        "exec_name": "local.data_read",
        "summary": "Read a CSV, TSV, PSV or any single-character-delimited file, JSON, JSONL/NDJSON or YAML (multi-document streams included) file confined to the workspace root.",
        "parameters": [
          "as",
          "columns",
          "comment",
          "delimiter",
          "filter",
          "format",
          "head",
          "header",
          "len",
          "limit",
          "offset",
          "path",
          "paths",
          "quote",
          "skip",
          "tail",
          "typed"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "data_validate",
        "exec_name": "local.data_validate",
        "summary": "Validate a CSV, TSV, PSV or any single-character-delimited file, JSON, JSONL/NDJSON or YAML (multi-document streams included) file confined to the workspace root.",
        "parameters": [
          "assert_format",
          "comment",
          "constraints",
          "delimiter",
          "format",
          "header",
          "max_findings",
          "path",
          "quote",
          "required_columns",
          "schema",
          "schema_path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "date",
        "exec_name": "local.date",
        "summary": "Return the current calendar date (YYYY-MM-DD) plus weekday and day-of-year.",
        "parameters": [
          "format",
          "tz"
        ]
      },
      {
        "name": "datetime",
        "exec_name": "local.datetime",
        "summary": "Return the current timestamp in multiple representations: RFC3339 UTC, RFC3339 local, date, time, Unix seconds + millis, timezone, weekday.",
        "parameters": [
          "format",
          "tz"
        ]
      },
      {
        "name": "describe_project_template",
        "exec_name": "local.describe_project_template",
        "summary": "Show the top-level files and README of a named project template (from list_project_templates).",
        "parameters": [
          "name",
          "root"
        ],
        "required": [
          "name"
        ]
      },
      {
        "name": "detect_project",
        "exec_name": "local.detect_project",
        "summary": "Detect which language toolchains and build systems a directory uses (go.mod, package.json, pyproject.toml, build.zig, Cargo.toml, Makefile, .gitlab-ci.yml).",
        "parameters": [
          "work_dir"
        ]
      },
      {
        "name": "diagnostics",
        "exec_name": "local.diagnostics",
        "summary": "Get system diagnostics including OS, architecture, memory stats, and optionally environment variables.",
        "parameters": [
          "include_env"
        ]
      },
      {
        "name": "diff",
        "exec_name": "local.diff",
        "summary": "Compare two files (unified diff) or two directories (recursive=true, returns added/removed/changed file list).",
        "parameters": [
          "brief_only",
          "context",
          "left",
          "recursive",
          "right"
        ],
        "required": [
          "left",
          "right"
        ]
      },
      {
        "name": "doc_convert",
        "exec_name": "local.doc_convert",
        "summary": "Mutation destinations must be literal relative paths in the admitted workspace; absolute paths and link aliases are refused.",
        "parameters": [
          "expected_absent",
          "expected_digest",
          "from",
          "output_path",
          "page_size",
          "pages",
          "password",
          "path",
          "sheets",
          "slides",
          "title",
          "to"
        ],
        "required": [
          "output_path",
          "path"
        ]
      },
      {
        "name": "doc_edit",
        "exec_name": "local.doc_edit",
        "summary": "Mutation destinations must be literal relative paths in the admitted workspace; absolute paths and link aliases are refused.",
        "parameters": [
          "allow_lossy",
          "dry_run",
          "expected_absent",
          "expected_digest",
          "ops",
          "output_path",
          "password",
          "path"
        ],
        "required": [
          "ops",
          "path"
        ]
      },
      {
        "name": "doc_inspect",
        "exec_name": "local.doc_inspect",
        "summary": "Inspect a docx, xlsx, pptx, vsdx, pdf, markdown, html, text or csv document confined to the workspace root.",
        "parameters": [
          "format",
          "password",
          "path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "doc_read",
        "exec_name": "local.doc_read",
        "summary": "Read a docx, xlsx, pptx, vsdx, pdf, markdown, html, text or csv document confined to the workspace root, rendered as markdown (default), text, html, csv (its tables) or json (a typed block tree).",
        "parameters": [
          "as",
          "context_lines",
          "filter",
          "format",
          "head",
          "ignore_case",
          "len",
          "limit",
          "offset",
          "pages",
          "password",
          "path",
          "raw_values",
          "sheets",
          "skip",
          "slides",
          "tail"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "doc_validate",
        "exec_name": "local.doc_validate",
        "summary": "Validate a docx, xlsx, pptx, vsdx, pdf, markdown, html, text or csv document confined to the workspace root (for OOXML: package parts, content types and relationships; for PDF: document structure).",
        "parameters": [
          "format",
          "password",
          "path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "doc_write",
        "exec_name": "local.doc_write",
        "summary": "Mutation destinations must be literal relative paths in the admitted workspace; absolute paths and link aliases are refused.",
        "parameters": [
          "content",
          "expected_absent",
          "expected_digest",
          "format",
          "from",
          "page_size",
          "path",
          "title"
        ],
        "required": [
          "content",
          "path"
        ]
      },
      {
        "name": "download",
        "exec_name": "local.download",
        "summary": "Download a file from a URL to a local path.",
        "parameters": [
          "overwrite",
          "path",
          "timeout",
          "url"
        ],
        "required": [
          "path",
          "url"
        ]
      },
      {
        "name": "edit_structured_data",
        "exec_name": "local.edit_structured_data",
        "summary": "Preview or atomically apply explicit set, delete, merge, and rename operations to a workspace JSON, YAML, or YML file.",
        "parameters": [
          "expected_digest",
          "format",
          "format_policy",
          "operations",
          "output_path",
          "path",
          "preview",
          "schema_json"
        ],
        "required": [
          "expected_digest",
          "format",
          "format_policy",
          "operations",
          "path"
        ]
      },
      {
        "name": "env_get",
        "exec_name": "local.env_get",
        "summary": "Read one environment variable from this session's declared allowlist.",
        "parameters": [
          "name"
        ],
        "required": [
          "name"
        ]
      },
      {
        "name": "extract_archive",
        "exec_name": "local.extract_archive",
        "summary": "Safely extract all or selected members from a bounded workspace ZIP, TAR, tar.gz, or gzip file.",
        "parameters": [
          "destination",
          "format",
          "limits",
          "members",
          "path"
        ],
        "required": [
          "destination",
          "path"
        ]
      },
      {
        "name": "fetch",
        "exec_name": "local.fetch",
        "summary": "Fetch content from a URL.",
        "parameters": [
          "body",
          "headers",
          "method",
          "timeout",
          "url"
        ],
        "required": [
          "url"
        ]
      },
      {
        "name": "file_stat",
        "exec_name": "local.file_stat",
        "summary": "Return size, line count, mode, mtime, MIME, and optional sha256 for a single file or directory.",
        "parameters": [
          "path",
          "sha256"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "head_file",
        "exec_name": "local.head_file",
        "summary": "Return the first N lines (default 50) of a file with absolute line numbers.",
        "parameters": [
          "lines",
          "path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "inspect_archive",
        "exec_name": "local.inspect_archive",
        "summary": "List and integrity-test every member of a bounded workspace ZIP, TAR, tar.gz, or gzip file.",
        "parameters": [
          "format",
          "limits",
          "path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "interactive_shell_close",
        "exec_name": "local.interactive_shell_close",
        "summary": "Close an interactive shell session, as closing its terminal would: the shell gets SIGHUP, which it passes on to its jobs, and SIGKILL if it has not exited 2 seconds later.",
        "parameters": [
          "shell_id"
        ],
        "required": [
          "shell_id"
        ]
      },
      {
        "name": "interactive_shell_read",
        "exec_name": "local.interactive_shell_read",
        "summary": "Read the output an interactive shell has printed since the last read (interactive_shell_read or interactive_shell_wait_prompt).",
        "parameters": [
          "shell_id",
          "timeout_ms"
        ],
        "required": [
          "shell_id"
        ]
      },
      {
        "name": "interactive_shell_wait_prompt",
        "exec_name": "local.interactive_shell_wait_prompt",
        "summary": "Wait until an interactive shell's output holds prompt_pattern, for example until a command has completed and the shell is ready for more input.",
        "parameters": [
          "prompt_pattern",
          "shell_id",
          "timeout_ms"
        ],
        "required": [
          "shell_id"
        ]
      },
      {
        "name": "interactive_shell_write",
        "exec_name": "local.interactive_shell_write",
        "summary": "Send input/commands to an interactive shell.",
        "parameters": [
          "add_newline",
          "input",
          "shell_id"
        ],
        "required": [
          "input",
          "shell_id"
        ]
      },
      {
        "name": "job_list",
        "exec_name": "local.job_list",
        "summary": "List all background jobs and their status."
      },
      {
        "name": "json_query",
        "exec_name": "local.json_query",
        "summary": "Query JSON data using dot notation paths.",
        "parameters": [
          "json_data",
          "path"
        ],
        "required": [
          "json_data",
          "path"
        ]
      },
      {
        "name": "kill_agent_process",
        "exec_name": "local.kill_agent_process",
        "summary": "Terminate an agent subprocess",
        "parameters": [
          "process_id"
        ],
        "required": [
          "process_id"
        ]
      },
      {
        "name": "list_interactive_shells",
        "exec_name": "local.list_interactive_shells",
        "summary": "List the interactive shell sessions: those running, and those that have ended (closed or exited) whose last output no read has taken yet, with their IDs, shells, states and start times."
      },
      {
        "name": "list_project_templates",
        "exec_name": "local.list_project_templates",
        "summary": "List the project scaffolding templates kept under ~/src/devnw (template-repos/* and <lang>/<lang>-template).",
        "parameters": [
          "root"
        ]
      },
      {
        "name": "lsp_definition",
        "exec_name": "local.lsp_definition",
        "summary": "Go to the definition of a symbol at a specific position.",
        "parameters": [
          "column",
          "line",
          "uri"
        ],
        "required": [
          "column",
          "line",
          "uri"
        ]
      },
      {
        "name": "lsp_diagnostics",
        "exec_name": "local.lsp_diagnostics",
        "summary": "Get diagnostics (errors, warnings, hints) for a file.",
        "parameters": [
          "uri"
        ],
        "required": [
          "uri"
        ]
      },
      {
        "name": "lsp_hover",
        "exec_name": "local.lsp_hover",
        "summary": "Get hover information (documentation, type info) for a symbol at a specific position in a file.",
        "parameters": [
          "column",
          "line",
          "uri"
        ],
        "required": [
          "column",
          "line",
          "uri"
        ]
      },
      {
        "name": "lsp_list",
        "exec_name": "local.lsp_list",
        "summary": "List all currently running LSP servers and their status."
      },
      {
        "name": "lsp_references",
        "exec_name": "local.lsp_references",
        "summary": "Find all references to a symbol at a specific position.",
        "parameters": [
          "column",
          "include_declaration",
          "line",
          "uri"
        ],
        "required": [
          "column",
          "line",
          "uri"
        ]
      },
      {
        "name": "lsp_start",
        "exec_name": "local.lsp_start",
        "summary": "Start a Language Server Protocol (LSP) server for a specific programming language.",
        "parameters": [
          "language_id"
        ],
        "required": [
          "language_id"
        ]
      },
      {
        "name": "lsp_stop",
        "exec_name": "local.lsp_stop",
        "summary": "Stop a running LSP server for a specific programming language.",
        "parameters": [
          "language_id"
        ],
        "required": [
          "language_id"
        ]
      },
      {
        "name": "lsp_symbols",
        "exec_name": "local.lsp_symbols",
        "summary": "Get all symbols (functions, classes, variables, etc.) defined in a document.",
        "parameters": [
          "uri"
        ],
        "required": [
          "uri"
        ]
      },
      {
        "name": "memory_delete",
        "exec_name": "local.memory_delete",
        "summary": "Delete one stored memory by id.",
        "parameters": [
          "id",
          "scope"
        ],
        "required": [
          "id"
        ]
      },
      {
        "name": "memory_list",
        "exec_name": "local.memory_list",
        "summary": "List stored memories (id, title, category, tags, scope \u2014 no content) across the global store and every .sonny directory on the path.",
        "parameters": [
          "category",
          "tag"
        ]
      },
      {
        "name": "memory_retrieve",
        "exec_name": "local.memory_retrieve",
        "summary": "Fetch one stored memory by id, full content included.",
        "parameters": [
          "id"
        ],
        "required": [
          "id"
        ]
      },
      {
        "name": "memory_search",
        "exec_name": "local.memory_search",
        "summary": "Full-text search stored memories (bm25-ranked over title, content, tags, category) across all scopes.",
        "parameters": [
          "category",
          "query",
          "top_k"
        ],
        "required": [
          "query"
        ]
      },
      {
        "name": "memory_stats",
        "exec_name": "local.memory_stats",
        "summary": "Report the memory scope chain for this workspace: each scope's directory and record count."
      },
      {
        "name": "memory_store",
        "exec_name": "local.memory_store",
        "summary": "Save a structured memory for later sessions: a fact, preference, decision, or reference worth remembering about this project (scope \"project\", stored under .sonny/memory/) or for you globally (scope \"\u2026",
        "parameters": [
          "category",
          "content",
          "id",
          "scope",
          "tags",
          "title"
        ],
        "required": [
          "content",
          "title"
        ]
      },
      {
        "name": "plan_draft",
        "exec_name": "local.plan_draft",
        "summary": "Create revision 1 of a new structured plan (sonny.workplan/v1 document) for this session.",
        "parameters": [
          "document",
          "idempotency_key"
        ],
        "required": [
          "document"
        ]
      },
      {
        "name": "plan_get",
        "exec_name": "local.plan_get",
        "summary": "Read one revision (default latest) of a structured plan of this session: revision metadata, task states, the canonical sonny.workplan/v1 document and its rendered Markdown.",
        "parameters": [
          "plan_id",
          "revision"
        ],
        "required": [
          "plan_id"
        ]
      },
      {
        "name": "plan_mark_ready",
        "exec_name": "local.plan_mark_ready",
        "summary": "Move the latest draft revision of a plan to review_ready after validation, no unanswered blocking question and a verification item on every task.",
        "parameters": [
          "expected_revision",
          "idempotency_key",
          "plan_id"
        ],
        "required": [
          "expected_revision",
          "plan_id"
        ]
      },
      {
        "name": "plan_report_evidence",
        "exec_name": "local.plan_report_evidence",
        "summary": "Report one verification result of the task this plan-task turn executes.",
        "parameters": [
          "idempotency_key",
          "plan_id",
          "result",
          "revision",
          "summary",
          "task_id",
          "tool_attempt_ref",
          "verification_id"
        ],
        "required": [
          "plan_id",
          "result",
          "revision",
          "task_id",
          "verification_id"
        ]
      },
      {
        "name": "plan_revise",
        "exec_name": "local.plan_revise",
        "summary": "Write the next revision of a plan from its full sonny.workplan/v1 content.",
        "parameters": [
          "document",
          "expected_revision",
          "idempotency_key",
          "plan_id"
        ],
        "required": [
          "document",
          "expected_revision",
          "plan_id"
        ]
      },
      {
        "name": "plan_task_brief",
        "exec_name": "local.plan_task_brief",
        "summary": "Return a bounded Markdown brief (at most 32 KiB) for one task of a plan revision (default latest): objective, the task, its criteria, its dependencies and live assumptions.",
        "parameters": [
          "plan_id",
          "revision",
          "task_id"
        ],
        "required": [
          "plan_id",
          "task_id"
        ]
      },
      {
        "name": "plan_validate",
        "exec_name": "local.plan_validate",
        "summary": "Validate a sonny.workplan/v1 document without storing it; returns the typed findings (path, code, message) and, when valid, the document digest.",
        "parameters": [
          "document"
        ],
        "required": [
          "document"
        ]
      },
      {
        "name": "query_structured_data",
        "exec_name": "local.query_structured_data",
        "summary": "Query a workspace JSON, JSONL, YAML, or YML file with Sonny's bounded native pipeline language.",
        "parameters": [
          "input_format",
          "output_format",
          "path",
          "query",
          "result_mode"
        ],
        "required": [
          "output_format",
          "path",
          "query"
        ]
      },
      {
        "name": "read_tool_artifact",
        "exec_name": "local.read_tool_artifact",
        "summary": "Read explicitly authorized fields from a stored tool artifact without rerunning its source.",
        "parameters": [
          "artifact_version",
          "fields",
          "handle",
          "max_bytes"
        ],
        "required": [
          "artifact_version",
          "fields",
          "handle"
        ]
      },
      {
        "name": "read_tool_output",
        "exec_name": "local.read_tool_output",
        "summary": "Retrieve un-shown ranges of a PRIOR tool result that Sonny truncated, WITHOUT re-running the tool.",
        "parameters": [
          "context_lines",
          "count_only",
          "execution_id",
          "ignore_case",
          "len",
          "limit",
          "max_bytes",
          "max_count",
          "max_matches",
          "offset",
          "pattern",
          "regex"
        ],
        "required": [
          "execution_id"
        ]
      },
      {
        "name": "run_reviewed_macro",
        "exec_name": "local.run_reviewed_macro",
        "summary": "Run a host-configured signed read-only macro by exact ID.",
        "parameters": [
          "id"
        ],
        "required": [
          "id"
        ]
      },
      {
        "name": "send_agent_input",
        "exec_name": "local.send_agent_input",
        "summary": "Send input text to a running agent subprocess",
        "parameters": [
          "input",
          "process_id"
        ],
        "required": [
          "input",
          "process_id"
        ]
      },
      {
        "name": "spawn_interactive_shell",
        "exec_name": "local.spawn_interactive_shell",
        "summary": "Start a new interactive shell session with PTY support.",
        "parameters": [
          "env",
          "shell",
          "work_dir"
        ]
      },
      {
        "name": "tail_file",
        "exec_name": "local.tail_file",
        "summary": "Return the last N lines (default 50) of a file with absolute line numbers.",
        "parameters": [
          "lines",
          "path"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "time",
        "exec_name": "local.time",
        "summary": "Return the current wall-clock time (HH:MM:SS).",
        "parameters": [
          "format",
          "tz"
        ]
      },
      {
        "name": "toolchain_run",
        "exec_name": "local.toolchain_run",
        "summary": "Run a language toolchain action: build, test, run, deps (install/tidy/fetch), fmt, clean, info (version), or list (make targets / available actions).",
        "parameters": [
          "action",
          "args",
          "env",
          "files",
          "fix",
          "language",
          "target",
          "timeout",
          "work_dir"
        ],
        "required": [
          "action",
          "language"
        ]
      },
      {
        "name": "trace_anchor_current_selection",
        "exec_name": "local.trace_anchor_current_selection",
        "summary": "Capture a (commit, blob, path, line-range, context-hash, patch-id) anchor binding the given subject ID to a file location.",
        "parameters": [
          "end_line",
          "path",
          "start_line",
          "subject_id",
          "subject_kind",
          "symbol"
        ],
        "required": [
          "end_line",
          "path",
          "start_line",
          "subject_id"
        ]
      },
      {
        "name": "trace_export_context",
        "exec_name": "local.trace_export_context",
        "summary": "Build a redacted JSON bundle of requirements + gaps for handing context to another agent.",
        "parameters": [
          "limit"
        ]
      },
      {
        "name": "trace_link_commit",
        "exec_name": "local.trace_link_commit",
        "summary": "Attach commit-level evidence to one or more subjects.",
        "parameters": [
          "commit_sha",
          "subject_ids",
          "subject_kind",
          "summary"
        ],
        "required": [
          "subject_ids",
          "summary"
        ]
      },
      {
        "name": "trace_next",
        "exec_name": "local.trace_next",
        "summary": "Return up to N best next gaps/requirements to work on.",
        "parameters": [
          "include_blocked",
          "kind",
          "limit"
        ]
      },
      {
        "name": "trace_search",
        "exec_name": "local.trace_search",
        "summary": "Keyword search across requirements + gaps (matches title and summary).",
        "parameters": [
          "limit",
          "query"
        ],
        "required": [
          "query"
        ]
      },
      {
        "name": "trace_show",
        "exec_name": "local.trace_show",
        "summary": "Read a trace requirement or gap without initialization.",
        "parameters": [
          "declaration_limit",
          "declaration_offset",
          "expected_declaration_revision",
          "id",
          "kind"
        ],
        "required": [
          "id"
        ]
      },
      {
        "name": "trace_verify_current_task",
        "exec_name": "local.trace_verify_current_task",
        "summary": "Run trace coherence gates (verified-without-evidence, orphan anchors, illegal statuses).",
        "parameters": [
          "subject_id"
        ]
      },
      {
        "name": "use_profile",
        "exec_name": "local.use_profile",
        "summary": "Select a specific LLM profile for the next operation.",
        "parameters": [
          "profile_id",
          "reason"
        ],
        "required": [
          "profile_id",
          "reason"
        ]
      },
      {
        "name": "vcs_add",
        "exec_name": "local.vcs_add",
        "summary": "Stage files for commit.",
        "parameters": [
          "all",
          "dry_run",
          "force",
          "intent",
          "paths",
          "update"
        ]
      },
      {
        "name": "vcs_blame",
        "exec_name": "local.vcs_blame",
        "summary": "Show who last modified each line of a file, useful for understanding code history and ownership.",
        "parameters": [
          "line_end",
          "line_start",
          "path",
          "revision",
          "show_email"
        ],
        "required": [
          "path"
        ]
      },
      {
        "name": "vcs_branch",
        "exec_name": "local.vcs_branch",
        "summary": "List, create, or delete branches.",
        "parameters": [
          "all",
          "contains",
          "create",
          "delete",
          "force",
          "merged",
          "no_merged",
          "remote",
          "start_point",
          "verbose"
        ]
      },
      {
        "name": "vcs_commit",
        "exec_name": "local.vcs_commit",
        "summary": "Create a new commit with staged changes.",
        "parameters": [
          "all",
          "allow_empty",
          "amend",
          "author",
          "files",
          "message",
          "no_verify"
        ]
      },
      {
        "name": "vcs_diff",
        "exec_name": "local.vcs_diff",
        "summary": "Show changes between commits, working tree, and staging area.",
        "parameters": [
          "commit",
          "commit_a",
          "commit_b",
          "context",
          "ignore_space",
          "name_only",
          "num_stat",
          "path",
          "staged",
          "stat"
        ]
      },
      {
        "name": "vcs_fetch",
        "exec_name": "local.vcs_fetch",
        "summary": "Fetch (git fetch) commits, branches and tags from a configured remote so the local repository knows the remote's latest state.",
        "parameters": [
          "all",
          "branch",
          "prune",
          "remote",
          "tags"
        ]
      },
      {
        "name": "vcs_grep",
        "exec_name": "local.vcs_grep",
        "summary": "Search for patterns in tracked files.",
        "parameters": [
          "context",
          "count",
          "extended",
          "files_match",
          "fixed",
          "ignore_case",
          "line_number",
          "max_count",
          "paths",
          "pattern",
          "revision",
          "word_regex"
        ],
        "required": [
          "pattern"
        ]
      },
      {
        "name": "vcs_log",
        "exec_name": "local.vcs_log",
        "summary": "View commit history with filtering options.",
        "parameters": [
          "all",
          "author",
          "first_parent",
          "graph",
          "grep",
          "max_count",
          "one_line",
          "patch",
          "path",
          "revision",
          "since",
          "stat",
          "until"
        ]
      },
      {
        "name": "vcs_log_search",
        "exec_name": "local.vcs_log_search",
        "summary": "Search commit history by message, diff content (pickaxe), or author.",
        "parameters": [
          "all",
          "ignore_case",
          "max_count",
          "path",
          "pattern",
          "regex",
          "since",
          "type",
          "until"
        ],
        "required": [
          "pattern"
        ]
      },
      {
        "name": "vcs_ls_files",
        "exec_name": "local.vcs_ls_files",
        "summary": "List tracked files in the repository.",
        "parameters": [
          "directory",
          "ignored",
          "modified",
          "others",
          "paths",
          "stage"
        ]
      },
      {
        "name": "vcs_pull",
        "exec_name": "local.vcs_pull",
        "summary": "Pull (git pull --ff-only): fetch from the remote and fast-forward the current branch to it, updating the working tree.",
        "parameters": [
          "branch",
          "remote"
        ]
      },
      {
        "name": "vcs_reflog",
        "exec_name": "local.vcs_reflog",
        "summary": "Show the reference log - history of where HEAD has pointed.",
        "parameters": [
          "max_count",
          "ref"
        ]
      },
      {
        "name": "vcs_remote",
        "exec_name": "local.vcs_remote",
        "summary": "Manage remote repositories.",
        "parameters": [
          "add",
          "remove",
          "show",
          "url",
          "verbose"
        ]
      },
      {
        "name": "vcs_reset",
        "exec_name": "local.vcs_reset",
        "summary": "Unstage files or move HEAD.",
        "parameters": [
          "allow_hard",
          "mode",
          "paths",
          "ref"
        ]
      },
      {
        "name": "vcs_rev_parse",
        "exec_name": "local.vcs_rev_parse",
        "summary": "Parse and resolve version-control revisions.",
        "parameters": [
          "abbrev",
          "git_dir",
          "is_bare_repo",
          "is_inside_work",
          "revision",
          "short",
          "show_prefix",
          "show_toplevel"
        ]
      },
      {
        "name": "vcs_show",
        "exec_name": "local.vcs_show",
        "summary": "Show details of a specific commit, tag, or other version-control object including changes made.",
        "parameters": [
          "name_only",
          "path",
          "revision",
          "stat"
        ]
      },
      {
        "name": "vcs_stash",
        "exec_name": "local.vcs_stash",
        "summary": "Temporarily save changes that aren't ready to commit.",
        "parameters": [
          "apply",
          "drop",
          "include_untracked",
          "index",
          "keep_index",
          "list",
          "message",
          "patch",
          "pop",
          "push",
          "show"
        ]
      },
      {
        "name": "vcs_status",
        "exec_name": "local.vcs_status",
        "summary": "Get the current status of the version-control repository including branch, staged changes, modified files, and untracked files.",
        "parameters": [
          "short"
        ]
      },
      {
        "name": "vcs_worktree",
        "exec_name": "local.vcs_worktree",
        "summary": "Manage multiple working trees.",
        "parameters": [
          "add",
          "branch",
          "force",
          "list",
          "new_branch",
          "prune",
          "remove"
        ]
      },
      {
        "name": "view_lines",
        "exec_name": "local.view_lines",
        "summary": "Return exactly the requested absolute line range from a file, optionally padded by context_lines on each side.",
        "parameters": [
          "context_lines",
          "end_line",
          "path",
          "start_line"
        ],
        "required": [
          "end_line",
          "path",
          "start_line"
        ]
      },
      {
        "name": "wc",
        "exec_name": "local.wc",
        "summary": "Count lines, words, and bytes for one file or a glob of files.",
        "parameters": [
          "bytes",
          "glob",
          "lines",
          "path",
          "words"
        ]
      },
      {
        "name": "workspace_info",
        "exec_name": "local.workspace_info",
        "summary": "Get information about the current workspace including working directory, git status, project type, and environment."
      },
      {
        "name": "workspace_providers",
        "exec_name": "local.workspace_providers",
        "summary": "Query this workspace's designated providers -- its declared \"source of truth\" per category (work_items, documentation, vcs, \u2026).",
        "parameters": [
          "category"
        ]
      }
    ],
    "mcp": {
      "pattern": "<server>.<tool>",
      "route": "tool_search, then tool_exec {\"tool\": \"<exact returned name>\", \"arguments\": {...}}"
    },
    "retired": [
      {
        "name": "bash",
        "replacement": "exec",
        "kind": "alias"
      },
      {
        "name": "git_add",
        "replacement": "vcs_add",
        "kind": "alias"
      },
      {
        "name": "git_blame",
        "replacement": "vcs_blame",
        "kind": "alias"
      },
      {
        "name": "git_branch",
        "replacement": "vcs_branch",
        "kind": "alias"
      },
      {
        "name": "git_commit",
        "replacement": "vcs_commit",
        "kind": "alias"
      },
      {
        "name": "git_diff",
        "replacement": "vcs_diff",
        "kind": "alias"
      },
      {
        "name": "git_fetch",
        "replacement": "vcs_fetch",
        "kind": "alias"
      },
      {
        "name": "git_grep",
        "replacement": "vcs_grep",
        "kind": "alias"
      },
      {
        "name": "git_log",
        "replacement": "vcs_log",
        "kind": "alias"
      },
      {
        "name": "git_log_search",
        "replacement": "vcs_log_search",
        "kind": "alias"
      },
      {
        "name": "git_ls_files",
        "replacement": "vcs_ls_files",
        "kind": "alias"
      },
      {
        "name": "git_pull",
        "replacement": "vcs_pull",
        "kind": "alias"
      },
      {
        "name": "git_reflog",
        "replacement": "vcs_reflog",
        "kind": "alias"
      },
      {
        "name": "git_remote",
        "replacement": "vcs_remote",
        "kind": "alias"
      },
      {
        "name": "git_reset",
        "replacement": "vcs_reset",
        "kind": "alias"
      },
      {
        "name": "git_rev_parse",
        "replacement": "vcs_rev_parse",
        "kind": "alias"
      },
      {
        "name": "git_show",
        "replacement": "vcs_show",
        "kind": "alias"
      },
      {
        "name": "git_stash",
        "replacement": "vcs_stash",
        "kind": "alias"
      },
      {
        "name": "git_status",
        "replacement": "vcs_status",
        "kind": "alias"
      },
      {
        "name": "git_worktree",
        "replacement": "vcs_worktree",
        "kind": "alias"
      },
      {
        "name": "glab_auth_status",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_issue_create",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_issue_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_issue_note",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_issue_update",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_issue_view",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_job_artifact",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_job_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_job_log",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_job_retry",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_label_create",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_label_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_approve",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_create",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_diff",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_merge",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_note",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_update",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_mr_view",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_pipeline_cancel",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_pipeline_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_pipeline_retry",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_pipeline_run",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_pipeline_view",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_project_clone",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_project_fork",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_project_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_project_view",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_release_create",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_release_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_variable_list",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glab_variable_set",
        "replacement": "a forge MCP server tool (<server>.<tool>) via tool_search, then tool_exec; local history via vcs_*",
        "kind": "removed"
      },
      {
        "name": "glob",
        "replacement": "find",
        "kind": "alias"
      },
      {
        "name": "grep",
        "replacement": "find",
        "kind": "alias"
      },
      {
        "name": "list_agent_packs",
        "replacement": "agent_search with query or name, then spawn_agent with pack_id",
        "kind": "removed"
      },
      {
        "name": "list_agents",
        "replacement": "agent_search (sub-agent pack ids), then spawn_agent with pack_id",
        "kind": "removed"
      },
      {
        "name": "list_directory",
        "replacement": "find",
        "kind": "alias"
      },
      {
        "name": "list_tools",
        "replacement": "tool_search",
        "kind": "alias"
      },
      {
        "name": "llm_aider",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "llm_claude",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "llm_codex",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "llm_copilot",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "llm_cursor",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "llm_goose",
        "replacement": "spawn_agent with pack_id (the native sonny worker is the only spawnable agent)",
        "kind": "removed"
      },
      {
        "name": "mcp_call_tool",
        "replacement": "tool_exec with the <server>.<tool> name tool_search returned",
        "kind": "removed"
      },
      {
        "name": "mcp_connect",
        "replacement": "tool_search (configured MCP servers connect automatically)",
        "kind": "removed"
      },
      {
        "name": "mcp_disconnect",
        "replacement": "none (sessions manage MCP connections)",
        "kind": "removed"
      },
      {
        "name": "mcp_list_servers",
        "replacement": "tool_search",
        "kind": "removed"
      },
      {
        "name": "mcp_list_tools",
        "replacement": "tool_search",
        "kind": "removed"
      },
      {
        "name": "project_files",
        "replacement": "find",
        "kind": "alias"
      },
      {
        "name": "request_tools",
        "replacement": "tool_search",
        "kind": "removed"
      },
      {
        "name": "shell_exec",
        "replacement": "exec",
        "kind": "removed"
      }
    ]
  }
}
