Skill v2.0.0
currentLLM-judged scan90/100name: tsa-edit-safety version: 2.0.0 description: | Pre-edit safety check using tree-sitter-analyzer. One workflow → verdict (SAFE/REVIEW/CAUTION/UNSAFE) + verification command + risk factors → ≤2k tokens, ≤3 MCP calls. Replaces ~10k tokens of grep/read/git-diff exploration before touching a file.
Use when:
- About to edit a file you haven't touched in this session
- Refactoring across multiple files
- Asked "is it safe to change X?" or "what breaks if I touch Y?"
- Before approving a code review
Workflow: 2-3 parallel MCP calls (edit action=safe + edit action=impact + health action=file), fold the verdicts, surface the exact verification_command and stop_condition. allowed-tools:
- mcp__tree-sitter-analyzer__edit
- mcp__tree-sitter-analyzer__health
- mcp__tree-sitter-analyzer__project
- mcp__tree-sitter-analyzer__nav
- Bash
- Read
tsa-edit-safety — Decide before you edit
Replaces grep/read/git-diff/blame exploration with 2-3 MCP calls returningverdict + exact command to verify. 80% token reduction vs. manual recon.
When to use
- Pre-edit gate for any non-trivial change (more than 5 lines or crossing files)
- User asks any of: "is X safe to change", "what depends on Y", "what tests cover Z"
- Right after
git diffshows pending changes you want to evaluate
Don't use when:
- One-line typo fix in a doc / comment
- File you're literally creating from scratch (no callers)
Procedure
Step 1 — Single fan-out (parallel)
Call these 3 tools in ONE message:
edit action=safewithfile_path: "<the file>"andedit_type: "<refactor|add_feature|fix_bug|rename>"edit action=impactwithmode: "staged"(or"branch"if pre-stage), scope to the filehealth action=filewithfile_path: "<the file>"
Step 2 — Read the verdict cascade
Verdict precedence (worst wins):
UNSAFE(from constraints or impact) → STOP, explain why, do not editCAUTION(high impact / dependencies / hot zone) → narrow scope, write tests firstREVIEW(moderate, often "no tests nearby") → write tests before editSAFE→ proceed; still run the returnedverification_command
Step 3 — Always quote the exact verification_command
The tools return a verification_command and stop_condition. Surface them verbatim to the user before editing. Example:
verdict: REVIEWverification_command:uv run pytest tests/unit/test_health_scorer.py -qstop_condition: tests exit successfullynext_step: write a failing test for the new behaviour first
Common shapes
No tests nearby → escalate to REVIEW + recommend tdd workflow `__init__.py` edit → REVIEW automatically (re-exports) `mod_count_30d >= 5` → CAUTION (hot zone — extra review attention) Constraint violation → UNSAFE (architectural rule — forbidden edge)
CLI equivalents (if MCP unavailable)
uv run tree-sitter-analyzer <file> --safe-to-edit --edit-type refactor --output-format jsonuv run tree-sitter-analyzer --change-impact --change-impact-mode staged --agent-summary-only --output-format jsonuv run tree-sitter-analyzer <file> --file-health --output-format json
Anti-patterns
- DO NOT read the file before this check — the tool's verdict is informed by
the AST + DB, not text scan. Reading first wastes tokens.
- DO NOT run pytest -q (whole suite) when the tool returned a focused command.
- DO NOT skip the gate just because the file is "small" — small files often
have outsized blast radius (e.g. __init__.py, conftest.py).
Decision surface returned
verdict: SAFE | REVIEW | CAUTION | UNSAFEfile_path: <abs>risk_level: safe | caution | highedit_strategy: focused_edit_with_tests | narrow_then_widen | freeze_and_redesignverification_command: <copy-paste exact pytest line>stop_condition: <when to declare done>risk_factors: [{factor, detail, severity}, ...]health_grade: A | B | C | D | Fconstraint_violations: [] # non-empty triggers UNSAFEhot_zone: bool # mod_count_30d >= 5 → true