{
  "shell.native_background": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:847 background.start; tool returns job id + pid + log" },
  "shell.timeout_cap": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:36 MAX_TIMEOUT_MS=600000; clamped at :784" },
  "shell.persistent": { "score": 0.5, "evidence": "packages/midas/src/tool/shell/session.ts:18-30 persistent bash per instance, default on at shell.ts:895; POSIX only, Windows falls back" },
  "shell.powershell": { "score": 1, "evidence": "packages/midas/src/tool/shell/prompt.ts:7 PowerShell and pwsh profiles; powershell parser at shell.ts:422" },
  "shell.middle_out": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:57 middleOut keeps head and tail" },
  "shell.full_log": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:732 trunc.write, path returned at :742" },
  "shell.omitted_counts": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:57 returns omittedLines/omittedBytes; rendered at :742" },
  "shell.signal_honesty": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:39 SIGNALS map, 128+N at :715" },
  "shell.benign_exit": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:96 benignExit for grep/diff/test exit 1" },
  "shell.untrusted_fencing": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:745 and :926 wrap process output in untrusted_shell_output" },
  "shell.bg_output_reader": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:38 read by job id from the background log" },
  "shell.wait_modes": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:151-180 now/output/exit" },
  "shell.cursor_reads": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:151 from byte offset; next offset returned" },
  "shell.list_tasks": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:105 list action" },
  "shell.kill_id": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:145 kill by id via BackgroundJob.cancel" },
  "shell.kill_pid_port": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:77 portPids (lsof/netstat), :129-141 kill by pid or port" },
  "shell.sigterm_escalation": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:708 forceKillAfter 3s; job.ts signal SIGTERM/SIGKILL" },
  "shell.group_kill": { "score": 1, "evidence": "packages/midas/src/tool/job.ts:59-75 signals a process group only for pids this harness owns" },
  "shell.monitor": { "score": 1, "evidence": "packages/midas/src/tool/monitor.ts:79-87 wakes on output pattern or exit" },
  "shell.sleep": { "score": 1, "evidence": "packages/midas/src/tool/sleep.ts:38-52 races timer against user-message event and abort" },
  "shell.cron": { "score": 0.5, "evidence": "packages/midas/src/background/cron.ts:33/58/67 persists schedules and ticks every 15s; firing requires an attached session" },
  "shell.bg_subagents": { "score": 1, "evidence": "packages/midas/src/tool/task.ts:189 background subagents; job.ts:156 wait collects result" },
  "shell.safe_classification": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:422 web-tree-sitter bash/powershell AST, not a token allowlist" },
  "shell.workspace_boundary": { "score": 1, "evidence": "packages/midas/src/tool/shell.ts:535 and :792 containsPath gates extracted paths" },

  "read.line_window": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:17 DEFAULT_READ_LIMIT 2000" },
  "read.second_ceiling": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:19 MAX_BYTES 50KB" },
  "read.per_line_clamp": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:17-18 clamp at 2000 chars" },
  "read.line_prefixes": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:627 prefixes first+index" },
  "read.resume_offset": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:632-635 names the next offset" },
  "read.empty_file_note": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:619 explicit empty-file note" },
  "read.eof_note": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:610 past-EOF is a note, not an Error" },
  "read.streaming": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:350 fs.stream with byte cap" },
  "read.deferred_chunk": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:366 stops at the byte cap without claiming more file exists" },
  "read.dedup": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:592 ReadLedger.take consumes the window on hit" },
  "read.ledger": { "score": 1, "evidence": "packages/midas/src/tool/read-ledger.ts:79 canWrite consulted by write.ts:57" },
  "read.partial_ledger": { "score": 1, "evidence": "packages/midas/src/tool/read-ledger.ts:79 partial views refuse overwrite" },
  "read.did_you_mean": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:116 Levenshtein distance, used by miss suggestions" },
  "read.unicode_retry": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:133 seven spelling variants retried" },
  "read.confusables": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:25 and :642 zero-width/bidi disclosure" },
  "read.image_vision": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:547 image attachments" },
  "read.coord_scale": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:181-232 Bun.Image downscale with scale factor in the note" },
  "read.magic_bytes": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:541 sniffAttachmentMime(sample, \"\") magic-only" },
  "read.notebooks": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:530 and :762 tagged cells, large outputs bounded" },
  "read.docx": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:106 fromDocx" },
  "read.pptx": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:184 fromPptx with speaker notes" },
  "read.xlsx": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:154 fromXlsx tables" },
  "read.odf": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:122 fromOdf" },
  "read.rtf_epub": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:207 fromEpub, :218 fromRtf" },
  "read.pdf_text": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:229 fromPdf text layer" },
  "read.scanned_pdf": { "score": 0.5, "evidence": "packages/midas/src/tool/documents.ts:13 pdfPageCount plus pdftoppm recovery; reports page count, not individual image pages" },
  "read.docs_windowed": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:483 document text sliced by offset/limit" },
  "read.docs_bulk": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:718 bulk loop calls one() per document" },
  "read.converter_on_demand": { "score": 1, "evidence": "packages/midas/src/tool/documents.ts:1 uses node:zlib only; no converter installed" },
  "read.many_files": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:700 paths array reads many files" },
  "read.globs": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:797 expand globs" },
  "read.per_file_range": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:753 parseRange reads path:start-end per entry" },
  "read.exclusions_gitignore": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:797 reads .gitignore and applies exclude patterns" },
  "read.aggregate_cap": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:718-730 100KB aggregate cap with omitted count" },
  "read.aliased_input": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:62 repairInput aliases and integer-string coercion" },
  "read.negative_offset": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:343 tail mode for negative offset" },
  "read.device_blocklist": { "score": 1, "evidence": "packages/midas/src/tool/read.ts:108 device path blocklist before I/O" }
}
