Files

270 lines
15 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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"
}
]
}