이번 파이프라인 작업과 무관하게 작업 트리에 남아 있던 것을 그대로 올린다. 사용자가 「전부 커밋」으로 정했고, 이번 작업과 섞이지 않게 커밋만 나눴다. 대부분은 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>
96 lines
4.5 KiB
JSON
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": {}
|
|
}
|