From 43e1aadef077ad93c30495df428ee3a71dd73f4a Mon Sep 17 00:00:00 2001 From: DongHyeonka Date: Thu, 10 Sep 2026 08:54:05 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B0=80=EC=83=81=ED=99=94=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=93=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analyzing-codebase-for-tech-log/SKILL.md | 3 +- .../references/evidence-contract.md | 4 +- .../templates/analysis/00-project-overview.md | 2 +- .../templates/state.json | 2 +- .../deriving-tech-log-root-tree/SKILL.md | 23 +- .../publishing-tech-log-to-studio/SKILL.md | 140 + .../references/playwright-recipes.md | 230 + .../references/studio-form-map.md | 103 + .../skills/running-tech-log-pipeline/SKILL.md | 160 + .../references/stage-contracts.md | 254 + .../references/subagent-prompts.md | 275 + .../templates/run.json | 101 + .agents/skills/technical-visualizer/SKILL.md | 47 +- .../skills/writing-tech-log-records/SKILL.md | 13 +- .../references/choosing-a-diagram.md | 82 + .../references/code-tables-diagrams.md | 22 + .../references/record-kinds.md | 2 +- .../references/review-checklist.md | 4 + .../references/tech-log-tree-contract.md | 25 + .../references/writing-each-kind.md | 2 + .claude/skills/publishing-tech-log-to-studio | 1 + .claude/skills/running-tech-log-pipeline | 1 + .../console-2026-09-07T09-03-16-756Z.log | 1 + .../console-2026-09-07T09-58-49-718Z.log | 3 + .../console-2026-09-07T09-59-07-925Z.log | 1 + .../console-2026-09-07T10-04-11-221Z.log | 2 + .../console-2026-09-07T10-21-00-686Z.log | 2 + .../console-2026-09-07T13-11-51-512Z.log | 1 + .../console-2026-09-07T23-33-54-254Z.log | 1 + .../console-2026-09-07T23-36-51-851Z.log | 10 + .../console-2026-09-07T23-45-31-313Z.log | 1 + .../console-2026-09-08T12-36-44-804Z.log | 5 + .../console-2026-09-09T05-00-49-567Z.log | 1 + .../console-2026-09-09T05-06-00-291Z.log | 2 + .../console-2026-09-09T05-20-55-682Z.log | 2 + .../console-2026-09-09T06-47-12-367Z.log | 6 + .../console-2026-09-09T08-32-59-336Z.log | 3 + .../page-2026-09-07T09-03-17-352Z.yml | 13 + .../page-2026-09-07T09-03-57-093Z.yml | 176 + .../page-2026-09-07T09-04-08-549Z.yml | 0 .../page-2026-09-07T09-05-15-742Z.yml | 733 ++ .../page-2026-09-07T09-05-35-415Z.yml | 0 .../page-2026-09-07T09-05-40-606Z.yml | 733 ++ .../page-2026-09-07T09-06-07-735Z.yml | 733 ++ .../page-2026-09-07T09-06-48-703Z.yml | 720 ++ .../page-2026-09-07T09-07-03-746Z.yml | 720 ++ .../page-2026-09-07T09-08-46-466Z.yml | 738 ++ .../page-2026-09-07T09-08-50-799Z.yml | 0 .../page-2026-09-07T09-08-55-491Z.yml | 0 .../page-2026-09-07T09-09-10-948Z.yml | 738 ++ .../page-2026-09-07T09-09-21-472Z.yml | 0 .../page-2026-09-07T09-09-27-661Z.yml | 738 ++ .../page-2026-09-07T09-09-39-312Z.yml | 725 ++ .../page-2026-09-07T09-10-33-419Z.yml | 743 ++ .../page-2026-09-07T09-10-38-415Z.yml | 0 .../page-2026-09-07T09-58-49-883Z.yml | 0 .../page-2026-09-07T09-59-08-001Z.yml | 0 .../page-2026-09-07T09-59-47-573Z.yml | 176 + .../page-2026-09-07T10-00-10-180Z.yml | 0 .../page-2026-09-07T10-00-15-732Z.yml | 763 ++ .../page-2026-09-07T10-00-20-168Z.yml | 0 .../page-2026-09-07T10-00-25-607Z.yml | 763 ++ .../page-2026-09-07T10-00-36-613Z.yml | 747 ++ .../page-2026-09-07T10-00-41-582Z.yml | 765 ++ .../page-2026-09-07T10-00-46-111Z.yml | 0 .../page-2026-09-07T10-00-52-436Z.yml | 765 ++ .../page-2026-09-07T10-01-04-857Z.yml | 749 ++ .../page-2026-09-07T10-01-09-793Z.yml | 767 ++ .../page-2026-09-07T10-01-14-101Z.yml | 0 .../page-2026-09-07T10-01-19-515Z.yml | 767 ++ .../page-2026-09-07T10-01-31-091Z.yml | 751 ++ .../page-2026-09-07T10-01-36-170Z.yml | 769 ++ .../page-2026-09-07T10-01-41-508Z.yml | 0 .../page-2026-09-07T10-01-46-975Z.yml | 769 ++ .../page-2026-09-07T10-01-57-787Z.yml | 753 ++ .../page-2026-09-07T10-02-37-098Z.yml | 771 ++ .../page-2026-09-07T10-02-41-518Z.yml | 0 .../page-2026-09-07T10-02-46-840Z.yml | 771 ++ .../page-2026-09-07T10-02-58-346Z.yml | 755 ++ .../page-2026-09-07T10-04-17-832Z.yml | 0 .../page-2026-09-07T10-08-47-719Z.yml | 765 ++ .../page-2026-09-07T10-14-36-144Z.yml | 0 .../page-2026-09-07T10-14-56-301Z.yml | 886 ++ .../page-2026-09-07T10-15-01-862Z.yml | 0 .../page-2026-09-07T10-15-21-698Z.yml | 1069 +++ .../page-2026-09-07T10-15-26-475Z.yml | 0 .../page-2026-09-07T10-15-47-991Z.yml | 980 +++ .../page-2026-09-07T10-15-53-449Z.yml | 0 .../page-2026-09-07T10-16-10-853Z.yml | 616 ++ .../page-2026-09-07T10-16-15-767Z.yml | 0 .../page-2026-09-07T10-16-32-232Z.yml | 664 ++ .../page-2026-09-07T10-21-00-827Z.yml | 0 .../page-2026-09-07T10-37-05-323Z.yml | 0 .../page-2026-09-07T10-37-22-610Z.yml | 628 ++ .../page-2026-09-07T10-37-28-125Z.yml | 0 .../page-2026-09-07T10-37-44-995Z.yml | 628 ++ .../page-2026-09-07T10-37-50-270Z.yml | 0 .../page-2026-09-07T10-38-25-062Z.yml | 564 ++ .../page-2026-09-07T10-38-32-742Z.yml | 0 .../page-2026-09-07T10-38-38-543Z.yml | 617 ++ .../page-2026-09-07T10-38-43-546Z.yml | 0 .../page-2026-09-07T10-38-49-718Z.yml | 617 ++ .../page-2026-09-07T10-39-02-642Z.yml | 601 ++ .../page-2026-09-07T10-39-30-708Z.yml | 604 ++ .../page-2026-09-07T13-11-51-765Z.yml | 0 .../page-2026-09-07T13-12-11-673Z.yml | 16 + .../page-2026-09-07T13-53-43-883Z.yml | 0 .../page-2026-09-07T13-58-20-941Z.yml | 0 .../page-2026-09-07T14-09-53-527Z.yml | 0 .../page-2026-09-07T14-11-28-607Z.yml | 0 .../page-2026-09-07T14-12-07-332Z.yml | 0 .../page-2026-09-07T14-12-15-259Z.yml | 60 + .../page-2026-09-07T14-12-19-826Z.yml | 109 + .../page-2026-09-07T14-29-21-516Z.yml | 0 .../page-2026-09-07T15-47-14-245Z.yml | 0 .../page-2026-09-07T23-33-54-523Z.yml | 0 .../page-2026-09-07T23-36-51-967Z.yml | 0 .../page-2026-09-07T23-44-56-091Z.yml | 990 +++ .../page-2026-09-07T23-45-31-421Z.yml | 0 .../page-2026-09-07T23-45-47-787Z.yml | 552 ++ .../page-2026-09-08T12-36-45-070Z.yml | 0 .../page-2026-09-08T12-42-39-467Z.yml | 0 .../page-2026-09-08T12-42-58-778Z.yml | 154 + .../page-2026-09-08T12-43-30-059Z.yml | 0 .../page-2026-09-08T12-43-54-421Z.yml | 0 .../page-2026-09-08T12-44-47-520Z.yml | 225 + .../page-2026-09-08T12-53-05-955Z.yml | 0 .../page-2026-09-08T12-57-44-051Z.yml | 0 .../page-2026-09-08T12-58-20-066Z.yml | 0 .../page-2026-09-08T12-59-04-756Z.yml | 0 .../page-2026-09-08T13-00-45-998Z.yml | 0 .../page-2026-09-08T13-06-38-555Z.yml | 0 .../page-2026-09-08T13-15-31-609Z.yml | 0 .../page-2026-09-09T05-00-50-264Z.yml | 13 + .../page-2026-09-09T05-05-23-559Z.yml | 0 .../page-2026-09-09T05-06-00-383Z.yml | 1 + .../page-2026-09-09T05-06-08-579Z.yml | 13 + .../page-2026-09-09T05-06-16-557Z.yml | 0 .../page-2026-09-09T05-09-19-752Z.yml | 0 .../page-2026-09-09T05-20-55-865Z.yml | 0 .../page-2026-09-09T05-37-55-615Z.yml | 0 .../page-2026-09-09T05-39-55-540Z.yml | 0 .../page-2026-09-09T05-52-03-418Z.yml | 0 .../page-2026-09-09T05-54-00-144Z.yml | 0 .../page-2026-09-09T06-22-38-980Z.yml | 0 .../page-2026-09-09T06-23-59-119Z.yml | 0 .../page-2026-09-09T06-34-22-856Z.yml | 0 .../page-2026-09-09T06-35-06-844Z.yml | 249 + .../page-2026-09-09T06-47-12-518Z.yml | 0 .../page-2026-09-09T07-12-11-022Z.yml | 0 .../page-2026-09-09T07-12-55-147Z.yml | 0 .../page-2026-09-09T07-16-15-799Z.yml | 0 .../page-2026-09-09T07-23-59-184Z.yml | 0 .../page-2026-09-09T07-24-56-526Z.yml | 0 .../page-2026-09-09T07-29-06-380Z.yml | 0 .../page-2026-09-09T07-29-17-263Z.yml | 0 .../page-2026-09-09T07-29-54-375Z.yml | 0 CLAUDE.md | 106 +- README.md | 28 +- .../.techviz/topic-variant-model/spec.json | 4 +- .../topic-variant-model.alt.md | 2 +- .../topic-variant-model.d2 | 2 +- .../topic-variant-model.drawio | 30 +- .../topic-variant-model.excalidraw | 58 +- .../topic-variant-model.manifest.json | 5 +- .../topic-variant-model.mmd | 2 +- .../topic-variant-model.svg | 76 +- .../case-a-link-that-pointed-at-itself.md | 2 +- ...case-a-slug-rule-that-threw-korean-away.md | 12 +- .../case-an-address-frozen-at-publish-time.md | 8 +- ...the-comparison-band-changed-three-times.md | 29 +- ...oncept-topic-variant-and-record-variant.md | 3 +- ...-a-section-wide-rule-caught-the-heading.md | 4 +- ...nce-scope-a-layout-rule-to-what-uses-it.md | 2 +- ...n-operation-you-can-see-but-cannot-call.md | 8 +- .../case-five-screens-were-quietly-empty.md | 4 +- ...-the-contract-with-both-implementations.md | 2 +- ...ne-cell-failing-took-its-neighbour-down.md | 2 +- ...ase-records-disappeared-without-a-trace.md | 4 +- ...e-new-kind-fell-through-thirteen-places.md | 15 +- ...ept-exhaustive-switch-and-record-tables.md | 2 +- ...on-two-kind-tables-outside-the-compiler.md | 2 +- ...merate-kinds-where-the-compiler-sees-it.md | 4 +- ...e-a-route-the-web-server-never-heard-of.md | 8 +- ...on-do-not-translate-the-catch-all-route.md | 2 +- ...obody-signed-the-accessibility-evidence.md | 4 +- ...the-route-lists-from-the-route-contract.md | 4 +- .../case/case-nine-names-for-five-kinds.md | 4 +- ...he-refusal-does-not-name-what-blocks-it.md | 8 +- .../case/case-a-build-argument-left-out.md | 4 +- ...a-healthy-container-that-served-one-403.md | 2 +- ...-generator-dropped-four-contract-fields.md | 10 +- .../case-the-sql-had-never-been-executed.md | 8 +- ...ooped-with-no-test-starting-the-context.md | 12 +- .../tech-log-studio/tech-log-tree.json | 12 +- ...st-item-had-to-carry-the-whole-document.md | 4 +- ...e-a-public-reference-was-entirely-empty.md | 12 +- ...-a-summary-vanished-at-three-boundaries.md | 4 +- ...ncept-eleven-boundaries-a-value-crosses.md | 7 +- ...-missing-contract-field-has-a-signature.md | 2 +- ...-verify-at-the-end-of-the-value-journey.md | 2 +- ...ow-implementation-satisfied-a-wide-port.md | 4 +- ...-the-typecheck-command-checked-no-files.md | 12 +- ...concept-where-typescript-stops-checking.md | 10 +- ...what-a-person-must-run-before-deploying.md | 4 +- ...-08-28-refactoring-from-analysis-design.md | 96 - .../2026-08-28-refactoring-from-analysis.md | 68 - ...08-28-tech-log-document-pipeline-design.md | 216 - .../2026-08-28-tech-log-document-pipeline.md | 100 - docs/_templates/final/assets/README.txt | 3 +- .../final/assets/tech-log-studio/README.txt | 2 - .../commit-evidence-phase-machine.svg | 106 - ...ecision-one-root-owns-the-master-switch.md | 1 + ...sion-pool-need-is-a-capability-question.md | 1 + ...cision-cursors-are-signed-for-integrity.md | 1 + ...ecision-tenant-id-is-never-a-metric-tag.md | 1 + ...ommit-ambiguity-is-not-only-sqlstate-08.md | 3 +- .../concept-transaction-result-algebra.md | 2 +- ...pability-grade-is-declared-not-inferred.md | 1 + ...ion-retry-safety-is-decided-by-evidence.md | 2 + ...-build-only-until-the-bridge-is-decided.md | 1 + ...ision-classpath-presence-is-not-consent.md | 1 + ...-separates-installation-from-activation.md | 1 + .../decision-flyway-owns-the-schema.md | 1 + ...on-grades-derive-from-executed-evidence.md | 1 + .../tech-log-studio/tech-log-tree.json | 11 +- .../decision-in-root-write-fails-fast.md | 1 + ...ision-templates-are-built-once-per-mode.md | 1 + ...decision-candidate-evidence-stays-at-r1.md | 1 + ...tification-lane-carries-no-docker-guard.md | 1 + ...mance-measurement-is-not-a-release-gate.md | 1 + .../.techviz/a5-partition-asymmetry/spec.json | 2 +- .../b4-header-trust-boundary/spec.json | 4 +- .../.techviz/bff-store-lookup-keys/spec.json | 6 +- .../c2-backchannel-both-sides/spec.json | 4 +- .../cpu-io-passthrough-paths/context.json | 2149 +++++ .../cpu-io-passthrough-paths/prompt.md | 2403 +++++ .../cpu-io-passthrough-paths/spec.json | 341 + .../.techviz/d2-upgrade-direction/spec.json | 4 +- .../guest-as-host-process/context.json | 2833 ++++++ .../.techviz/guest-as-host-process/prompt.md | 2804 ++++++ .../.techviz/guest-as-host-process/spec.json | 306 + .../open-questions-answered/spec.json | 4 +- .../.techviz/session-sharing-path/spec.json | 11 +- .../a5-partition-asymmetry.alt.md | 2 +- .../a5-partition-asymmetry.d2 | 2 +- .../a5-partition-asymmetry.dot | 2 +- .../a5-partition-asymmetry.drawio | 2 +- .../a5-partition-asymmetry.excalidraw | 4 +- .../a5-partition-asymmetry.manifest.json | 4 +- .../a5-partition-asymmetry.mmd | 2 +- .../a5-partition-asymmetry.svg | 4 +- .../b4-header-trust-boundary.alt.md | 4 +- .../b4-header-trust-boundary.d2 | 2 +- .../b4-header-trust-boundary.dot | 2 +- .../b4-header-trust-boundary.drawio | 2 +- .../b4-header-trust-boundary.excalidraw | 4 +- .../b4-header-trust-boundary.manifest.json | 4 +- .../b4-header-trust-boundary.mmd | 2 +- .../b4-header-trust-boundary.svg | 2 +- .../bff-store-lookup-keys.alt.md | 4 +- .../bff-store-lookup-keys.d2 | 4 +- .../bff-store-lookup-keys.dot | 4 +- .../bff-store-lookup-keys.drawio | 4 +- .../bff-store-lookup-keys.excalidraw | 12 +- .../bff-store-lookup-keys.manifest.json | 4 +- .../bff-store-lookup-keys.mmd | 4 +- .../bff-store-lookup-keys.svg | 8 +- .../c2-backchannel-both-sides.alt.md | 4 +- .../c2-backchannel-both-sides.d2 | 2 +- .../c2-backchannel-both-sides.dot | 2 +- .../c2-backchannel-both-sides.drawio | 2 +- .../c2-backchannel-both-sides.excalidraw | 4 +- .../c2-backchannel-both-sides.manifest.json | 4 +- .../c2-backchannel-both-sides.mmd | 2 +- .../c2-backchannel-both-sides.svg | 2 +- .../cpu-io-passthrough-paths.alt.md | 32 + .../cpu-io-passthrough-paths.d2 | 38 + .../cpu-io-passthrough-paths.drawio | 78 + .../cpu-io-passthrough-paths.excalidraw | 1426 +++ .../cpu-io-passthrough-paths.manifest.json | 31 + .../cpu-io-passthrough-paths.mmd | 20 + .../cpu-io-passthrough-paths.svg | 139 + .../d2-upgrade-direction.alt.md | 4 +- .../d2-upgrade-direction.d2 | 2 +- .../d2-upgrade-direction.dot | 2 +- .../d2-upgrade-direction.drawio | 2 +- .../d2-upgrade-direction.excalidraw | 4 +- .../d2-upgrade-direction.manifest.json | 4 +- .../d2-upgrade-direction.mmd | 2 +- .../d2-upgrade-direction.svg | 2 +- .../guest-as-host-process.alt.md | 27 + .../guest-as-host-process.d2 | 28 + .../guest-as-host-process.drawio | 55 + .../guest-as-host-process.excalidraw | 961 ++ .../guest-as-host-process.manifest.json | 31 + .../guest-as-host-process.mmd | 18 + .../guest-as-host-process.svg | 113 + .../open-questions-answered.alt.md | 2 +- .../open-questions-answered.drawio | 2 +- .../open-questions-answered.excalidraw | 4 +- .../open-questions-answered.manifest.json | 4 +- .../open-questions-answered.svg | 2 +- .../session-sharing-path.drawio | 22 +- .../session-sharing-path.excalidraw | 96 +- .../session-sharing-path.manifest.json | 6 +- .../session-sharing-path.svg | 61 +- docs/keycloak-session-store/final/document.md | 230 + .../tech-log-studio/tech-log-tree.json | 226 +- .../ap1-direct-architecture/spec.json | 4 +- .../ap2-mediator-architecture/spec.json | 6 +- .../ap3-bff-architecture/context.json | 384 +- .../.techviz/ap3-bff-architecture/spec.json | 61 +- .../.techviz/ap3-csrf-boundary/context.json | 2934 +++---- .../.techviz/ap3-csrf-boundary/spec.json | 72 +- .../ap4-edge-trust-architecture/context.json | 3793 ++++---- .../ap4-edge-trust-architecture/spec.json | 85 +- .../context.json | 474 - .../credential-contract-migration/prompt.md | 728 -- .../credential-contract-migration/spec.json | 123 - .../credential-custody-map/context.json | 485 -- .../.techviz/credential-custody-map/prompt.md | 740 -- .../.techviz/credential-custody-map/spec.json | 146 - .../context.json | 478 - .../four-pattern-request-boundaries/prompt.md | 756 -- .../four-pattern-request-boundaries/spec.json | 136 - .../login-api-phase-split/context.json | 239 +- .../.techviz/login-api-phase-split/spec.json | 110 +- .../ap1-direct-architecture.drawio | 2 +- .../ap1-direct-architecture.manifest.json | 2 +- .../ap1-direct-architecture.svg | 2 +- .../ap2-mediator-architecture.alt.md | 2 +- .../ap2-mediator-architecture.d2 | 2 +- .../ap2-mediator-architecture.dot | 2 +- .../ap2-mediator-architecture.drawio | 4 +- .../ap2-mediator-architecture.excalidraw | 8 +- .../ap2-mediator-architecture.manifest.json | 2 +- .../ap2-mediator-architecture.mmd | 2 +- .../ap2-mediator-architecture.svg | 8 +- .../ap3-bff-architecture.alt.md | 18 +- .../ap3-bff-architecture.d2 | 6 +- .../ap3-bff-architecture.dot | 6 +- .../ap3-bff-architecture.drawio | 34 +- .../ap3-bff-architecture.excalidraw | 180 +- .../ap3-bff-architecture.manifest.json | 14 +- .../ap3-bff-architecture.mmd | 6 +- .../ap3-bff-architecture.svg | 69 +- .../ap3-csrf-boundary.alt.md | 20 +- .../ap3-csrf-boundary/ap3-csrf-boundary.d2 | 6 +- .../ap3-csrf-boundary/ap3-csrf-boundary.dot | 6 +- .../ap3-csrf-boundary.drawio | 16 +- .../ap3-csrf-boundary.excalidraw | 28 +- .../ap3-csrf-boundary.manifest.json | 10 +- .../ap3-csrf-boundary/ap3-csrf-boundary.mmd | 6 +- .../ap3-csrf-boundary/ap3-csrf-boundary.svg | 36 +- .../ap4-edge-trust-architecture.alt.md | 18 +- .../ap4-edge-trust-architecture.d2 | 6 +- .../ap4-edge-trust-architecture.dot | 6 +- .../ap4-edge-trust-architecture.drawio | 34 +- .../ap4-edge-trust-architecture.excalidraw | 310 +- .../ap4-edge-trust-architecture.manifest.json | 14 +- .../ap4-edge-trust-architecture.mmd | 6 +- .../ap4-edge-trust-architecture.svg | 81 +- .../credential-contract-migration.alt.md | 16 - .../credential-contract-migration.d2 | 15 - .../credential-contract-migration.dot | 9 - .../credential-contract-migration.drawio | 23 - .../credential-contract-migration.excalidraw | 289 - ...redential-contract-migration.manifest.json | 32 - .../credential-contract-migration.mmd | 7 - .../credential-contract-migration.svg | 93 - .../credential-custody-map.alt.md | 16 - .../credential-custody-map.d2 | 15 - .../credential-custody-map.dot | 9 - .../credential-custody-map.drawio | 23 - .../credential-custody-map.excalidraw | 289 - .../credential-custody-map.manifest.json | 32 - .../credential-custody-map.mmd | 7 - .../credential-custody-map.svg | 89 - .../four-pattern-request-boundaries.alt.md | 16 - .../four-pattern-request-boundaries.d2 | 15 - .../four-pattern-request-boundaries.dot | 9 - .../four-pattern-request-boundaries.drawio | 23 - ...four-pattern-request-boundaries.excalidraw | 289 - ...r-pattern-request-boundaries.manifest.json | 32 - .../four-pattern-request-boundaries.mmd | 7 - .../four-pattern-request-boundaries.svg | 90 - .../login-api-phase-split.alt.md | 36 +- .../login-api-phase-split.d2 | 6 +- .../login-api-phase-split.dot | 6 +- .../login-api-phase-split.drawio | 22 +- .../login-api-phase-split.excalidraw | 36 +- .../login-api-phase-split.manifest.json | 10 +- .../login-api-phase-split.mmd | 6 +- .../login-api-phase-split.svg | 51 +- .../ap1-credential-custody.svg | 58 - .../tech-log-studio/ap2-split-custody.svg | 58 - .../tech-log-studio/ap3-bff-custody.svg | 62 - .../tech-log-studio/ap3-csrf-boundary.svg | 104 - .../assets/tech-log-studio/ap3-csrf-split.svg | 48 - .../ap4-edge-forward-auth-flow.svg | 83 - .../assets/tech-log-studio/ap4-edge-trust.svg | 66 - docs/keycloak/final/document.md | 68 +- .../case/case-ap2-split-custody.md | 17 +- .../case/case-ap3-bff-session-csrf.md | 23 +- .../case/case-ap4-identity-header-trust.md | 75 +- .../case/case-browser-credential-boundary.md | 17 +- .../concept-authorization-code-and-pkce.md | 18 + .../concept/concept-cookie-auth-csrf.md | 5 +- .../concept-forward-auth-and-auth-request.md | 5 +- .../reference-runtime-verification-order.md | 40 +- .../tech-log-studio/tech-log-tree.json | 191 +- .../.techviz/baseline-schema/context.json | 879 ++ .../final/.techviz/baseline-schema/spec.json | 44 +- .../batch-fetch-in-clause/context.json | 734 ++ .../.techviz/batch-fetch-in-clause/prompt.md | 982 +++ .../.techviz/batch-fetch-in-clause/spec.json | 196 + .../cartesian-row-multiplication/context.json | 878 ++ .../cartesian-row-multiplication/prompt.md | 1126 +++ .../cartesian-row-multiplication/spec.json | 191 + .../eager-lazy-query-sequence/context.json | 1376 +++ .../eager-lazy-query-sequence/spec.json | 66 +- .../.techviz/nplus1-query-fanout/context.json | 1044 +++ .../.techviz/nplus1-query-fanout/spec.json | 52 +- .../projection-row-over-fetch/context.json | 1223 +++ .../projection-row-over-fetch/prompt.md | 1480 ++++ .../projection-row-over-fetch/spec.json | 156 + .../.techviz/query-port-boundary/context.json | 797 ++ .../.techviz/query-port-boundary/spec.json | 46 +- .../final/.techviz/skew-profile/spec.json | 132 - .../.techviz/strategy-journey/context.json | 1097 +++ .../final/.techviz/strategy-journey/spec.json | 70 +- .../final/.techviz/target-schema/context.json | 879 ++ .../final/.techviz/target-schema/spec.json | 60 +- .../baseline-schema/baseline-schema.alt.md | 22 + .../baseline-schema/baseline-schema.d2 | 18 + .../baseline-schema/baseline-schema.dot | 12 + .../baseline-schema/baseline-schema.drawio | 14 +- .../baseline-schema.excalidraw | 586 ++ .../baseline-schema.manifest.json | 32 + .../baseline-schema/baseline-schema.mmd | 10 + .../baseline-schema/baseline-schema.svg | 28 +- .../batch-fetch-in-clause.alt.md | 25 + .../batch-fetch-in-clause.d2 | 21 + .../batch-fetch-in-clause.dot | 15 + .../batch-fetch-in-clause.drawio | 53 + .../batch-fetch-in-clause.excalidraw | 835 ++ .../batch-fetch-in-clause.manifest.json | 32 + .../batch-fetch-in-clause.mmd | 13 + .../batch-fetch-in-clause.svg} | 65 +- .../cartesian-row-multiplication.alt.md | 24 + .../cartesian-row-multiplication.d2 | 22 + .../cartesian-row-multiplication.dot | 14 + .../cartesian-row-multiplication.drawio | 46 + .../cartesian-row-multiplication.excalidraw | 754 ++ ...cartesian-row-multiplication.manifest.json | 32 + .../cartesian-row-multiplication.mmd | 12 + .../cartesian-row-multiplication.svg | 89 + .../eager-lazy-query-sequence.alt.md | 24 + .../eager-lazy-query-sequence.d2 | 18 + .../eager-lazy-query-sequence.dot | 14 + .../eager-lazy-query-sequence.drawio | 10 +- .../eager-lazy-query-sequence.excalidraw | 766 ++ .../eager-lazy-query-sequence.manifest.json | 32 + .../eager-lazy-query-sequence.mmd | 12 + .../eager-lazy-query-sequence.svg | 30 +- .../nplus1-query-fanout.alt.md | 20 + .../nplus1-query-fanout.d2 | 14 + .../nplus1-query-fanout.dot | 10 + .../nplus1-query-fanout.drawio | 10 +- .../nplus1-query-fanout.excalidraw | 418 + .../nplus1-query-fanout.manifest.json | 32 + .../nplus1-query-fanout.mmd | 8 + .../nplus1-query-fanout.svg | 20 +- .../projection-row-over-fetch.alt.md | 22 + .../projection-row-over-fetch.d2 | 18 + .../projection-row-over-fetch.dot | 12 + .../projection-row-over-fetch.drawio | 38 + .../projection-row-over-fetch.excalidraw | 586 ++ .../projection-row-over-fetch.manifest.json | 32 + .../projection-row-over-fetch.mmd | 10 + .../projection-row-over-fetch.svg | 84 + .../query-port-boundary.alt.md | 22 + .../query-port-boundary.d2 | 18 + .../query-port-boundary.dot | 12 + .../query-port-boundary.drawio | 8 +- .../query-port-boundary.excalidraw | 594 ++ .../query-port-boundary.manifest.json | 32 + .../query-port-boundary.mmd | 10 + .../query-port-boundary.svg | 16 +- .../diagrams/skew-profile/skew-profile.drawio | 20 - .../diagrams/skew-profile/skew-profile.svg | 80 - .../strategy-journey/strategy-journey.alt.md | 25 + .../strategy-journey/strategy-journey.d2 | 23 + .../strategy-journey/strategy-journey.dot | 15 + .../strategy-journey/strategy-journey.drawio | 24 +- .../strategy-journey.excalidraw | 853 ++ .../strategy-journey.manifest.json | 32 + .../strategy-journey/strategy-journey.mmd | 13 + .../strategy-journey/strategy-journey.svg | 50 +- .../target-schema/target-schema.alt.md | 25 + .../diagrams/target-schema/target-schema.d2 | 23 + .../diagrams/target-schema/target-schema.dot | 15 + .../target-schema/target-schema.drawio | 20 +- .../target-schema/target-schema.excalidraw | 853 ++ .../target-schema/target-schema.manifest.json | 32 + .../diagrams/target-schema/target-schema.mmd | 13 + .../diagrams/target-schema/target-schema.svg | 42 +- .../tech-log-studio/batch-fetch-in-clause.svg | 45 - .../cartesian-row-multiplication.svg | 45 - .../eager-lazy-query-sequence.svg | 80 - .../tech-log-studio/in-memory-paging.svg | 56 - .../tech-log-studio/keyset-vs-offset.svg | 48 - .../projection-row-over-fetch.svg | 45 - .../tech-log-studio/top-n-per-group.svg | 49 - docs/n+1liner/final/document.md | 18 +- ...-collection-fetch-join-in-memory-paging.md | 67 +- .../case-eager-toone-nplus1-without-access.md | 15 +- ...e-fetch-join-multibag-and-row-explosion.md | 16 +- .../case/case-projection-row-over-fetch.md | 49 +- .../case-visibility-or-breaks-keyset-index.md | 16 - .../tech-log-studio/tech-log-tree.json | 94 +- docs/virtualization/README.md | 30 + docs/virtualization/final/.techviz/README.txt | 2 + .../guest-block-io-to-virtqueue/context.json | 2474 ++++++ .../guest-block-io-to-virtqueue/prompt.md | 2722 ++++++ .../guest-block-io-to-virtqueue/spec.json | 338 + .../context.json | 2606 ++++++ .../prompt.md | 2855 ++++++ .../spec.json | 285 + .../context.json | 2280 +++++ .../numa-vcpu-and-memory-placement/prompt.md | 2525 ++++++ .../numa-vcpu-and-memory-placement/spec.json | 250 + .../context.json | 2369 +++++ .../packet-control-and-data-paths/prompt.md | 2620 ++++++ .../packet-control-and-data-paths/spec.json | 544 ++ .../page-fault-layers-in-a-vm/context.json | 2290 +++++ .../page-fault-layers-in-a-vm/prompt.md | 2539 ++++++ .../page-fault-layers-in-a-vm/spec.json | 230 + .../context.json | 2274 +++++ .../virtio-balloon-inflate-deflate/prompt.md | 2523 ++++++ .../virtio-balloon-inflate-deflate/spec.json | 226 + .../vm-exit-handling-cycle/context.json | 2766 ++++++ .../.techviz/vm-exit-handling-cycle/prompt.md | 1730 ++++ .../.techviz/vm-exit-handling-cycle/spec.json | 240 + .../vms-sharing-one-nvme/context.json | 2167 +++++ .../.techviz/vms-sharing-one-nvme/prompt.md | 2417 ++++++ .../.techviz/vms-sharing-one-nvme/spec.json | 258 + .../write-completion-boundaries/context.json | 2305 +++++ .../write-completion-boundaries/prompt.md | 2553 ++++++ .../write-completion-boundaries/spec.json | 264 + docs/virtualization/final/assets/README.txt | 3 + .../guest-block-io-to-virtqueue.alt.md | 32 + .../guest-block-io-to-virtqueue.d2 | 38 + .../guest-block-io-to-virtqueue.drawio | 76 + .../guest-block-io-to-virtqueue.excalidraw | 1240 +++ .../guest-block-io-to-virtqueue.manifest.json | 31 + .../guest-block-io-to-virtqueue.mmd | 22 + .../guest-block-io-to-virtqueue.svg | 107 + ...est-memory-address-translation-path.alt.md | 30 + .../guest-memory-address-translation-path.d2 | 34 + ...est-memory-address-translation-path.drawio | 68 + ...memory-address-translation-path.excalidraw | 1228 +++ ...ory-address-translation-path.manifest.json | 31 + .../guest-memory-address-translation-path.mmd | 22 + .../guest-memory-address-translation-path.svg | 115 + .../numa-vcpu-and-memory-placement.alt.md | 25 + .../numa-vcpu-and-memory-placement.d2 | 23 + .../numa-vcpu-and-memory-placement.drawio | 51 + .../numa-vcpu-and-memory-placement.excalidraw | 813 ++ ...ma-vcpu-and-memory-placement.manifest.json | 31 + .../numa-vcpu-and-memory-placement.mmd | 13 + .../numa-vcpu-and-memory-placement.svg | 93 + .../packet-control-and-data-paths.alt.md | 43 + .../packet-control-and-data-paths.d2 | 52 + .../packet-control-and-data-paths.drawio | 113 + .../packet-control-and-data-paths.excalidraw | 2050 +++++ ...acket-control-and-data-paths.manifest.json | 31 + .../packet-control-and-data-paths.mmd | 28 + .../packet-control-and-data-paths.svg | 160 + .../page-fault-layers-in-a-vm.alt.md | 25 + .../page-fault-layers-in-a-vm.d2 | 25 + .../page-fault-layers-in-a-vm.drawio | 49 + .../page-fault-layers-in-a-vm.excalidraw | 823 ++ .../page-fault-layers-in-a-vm.manifest.json | 31 + .../page-fault-layers-in-a-vm.mmd | 13 + .../page-fault-layers-in-a-vm.svg | 96 + .../virtio-balloon-inflate-deflate.alt.md | 33 + .../virtio-balloon-inflate-deflate.d2 | 21 + .../virtio-balloon-inflate-deflate.drawio | 55 + .../virtio-balloon-inflate-deflate.excalidraw | 835 ++ ...rtio-balloon-inflate-deflate.manifest.json | 31 + .../virtio-balloon-inflate-deflate.mmd | 13 + .../virtio-balloon-inflate-deflate.svg | 87 + .../vm-exit-handling-cycle.alt.md | 25 + .../vm-exit-handling-cycle.d2 | 23 + .../vm-exit-handling-cycle.drawio | 51 + .../vm-exit-handling-cycle.excalidraw | 853 ++ .../vm-exit-handling-cycle.manifest.json | 31 + .../vm-exit-handling-cycle.mmd | 13 + .../vm-exit-handling-cycle.svg | 96 + .../vms-sharing-one-nvme.alt.md | 26 + .../vms-sharing-one-nvme.d2 | 26 + .../vms-sharing-one-nvme.drawio | 54 + .../vms-sharing-one-nvme.excalidraw | 766 ++ .../vms-sharing-one-nvme.manifest.json | 31 + .../vms-sharing-one-nvme.mmd | 14 + .../vms-sharing-one-nvme.svg | 94 + .../write-completion-boundaries.alt.md | 28 + .../write-completion-boundaries.d2 | 30 + .../write-completion-boundaries.drawio | 62 + .../write-completion-boundaries.excalidraw | 934 ++ .../write-completion-boundaries.manifest.json | 31 + .../write-completion-boundaries.mmd | 16 + .../write-completion-boundaries.svg | 94 + docs/virtualization/final/document.md | 7719 +++++++++++++++++ .../final/evidence/browser/README.txt | 1 + .../final/evidence/meta/README.txt | 1 + .../final/evidence/raw/README.txt | 2 + .../final/evidence/rendered/README.txt | 2 + .../concept-kvm-vcpu-to-physical-cpu.md | 197 + ...exit-distribution-for-keycloak-workload.md | 98 + .../question/question-host-numa-topology.md | 85 + .../question-idle-vcpu-thread-appearance.md | 119 + .../question-is-production-on-a-hypervisor.md | 112 + .../question-pinning-before-and-after.md | 93 + ...l-time-increase-under-two-cpu-bound-vms.md | 118 + .../question-throttling-vs-contention.md | 101 + .../question-throughput-vs-vcpu-count.md | 101 + ...stion-vcpu-contention-under-two-vm-load.md | 119 + ...n-vcpu-thread-migration-without-pinning.md | 107 + ...ization-layer-saturation-during-refresh.md | 139 + ...estion-vm-exit-distribution-by-workload.md | 119 + ...oncept-guest-memory-address-translation.md | 336 + .../concept/concept-huge-pages-in-a-vm.md | 179 + ...oncept-memory-pressure-reclaim-swap-oom.md | 118 + ...ncept-numa-locality-for-vcpu-and-memory.md | 123 + .../concept-page-fault-layers-in-a-vm.md | 237 + .../concept-virtio-balloon-memory-reclaim.md | 106 + ...alloon-target-vs-guest-available-memory.md | 102 + .../question-guest-page-fault-vs-workload.md | 98 + ...ion-host-major-fault-vs-storage-latency.md | 101 + ...n-host-memory-pressure-vs-guest-latency.md | 112 + .../question/question-host-thp-policy.md | 102 + ...-numa-remote-access-vs-workload-latency.md | 91 + .../question-qemu-memory-numa-placement.md | 100 + ...stion-qemu-resident-memory-distribution.md | 111 + ...uestion-swap-activity-in-guest-and-host.md | 99 + .../question-virtio-balloon-configured.md | 87 + ...uestion-vm-configured-vs-current-memory.md | 116 + .../question-vm-ram-backed-by-hugetlb.md | 98 + ...e-memory-symptom-needs-layer-separation.md | 120 + ...conditions-with-every-memory-experiment.md | 106 + ...ncept-guest-packet-path-to-physical-nic.md | 341 + ...on-actual-packet-path-nginx-to-keycloak.md | 110 + .../question-is-vhost-net-actually-in-use.md | 101 + ...work-virtualization-cpu-cost-under-load.md | 115 + ...-qemu-backend-vs-vhost-net-on-this-host.md | 106 + .../question-tap-interface-to-vm-mapping.md | 104 + ...question-virtio-net-multi-queue-enabled.md | 106 + ...on-vm-network-mode-bridge-nat-or-routed.md | 104 + ...ect-the-packet-path-with-capture-points.md | 137 + ...ork-path-before-blaming-the-application.md | 108 + ...oncept-guest-block-io-path-to-virtqueue.md | 161 + .../concept-host-block-stack-under-the-vm.md | 119 + .../concept-qemu-block-backend-forms.md | 123 + ...cept-write-completion-is-not-durability.md | 167 + ...disk-image-format-and-actual-host-usage.md | 95 + ...t-fsync-latency-vs-host-storage-latency.md | 106 + ...-host-block-device-under-the-disk-image.md | 101 + .../question/question-host-io-scheduler.md | 107 + .../question/question-qemu-disk-cache-mode.md | 111 + .../question-vm-disk-backend-mapping.md | 102 + ...uestion-vm1-storage-load-vs-vm2-latency.md | 120 + ...moved-durability-is-not-an-optimization.md | 95 + ...ce-confirm-the-disk-backend-on-the-host.md | 91 + ...-storage-before-blaming-cpu-for-latency.md | 104 + .../tech-log-studio/tech-log-tree.json | 4779 ++++++++++ runs/virtualization/2026-09-08-1426/run.json | 269 + runs/virtualization/2026-09-08-1958/run.json | 326 + runs/virtualization/2026-09-09-1052/run.json | 290 + scripts/check-figure-overlap.py | 176 + scripts/check-figure-text.py | 105 + scripts/preview-figure.py | 82 + scripts/studio-body.py | 104 + scripts/tests/test_figure_overlap.py | 91 + scripts/tests/test_pipeline_run.py | 148 + scripts/tests/test_tech_log_tree.py | 38 +- scripts/tests/test_tree_anchors.py | 133 + scripts/tests/test_tree_rules.py | 141 + scripts/verify-pipeline-run.py | 281 + scripts/verify-pipeline.py | 37 +- scripts/verify-project-layout.py | 122 +- scripts/verify-tech-log-tree.py | 186 + studio-dump.json | 1 + 695 files changed, 153404 insertions(+), 12754 deletions(-) create mode 100644 .agents/skills/publishing-tech-log-to-studio/SKILL.md create mode 100644 .agents/skills/publishing-tech-log-to-studio/references/playwright-recipes.md create mode 100644 .agents/skills/publishing-tech-log-to-studio/references/studio-form-map.md create mode 100644 .agents/skills/running-tech-log-pipeline/SKILL.md create mode 100644 .agents/skills/running-tech-log-pipeline/references/stage-contracts.md create mode 100644 .agents/skills/running-tech-log-pipeline/references/subagent-prompts.md create mode 100644 .agents/skills/running-tech-log-pipeline/templates/run.json create mode 100644 .agents/skills/writing-tech-log-records/references/choosing-a-diagram.md create mode 120000 .claude/skills/publishing-tech-log-to-studio create mode 120000 .claude/skills/running-tech-log-pipeline create mode 100644 .playwright-mcp/console-2026-09-07T09-03-16-756Z.log create mode 100644 .playwright-mcp/console-2026-09-07T09-58-49-718Z.log create mode 100644 .playwright-mcp/console-2026-09-07T09-59-07-925Z.log create mode 100644 .playwright-mcp/console-2026-09-07T10-04-11-221Z.log create mode 100644 .playwright-mcp/console-2026-09-07T10-21-00-686Z.log create mode 100644 .playwright-mcp/console-2026-09-07T13-11-51-512Z.log create mode 100644 .playwright-mcp/console-2026-09-07T23-33-54-254Z.log create mode 100644 .playwright-mcp/console-2026-09-07T23-36-51-851Z.log create mode 100644 .playwright-mcp/console-2026-09-07T23-45-31-313Z.log create mode 100644 .playwright-mcp/console-2026-09-08T12-36-44-804Z.log create mode 100644 .playwright-mcp/console-2026-09-09T05-00-49-567Z.log create mode 100644 .playwright-mcp/console-2026-09-09T05-06-00-291Z.log create mode 100644 .playwright-mcp/console-2026-09-09T05-20-55-682Z.log create mode 100644 .playwright-mcp/console-2026-09-09T06-47-12-367Z.log create mode 100644 .playwright-mcp/console-2026-09-09T08-32-59-336Z.log create mode 100644 .playwright-mcp/page-2026-09-07T09-03-17-352Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-03-57-093Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-04-08-549Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-05-15-742Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-05-35-415Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-05-40-606Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-06-07-735Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-06-48-703Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-07-03-746Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-08-46-466Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-08-50-799Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-08-55-491Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-09-10-948Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-09-21-472Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-09-27-661Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-09-39-312Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-10-33-419Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-10-38-415Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-58-49-883Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-59-08-001Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T09-59-47-573Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-10-180Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-15-732Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-20-168Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-25-607Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-36-613Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-41-582Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-46-111Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-00-52-436Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-04-857Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-09-793Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-14-101Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-19-515Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-31-091Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-36-170Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-41-508Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-46-975Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-01-57-787Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-02-37-098Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-02-41-518Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-02-46-840Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-02-58-346Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-04-17-832Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-08-47-719Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-14-36-144Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-14-56-301Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-15-01-862Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-15-21-698Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-15-26-475Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-15-47-991Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-15-53-449Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-16-10-853Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-16-15-767Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-16-32-232Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-21-00-827Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-37-05-323Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-37-22-610Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-37-28-125Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-37-44-995Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-37-50-270Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-38-25-062Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-38-32-742Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-38-38-543Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-38-43-546Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-38-49-718Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-39-02-642Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T10-39-30-708Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T13-11-51-765Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T13-12-11-673Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T13-53-43-883Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T13-58-20-941Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-09-53-527Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-11-28-607Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-12-07-332Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-12-15-259Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-12-19-826Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T14-29-21-516Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T15-47-14-245Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T23-33-54-523Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T23-36-51-967Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T23-44-56-091Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T23-45-31-421Z.yml create mode 100644 .playwright-mcp/page-2026-09-07T23-45-47-787Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-36-45-070Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-42-39-467Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-42-58-778Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-43-30-059Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-43-54-421Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-44-47-520Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-53-05-955Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-57-44-051Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-58-20-066Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T12-59-04-756Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T13-00-45-998Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T13-06-38-555Z.yml create mode 100644 .playwright-mcp/page-2026-09-08T13-15-31-609Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-00-50-264Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-05-23-559Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-06-00-383Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-06-08-579Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-06-16-557Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-09-19-752Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-20-55-865Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-37-55-615Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-39-55-540Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-52-03-418Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T05-54-00-144Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T06-22-38-980Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T06-23-59-119Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T06-34-22-856Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T06-35-06-844Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T06-47-12-518Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-12-11-022Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-12-55-147Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-16-15-799Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-23-59-184Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-24-56-526Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-29-06-380Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-29-17-263Z.yml create mode 100644 .playwright-mcp/page-2026-09-09T07-29-54-375Z.yml delete mode 100644 docs/_design/2026-08-28-refactoring-from-analysis-design.md delete mode 100644 docs/_design/2026-08-28-refactoring-from-analysis.md delete mode 100644 docs/_design/2026-08-28-tech-log-document-pipeline-design.md delete mode 100644 docs/_design/2026-08-28-tech-log-document-pipeline.md delete mode 100644 docs/_templates/final/assets/tech-log-studio/README.txt delete mode 100644 docs/clean-architecture-backend-template/final/assets/tech-log-studio/commit-evidence-phase-machine.svg create mode 100644 docs/keycloak-session-store/final/.techviz/cpu-io-passthrough-paths/context.json create mode 100644 docs/keycloak-session-store/final/.techviz/cpu-io-passthrough-paths/prompt.md create mode 100644 docs/keycloak-session-store/final/.techviz/cpu-io-passthrough-paths/spec.json create mode 100644 docs/keycloak-session-store/final/.techviz/guest-as-host-process/context.json create mode 100644 docs/keycloak-session-store/final/.techviz/guest-as-host-process/prompt.md create mode 100644 docs/keycloak-session-store/final/.techviz/guest-as-host-process/spec.json create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.alt.md create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.d2 create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.drawio create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.excalidraw create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.manifest.json create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.mmd create mode 100644 docs/keycloak-session-store/final/assets/cpu-io-passthrough-paths/cpu-io-passthrough-paths.svg create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.alt.md create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.d2 create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.drawio create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.excalidraw create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.manifest.json create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.mmd create mode 100644 docs/keycloak-session-store/final/assets/guest-as-host-process/guest-as-host-process.svg delete mode 100644 docs/keycloak/final/.techviz/credential-contract-migration/context.json delete mode 100644 docs/keycloak/final/.techviz/credential-contract-migration/prompt.md delete mode 100644 docs/keycloak/final/.techviz/credential-contract-migration/spec.json delete mode 100644 docs/keycloak/final/.techviz/credential-custody-map/context.json delete mode 100644 docs/keycloak/final/.techviz/credential-custody-map/prompt.md delete mode 100644 docs/keycloak/final/.techviz/credential-custody-map/spec.json delete mode 100644 docs/keycloak/final/.techviz/four-pattern-request-boundaries/context.json delete mode 100644 docs/keycloak/final/.techviz/four-pattern-request-boundaries/prompt.md delete mode 100644 docs/keycloak/final/.techviz/four-pattern-request-boundaries/spec.json delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.alt.md delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.d2 delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.dot delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.drawio delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.excalidraw delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.manifest.json delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.mmd delete mode 100644 docs/keycloak/final/assets/credential-contract-migration/credential-contract-migration.svg delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.alt.md delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.d2 delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.dot delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.drawio delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.excalidraw delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.manifest.json delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.mmd delete mode 100644 docs/keycloak/final/assets/credential-custody-map/credential-custody-map.svg delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.alt.md delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.d2 delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.dot delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.drawio delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.excalidraw delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.manifest.json delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.mmd delete mode 100644 docs/keycloak/final/assets/four-pattern-request-boundaries/four-pattern-request-boundaries.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap1-credential-custody.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap2-split-custody.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap3-bff-custody.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap3-csrf-boundary.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap3-csrf-split.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap4-edge-forward-auth-flow.svg delete mode 100644 docs/keycloak/final/assets/tech-log-studio/ap4-edge-trust.svg create mode 100644 docs/n+1liner/final/.techviz/baseline-schema/context.json create mode 100644 docs/n+1liner/final/.techviz/batch-fetch-in-clause/context.json create mode 100644 docs/n+1liner/final/.techviz/batch-fetch-in-clause/prompt.md create mode 100644 docs/n+1liner/final/.techviz/batch-fetch-in-clause/spec.json create mode 100644 docs/n+1liner/final/.techviz/cartesian-row-multiplication/context.json create mode 100644 docs/n+1liner/final/.techviz/cartesian-row-multiplication/prompt.md create mode 100644 docs/n+1liner/final/.techviz/cartesian-row-multiplication/spec.json create mode 100644 docs/n+1liner/final/.techviz/eager-lazy-query-sequence/context.json create mode 100644 docs/n+1liner/final/.techviz/nplus1-query-fanout/context.json create mode 100644 docs/n+1liner/final/.techviz/projection-row-over-fetch/context.json create mode 100644 docs/n+1liner/final/.techviz/projection-row-over-fetch/prompt.md create mode 100644 docs/n+1liner/final/.techviz/projection-row-over-fetch/spec.json create mode 100644 docs/n+1liner/final/.techviz/query-port-boundary/context.json delete mode 100755 docs/n+1liner/final/.techviz/skew-profile/spec.json create mode 100644 docs/n+1liner/final/.techviz/strategy-journey/context.json create mode 100644 docs/n+1liner/final/.techviz/target-schema/context.json create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.dot create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/baseline-schema/baseline-schema.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.dot create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.drawio create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.mmd rename docs/{keycloak/final/assets/tech-log-studio/ap3-bff-session-flow.svg => n+1liner/final/assets/diagrams/batch-fetch-in-clause/batch-fetch-in-clause.svg} (50%) create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.dot create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.drawio create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/cartesian-row-multiplication/cartesian-row-multiplication.svg create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.dot create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/eager-lazy-query-sequence/eager-lazy-query-sequence.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.dot create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/nplus1-query-fanout/nplus1-query-fanout.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.dot create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.drawio create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/projection-row-over-fetch/projection-row-over-fetch.svg create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.dot create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/query-port-boundary/query-port-boundary.mmd delete mode 100755 docs/n+1liner/final/assets/diagrams/skew-profile/skew-profile.drawio delete mode 100755 docs/n+1liner/final/assets/diagrams/skew-profile/skew-profile.svg create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.dot create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/strategy-journey/strategy-journey.mmd create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.alt.md create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.d2 create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.dot create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.excalidraw create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.manifest.json create mode 100644 docs/n+1liner/final/assets/diagrams/target-schema/target-schema.mmd delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/batch-fetch-in-clause.svg delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/cartesian-row-multiplication.svg delete mode 100755 docs/n+1liner/final/assets/tech-log-studio/eager-lazy-query-sequence.svg delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/in-memory-paging.svg delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/keyset-vs-offset.svg delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/projection-row-over-fetch.svg delete mode 100644 docs/n+1liner/final/assets/tech-log-studio/top-n-per-group.svg create mode 100644 docs/virtualization/README.md create mode 100644 docs/virtualization/final/.techviz/README.txt create mode 100644 docs/virtualization/final/.techviz/guest-block-io-to-virtqueue/context.json create mode 100644 docs/virtualization/final/.techviz/guest-block-io-to-virtqueue/prompt.md create mode 100644 docs/virtualization/final/.techviz/guest-block-io-to-virtqueue/spec.json create mode 100644 docs/virtualization/final/.techviz/guest-memory-address-translation-path/context.json create mode 100644 docs/virtualization/final/.techviz/guest-memory-address-translation-path/prompt.md create mode 100644 docs/virtualization/final/.techviz/guest-memory-address-translation-path/spec.json create mode 100644 docs/virtualization/final/.techviz/numa-vcpu-and-memory-placement/context.json create mode 100644 docs/virtualization/final/.techviz/numa-vcpu-and-memory-placement/prompt.md create mode 100644 docs/virtualization/final/.techviz/numa-vcpu-and-memory-placement/spec.json create mode 100644 docs/virtualization/final/.techviz/packet-control-and-data-paths/context.json create mode 100644 docs/virtualization/final/.techviz/packet-control-and-data-paths/prompt.md create mode 100644 docs/virtualization/final/.techviz/packet-control-and-data-paths/spec.json create mode 100644 docs/virtualization/final/.techviz/page-fault-layers-in-a-vm/context.json create mode 100644 docs/virtualization/final/.techviz/page-fault-layers-in-a-vm/prompt.md create mode 100644 docs/virtualization/final/.techviz/page-fault-layers-in-a-vm/spec.json create mode 100644 docs/virtualization/final/.techviz/virtio-balloon-inflate-deflate/context.json create mode 100644 docs/virtualization/final/.techviz/virtio-balloon-inflate-deflate/prompt.md create mode 100644 docs/virtualization/final/.techviz/virtio-balloon-inflate-deflate/spec.json create mode 100644 docs/virtualization/final/.techviz/vm-exit-handling-cycle/context.json create mode 100644 docs/virtualization/final/.techviz/vm-exit-handling-cycle/prompt.md create mode 100644 docs/virtualization/final/.techviz/vm-exit-handling-cycle/spec.json create mode 100644 docs/virtualization/final/.techviz/vms-sharing-one-nvme/context.json create mode 100644 docs/virtualization/final/.techviz/vms-sharing-one-nvme/prompt.md create mode 100644 docs/virtualization/final/.techviz/vms-sharing-one-nvme/spec.json create mode 100644 docs/virtualization/final/.techviz/write-completion-boundaries/context.json create mode 100644 docs/virtualization/final/.techviz/write-completion-boundaries/prompt.md create mode 100644 docs/virtualization/final/.techviz/write-completion-boundaries/spec.json create mode 100644 docs/virtualization/final/assets/README.txt create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.d2 create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.drawio create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.mmd create mode 100644 docs/virtualization/final/assets/diagrams/guest-block-io-to-virtqueue/guest-block-io-to-virtqueue.svg create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.d2 create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.drawio create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.mmd create mode 100644 docs/virtualization/final/assets/diagrams/guest-memory-address-translation-path/guest-memory-address-translation-path.svg create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.d2 create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.drawio create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.mmd create mode 100644 docs/virtualization/final/assets/diagrams/numa-vcpu-and-memory-placement/numa-vcpu-and-memory-placement.svg create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.d2 create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.drawio create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.mmd create mode 100644 docs/virtualization/final/assets/diagrams/packet-control-and-data-paths/packet-control-and-data-paths.svg create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.d2 create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.drawio create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.mmd create mode 100644 docs/virtualization/final/assets/diagrams/page-fault-layers-in-a-vm/page-fault-layers-in-a-vm.svg create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.d2 create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.drawio create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.mmd create mode 100644 docs/virtualization/final/assets/diagrams/virtio-balloon-inflate-deflate/virtio-balloon-inflate-deflate.svg create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.d2 create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.drawio create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.mmd create mode 100644 docs/virtualization/final/assets/diagrams/vm-exit-handling-cycle/vm-exit-handling-cycle.svg create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.d2 create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.drawio create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.mmd create mode 100644 docs/virtualization/final/assets/diagrams/vms-sharing-one-nvme/vms-sharing-one-nvme.svg create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.alt.md create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.d2 create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.drawio create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.excalidraw create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.manifest.json create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.mmd create mode 100644 docs/virtualization/final/assets/diagrams/write-completion-boundaries/write-completion-boundaries.svg create mode 100644 docs/virtualization/final/document.md create mode 100644 docs/virtualization/final/evidence/browser/README.txt create mode 100644 docs/virtualization/final/evidence/meta/README.txt create mode 100644 docs/virtualization/final/evidence/raw/README.txt create mode 100644 docs/virtualization/final/evidence/rendered/README.txt create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/concept/concept-kvm-vcpu-to-physical-cpu.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-exit-distribution-for-keycloak-workload.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-host-numa-topology.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-idle-vcpu-thread-appearance.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-is-production-on-a-hypervisor.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-pinning-before-and-after.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-steal-time-increase-under-two-cpu-bound-vms.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-throttling-vs-contention.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-throughput-vs-vcpu-count.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-vcpu-contention-under-two-vm-load.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-vcpu-thread-migration-without-pinning.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-virtualization-layer-saturation-during-refresh.md create mode 100644 docs/virtualization/tech-log-studio/cpu-virtualization/question/question-vm-exit-distribution-by-workload.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-guest-memory-address-translation.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-huge-pages-in-a-vm.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-memory-pressure-reclaim-swap-oom.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-numa-locality-for-vcpu-and-memory.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-page-fault-layers-in-a-vm.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/concept/concept-virtio-balloon-memory-reclaim.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-balloon-target-vs-guest-available-memory.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-guest-page-fault-vs-workload.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-host-major-fault-vs-storage-latency.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-host-memory-pressure-vs-guest-latency.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-host-thp-policy.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-numa-remote-access-vs-workload-latency.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-qemu-memory-numa-placement.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-qemu-resident-memory-distribution.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-swap-activity-in-guest-and-host.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-virtio-balloon-configured.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-vm-configured-vs-current-memory.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/question/question-vm-ram-backed-by-hugetlb.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/reference/reference-memory-symptom-needs-layer-separation.md create mode 100644 docs/virtualization/tech-log-studio/memory-virtualization/reference/reference-record-the-conditions-with-every-memory-experiment.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/concept/concept-guest-packet-path-to-physical-nic.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-actual-packet-path-nginx-to-keycloak.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-is-vhost-net-actually-in-use.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-network-virtualization-cpu-cost-under-load.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-qemu-backend-vs-vhost-net-on-this-host.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-tap-interface-to-vm-mapping.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-virtio-net-multi-queue-enabled.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/question/question-vm-network-mode-bridge-nat-or-routed.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/reference/reference-bisect-the-packet-path-with-capture-points.md create mode 100644 docs/virtualization/tech-log-studio/network-virtualization/reference/reference-verify-the-network-path-before-blaming-the-application.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/concept/concept-guest-block-io-path-to-virtqueue.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/concept/concept-host-block-stack-under-the-vm.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/concept/concept-qemu-block-backend-forms.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/concept/concept-write-completion-is-not-durability.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-disk-image-format-and-actual-host-usage.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-guest-fsync-latency-vs-host-storage-latency.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-host-block-device-under-the-disk-image.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-host-io-scheduler.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-qemu-disk-cache-mode.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-vm-disk-backend-mapping.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/question/question-vm1-storage-load-vs-vm2-latency.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/reference/reference-a-speedup-that-removed-durability-is-not-an-optimization.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/reference/reference-confirm-the-disk-backend-on-the-host.md create mode 100644 docs/virtualization/tech-log-studio/storage-virtualization/reference/reference-read-storage-before-blaming-cpu-for-latency.md create mode 100644 docs/virtualization/tech-log-studio/tech-log-tree.json create mode 100644 runs/virtualization/2026-09-08-1426/run.json create mode 100644 runs/virtualization/2026-09-08-1958/run.json create mode 100644 runs/virtualization/2026-09-09-1052/run.json create mode 100644 scripts/check-figure-overlap.py create mode 100755 scripts/check-figure-text.py create mode 100755 scripts/preview-figure.py create mode 100755 scripts/studio-body.py create mode 100644 scripts/tests/test_figure_overlap.py create mode 100644 scripts/tests/test_pipeline_run.py create mode 100644 scripts/tests/test_tree_anchors.py create mode 100644 scripts/tests/test_tree_rules.py create mode 100644 scripts/verify-pipeline-run.py create mode 100644 studio-dump.json diff --git a/.agents/skills/analyzing-codebase-for-tech-log/SKILL.md b/.agents/skills/analyzing-codebase-for-tech-log/SKILL.md index 822616d..8acd15e 100644 --- a/.agents/skills/analyzing-codebase-for-tech-log/SKILL.md +++ b/.agents/skills/analyzing-codebase-for-tech-log/SKILL.md @@ -11,7 +11,8 @@ Produce a highly detailed, source-traceable engineering analysis. This stage dis ## Required sequence -1. **First read `<분석 대상 저장소>/analysis-queue.yaml`.** Before inspecting any project contents, apply `references/queue-contract.md`: reconcile newly discovered project directories, preserve queue order, and determine the single active project. +0. **Fix the two roots before anything else.** `<분석 대상 저장소>` is the repository being analyzed — an absolute path outside this repository, given by the caller. `docs/<프로젝트>/` is inside *this* repository. Never write into the analyzed repository, and never read analysis state from it. +1. **Read `<분석 대상 저장소>/analysis-queue.yaml` if it exists.** It exists only when several repositories are queued. Apply `references/queue-contract.md`: reconcile newly discovered project directories, preserve queue order, and determine the single active project. **If there is no queue, analyze the one repository the caller named and skip to step 3.** A missing queue is not a blocker — it means nothing is queued. 2. If an `IN_PROGRESS` project exists, analyze only that project. If none exists, activate the first `PENDING` project in queue order. Never preempt an active project because a new project appeared. 3. For the selected `<분석 대상 저장소>`, check the nearest `AGENTS.md` or equivalent repository instructions. 4. Record Git revision and `git status` when Git is available. Never modify or reset user source as part of analysis. diff --git a/.agents/skills/analyzing-codebase-for-tech-log/references/evidence-contract.md b/.agents/skills/analyzing-codebase-for-tech-log/references/evidence-contract.md index 915b767..c52fd4b 100644 --- a/.agents/skills/analyzing-codebase-for-tech-log/references/evidence-contract.md +++ b/.agents/skills/analyzing-codebase-for-tech-log/references/evidence-contract.md @@ -2,7 +2,7 @@ ## Primary evidence first -Store command output, logs, generated query plans, benchmark results, browser observations, and other primary material under `docs/<프로젝트>/evidence/raw/` before creating presentation assets. +Store command output, logs, generated query plans, benchmark results, browser observations, and other primary material under `docs/<프로젝트>/final/evidence/raw/` before creating presentation assets. ## Terminal evidence @@ -15,7 +15,7 @@ For a command used as evidence, retain: - raw stdout/stderr; - source revision when relevant. -Render terminal UI with `./tools/terminal-evidence/render_terminal.py`. +Render terminal UI with `scripts/terminal-evidence/render_terminal.py`. The visual asset is explanatory. The raw evidence is the provenance. diff --git a/.agents/skills/analyzing-codebase-for-tech-log/templates/analysis/00-project-overview.md b/.agents/skills/analyzing-codebase-for-tech-log/templates/analysis/00-project-overview.md index a3ee3ec..45b5c75 100644 --- a/.agents/skills/analyzing-codebase-for-tech-log/templates/analysis/00-project-overview.md +++ b/.agents/skills/analyzing-codebase-for-tech-log/templates/analysis/00-project-overview.md @@ -2,7 +2,7 @@ ## 분석 기준 revision -- repository: `/shared/codebase/` +- repository: `<분석 대상 저장소의 절대 경로>` - revision: `` ## Build and module map diff --git a/.agents/skills/analyzing-codebase-for-tech-log/templates/state.json b/.agents/skills/analyzing-codebase-for-tech-log/templates/state.json index 5244a94..8e09c77 100644 --- a/.agents/skills/analyzing-codebase-for-tech-log/templates/state.json +++ b/.agents/skills/analyzing-codebase-for-tech-log/templates/state.json @@ -1,7 +1,7 @@ { "schemaVersion": 2, "project": "", - "codebasePath": "/shared/codebase/", + "codebasePath": "<분석 대상 저장소의 절대 경로>", "gitRevision": null, "analysisStatus": "NOT_STARTED", "analysisCycle": 1, diff --git a/.agents/skills/deriving-tech-log-root-tree/SKILL.md b/.agents/skills/deriving-tech-log-root-tree/SKILL.md index 5172c28..e7ba951 100644 --- a/.agents/skills/deriving-tech-log-root-tree/SKILL.md +++ b/.agents/skills/deriving-tech-log-root-tree/SKILL.md @@ -82,7 +82,28 @@ They do not hold candidates, and in a folded project they are gone. with the fields its kind requires. There is no second tree to keep in step. 10. Run `references/decomposition-checklist.md`. 11. Record `candidateScope`, the source document hash, and the project revision. -12. `python3 scripts/verify-tech-log-tree.py ` — errors must be 0. +12. `python3 scripts/build-tech-log-tree.py ` first, then + `python3 scripts/verify-tech-log-tree.py ` — errors must be 0. Build fills + `ssotSha256`; verify errors when it is absent, so verifying before building always fails. + +## Three fields the verifier requires and this procedure does not otherwise name + +Write them by hand. `verify-tech-log-tree.py` counts each as an error when missing. + +| Field | What goes in it | +|---|---| +| `candidateScope` | the range candidates were found in — above | +| `sourceRepository` | `path` of the analyzed repository, its `revision`, and how that was established. Leave `revision` `null` rather than inventing one; when the work is split across branches, pair names and commits under `revisions` | +| `ssotSha256` | filled by `build-tech-log-tree.py`. Its job is to catch a tree whose SSOT changed after the candidates were chosen | + +```json +"sourceRepository": { + "path": "/absolute/path/to/analyzed-repo", + "revision": null, + "revisions": {"AP1 develop-pattern1": "64175266"}, + "verified": "how the revision was established, or why it is null" +} +``` Use `.agents/skills/writing-tech-log-records/references/tech-log-tree-contract.md` as the output contract. diff --git a/.agents/skills/publishing-tech-log-to-studio/SKILL.md b/.agents/skills/publishing-tech-log-to-studio/SKILL.md new file mode 100644 index 0000000..4acdbd6 --- /dev/null +++ b/.agents/skills/publishing-tech-log-to-studio/SKILL.md @@ -0,0 +1,140 @@ +--- +name: publishing-tech-log-to-studio +description: Use when a finished Tech Log record .md must be put into Tech Log Studio through the browser with Playwright MCP — creating or opening the working copy, uploading assets, filling the per-kind fields, and saving. Save only; this skill never publishes. +--- + +# Studio 반입 — 저장까지만 + +## 이 스킬의 경계 + +기록 `.md` 하나를 Studio 편집 화면에 넣고 **저장**한다. 거기서 끝난다. + +**게시하지 않는다.** 게시는 공개 사이트에 올리는 일이고, 되돌리려면 `unpublish` 를 해야 하며 +그 사이에 누구나 본다. 더 중요한 것은 **한 번이라도 게시한 문서는 게시를 취소해도 지워지지 +않는다는 것이다** — 삭제가 409 로 거절되고 「공개된 기록은 삭제할 수 없습니다」가 뜬다. 그래서 +시험 삼아 게시하지 않는다. 게시는 사람이 미리보기를 읽고 판단한다. + +편집 화면 오른쪽 `aside` 에 버튼이 `저장`·`게시` 둘뿐이다. **`게시` 를 누르면 저장·검증· +미리보기·게시가 한 번에 돈다.** 이 스킬은 `저장` 만 누른다. + +## 들어가기 전 조건 + +| 조건 | 확인 | +|---|---| +| 기록 `.md` 가 파서를 통과했다 | `studio-body.py` 로 바꾼 파일에 `check_body.mjs`, error 0 | +| 문장 검사를 지났다 | `check_prose.mjs` error 0 | +| 인용이 SSOT 에 실재한다 | `check_evidence.mjs <프로젝트> --repo` | +| 브라우저가 이미 로그인돼 있다 | 아래 「인증」 | + +**검사를 안 지난 초안을 넣지 않는다.** 저장은 빈 칸도 받아 주기 때문에(Studio 는 한 번에 다 +쓰지 않아도 저장되게 만들어져 있다) 넣는 것 자체는 성공한다. 그래서 파서·문장 검사를 여기서 +대신 잡아 주지 않는다. + +## 인증 + +Studio 는 조회에도 권한을 요구한다. 읽는 것이 게시 전 초안이기 때문이다. + +**이 저장소에 자격증명을 두지 않는다.** 이미 로그인된 브라우저 세션을 쓴다. 편집 화면을 열었을 +때 상태 `aside` 가 25초 안에 안 뜨면 **인증이 안 된 것으로 보고 멈춘다.** 로그인 화면을 +자동으로 통과하려 들지 않는다 — 사용자에게 로그인해 달라고 말하고 기다린다. + +``` +aside[class*="studio-document-status"] ← 이것이 안 보이면 인증 실패 +``` + +## 주소 + +| 무엇 | 주소 | +|---|---| +| Studio | `https://hyeonworks.com/studio` | +| 편집 화면 | `https://hyeonworks.com/studio/documents//edit` | +| 새 문서 | Studio 에서 `새 문서` → 종류 선택 → `작업본 만들기` | + +기록 frontmatter 의 `id` 와 `studio:` 가 이미 차 있으면 **새로 만들지 않는다.** 그 주소로 바로 +간다. 비어 있으면 새로 만들고, 받은 uuid 와 편집 주소를 기록 frontmatter 에 적는다. + +## 절차 + +### 1. 기록을 읽고 무엇을 넣을지 정한다 + +`kind` 로 칸 목록이 정해진다. 어떤 `##` 제목이 Studio 의 어느 칸인지는 +[references/studio-form-map.md](references/studio-form-map.md). + +**frontmatter 는 메타데이터고, 본문의 `##` 가 Studio 의 칸이며, 제목 아래 첫 문단이 `요약` +이다.** 계약에 없는 `##` 는 화면에 자리가 없어 통째로 사라진다. + +### 2. 그림이 있으면 Asset 을 먼저 올린다 + +frontmatter `assets:` 의 `file:` 이 올릴 파일이고 `key:` 는 저장소 쪽 이름이다. 올리면 서버가 +`<이름>-<해시8>` 형태의 키를 준다. + +**본문을 넣기 전에 올린다.** 순서를 뒤집으면 미리보기가 본문 전체를 막는다 — +`1:1 supported local evidence key not found: `. 다른 경로로 올렸으면 편집 화면을 +한 번 새로 고쳐야 목록을 다시 받는다. 본문 문법 문제로 오해하기 쉽다. + +본문은 서버가 준 키로 바꿔서 넣는다. + +```bash +python3 scripts/studio-body.py <기록.md> --key <저장소 key>=<서버가 준 key> --body-only +``` + +저장소의 `.md` 는 마크다운 이미지로 두고 고치지 않는다. `:::evidence` 는 Studio 렌더러의 +구문이라 저장소에 쓰면 편집기에서 그림이 안 보인다. + +### 3. 칸을 채운다 + +되풀이되는 칸(`영향`·`선택지`·`사실`처럼 여러 줄인 것)은 **줄 수를 먼저 맞추고** 값을 넣는다. +줄이 모자란 채로 채우면 뒤엣것이 조용히 버려진다. 셀렉터와 배치 실행 방법은 +[references/playwright-recipes.md](references/playwright-recipes.md). + +**본문이 없는 세 종류(Reference·Question·Decision)의 칸은 평문으로 렌더링된다.** 백틱과 +파이프가 글자 그대로 보이고, 줄바꿈은 `
` 로만 살아난다. + +### 4. 저장한다 + +``` +aside[class*="studio-document-status"] 안의 `저장` 버튼 +→ 같은 aside 의 글자가 `저장됨` 으로 바뀔 때까지 기다린다 (최대 30초) +``` + +`저장됨` 을 못 보면 실패다. 그 `aside` 의 글자를 그대로 읽어서 보고한다. **버튼을 다시 누르지 +않는다** — 검증 오류로 막힌 것을 연타로 뚫으려다 `게시` 를 누르게 된다. + +버전은 같은 `aside` 의 첫 `dd` 에 있다. 저장 전후로 읽어 두면 실제로 올라갔는지 보인다. + +### 5. 미리보기로 읽는다 + +`즉시 미리보기` 탭은 저장한 값이 아니라 **화면에 입력한 값**을 렌더링한다. 그래서 게시 없이도 +공개 화면과 같은 블록 렌더러로 본문을 볼 수 있다. + +읽을 항목은 `../writing-tech-log-records/references/studio-draft-review.md` 의 목록을 쓴다. +고칠 것이 있으면 `편집` 탭으로 돌아가 고치고 다시 저장한다. + +### 6. 기록에 되적는다 + +새로 만들었으면 frontmatter 의 `id` 와 `studio:` 를 채우고 색인을 다시 만든다. + +```bash +python3 scripts/build-tech-log-tree.py <프로젝트> +python3 scripts/verify-tech-log-tree.py <프로젝트> +``` + +`build-tech-log-tree.py` 는 frontmatter 의 `id` 가 있으면 `publication` 을 `게시됨` 으로 +적는다. **이 칸은 「Studio 에 있다」는 뜻이지 「공개돼 있다」가 아니다.** 공개 여부는 기록의 +`status` 와 `public:` 이 말한다. + +## 시험용 초안을 남기지 않는다 + +확인하려고 만든 작업본은 지운다. 다만 **Decision 은 계약에 삭제 경로가 없다** — 확인용으로 +만들지 않는 편이 낫다. 관계로 참조된 문서도 지워지지 않는다(`DOCUMENT_IN_USE`). 참조하는 쪽의 +관계를 먼저 끊는다. + +## 실패했을 때 + +| 증상 | 원인 | +|---|---| +| `aside` 가 안 뜬다 | 인증. 로그인 화면을 자동으로 넘기지 않는다 | +| 미리보기가 본문 전체를 막는다 | Asset 을 올리기 전에 본문을 넣었다. 화면을 새로 고친다 | +| 칸을 못 찾는다 (`label` 매치 0) | 그 종류에 없는 칸이다. `studio-form-map.md` 를 다시 본다 | +| 값이 잘렸다 | 되풀이 칸의 줄 수를 안 맞추고 채웠다 | +| `저장됨` 이 안 뜬다 | 검증이 막은 것이다. `aside` 글자를 읽어 보고한다 | diff --git a/.agents/skills/publishing-tech-log-to-studio/references/playwright-recipes.md b/.agents/skills/publishing-tech-log-to-studio/references/playwright-recipes.md new file mode 100644 index 0000000..aa62efe --- /dev/null +++ b/.agents/skills/publishing-tech-log-to-studio/references/playwright-recipes.md @@ -0,0 +1,230 @@ +# Playwright MCP 로 편집 화면을 다루는 법 + +여기 적은 셀렉터는 지어낸 것이 아니라 이 저장소가 실제로 돌린 것이다. 원문은 +`.playwright-mcp/_p1.mjs`·`_p2.mjs`·`_p3.mjs` 에 남아 있다. + +## 두 가지 방식 + +| 방식 | 언제 | +|---|---| +| MCP 도구를 하나씩 (`browser_navigate` · `browser_snapshot` · `browser_fill_form` · `browser_click`) | 기록 한 건. 화면을 보면서 한다 | +| `browser_run_code_unsafe` 로 한 번에 | 여러 건을 같은 모양으로 채운다 | + +**처음 넣는 기록은 하나씩 한다.** 배치는 이미 한 번 성공한 모양을 반복할 때만 쓴다. 화면을 +안 보고 배치를 돌리면 못 찾은 칸이 조용히 버려진다. + +## 새로 만들 때 — `/studio/documents/new` + +종류를 라디오로 고르고 `작업본 만들기` 를 누른다. 라디오의 이름은 화면에 보이는 그대로다. + +| 종류 | 라디오 이름 | 화면이 적어 놓은 칸 | +|---|---|---| +| Case | `Case` | 문제 · 결론 · 환경 · 재현 · 본문 | +| Reference | `Reference` | 목적 · 규칙 · 적용 조건 · 예외 · 예시 | +| Concept | **`개념`** | 기준 버전 · 본문 | +| Question | `Question` | 상태 · 사실 · 가정 · 미지수 · 선택지 | +| Decision | `Decision` | 상태 · 결정일 · 결정문 · 판단 이유 · 영향 · 근거 | + +**Concept 만 라디오 이름이 한글(`개념`)이다.** 나머지 넷은 영어다. + +```js +await page.goto('https://hyeonworks.com/studio/documents/new'); +await page.getByRole('radio', { name: /^Reference/ }).check(); +await page.getByRole('button', { name: '작업본 만들기' }).click(); +// 주소가 /studio/documents//edit 로 바뀐다. 그 uuid 를 기록 frontmatter 에 적는다 +``` + +화면에 이렇게 적혀 있다 — 「이 화면의 작업본은 현재 Studio 세션에서만 유지됩니다.」 +**만들었으면 그 자리에서 칸을 채우고 저장한다.** 만들어 두고 나중에 돌아오지 않는다. + +## 화면의 기준점 + +```js +const RAIL = 'aside[class*="studio-document-status"]'; +``` + +이 `aside` 가 상태 레일이다. 여기에 버전(`dd` 첫 번째)과 저장 상태(`저장됨`)와 버튼 +(`저장`·`게시`)이 있다. + +**이것이 25초 안에 안 뜨면 인증이 안 된 것이다.** 로그인 화면을 자동으로 넘기려 들지 않는다. + +```js +await page.goto('https://hyeonworks.com/studio/documents/' + id + '/edit'); +try { await page.waitForSelector(RAIL, { timeout: 25000 }); } +catch { return { error: 'AUTH? ' + page.url() }; } +``` + +## 버전 읽기 + +```js +const version = await page.locator(RAIL + ' dd').first().innerText(); +``` + +저장 전후로 읽는다. 안 올라갔으면 저장이 안 된 것이다. + +## 칸 채우기 + +칸은 `label` 안의 `span` 이 이름을 들고 있다. + +```js +const loc = page.locator('xpath=//label[./span[normalize-space(.)="' + label + '"]]') + .locator('textarea, input').first(); +if (await loc.count() !== 1) { /* 그 종류에 없는 칸이다 — 채우지 말고 기록한다 */ } +if (await loc.inputValue() === value) { /* 이미 같다 — 건드리지 않는다 */ } +await loc.fill(value); +``` + +**매치가 1이 아니면 채우지 않고 못 찾았다고 적는다.** 비슷한 이름의 다른 칸에 넣는 것보다 +안 넣는 쪽이 낫다. + +**이미 같은 값이면 건드리지 않는다.** 안 그러면 바뀐 것이 없는데 버전만 올라간다. + +## 되풀이되는 칸은 줄 수를 먼저 맞춘다 + +`영향`·`선택지`·`사실`처럼 여러 줄인 칸은 `fieldset` 의 `legend` 가 이름이고 줄이 +`.studio-ordered-item` 이다. + +```js +const fs = page.locator('xpath=//fieldset[./legend[normalize-space(.)="' + legend + '"]]').first(); +let cur = await fs.locator('.studio-ordered-item').count(); +while (cur > want) { // 줄이 남으면 뒤에서 지운다 + await fs.locator('.studio-ordered-item').last().getByRole('button', { name: '삭제' }).click(); + await page.waitForTimeout(60); cur--; +} +while (cur < want) { // 모자라면 더한다 + await fs.getByRole('button', { name: legend + ' 추가' }).click(); + await page.waitForTimeout(60); cur++; +} +``` + +**값을 넣기 전에 한다.** 줄이 모자란 채로 채우면 뒤엣것이 조용히 버려진다. + +**행 클래스가 칸마다 다르다.** `관계` 는 `.studio-relation-item` 이고 나머지가 +`.studio-ordered-item` 이다. 하나로 세면 관계는 늘 0으로 읽힌다. + +**더한 뒤에는 카운트가 아니라 라벨 목록으로 검산한다.** 실제로 「판단 기준 추가」를 7번 +눌렀는데 행이 9개 생겼다. 카운트만 믿으면 못 잡는다. + +```js +// 채우기 전에 그 fieldset 안의 라벨을 전부 읽어 몇 줄인지 다시 센다 +const labels = await fs.locator('label span').allInnerTexts(); +``` + +## 칸 DOM 이 두 가지다 + +위 xpath 는 절반만 통한다. 실제 편집 화면에는 모양이 둘이다. + +```html + +
+
+``` + +`요약` · `본문 Markdown` · `관계 N 이유` 가 B형이다. A형만 찾으면 이 칸들이 조용히 안 채워진다. +**둘 다 본다.** + +```js +async function field(page, name) { + const a = page.locator(`xpath=//label[./span[normalize-space(.)="${name}"]]`) + .locator('textarea, input').first(); + if (await a.count()) return a; + const id = await page.locator(`xpath=//label[normalize-space(.)="${name}"]`) + .first().getAttribute('for'); + return id ? page.locator('#' + id) : null; +} +``` + +**본문 칸의 이름은 `본문` 이 아니라 `본문 Markdown` 이다.** + +## Asset 을 올릴 때 + +`Asset 업로드` 는 모달을 띄우고 **`filechooser` 이벤트를 내지 않는다.** 기다리면 타임아웃이다. +모달 안의 `input[type=file]` 에 직접 넣는다. + +```js +await page.getByRole('button', { name: 'Asset 업로드' }).click(); +await page.locator('input[type=file]').setInputFiles(svgPath); +// 대체 텍스트 칸에 기록 본문의 alt 를 그대로 넣는다 +``` + +**올린 직후 목록이 갱신되지 않는다.** 화면의 `Asset 검색` 을 다시 눌러야 새 키가 나온다. +새로 올리면 서버가 새 키를 준다(`<이름>-<해시8>`) — 옛 키는 목록에 남는다. 다른 문서가 +참조할 수 있으니 지우지 않는다. + +## 값을 읽을 때는 `getByLabel` 을 쓰지 않는다 + +칸이 `