feat: 가상화 문서들 추가

This commit is contained in:
DongHyeonka
2026-09-10 08:54:05 +09:00
parent e9f6a93327
commit 43e1aadef0
695 changed files with 153404 additions and 12754 deletions
@@ -0,0 +1,269 @@
{
"schemaVersion": 1,
"runId": "2026-09-08-1426",
"project": "virtualization",
"record": "docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md",
"startedAt": "2026-09-08T14:26:02+09:00",
"finishedAt": "2026-09-08T22:22:53+09:00",
"stages": [
{
"id": "S1",
"name": "코드베이스 → SSOT",
"skill": "analyzing-codebase-for-tech-log",
"runBy": "subagent",
"status": "SKIPPED",
"skipReason": "분석할 코드베이스가 없다. 사용자가 밖에서 쓴 문서 한 편을 반입한 프로젝트라 CLAUDE.md 「밖에서 문서를 가져올 때」 1·2 단계로 대신했다 — 원본을 source/ 에 복사하고, frontmatter 만 떼고 절의 heading 단계를 한 칸 내려 final/document.md 로 두었다. 이 글감의 근거는 그 안에 전부 있다.",
"skillEcho": "",
"inputs": [
"docs/virtualization/source/kvm-cpu-virtualization-ssot.md"
],
"outputs": [
"docs/virtualization/final/document.md"
],
"gates": [
{
"cmd": "python3 scripts/verify-project-layout.py virtualization",
"exit": 0
}
],
"notes": "오케스트레이터가 반입했다. 서브에이전트를 띄우지 않았다 — 분석이 아니라 파일 이동이라 판단할 것이 없었다. 반입 시점의 SSOT 는 절 23개(1222줄)였고, S2 가 도는 동안 14:31 에 사용자가 §24~§28 을 더한 판(1640줄)으로 final/document.md 를 덮었다. 지운 문장은 없고 430줄이 붙기만 했다(source/ 와 heading marker 를 뺀 본문을 대조). S2 가 그 판의 heading 단계를 다시 맞췄다(h1=1 · h2=28 · h3=65 · h4=4). source/ 의 사본은 그 시점 이후로 낡았다. SSOT 는 측정 자료가 없는 개념 문서다 — final/evidence/ 는 비어 있고 §20·§27 의 OQ 열둘이 아직 안 돌린 실험이다."
},
{
"id": "S2",
"name": "SSOT → 분해 계약",
"skill": "deriving-tech-log-root-tree",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "**Select what is worth publishing. Do not emit everything the analysis found.**",
"inputs": [
"docs/virtualization/final/document.md"
],
"outputs": [
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "python3 scripts/build-tech-log-tree.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-tech-log-tree.py virtualization",
"exit": 0
}
],
"notes": "글감 하나 — topic=cpu-virtualization · concept · slug=kvm-vcpu-to-physical-cpu · source 앵커 23개. 후보 39건 처분: PROMOTE 1 · MERGE_INTO 21 · NEEDS_EVIDENCE 13 · KEEP_IN_SSOT 3 · NEEDS_DECISION 1 · PENDING 0. 남은 warn 2 = Topic 에 노드가 하나뿐(사용자가 정한 제약) · sourceRepository 에 리비전이 없다(고정할 커밋이 없다). assetLedger 는 SVG 가 0장이라 안 썼다 — S4 가 그림을 만들면 그때 써야 한다. 런 끝에 오케스트레이터가 sourceRepository 를 고쳤다 — S2 가 적은 path(source/kvm-cpu-virtualization-ssot.md)는 반입 재료라 지웠고, check_evidence 는 체크아웃이 없는 반입 문서일 때 path 가 그 파일이기를 요구한다. 그래서 path 를 final/document.md 로 옮기고 verified 에 사유를 적었다. 다른 칸은 S2 가 쓴 그대로다."
},
{
"id": "S3",
"name": "글감 → 기록",
"skill": "writing-tech-log-records",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "**코드·표·다이어그램·이미지는 본문에만 들어간다. 본문이 있는 종류는 Case 와 Concept 둘뿐이다.**",
"inputs": [
"docs/virtualization/tech-log-studio/tech-log-tree.json",
"docs/virtualization/final/document.md"
],
"outputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md"
],
"gates": [
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md>",
"exit": 0
},
{
"cmd": "node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs virtualization --repo",
"exit": 0
},
{
"cmd": "python3 scripts/build-tech-log-tree.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-tech-log-tree.py virtualization",
"exit": 0
}
],
"notes": "후보 SSOT-02-19-execution-path-as-one-concept 가 PROMOTE·CONFIRMED 인 것을 대조하고 착수했다. frontmatter 의 source 23개는 계약에서 스크립트로 옮겼다. 측정값은 하나도 쓰지 않았다 — 마지막 절이 §28 의 경계와 「이 Host 에서 잰 값이 없다」를 명시한다. 그림 필요: virsh→libvirt→QEMU vCPU thread→/dev/kvm→KVM Core→kvm_intel→VMX→물리 CPU 실행 경로와 KVM_RUN·VM Entry·VM Exit 이 되돌아오는 고리. 근거 절 = #2-전체-구조 · #6-kvm_run과-guest-실행 · #7-vm-entry와-vm-exit · #9-vm-exit-이후-처리. 관계 절은 두지 않았다 — 걸 상대가 아직 없다."
},
{
"id": "S4",
"name": "기록 → 그림",
"skill": "technical-visualizer",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "- Every factual boundary/group, node, and edge must cite document line ranges. Unsupported content must be `assumption: true` with no evidence.",
"inputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md",
"docs/virtualization/final/document.md#9-vm-exit-이후-처리"
],
"outputs": [
"docs/virtualization/final/.techviz/vm-exit-handling-cycle/spec.json",
"docs/virtualization/final/.techviz/vm-exit-handling-cycle/context.json",
"docs/virtualization/final/.techviz/vm-exit-handling-cycle/prompt.md",
"docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.svg"
],
"gates": [
{
"cmd": "./scripts/techviz lint docs/virtualization/final/.techviz/vm-exit-handling-cycle/spec.json --context .../context.json",
"exit": 0
},
{
"cmd": "python3 scripts/check-figure-text.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/check-figure-overlap.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/preview-figure.py virtualization -o /tmp/figs",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "python3 scripts/build-tech-log-tree.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-tech-log-tree.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-project-layout.py virtualization",
"exit": 0
}
],
"notes": "그림 하나 — vm-exit-handling-cycle. 근거는 SSOT §9(final/document.md#9-vm-exit-이후-처리). profile=component-flow, 노드 5·엣지 5·assumption 0. 1차 spec 은 Kernel·Userspace 를 groups 로 그렸다가 check-figure-overlap 이 구역 겹침 15750px² 와 라벨 먹힘 99px² 를 냈다. groups 를 걷어 노드 details 로 내리고 재합류 엣지 라벨을 줄여 통과했다 — 기각 사유는 spec 의 metadata.rationale 에 있다. 기록 frontmatter 의 assets: 와 본문 마크다운 이미지, 계약의 assetLedger·ssot-assets 를 되적었다. §24~§26 의 진단 계층 그림은 두 번째 후보였으나 §25 진단표와 겹쳐 그리지 않았다."
},
{
"id": "S5",
"name": "AI 티 제거",
"skill": "rewriting-technical-prose-naturally",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "### Write Korean words in Korean. Latin script is for identifiers only",
"inputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md"
],
"outputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md"
],
"gates": [
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md>",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/style_profile.mjs <기록.md>",
"exit": 0
},
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs virtualization --repo",
"exit": 0
}
],
"notes": "style_profile 벗어남 4→0. engPerSent 6.45→3.50 · hangulRatio 0.47→0.65 · avgLen 72.5→57.2 · longRatio 0.093→0.008 · connPer100 2.8→8.1. 문장 107→124. 주된 편집은 라틴 문자 정리다 — 식별자·고유명사는 그대로 두고 자리잡은 외래어만 한글로 옮겼다. 코드블록 4개와 frontmatter 는 한 글자도 건드리지 않았다(check_evidence 로 확인). 남긴 것: check_prose 경고 5건(VT·QEMU·AMD·SVM·NUMA 미확장) — 다 풀면 라틴 토큰이 늘어 되레 나빠진다고 판단. 근거가 모자란 문제(이 Host 에서 잰 값이 없다)는 S5 범위가 아니라 계약 쪽 일로 남겼다."
},
{
"id": "S6",
"name": "일한 사람의 목소리",
"skill": "writing-as-the-person-who-did-it",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "2. **확인하지 못한 것을 그 대목에서 말한다** — 끝의 목록이 아니라 그 주장 옆에서",
"inputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md",
"docs/virtualization/final/document.md",
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"outputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md"
],
"gates": [
{
"cmd": "node .agents/skills/writing-as-the-person-who-did-it/scripts/check_voice.mjs <기록.md>",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md>",
"exit": 0
},
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/studio-body.md",
"exit": 0
},
{
"cmd": "node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs virtualization --repo",
"exit": 0
}
],
"notes": "흔적 있음. 넣은 것은 세 곳이고 모두 상류 자료에서 옮겼다 — (1) vCPU 스레드가 논리 CPU 사이를 옮겨 다닌다는 주장 옆에 이 Host 에서 재지 않았다는 것과 PSR 로 확인한다는 것(§20 OQ-5 · §14.7 · 노드의 missing-verification), (2) 진단표가 운영 서버에 그대로 적용되는지는 구성 확인으로 정해진다는 것(§20 OQ-6), (3) 동시성 실험과 부하 실험을 나눠 도는 이유와 견준 대상(§26 · §17.2 의 문구를 그대로 인용). 안 넣은 것: 오독 기록이 없어 「~로 읽기 쉽다」를 안 썼고, 측정이 없어 「어긋난 자리」가 없었고, 코드 저장소가 없어 남의 말을 옮길 자리가 없었다."
},
{
"id": "S7",
"name": "Studio 저장",
"skill": "publishing-tech-log-to-studio",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "기록 `.md` 하나를 Studio 편집 화면에 넣고 **저장**한다. 거기서 끝난다.",
"inputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md",
"docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.svg"
],
"outputs": [
"docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md",
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "상태 레일이 `저장됨` 으로 바뀌는 것을 확인 (건마다)",
"exit": 0
},
{
"cmd": "넣은 값을 화면에서 되읽어 원문과 대조 (건마다)",
"exit": 0
},
{
"cmd": "python3 scripts/build-tech-log-tree.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-tech-log-tree.py virtualization",
"exit": 0
}
],
"notes": "앞서 SKIPPED 로 적었던 것을 사용자가 뒤집어 실제로 돌렸다. Studio 에 이 프로젝트의 주제와 프로젝트가 없어 한 번 BLOCKED 로 멈췄고, 사용자가 만들라고 정한 뒤 주제 `CPU 가상화`(slug cpu-virtualization · id e42456e2-9efd-41ee-b676-df82e90f2f53, 논지 칸에 계약의 readerQuestion 기입)와 프로젝트 `가상화` 를 만들고 이어 갔다. 그림 Asset 을 본문보다 먼저 올려 서버 키 vm-exit-handling-cycle-f8448581 을 받고 studio-body.py --key 로 본문을 변환해 넣었다. 저장 버전 1→2, 상태 `저장됨`. 게시하지 않았다. 저장 뒤 오케스트레이터가 편집 화면을 직접 열어 그림이 실제로 뜨는지 확인했다 — figure 안의 img 가 naturalWidth 1195 × 353 · complete true, [role=alert] 0건. 문서: https://hyeonworks.com/studio/documents/5bcae89b-0873-4a2b-af4a-10e5234c085b/edit"
}
]
}