--- description: 에이전트 셸·Python 원라이너 — 문법 오류 코드 금지로 토큰/재실행 낭비 방지 alwaysApply: true --- # 에이전트 셸 / Python 스니펫 안전 (토큰 절약) 대화에서 실제로 낭비된 패턴: **실행 전에 문법이 틀린 Python을 heredoc으로 돌림** (예: `from X import Y if False else None` → `SyntaxError` → 재작성으로 턴·토큰 낭비). ## 1. 실행 전 문법 유효성 (필수) - `python - <<'PY'` / `-c` / 임시 `.py` 를 **돌리기 전에** 문법이 맞는지 스스로 확인. - 확신이 없으면 파일로 쓴 뒤 `python -m py_compile path.py` **1회**만 하고 실행. - `SyntaxError` / `IndentationError` 나면 **원인 고친 뒤 1회만** 재실행. 같은 스니펫을 살짝만 바꿔 반복 금지. ## 2. 금지 패턴 (자주 나는 가짜 문법) - `from module import name if cond else None` — **문법 불가**. → `import module as m` 후 `getattr(m, "name", None)` 또는 `try/except ImportError`. - `from X import a, b if c` / 조건부 import를 `from` 한 줄에 섞기. - 존재하지 않는 심볼을 **추측 import** (`get_scalp_grids` 등). → 먼저 `hasattr` / `dir` / Grep으로 실명 확인 후 import. - heredoc 안에서 이전에 실패한 코드를 **거의 그대로** 다시 붙여 넣기. ## 3. 그리드·헬퍼 조회 스니펫 최소형 축 개수 세기 등은 아래처럼 **검증된 형태만** 사용 (조건부 from 금지): ```python from kis_trader.backtest.param_search_breakout import _breakout_grids import kis_trader.backtest.param_search_scalping as sc bg = _breakout_grids() print({m: len(a) for m, a in bg.items()}) fn = getattr(sc, "_scalp_grids", None) print({m: len(a) for m, a in fn().items()} if callable(fn) else "no _scalp_grids") ``` 시그니처를 모르면 `inspect.signature(fn)` **먼저** — `_tail_grids(mode)` 처럼 인자가 필요한데 `()`로 호출하지 말 것. ## 4. 토큰 절약 원칙 - “한 번에 여러 전략 import + 조건부 트릭”보다 **짧은 확정 코드 1회**. - 실패 로그를 사용자에게 길게 반복 붙여 넣지 말 것. 고치고 결과만 보고. - ImportError/AttributeError 시 비슷한 심볼명 추측 재실행 금지 → Grep 1회 (`invalidate_merged_env_cache` 등). - 상세 절대규칙: `.cursorrules` CRITICAL §4.