Files
document-haness/scripts/terminal-evidence
DongHyeonkaandClaude Opus 5 7fc7c69157 fix(terminal-evidence): 마스킹이 자격증명을 덮으면서 명령을 고치고 있었다
두 가지가 겹쳐 있었다.

줄 맨 앞 앵커 때문에 `curl -H "Authorization: Bearer ..."` 처럼 명령 인자 안에 든
자격증명을 놓쳤다. 터미널 증거에서 Bearer 가 가장 흔히 나오는 자리가 그 명령줄이다.

그리고 키워드 패턴의 값이 `[^\s,;]+` 라 공백까지 먹어 닫는 따옴표를 넘어갔다.
`curl -H "X-Api-Key: TESTONLY-x" https://...` 가
`curl -H "X-Api-Key: [REDACTED] https://...` 가 된다. 다중 -H 에서는 다음 인자의
경계까지 무너진다. 증거에 실린 명령이 실제로 돌린 명령과 달라진다.

값의 끝을 따옴표 앞에서 막되, 감싼 따옴표는 되돌려 놓는다. 문자 집합만 좁히면
`TOKEN="eyJ..."` 가 여는 따옴표에서 막혀 아예 안 가려진다.

함께 메운 것: Authorization/Proxy-Authorization 의 Basic, `curl -u`/`--user`
(사용자 이름은 남긴다 — 어느 계정으로 붙었는지가 증거의 일부다), 그리고 JWT.

회귀는 「가려졌는가」만 묻지 않는다. 원문과 따옴표 수가 같은지 함께 본다.
앞선 회귀가 그것을 안 물어서 이 결함을 통과시켰다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4vKjQo9KKBBokzxqXLCfk
2026-09-10 11:06:32 +09:00
..

Terminal Evidence Renderer

실제 명령 출력 원문을 보존한 뒤, 그 원문을 terminal UI 형태의 SVG로 렌더링한다.

Evidence rule

SVG가 정본이 아니다. 실행한 명령의 raw output과 metadata가 정본이고 SVG는 문서에 넣기 위한 표현이다.

command execution
  ├── raw/<name>.txt      # stdout/stderr 원문
  ├── meta/<name>.json    # command, cwd, executedAt, exitCode, revision
  └── terminal/<name>.svg # raw에서 생성

시각화 단계에서는 Authorization Bearer, Cookie, token/password/client_secret/API key 형태의 값을 [REDACTED]로 치환한다. 그래도 raw 파일에 secret이 들어간 채 보관하면 안 된다. 명령 자체를 secret이 출력되지 않도록 구성하고, raw 저장 전에도 검사한다.

Render

python3 /shared/Tech-Log-Document/tools/terminal-evidence/render_terminal.py \
  evidence/raw/gradle-test.txt \
  evidence/terminal/gradle-test.svg \
  --command './gradlew test' \
  --cwd '/shared/codebase/my-project' \
  --exit-code 0 \
  --executed-at '2026-08-28T15:00:00+09:00'

Capture pattern

Agent가 명령을 실제로 실행할 때 stdout/stderr, exit code, 실행 시간, cwd를 함께 기록한다. 실패 명령도 Evidence가 될 수 있으므로 exit code를 버리지 않는다.

예시 shell pattern:

set +e
executed_at=$(date --iso-8601=seconds)
pwd_value=$(pwd)
./gradlew test > evidence/raw/gradle-test.txt 2>&1
exit_code=$?
set -e

그 뒤 metadata JSON을 쓰고 renderer를 호출한다. command에 credential을 직접 넣지 않는다.

Tests

python3 -m unittest discover -s tests -v