{
  "shell.native_background": { "score": 0.5, "evidence": "sdk/packages/core/src/extensions/tools/executors/bash.ts:785-832 detaches a running child to a temp log and returns only the log path (executionId is internal, no model-visible task id); sdk/packages/core/src/extensions/tools/definitions.ts:456 still tells the model to run long commands in background with & and a tmp file" },
  "shell.timeout_cap": { "score": 0.5, "evidence": "sdk/packages/core/src/extensions/tools/definitions.ts:481 default 30000ms; sdk/packages/core/src/extensions/tools/schemas.ts:149-153 input has only commands, no timeout; apps/vscode/src/sdk/vscode-run-commands-tool.ts:47 hard 60min foreground cap" },
  "shell.persistent": { "score": 0, "evidence": "sdk/packages/core/src/extensions/tools/executors/bash.ts:673-682 spawns a fresh child per call; apps/vscode/src/hosts/vscode/terminal/VscodeTerminalManager.ts:346-354 only reuses a terminal whose cwd already matches, and cds it at :386, so cwd/env do not survive as a session" },
  "shell.powershell": { "score": 1, "evidence": "sdk/packages/shared/src/parse/shell.ts:11-13 powershell is the win32 default; :57-118 dedicated -NoProfile -NonInteractive UTF-8 invocation; sdk/packages/core/src/extensions/tools/definitions.ts:432-441 powershell-specific prompt" },
  "shell.middle_out": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/output-limits.ts:20-38 keeps head and tail and elides the middle; rolling collector at executors/bash.ts:397-445" },
  "shell.full_log": { "score": 0.5, "evidence": "detached commands only: sdk/packages/core/src/extensions/tools/executors/bash.ts:785-832 and apps/vscode/src/sdk/vscode-run-commands-tool.ts:207-214 return a log path; a normally-completed truncated command keeps no recoverable full log (output-limits.ts:20-38)" },
  "shell.omitted_counts": { "score": 0.5, "evidence": "sdk/packages/core/src/extensions/tools/executors/output-limits.ts:33-36 reports total chars and a recovery instruction but not the omitted count; apps/vscode/src/sdk/vscode-run-commands-tool.ts:427-433 counts dropped lines only when its line buffer overflows" },
  "shell.signal_honesty": { "score": 0.5, "evidence": "SDK/CLI path maps a null exit code to 1, never 128+N: sdk/packages/core/src/extensions/tools/executors/bash.ts:899-939; the VS Code terminal mode forwards the shell-integration exit code at apps/vscode/src/sdk/vscode-run-commands-tool.ts:465-478, so only the extension path can surface 137/143" },
  "shell.benign_exit": { "score": 0, "evidence": "any non-zero exit becomes a CommandExitError with no benign annotation: sdk/packages/core/src/extensions/tools/executors/bash.ts:920-939; no grep/diff/test exit-1 special case" },
  "shell.untrusted_fencing": { "score": 0, "evidence": "process output is returned raw: sdk/packages/core/src/extensions/tools/executors/bash.ts:940-954; no untrusted-output delimiter anywhere in the shell tool path" },
  "shell.bg_output_reader": { "score": 1, "evidence": "apps/vscode/src/sdk/vscode-run-commands-tool.ts:207-214 tells the model to read the log file for progress; the SDK detach path returns the same kind of path at sdk/packages/core/src/extensions/tools/executors/bash.ts:821-829, readable with read_files" },
  "shell.wait_modes": { "score": 0, "evidence": "sdk/packages/core/src/extensions/tools/schemas.ts:149-153 run_commands has only a commands array; no wait-now / wait-output / wait-exit control" },
  "shell.cursor_reads": { "score": 0, "evidence": "no byte-offset read of a running job; read_files offers line ranges only (sdk/packages/core/src/extensions/tools/executors/file-read.ts:89-94) and the detached log has no cursor API" },
  "shell.list_tasks": { "score": 0, "evidence": "no model-facing shell-job list in the tool catalog (sdk/packages/core/src/extensions/tools/runtime.ts:43-111); team_list_runs at extensions/tools/team/team-tools.ts:563-590 lists subagent runs only" },
  "shell.kill_id": { "score": 0, "evidence": "no cancel-by-job-id tool; apps/vscode/src/sdk/SdkController.ts:1414-1416 cancelBackgroundCommand is a stubWarn" },
  "shell.kill_pid_port": { "score": 0, "evidence": "no tool accepts a raw pid or listening port; the harness only kills the process group it spawned internally (sdk/packages/core/src/extensions/tools/executors/bash.ts:750-754)" },
  "shell.sigterm_escalation": { "score": 0, "evidence": "SIGKILL immediately with no TERM-then-poll: sdk/packages/core/src/extensions/tools/executors/bash.ts:750-754; the extension aborts with SIGINT only at apps/vscode/src/sdk/vscode-run-commands-tool.ts:384-391" },
  "shell.group_kill": { "score": 1, "evidence": "the child is spawned into its own process group (bash.ts:673-682, detached: !isWindows) and killed with process.kill(-childPid) at :750-754; Windows uses taskkill /T at :724-727, so no foreign group is signalled" },
  "shell.monitor": { "score": 0, "evidence": "no monitor/wake tool or output-pattern trigger in the catalog: sdk/packages/core/src/extensions/tools/runtime.ts:43-111" },
  "shell.sleep": { "score": 0, "evidence": "no sleep tool; catalog at sdk/packages/core/src/extensions/tools/runtime.ts:43-111 has no parking primitive" },
  "shell.cron": { "score": 0.5, "evidence": "durable schedules exist in sdk/packages/core/src/cron/store/sqlite-cron-store.ts:19-30 (cron.db, schema at cron-schema.ts:8-25), but the tasks tool is marked unavailable for both cli and vscode at sdk/packages/core/src/extensions/tools/runtime.ts:93-98; the CLI /schedule command needs a schedule context (apps/cli/src/utils/chat-commands.ts:469-475)" },
  "shell.bg_subagents": { "score": 1, "evidence": "async teammate runs plus an explicit await: sdk/packages/core/src/extensions/tools/team/team-tools.ts:495-499 and :597-611; enabled by the act preset (extensions/tools/presets.ts:35-36) and the CLI (apps/cli/src/main.ts:1087-1088). Caveat: the VS Code extension disables both at apps/vscode/src/sdk/cline-session-factory.ts:1027-1028" },
  "shell.safe_classification": { "score": 0, "evidence": "explicitly a token blacklist, not an AST: sdk/packages/core/src/extensions/tools/command-guard.ts:10-17, with BLOCKED_COMMANDS at :23-74" },
  "shell.workspace_boundary": { "score": 0, "evidence": "run_commands only sets the spawn cwd (sdk/packages/core/src/extensions/tools/executors/bash.ts:673-682); there is no path extraction or outside-workspace gate" },

  "read.line_window": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/output-limits.ts:41 MAX_READ_LINES=2000, enforced at executors/file-read.ts:100-102,134-137" },
  "read.second_ceiling": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/output-limits.ts:47 MAX_READ_OUTPUT_CHARS=48000, enforced at executors/file-read.ts:144-148" },
  "read.per_line_clamp": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/output-limits.ts:44 MAX_LINE_CHARS=2000, clamped with [line truncated] at executors/file-read.ts:139-142" },
  "read.line_prefixes": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/file-read.ts:161-170 prints the captured lineNumber, padded, 1-based" },
  "read.resume_offset": { "score": 0.5, "evidence": "sdk/packages/core/src/extensions/tools/executors/file-read.ts:184-188 says 'Showing lines X-Y of N. Use start_line/end_line', naming the last line but not the next offset (the model must add 1)" },
  "read.empty_file_note": { "score": 0.5, "evidence": "an empty file returns success with an empty body (sdk/packages/core/src/extensions/tools/executors/file-read.ts:171-174); it is distinguishable from an error but carries no note" },
  "read.eof_note": { "score": 0.5, "evidence": "start_line past EOF captures nothing and returns success with an empty body (sdk/packages/core/src/extensions/tools/executors/file-read.ts:171-174); no recovery note" },
  "read.streaming": { "score": 1, "evidence": "createReadStream + readline in sdk/packages/core/src/extensions/tools/executors/file-read.ts:107-121; the file is never loaded whole" },
  "read.deferred_chunk": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/file-read.ts:121-152 keeps scanning after the capture cap to learn the real total (or an honest 50000+ at :59,127-130), then reports at :180-182" },
  "read.dedup": { "score": 0.5, "evidence": "the session request builder replaces older same-locator read results with '[outdated - see the latest file content]' (sdk/packages/core/src/session/services/message-builder.ts:49,250-263,897-910); the repeated read itself still returns full content, so this is context-level elision, not a hit stub" },
  "read.ledger": { "score": 0, "evidence": "editor/apply-patch read the file they patch but never consult what the model has read: sdk/packages/core/src/extensions/tools/executors/editor.ts:169,200 and apply-patch.ts:222" },
  "read.partial_ledger": { "score": 0, "evidence": "no partial-view tracking; no write refuses an overwrite because the model saw only a window (same paths as read.ledger, editor.ts:169,200; apply-patch.ts:222)" },
  "read.did_you_mean": { "score": 0, "evidence": "a missing path falls through to fs.stat and is wrapped as 'Error reading file' (sdk/packages/core/src/extensions/tools/executors/file-read.ts:225-229; extensions/tools/definitions.ts:341-348); no suggestion" },
  "read.unicode_retry": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/file-read.ts:217-220 calls resolveExistingFilePath; sdk/packages/shared/src/storage/path-resolution.ts:84-113 retries U+202F, NFD and curly-apostrophe variants plus a directory scan" },
  "read.confusables": { "score": 0, "evidence": "no zero-width/bidi disclosure in the read path; sdk/packages/core/src/extensions/tools/executors/file-read.ts:139-142 only clamps length" },
  "read.image_vision": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/executors/file-read.ts:231-251 attaches base64 image blocks for image-capable models, gated on metadata.modelSupportsImages set at sdk/packages/core/src/runtime/orchestration/session-runtime-orchestrator.ts:890" },
  "read.coord_scale": { "score": 0, "evidence": "no downscaling or scale disclosure; oversized images are rejected instead at apps/vscode/src/integrations/misc/process-files.ts:43-48" },
  "read.magic_bytes": { "score": 0, "evidence": "media type comes from the extension map at sdk/packages/core/src/extensions/tools/executors/file-read.ts:21-27, used at :221-222; no byte sniffing" },
  "read.notebooks": { "score": 0.5, "evidence": "a .ipynb is plain JSON, so read_files returns raw JSON (sdk/packages/core/src/extensions/tools/executors/file-read.ts:254-267) rather than tagged cells; the only renderer strips outputs and lives on the mention path (apps/vscode/src/integrations/misc/extract-text.ts:90-98)" },
  "read.docx": { "score": 0, "evidence": "binary input is refused before any extractor: sdk/packages/core/src/runtime/host/local/user-files.ts:13-15 and apps/vscode/src/core/mentions/index.ts:341-344; the mammoth extractor at apps/vscode/src/integrations/misc/extract-text.ts:85-88 is unreachable" },
  "read.pptx": { "score": 0, "evidence": "no pptx parser anywhere; the extractor switch handles only pdf/docx/ipynb/xlsx (apps/vscode/src/integrations/misc/extract-text.ts:50-62)" },
  "read.xlsx": { "score": 0, "evidence": "binary input is refused at sdk/packages/core/src/runtime/host/local/user-files.ts:13-15 and apps/vscode/src/core/mentions/index.ts:341-344; the exceljs extractor at apps/vscode/src/integrations/misc/extract-text.ts:144-193 is unreachable" },
  "read.odf": { "score": 0, "evidence": "no odt/ods/odp handling in the extractor switch at apps/vscode/src/integrations/misc/extract-text.ts:50-62" },
  "read.rtf_epub": { "score": 0, "evidence": "no rtf or epub handling in the extractor switch at apps/vscode/src/integrations/misc/extract-text.ts:50-62" },
  "read.pdf_text": { "score": 0, "evidence": "pdf is binary and refused at sdk/packages/core/src/runtime/host/local/user-files.ts:13-15 and apps/vscode/src/core/mentions/index.ts:341-344; the pdf-parse extractor at apps/vscode/src/integrations/misc/extract-text.ts:79-83 is unreachable" },
  "read.scanned_pdf": { "score": 0, "evidence": "the only pdf path is pdf-parse text extraction (apps/vscode/src/integrations/misc/extract-text.ts:79-83), it is unreachable, and there is no scan detection or rendering hint" },
  "read.docs_windowed": { "score": 0, "evidence": "no document-aware offset/limit; the extractor truncates at 400KB (apps/vscode/src/integrations/misc/extract-text.ts:75-76) and is unreachable from the read tool" },
  "read.docs_bulk": { "score": 0, "evidence": "user files are bulk-loaded (sdk/packages/core/src/runtime/orchestration/user-input-builder.ts:17-35) but binary documents are rejected (sdk/packages/core/src/runtime/host/local/user-files.ts:13-15)" },
  "read.converter_on_demand": { "score": 0, "evidence": "no on-demand converter; mammoth/exceljs/pdf-parse are static package dependencies (apps/vscode/package.json:500,515,527) and the document path is unreachable" },
  "read.many_files": { "score": 1, "evidence": "read_files accepts an array of per-file requests: sdk/packages/core/src/extensions/tools/definitions.ts:271-353; schemas.ts:57-63" },
  "read.globs": { "score": 0, "evidence": "paths are stat'ed literally (sdk/packages/core/src/extensions/tools/executors/file-read.ts:213-229); no glob expansion in read_files" },
  "read.per_file_range": { "score": 1, "evidence": "each entry carries its own start_line/end_line: sdk/packages/core/src/extensions/tools/schemas.ts:44-52,57-63; consumed at executors/file-read.ts:213" },
  "read.exclusions_gitignore": { "score": 0, "evidence": "read_files has no exclude option and never consults .gitignore (sdk/packages/core/src/extensions/tools/executors/file-read.ts:212-229)" },
  "read.aggregate_cap": { "score": 0, "evidence": "each file gets its own 48k cap and they run in Promise.all (sdk/packages/core/src/extensions/tools/definitions.ts:318-351; executors/output-limits.ts:47); no shared budget" },
  "read.aliased_input": { "score": 1, "evidence": "sdk/packages/core/src/extensions/tools/schemas.ts:65-106 normalizes file_path/filePath/files/file_paths/paths in string or array form; start_line/end_line are coerced at :23-40" },
  "read.negative_offset": { "score": 0, "evidence": "start_line is .positive() at sdk/packages/core/src/extensions/tools/schemas.ts:23-28; no negative/tail offset" },
  "read.device_blocklist": { "score": 0.5, "evidence": "fs.stat + isFile rejects device nodes such as /dev/zero before content I/O (sdk/packages/core/src/extensions/tools/executors/file-read.ts:225-229), but there is no explicit device-path blocklist" }
}
