Files
document-haness/runs/virtualization/2026-09-09-1052/run.json
T

291 lines
23 KiB
JSON

{
"schemaVersion": 1,
"runId": "2026-09-09-1052",
"project": "virtualization",
"record": "docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-guest-memory-address-translation.md",
"startedAt": "2026-09-09T10:52:29+09:00",
"finishedAt": "2026-09-09T16:32:05+09:00",
"stages": [
{
"id": "S1",
"name": "코드베이스 → SSOT",
"skill": "analyzing-codebase-for-tech-log",
"runBy": "subagent",
"status": "SKIPPED",
"skipReason": "분석할 코드베이스가 없다. 사용자가 밖에서 쓴 SSOT 세 편(메모리·네트워크·스토리지)을 반입하는 일이라 CLAUDE.md 「밖에서 문서를 가져올 때」 1·2 단계로 대신했다 — 원본을 source/ 에 복사하고, frontmatter 를 떼고 heading 단계를 한 칸 내리고 절 번호만 이 문서의 번호로 옮겨 final/document.md 의 제2·3·4부로 붙인 뒤, heading 이 아닌 줄이 원본과 한 줄도 다르지 않은 것을 대조하고 source/ 를 지웠다. 이 런의 글감 근거는 그 안에 전부 있다.",
"skillEcho": "",
"inputs": [
"docs/virtualization/source/kvm-memory-virtualization-ssot.md",
"docs/virtualization/source/kvm-network-virtualization-ssot.md",
"docs/virtualization/source/kvm-storage-virtualization-ssot.md"
],
"outputs": [
"docs/virtualization/final/document.md",
"docs/virtualization/README.md"
],
"gates": [
{
"cmd": "python3 scripts/verify-project-layout.py virtualization",
"exit": 0
}
],
"notes": "오케스트레이터가 반입했다. 서브에이전트를 띄우지 않았다 — 분석이 아니라 파일 병합이라 판단할 것이 없었다. SSOT 는 절 28개(1640줄) → 절 177개(7719줄). 제2부 §29~§88(원본 절 1~60) · 제3부 §89~§126(원본 절 1~38) · 제4부 §127~§177(원본 절 0~50). §1 의 「이 문서에서는 CPU 가상화만 다룬다 / 네트워크·메모리·스토리지는 별도 범위」 선언이 병합으로 거짓이 되어 그 문단만 고쳤다 — 제1부가 CPU 만 다루고 나머지 셋은 제2·3·4부에 있다고, 범위 밖은 PCIe/VFIO/IOMMU 와 K3s 상세 둘뿐이라고. 대조 결과: 제2부 1765줄 · 제3부 1112줄 · 제4부 1390줄이 원본과 동일. h2 절 슬러그 177개 중복 없음. 남은 warn 1 = SSOT 가 바뀐 뒤 vm-exit-handling-cycle 그림을 다시 보지 않았다(그 그림의 근거 §9 는 이번에 안 바뀌었다)."
},
{
"id": "S2",
"name": "SSOT → 분해 계약",
"skill": "deriving-tech-log-root-tree",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "8. Group `PROMOTE` candidates into Topics. Write one reader question per Topic.",
"inputs": [
"docs/virtualization/final/document.md",
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"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": "서브에이전트 셋을 차례로 띄웠다(S2-A 제2부 메모리 · S2-B 제3부 네트워크 · S2-C 제4부 스토리지). 같은 계약 파일 하나를 고치므로 병렬로 돌리지 않았고, 각 에이전트는 앞선 부의 주제·후보를 바이트 단위로 보존한 것을 대조하고 끝냈다. 결과: 주제 1→4 · 글감 13→57 · 후보 39→213. 부별 처분 — 제2부 PROMOTE 20 / MERGE_INTO 55 / KEEP_IN_SSOT 2, 제3부 PROMOTE 10 / MERGE_INTO 35 / KEEP_IN_SSOT 2 / NEEDS_EVIDENCE 1, 제4부 PROMOTE 14 / MERGE_INTO 33 / KEEP_IN_SSOT 1 / NEEDS_DECISION 1. candidateScope.sections 27→176. Case 는 세 부 모두 0 이다 — 이 Host 에서 잰 값이 SSOT 어디에도 없어 Case 를 만들 근거가 없고, 각 부의 OPEN QUESTION 을 그대로 question 글감으로 올렸다(제1부가 세운 기준과 같다). 개념을 몇 편으로 나눌지는 부마다 갈렸고 근거는 SSOT 안에 있다 — 제1부 §19 와 제3부 §121 이 「하나의 CONCEPT 로 관리한다」고 적어 각각 한 편, 그런 지시가 없는 제2부는 여섯 편 제4부는 네 편으로 나눴다. 중복 물음은 MERGE_INTO 로 걷었다 — 제2부 OQ-1·OQ-10 은 제1부 question:host-numa-topology 가 이미 묻고, 제4부 OQ-2 는 OQ-3 과 같은 qemu-img info 한 번으로 닫힌다. 남은 warn 1 = sourceRepository 에 리비전이 없다(코드 저장소가 아니라 반입 문서라 null 로 두었고 verified 에 사유가 있다)."
},
{
"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/tech-log-tree.json"
],
"gates": [
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/sb-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/sb-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md> (44건)",
"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
},
{
"cmd": "python3 scripts/audit-records.py virtualization",
"exit": 0
}
],
"notes": "기록 44건을 서브에이전트 12개에 나눠 동시에 썼다(메모리 20건 = S3-A·B 개념 6 / S3-C 참조 2+질문 2 / S3-D·E 질문 8, 네트워크 10건 = S3-F 개념 1+참조 2 / S3-G·H 질문 7, 스토리지 14건 = S3-I·J 개념 4 / S3-K 참조 3+질문 2 / S3-L 질문 5). 같은 단계의 서로 다른 기록이라 병렬로 돌렸고, 프로젝트 전체를 훑는 검사기(check_evidence·build·verify-tree·audit)는 배치가 서로의 반쯤 쓴 파일을 보지 않도록 오케스트레이터가 열둘이 끝난 뒤 한 번만 돌렸다. 열두 배치가 같은 것을 지켰다 — Reference·Question 은 평문 칸이라 백틱·코드펜스·표·그림을 넣지 않았고, 명령은 SSOT 에 적힌 것만 쓰고 SSOT 가 명령을 안 적은 확인은 명령을 짓지 않고 그 사실을 적었으며, 이 Host 에서 잰 값은 하나도 만들지 않고 SSOT 의 예시 숫자는 예시라고 밝혔다. 오케스트레이터가 런 도중에 고친 것 둘. (1) 계약 제목 「vCPU 배치와 메모리 배치가 NUMA 에서 한 묶음이 되는 자리」가 check_prose 의 spatial-metaphor 를 error 로 밟아 계약과 기록을 함께 「NUMA 에서는 vCPU 배치와 메모리 배치를 함께 본다」로 고쳤다. 배치 셋이 각자 다른 우회 표현을 쓰고 있어 그것도 새 제목으로 맞췄다. (2) topicName 이 배치마다 갈렸다 — 기존 CPU 기록 13건은 짧은 「CPU 가상화」인데 새 기록들이 계약 주제의 긴 title 을 넣었다. Studio 주제 이름이 될 칸이라 44건을 「메모리 가상화」·「네트워크 가상화」·「스토리지 가상화」로 맞췄다. 계약 storage 주제의 title·readerQuestion·노드 제목에 있던 백틱 6곳도 지웠다 — 평문으로 렌더링되는 칸이다. check_body 가 문단 안의 꺾쇠 자리표시자(<device> 같은 것)를 inline html 로 거절해 네 배치가 자리표시자를 말로 풀어 썼다. 그림은 아무도 만들지 않았다 — 아홉 기록이 「그림 필요」를 근거 절 앵커와 함께 적어 S4 로 넘겼고, 개념 둘(huge-pages-in-a-vm · qemu-block-backend-forms)은 표가 답한다고 판단해 청구하지 않았다."
},
{
"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/*/concept/*.md",
"docs/virtualization/final/document.md"
],
"outputs": [
"docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.svg",
"docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.svg",
"docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.svg",
"docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.svg",
"docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.svg",
"docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.svg",
"docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.svg",
"docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.svg",
"docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.svg",
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "./scripts/techviz lint docs/virtualization/final/.techviz/<이름>/spec.json --context .../context.json (9장)",
"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 (PNG 로 떠서 눈으로 봤다)",
"exit": 0
},
{
"cmd": "python3 scripts/verify-project-layout.py virtualization",
"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": "서브에이전트 넷(S4-A·B·C 신규 · S4-D 기존 그림 재대조). 3단계가 청구한 아홉 중 여덟을 그렸다. 못 그린 하나 — memory-pressure-to-storage-contention(네 갈래 I/O 가 한 NVMe 로 모이는 그림). 근거 절 §62 로 prepare 한 문맥이 허용하는 profile 이 sequence 하나뿐인데 그 절이 「Guest와 Host가 동시에 memory pressure를 겪으면」이라고 못 박아 순서가 없다. 순서를 지어내야 그려져서 멈췄고 반쯤 만든 .techviz 폴더도 지웠다 — SKILL.md 가 「Stop and report metadata.source_gap instead of fabricating」라고 적은 자리다. 개념 열하나 중 huge-pages-in-a-vm 과 qemu-block-backend-forms 는 3단계가 「본문 비교표가 답한다」로 청구하지 않았다. profile 은 문맥이 정했다 — component-flow 넷(주소 변환 경로 · page fault 계층 · 블록 I O 경로 · 완료 경계 · NVMe 수렴 중 다섯), sequence 둘(balloon · NUMA). 기각과 재작업이 여러 번 있었고 사유는 spec 의 metadata.rationale 에 남겼다. 검사기가 못 잡고 사람 눈이 잡은 것 셋 — (1) group 이름이 경계를 넘는 엣지 라벨에 덮여 「Guest Kerne」로 잘림, (2) 레이아웃이 노드를 group 별로 모으지 않아 Host 상자가 Guest 노드까지 감쌈, (3) device model 에서 나가는 점선이 옆 라벨을 관통. 셋 다 lint 와 겹침 검사기는 PASS 였다. S4-D 는 SSOT 가 절 28개에서 177개로 커지며 §1~§28 의 줄 번호가 +14 밀린 것을 vm-exit-handling-cycle 의 정본에 반영했다 — 세 절의 text 가 문자열로 동일한 것을 먼저 확인하고 evidence 줄 번호 38개와 sha256 만 옮겼다. SVG 의 좌표는 한 값도 바뀌지 않았다. 오케스트레이터가 계약을 되적었다 — 개념 노드 여덟에 ssot-assets, assetLedger 에 배정 아홉과 그림을 안 받은 개념 셋의 사유."
},
{
"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/*/*/*.md (44건)"
],
"outputs": [
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md> (44건)",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/style_profile.mjs <기록.md> (44건)",
"exit": 0
},
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/sb5-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/sb5-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs virtualization --repo",
"exit": 0
},
{
"cmd": "python3 scripts/audit-records.py virtualization",
"exit": 0
}
],
"notes": "서브에이전트 아홉(S5-A~I)이 44건을 나눠 제자리에서 고쳤다. 고친 것은 대부분 같은 종류다 — 자리잡은 외래어를 한글로 옮기고(호스트·게스트·메모리·페이지·패킷·큐·스토리지·지연), 영어 용어는 첫 자리에서 한 번만 「한글 뜻(English)」로 풀고, 120자 넘는 문장을 주어가 바뀌는 자리에서 끊고, 자료에 이미 있는 인과를 문장 안으로 이었다(연결어미). 대표 수치: 문장당 맨몸 영문 5~12 → 2.4~8, 한글 비율 0.43~0.55 → 0.58~0.72. 보호 구간은 지켰다 — 코드블록·명령어·수치·직접 인용·frontmatter·계약 title·관계 절의 다른 기록 제목이 원문 그대로인 것을 각 에이전트가 대조했고, 오케스트레이터가 끝에 check_evidence 로 다시 봤다(문제 없음). 남긴 것 셋. (1) style_profile 의 「문장당 맨몸 영문」이 Question·Reference 여러 건에서 기준 위로 남는다. 그 종류는 칸이 평문이라 백틱을 못 쓰고, 검사기가 frontmatter 의 source 앵커와 영문 title 까지 산문에 섞어 세며, 남은 라틴은 SSOT 를 그대로 옮긴 명령·열거·다른 기록 제목이다. 수치를 맞추려면 보호 구간을 건드려야 해서 멈췄다 — 스킬이 「수치를 맞추려고 문장을 넣지 마라」고 적은 자리다. (2) density.mjs 는 본문 없는 종류에 걸지 않았다. 본문 있는 개념 셋(memory-pressure·virtio-balloon·numa)이 「절당 낱말」과 「1,000낱말당 수치」에 걸리는데, 이 SSOT 에 이 Host 에서 잰 값이 하나도 없어 채우려면 없는 사실을 만들어야 한다. (3) 에이전트들이 문체 밖의 문제를 넘겼다 — 본문이 인용한 절 번호가 frontmatter 의 source 에 없는 경우 몇 건, reference-a-speedup 의 양상(SSOT 는 당위인데 기록은 서술), reference-record-the-conditions 규칙 5 가 SSOT 의 6~9 단계를 건너뛴 것. S5 범위가 아니라 고치지 않고 적어 둔다."
},
{
"id": "S6",
"name": "일한 사람의 목소리",
"skill": "writing-as-the-person-who-did-it",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "고치는 방법은 하나뿐이다. **자료에 남아 있는 사람의 흔적을 찾아서 제자리에 놓는다.**",
"inputs": [
"docs/virtualization/tech-log-studio/*/*/*.md (44건)",
"docs/virtualization/final/document.md",
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"outputs": [
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "node .agents/skills/writing-as-the-person-who-did-it/scripts/check_voice.mjs <기록.md> (57건 전수)",
"exit": 0
},
{
"cmd": "node .agents/skills/rewriting-technical-prose-naturally/scripts/check_prose.mjs --warn <기록.md> (57건 전수)",
"exit": 0
},
{
"cmd": "python3 scripts/studio-body.py <기록.md> -o /tmp/sb6-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node --experimental-transform-types .agents/skills/writing-tech-log-records/scripts/check_body.mjs /tmp/sb6-<slug>.md (44건)",
"exit": 0
},
{
"cmd": "node .agents/skills/writing-tech-log-records/scripts/check_evidence.mjs virtualization --repo",
"exit": 0
},
{
"cmd": "python3 scripts/audit-records.py virtualization",
"exit": 0
}
],
"notes": "흔적 있음. 서브에이전트 아홉(S6-A~I)이 44건을 나눠 봤고, 넣은 문장은 배치별로 5~15개다. 이 프로젝트에는 코드 저장소도 커밋도 주석도 없고 이 Host 에서 잰 값도 없어, 쓸 수 있는 흔적은 두 종류뿐이었다 — (1) SSOT 자신이 못 박아 둔 문장(「잘못된 이해」를 먼저 그린 §44, 「정확한 표현:」으로 뽑은 §156, 「단정하면 안 되는 이유」를 절 제목으로 삼은 §157, 「Host-side release 동작은 버전과 설정에 따라 달라질 수 있다」는 §67), (2) 사람이 분해 계약에 손으로 적은 처분 사유 — 왜 이것만 독립 기록이 되고 나머지는 흡수됐는지, 왜 이 물음을 다른 물음과 합치지 않았는지, 무엇을 재지 않았는지. 그 둘을 요약하지 않고 그 주장 옆으로 옮겼다. 안 넣은 것도 배치마다 적었다 — 「처음에는」·「고민 끝에」·「놀랍게도」는 한 건도 쓰지 않았고, 예상과 어긋난 자리는 이 Host 에서 잰 값이 없어 쓸 근거가 없었고, 누가 실제로 오독했다는 기록이 없어 「~로 읽기 쉽다」류를 만들지 않았다. 한 배치(S6-E)는 담당 넷 중 하나(question:network-virtualization-cpu-cost-under-load)를 한 글자도 고치지 않았다 — 상류의 판단이 이미 본문에 다 들어가 있었다. 검사 중에 새로 난 error 는 그 자리에서 고쳤다(spatial-metaphor 「그 자리에」·「같은 자리에 있다」, naming-instead-of-telling 「밝혀 둔 것이다」). 오케스트레이터가 기록 57건 전수에 check_voice 와 check_prose 를 다시 돌려 실패 0 을 확인했다. 넘어온 것 하나 — question:host-block-device-under-the-disk-image 의 본문이 §163 을 대는데 그 기록의 source 앵커에 §163 이 없다. check_evidence 는 산문의 절 번호를 대조하지 않아 통과하지만 계약과는 어긋난 자리다."
},
{
"id": "S7",
"name": "Studio 저장",
"skill": "publishing-tech-log-to-studio",
"runBy": "subagent",
"status": "DONE",
"skipReason": "",
"skillEcho": "기록 `.md` 하나를 Studio 편집 화면에 넣고 **저장**한다. 거기서 끝난다.",
"inputs": [
"docs/virtualization/tech-log-studio/*/*/*.md (44건)",
"docs/virtualization/final/assets/diagrams/*/*.svg (8장)"
],
"outputs": [
"docs/virtualization/tech-log-studio/tech-log-tree.json"
],
"gates": [
{
"cmd": "상태 레일 `저장됨` 확인 (44건)",
"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/audit-records.py virtualization",
"exit": 0
},
{
"cmd": "python3 scripts/verify-project-layout.py virtualization",
"exit": 0
}
],
"notes": "처음에 인증이 안 돼 SKIPPED 로 적었다가 사용자가 로그인한 뒤 실제로 돌렸다. Playwright 는 브라우저 하나를 공유하므로 병렬로 못 돌린다 — 서브에이전트 여덟(S7-A~I)을 순차로 돌렸다. 오케스트레이터가 먼저 /studio/taxonomy 에서 주제 셋(메모리 가상화 · 네트워크 가상화 · 스토리지 가상화)을 만들었다. 기록 44건 전부 새 작업본을 만들고 칸을 채워 저장했고, 44건 모두 상태 레일이 `저장됨` 이며 frontmatter 에 id 와 studio 를 되적었다. 게시는 한 건도 하지 않았다. 그림 Asset 여덟을 본문보다 먼저 올려 서버 키를 받고 studio-body.py --key 로 본문을 바꿔 넣었으며, 미리보기에서 여덟 장 모두 img naturalWidth 가 0 이 아닌 것을 눈으로 확인했다. 화면이 계약과 다른 자리를 배치들이 찾아 적었다 — Question 은 사실→확인한 사실 · 미지수→남은 미지수 · 선택지→검토한 선택지이고 「닫는 조건」 칸이 없어 「다음 검증」 마지막 줄로 넣었다. Reference 는 목적→이 기준을 쓰는 이유 · 규칙→판단 기준 · 적용 조건→적용할 때 · 예외→예외와 주의. Concept 라디오 이름은 「개념」 이고 본문 칸은 「본문 Markdown」 이다. 이번 런에서 새로 드러난 Studio 쪽 한계 셋. (1) 값이 조용히 잘린다 — 제목 30/31자 · 기준 버전 66/107자 · 본문 4157/4187자로 잘려 저장된 일이 있었다. 이후 모든 배치가 넣은 뒤 되읽어 글자 수까지 대조하고 어긋나면 다시 채웠다. (2) Asset 의 대체 텍스트가 300자를 넘으면 업로드가 500 으로 실패한다(319·341·348자에서 재현). 저장소 .md 의 alt 는 그대로 두고 Asset 메타데이터의 alt 만 줄였다. (3) 관계 대상 드롭다운이 100건 상한이고 서버가 limit>100 을 422 로 막는다. 이번에 문서 총수가 100 을 넘으면서 목록에서 밀려나는 대상이 생겨, 마지막 두 배치가 catalog 요청을 가로채 q= 검색 결과를 합쳐 넣고 화면의 정상 경로로 골랐다. 또 「판단 기준」 행의 제목 input 에 type=\"text\" 속성이 없어 흔한 셀렉터로 안 잡히고 다섯 칸이 조용히 빈 적이 있다 — 되읽기 대조가 잡았다. 관계는 상대가 아직 Studio 에 없으면 못 걸리므로 배치마다 비워 두었다가 뒤 배치가 되돌아가 채웠다(네트워크 12건 · 스토리지 14건 · 마지막 10건). 마지막 배치가 기존 관계가 사라지지 않은 것(lostRelations 0)과 기록 57건 전부 id·studio 를 갖고 있는 것을 대조했다."
}
]
}