Files
document-haness/docs/_templates/tech-log-studio/tech-log-tree.json
T
DongHyeonkaandClaude Opus 5 ab59130196 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>
2026-09-17 11:02:02 +09:00

96 lines
4.5 KiB
JSON

{
"schemaVersion": 4,
"project": "<project>",
"ssot": "final/document.md",
"sourceRepository": {
"path": "<분석한 저장소의 체크아웃 경로 또는 URL>",
"revision": "<문서가 서술한 상태의 커밋. 모르면 null 로 두고 지어내지 않는다>",
"revisions": {"<갈래가 여럿이면 이름>": "<커밋>"},
"verified": "<이 값이 맞다고 판단한 근거 — 무엇을 어디서 대조했는지>"
},
"ssotSha256": "<sha256>",
"sourceRevision": "<git-revision-or-snapshot>",
"generatedAt": "<YYYY-MM-DD>",
"candidateScope": {
"document": "final/document.md",
"sections": ["§3", "§4", "§5", "§6", "§7", "§8", "§9", "§10", "§11"],
"excluded": ["제2부 — 모듈 분석 전문", "제3부 — 분석 재료"],
"note": "후보를 찾는 범위다. 제2부·제3부는 근거이지 후보 자리가 아니다. excludedAnchorPattern 을 적으면 그 정규식에 걸리는 앵커에서만 나온 글감을 검사기가 error 로 센다"
},
"note": "이 프로젝트의 글감 전부다. 분해 계약이자 색인이고, 이 파일이 정본이다. 노드의 칸(readiness·source·classification·relations…)은 사람이 적고, file·publication·status 는 기록 파일에서 읽어 채운다 — python3 scripts/build-tech-log-tree.py <프로젝트>",
"contract": {
"decomposition": [
"글감을 찾는 입력은 final/document.md 하나다. 거기에 없는 근거는 먼저 SSOT 에 넣는다.",
"후보 전부는 candidates 에 처분과 함께 남고 PROMOTE 만 topics 로 올라간다.",
"없애고 관련 Case 나 Concept 의 한 절로 넣어도 이해·결정·재사용성이 그대로라면 독립 기록으로 만들지 않는다.",
"Topic 은 독자 질문 하나다. 그 물음에 답하지 않는 글감은 다른 Topic 으로 옮긴다.",
"Concept 은 Case·Decision·Question 을 먼저 고른 뒤 그것을 이해하는 데 필요한 것만 거꾸로 더한다."
],
"readinessValues": ["READY", "OPEN", "NEEDS_EVIDENCE", "NEEDS_DECISION", "BLOCKED"],
"dispositionValues": {
"PROMOTE": "독립 Tech Log 로 쓴다",
"MERGE_INTO": "다른 기록의 한 절로 흡수한다",
"KEEP_IN_SSOT": "분석에는 남기고 독립 기록으로 만들지 않는다 — 정상적인 성공 결과다",
"NEEDS_EVIDENCE": "주장에 아직 검증이 없다",
"NEEDS_DECISION": "방향이 그럴듯하지만 프로젝트가 정하지 않았다",
"BLOCKED": "원본이 불완전하거나 서로 어긋난다"
}
},
"counts": { "topics": 1, "nodes": 2, "written": 0, "unwritten": 2, "unlisted": 0, "candidates": 1 },
"topics": {
"<topic-slug>": {
"topic": "<topic-slug>",
"title": "<Topic 제목>",
"readerQuestion": "<이 Topic 의 기록들이 함께 답하는 물음 하나?>",
"kinds": {
"case": [
{
"title": "<Case 제목>",
"kind": "case",
"slug": "<slug>",
"readiness": "READY",
"source": ["final/document.md#<anchor>"],
"code": ["<path>:<line-or-symbol>"],
"evidence": ["evidence/raw/<file>"],
"classification": "<재현·진단·결론이 닫히는 하나의 사건. 정적 카운트나 문구 수정이 아니다>",
"missing-verification": "<없음 또는 하지 못한 확인>",
"relations": ["concept:<slug>"],
"publication": "미작성"
}
],
"concept": [
{
"title": "<Concept 제목>",
"kind": "concept",
"slug": "<slug>",
"readiness": "READY",
"source": ["final/document.md#<anchor>"],
"basis-version": "<무엇을 보고 썼는지 — 예: Keycloak 26.7.0 identity brokering>",
"classification": "<이 구조를 처음부터 설명해야 어떤 Case 를 이해할 수 있는지>",
"relations": ["case:<slug>"],
"publication": "미작성"
}
],
"reference": [],
"question": [],
"decision": [],
"setup": []
}
}
},
"candidates": [
{
"id": "<A05-F012>",
"kindCandidate": "CASE",
"sourceRefs": ["final/document.md#<anchor>"],
"summary": "<한 줄>",
"disposition": "KEEP_IN_SSOT",
"dispositionReview": "CONFIRMED",
"target": null,
"reason": "<왜 독립 기록으로 만들지 않았는지>"
}
],
"unlisted": [],
"history": {}
}