chore: 이전 세션이 남긴 변경을 커밋한다

이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다.
사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다.

대부분은 clean-architecture-backend-template 의 그림 정본 재배치다 —
final/assets/diagrams/<이름>/ 에 있던 것이 CLAUDE.md 가 적은 배치인
final/assets/<이름>/ 로 옮겨졌고 .techviz/<이름>/ 이 함께 들어왔다.
삽입 줄의 대부분(3.15M)이 그 .techviz context.json 이다.

그 밖에 ca-tmpl·document-haness 의 정리, .claude/agents/ 열한 개,
writing-practitioner-guides 스킬, .playwright-mcp 세션 산출물,
scripts/check-ssot-facts.py 와 그 시험이 들어 있다.

이 커밋의 내용은 내가 만든 것이 아니라 이전 세션이 남긴 것이고 검증하지 않았다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-09-17 11:02:02 +09:00
co-authored by Claude Opus 5
parent 2109f726fe
commit ab59130196
1524 changed files with 3160026 additions and 8369 deletions
+36 -6
View File
@@ -11,9 +11,21 @@ import os, re, sys, glob, json, collections
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(ROOT, "scripts"))
import techlog # noqa: E402
KINDS = {"case": "CASE", "concept": "CONCEPT", "reference": "REFERENCE",
"question": "QUESTION", "decision": "PROJECT_DECISION"}
BODY_KINDS = {"case", "concept"}
# 폴더 이름 ↔ 종류. 손으로 다시 적지 않는다 — 여섯 번째 종류(SETUP)가 빠졌던 자리다
KINDS = techlog.KIND_OF_DIR
BODY_KINDS = techlog.BODY_KINDS
# 마크다운 **블록** 파서를 안 거치는 칸. 그렇다고 전부 글자로 나오지는 않는다 —
# 렌더러가 이 칸들을 `<ProseText>` 로 그리고(`tech-log-frontend` 의
# `presentation/shared/public-render/prose-text.tsx`), 거기서 백틱 쌍은 인라인 `<code>` 로,
# 빈 줄은 문단으로, 한 줄 바꿈은 `<br>` 로 산다. **살아나지 않는 것만 잡는다** —
# 코드펜스·별표·파이프다.
#
# 여기서 백틱도 잡던 때가 있었다. 그때는 맞았고(칸이 진짜 평문이었다) 지금은 틀렸다.
# 지금 이 검사가 0건인 것은 깨끗해서가 아니라 **그 규칙을 따라 이미 다 떼어 놨기**
# 때문이다. 되돌리는 것은 기록 수백 편을 건드리는 일이라 따로 다룬다.
#
# **`concept` 과 `setup` 은 여기 없는 것이 맞다** — 본문 밖에 절이 없다. 그 둘의 본문 밖 칸
# (`basisVersion` · `pinnedVersions`)은 frontmatter 에 있다
PLAIN_FIELDS = {"case": ("문제", "결론", "검증 환경", "재현 조건"),
"reference": ("목적", "규칙", "적용 조건", "예외", "예시"),
"question": ("사실", "가정", "미지수", "제약", "선택지", "다음 검증"),
@@ -79,13 +91,31 @@ def audit_project(project: str) -> dict:
if not os.path.exists(os.path.normpath(os.path.join(d, m.group(1)))):
flag("evidence 링크 깨짐", f"{rel}{m.group(1)}")
# 평문 칸은 백틱·코드펜스가 글자 그대로 보인
# 이 칸에서 살아나지 않는 마크업. 백틱은 `<code>` 로 사니까 잡지 않는
head = text if "<!-- body:start -->" not in text \
else text[:text.index("<!-- body:start -->")]
for field in PLAIN_FIELDS.get(kind_dir, ()):
fm2 = re.search(rf"^## {re.escape(field)}\n(.*?)(?=\n## |\Z)", head, re.M | re.S)
if fm2 and ("`" in fm2.group(1) or "```" in fm2.group(1)):
flag("평문 칸에 마크업", f"{rel}{field}")
if not fm2:
continue
chunk = fm2.group(1)
dead = []
if "```" in chunk:
dead.append("코드펜스")
# 목록 표지(`- **제목**`)는 관계 절의 표기이고 이 칸들에는 안 온다.
# 줄 첫머리가 아닌 자리의 `**…**` 만 본다
if re.search(r"(?<!^)(?<!- )\*\*[^*\n]+\*\*", chunk, re.M):
dead.append("별표")
if re.search(r"^\s*\|", chunk, re.M):
dead.append("")
# 인용 표지도 안 산다. `studio-save.py` 의 `_sections()` 가 `>` 를 그대로
# 실어 보내고 `ProseText` 는 백틱·빈 줄·줄바꿈 셋만 해석한다 — 화면에
# 홑화살괄호가 글자로 나온다. SSOT 를 그대로 옮긴 인용이라도 마찬가지다
if re.search(r"^\s*>", chunk, re.M):
dead.append("인용 표지")
if dead:
flag("평문 칸에 살아나지 않는 마크업",
f"{rel}{field} · {'·'.join(dead)}. 백틱은 괜찮다")
# 본문이 부르는 자산이 frontmatter 에 선언돼 있나
declared = set(re.findall(r"^ - key: (\S+)$", text, re.M))