rdc-cli 0.5.4__tar.gz → 0.5.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (663) hide show
  1. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/PKG-INFO +1 -1
  2. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/commands.json +6 -0
  3. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/proposal.md +90 -0
  4. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/tasks.md +10 -0
  5. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/test-plan.md +33 -0
  6. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/proposal.md +95 -0
  7. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/specs/daemon/spec.md +40 -0
  8. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/tasks.md +47 -0
  9. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/test-plan.md +78 -0
  10. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/proposal.md +95 -0
  11. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/specs/daemon/spec.md +40 -0
  12. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/tasks.md +31 -0
  13. rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/test-plan.md +74 -0
  14. rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/proposal.md +235 -0
  15. rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/tasks.md +14 -0
  16. rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/test-plan.md +232 -0
  17. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/daemon/spec.md +16 -0
  18. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-commands.py +1 -1
  19. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/references/commands-quick-ref.md +21 -0
  20. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/capture_core.py +28 -2
  21. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/cli.py +2 -0
  22. rdc_cli-0.5.5/src/rdc/commands/cbuffer.py +61 -0
  23. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/mesh.py +14 -1
  24. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/daemon_server.py +215 -36
  25. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/buffer.py +82 -7
  26. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/capture.py +19 -14
  27. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/remote_core.py +12 -4
  28. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/session_service.py +2 -2
  29. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/router.py +6 -0
  30. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/PKG-INFO +1 -1
  31. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/SOURCES.txt +16 -0
  32. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_daemon_handlers_real.py +31 -0
  33. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/mocks/mock_renderdoc.py +15 -1
  34. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_buffer_decode.py +377 -0
  35. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_core.py +34 -0
  36. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_handlers.py +91 -0
  37. rdc_cli-0.5.5/tests/unit/test_cbuffer_commands.py +132 -0
  38. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_server_unit.py +394 -0
  39. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mesh_commands.py +75 -0
  40. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_core.py +39 -0
  41. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_replay.py +165 -1
  42. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_service.py +1 -0
  43. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_router.py +7 -0
  44. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.commitlintrc.yml +0 -0
  45. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.githooks/pre-commit +0 -0
  46. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.githooks/pre-push +0 -0
  47. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/CODEOWNERS +0 -0
  48. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  49. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  50. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  51. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  52. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/aur.yml +0 -0
  53. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/ci.yml +0 -0
  54. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/commitlint.yml +0 -0
  55. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/docs.yml +0 -0
  56. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.gitignore +0 -0
  57. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.python-version +0 -0
  58. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.release-please-manifest.json +0 -0
  59. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/CONTRIBUTING.md +0 -0
  60. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/LICENSE +0 -0
  61. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/Makefile +0 -0
  62. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/README.md +0 -0
  63. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/SECURITY.md +0 -0
  64. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/aur/PKGBUILD +0 -0
  65. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/aur/stable/PKGBUILD +0 -0
  66. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docker/Dockerfile +0 -0
  67. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/astro.config.mjs +0 -0
  68. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/package-lock.json +0 -0
  69. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/package.json +0 -0
  70. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/public/.nojekyll +0 -0
  71. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/public/favicon.svg +0 -0
  72. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Commands.astro +0 -0
  73. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Demo.astro +0 -0
  74. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Features.astro +0 -0
  75. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Footer.astro +0 -0
  76. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Hero.astro +0 -0
  77. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Install.astro +0 -0
  78. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Navbar.astro +0 -0
  79. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Philosophy.astro +0 -0
  80. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Terminal.astro +0 -0
  81. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/ThemeSwitcher.astro +0 -0
  82. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/replay.json +0 -0
  83. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/stats.json +0 -0
  84. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/layouts/Base.astro +0 -0
  85. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/layouts/Docs.astro +0 -0
  86. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/ai-integration.astro +0 -0
  87. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/commands.astro +0 -0
  88. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/design.astro +0 -0
  89. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/examples.astro +0 -0
  90. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/index.astro +0 -0
  91. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/install.astro +0 -0
  92. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/remote.astro +0 -0
  93. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/usage.astro +0 -0
  94. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/vfs.astro +0 -0
  95. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/index.astro +0 -0
  96. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/styles/global.css +0 -0
  97. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tailwind.config.mjs +0 -0
  98. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tapes/pipeline.tape +0 -0
  99. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tapes/quickstart.tape +0 -0
  100. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tests/validate.mjs +0 -0
  101. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tsconfig.json +0 -0
  102. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/mypy.ini +0 -0
  103. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/proposal.md +0 -0
  104. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/tasks.md +0 -0
  105. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/test-plan.md +0 -0
  106. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/proposal.md +0 -0
  107. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/tasks.md +0 -0
  108. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/test-plan.md +0 -0
  109. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/proposal.md +0 -0
  110. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/tasks.md +0 -0
  111. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/test-plan.md +0 -0
  112. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/proposal.md +0 -0
  113. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/specs/ci/spec.md +0 -0
  114. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/tasks.md +0 -0
  115. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/test-plan.md +0 -0
  116. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/proposal.md +0 -0
  117. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/specs/foundation/spec.md +0 -0
  118. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/tasks.md +0 -0
  119. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/test-plan.md +0 -0
  120. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/proposal.md +0 -0
  121. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/specs/daemon/spec.md +0 -0
  122. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/tasks.md +0 -0
  123. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/test-plan.md +0 -0
  124. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/proposal.md +0 -0
  125. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/specs/daemon/spec.md +0 -0
  126. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/tasks.md +0 -0
  127. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/test-plan.md +0 -0
  128. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/proposal.md +0 -0
  129. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/specs/tooling/spec.md +0 -0
  130. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/tasks.md +0 -0
  131. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/test-plan.md +0 -0
  132. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/proposal.md +0 -0
  133. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/specs/tooling/spec.md +0 -0
  134. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/tasks.md +0 -0
  135. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/test-plan.md +0 -0
  136. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/proposal.md +0 -0
  137. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/specs/session/spec.md +0 -0
  138. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/tasks.md +0 -0
  139. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/test-plan.md +0 -0
  140. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/design.md +0 -0
  141. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/proposal.md +0 -0
  142. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/specs/architecture/spec.md +0 -0
  143. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/tasks.md +0 -0
  144. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/test-plan.md +0 -0
  145. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/proposal.md +0 -0
  146. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/specs/daemon/spec.md +0 -0
  147. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/tasks.md +0 -0
  148. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/test-plan.md +0 -0
  149. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/proposal.md +0 -0
  150. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/specs/daemon/spec.md +0 -0
  151. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/specs/foundation/spec.md +0 -0
  152. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/tasks.md +0 -0
  153. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/test-plan.md +0 -0
  154. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/proposal.md +0 -0
  155. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/specs/daemon/spec.md +0 -0
  156. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/tasks.md +0 -0
  157. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/test-plan.md +0 -0
  158. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/proposal.md +0 -0
  159. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/tasks.md +0 -0
  160. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/test-plan.md +0 -0
  161. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/proposal.md +0 -0
  162. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/tasks.md +0 -0
  163. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/test-plan.md +0 -0
  164. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/proposal.md +0 -0
  165. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/specs/daemon/spec.md +0 -0
  166. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/tasks.md +0 -0
  167. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/test-plan.md +0 -0
  168. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/proposal.md +0 -0
  169. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/tasks.md +0 -0
  170. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/test-plan.md +0 -0
  171. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/proposal.md +0 -0
  172. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/tasks.md +0 -0
  173. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/test-plan.md +0 -0
  174. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/proposal.md +0 -0
  175. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/tasks.md +0 -0
  176. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/test-plan.md +0 -0
  177. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/proposal.md +0 -0
  178. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/tasks.md +0 -0
  179. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/test-plan.md +0 -0
  180. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/proposal.md +0 -0
  181. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/tasks.md +0 -0
  182. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/test-plan.md +0 -0
  183. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/proposal.md +0 -0
  184. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/tasks.md +0 -0
  185. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/test-plan.md +0 -0
  186. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/proposal.md +0 -0
  187. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/tasks.md +0 -0
  188. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/test-plan.md +0 -0
  189. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/proposal.md +0 -0
  190. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/tasks.md +0 -0
  191. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/test-plan.md +0 -0
  192. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/proposal.md +0 -0
  193. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/tasks.md +0 -0
  194. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/test-plan.md +0 -0
  195. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/proposal.md +0 -0
  196. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/tasks.md +0 -0
  197. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/test-plan.md +0 -0
  198. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-aur-pkgbuild/proposal.md +0 -0
  199. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-aur-pkgbuild/tasks.md +0 -0
  200. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-aur-pkgbuild/test-plan.md +0 -0
  201. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-cli-enhancements/proposal.md +0 -0
  202. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-cli-enhancements/tasks.md +0 -0
  203. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-cli-enhancements/test-plan.md +0 -0
  204. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-python-compat-ci/proposal.md +0 -0
  205. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-python-compat-ci/tasks.md +0 -0
  206. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-python-compat-ci/test-plan.md +0 -0
  207. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-release-ci/proposal.md +0 -0
  208. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-release-ci/tasks.md +0 -0
  209. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-release-ci/test-plan.md +0 -0
  210. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-daemon-crash/proposal.md +0 -0
  211. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-daemon-crash/tasks.md +0 -0
  212. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-daemon-crash/test-plan.md +0 -0
  213. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-output-quality/proposal.md +0 -0
  214. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-output-quality/tasks.md +0 -0
  215. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-output-quality/test-plan.md +0 -0
  216. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-pipeline-extended/proposal.md +0 -0
  217. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-pipeline-extended/tasks.md +0 -0
  218. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-pipeline-extended/test-plan.md +0 -0
  219. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-shader-api/proposal.md +0 -0
  220. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-shader-api/tasks.md +0 -0
  221. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-shader-api/test-plan.md +0 -0
  222. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/proposal.md +0 -0
  223. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/tasks.md +0 -0
  224. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/test-plan.md +0 -0
  225. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-daemon-startup-timeout/proposal.md +0 -0
  226. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-daemon-startup-timeout/tasks.md +0 -0
  227. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-daemon-startup-timeout/test-plan.md +0 -0
  228. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-event-break-and-test-flaky/proposal.md +0 -0
  229. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-event-break-and-test-flaky/tasks.md +0 -0
  230. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-event-break-and-test-flaky/test-plan.md +0 -0
  231. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/proposal.md +0 -0
  232. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/tasks.md +0 -0
  233. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/test-plan.md +0 -0
  234. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-vfs-pass-consistency/proposal.md +0 -0
  235. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-vfs-pass-consistency/tasks.md +0 -0
  236. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-vfs-pass-consistency/test-plan.md +0 -0
  237. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-bug-filters/proposal.md +0 -0
  238. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-bug-filters/tasks.md +0 -0
  239. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-bug-filters/test-plan.md +0 -0
  240. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-refactor-structure/proposal.md +0 -0
  241. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-refactor-structure/tasks.md +0 -0
  242. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-refactor-structure/test-plan.md +0 -0
  243. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/proposal.md +0 -0
  244. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/tasks.md +0 -0
  245. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/test-plan.md +0 -0
  246. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/proposal.md +0 -0
  247. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/tasks.md +0 -0
  248. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/test-plan.md +0 -0
  249. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/proposal.md +0 -0
  250. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/tasks.md +0 -0
  251. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/test-plan.md +0 -0
  252. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/proposal.md +0 -0
  253. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/tasks.md +0 -0
  254. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/test-plan.md +0 -0
  255. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/proposal.md +0 -0
  256. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/tasks.md +0 -0
  257. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/test-plan.md +0 -0
  258. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/proposal.md +0 -0
  259. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/tasks.md +0 -0
  260. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/test-plan.md +0 -0
  261. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-diff-completeness/proposal.md +0 -0
  262. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-diff-completeness/tasks.md +0 -0
  263. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-diff-completeness/test-plan.md +0 -0
  264. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-shader-api-fix/proposal.md +0 -0
  265. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-shader-api-fix/tasks.md +0 -0
  266. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-shader-api-fix/test-plan.md +0 -0
  267. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-vfs-ls-long/proposal.md +0 -0
  268. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-vfs-ls-long/tasks.md +0 -0
  269. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-vfs-ls-long/test-plan.md +0 -0
  270. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/proposal.md +0 -0
  271. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/tasks.md +0 -0
  272. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/test-plan.md +0 -0
  273. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/proposal.md +0 -0
  274. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/tasks.md +0 -0
  275. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/test-plan.md +0 -0
  276. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/proposal.md +0 -0
  277. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/tasks.md +0 -0
  278. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/test-plan.md +0 -0
  279. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/proposal.md +0 -0
  280. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/tasks.md +0 -0
  281. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/test-plan.md +0 -0
  282. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/proposal.md +0 -0
  283. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/tasks.md +0 -0
  284. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/test-plan.md +0 -0
  285. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/proposal.md +0 -0
  286. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/tasks.md +0 -0
  287. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/test-plan.md +0 -0
  288. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/proposal.md +0 -0
  289. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/tasks.md +0 -0
  290. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/test-plan.md +0 -0
  291. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-fix-json-error-and-search-preload/proposal.md +0 -0
  292. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-fix-json-error-and-search-preload/tasks.md +0 -0
  293. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-fix-json-error-and-search-preload/test-plan.md +0 -0
  294. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/proposal.md +0 -0
  295. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/tasks.md +0 -0
  296. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/test-plan.md +0 -0
  297. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/proposal.md +0 -0
  298. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/tasks.md +0 -0
  299. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/test-plan.md +0 -0
  300. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/proposal.md +0 -0
  301. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/tasks.md +0 -0
  302. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/test-plan.md +0 -0
  303. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/proposal.md +0 -0
  304. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/tasks.md +0 -0
  305. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/test-plan.md +0 -0
  306. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/proposal.md +0 -0
  307. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/tasks.md +0 -0
  308. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/test-plan.md +0 -0
  309. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4b-shader-edit-replay/proposal.md +0 -0
  310. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4b-shader-edit-replay/tasks.md +0 -0
  311. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4b-shader-edit-replay/test-plan.md +0 -0
  312. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/proposal.md +0 -0
  313. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/tasks.md +0 -0
  314. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/test-plan.md +0 -0
  315. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/proposal.md +0 -0
  316. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/tasks.md +0 -0
  317. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/test-plan.md +0 -0
  318. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/proposal.md +0 -0
  319. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/tasks.md +0 -0
  320. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/test-plan.md +0 -0
  321. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/proposal.md +0 -0
  322. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/tasks.md +0 -0
  323. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/test-plan.md +0 -0
  324. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/proposal.md +0 -0
  325. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/tasks.md +0 -0
  326. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/test-plan.md +0 -0
  327. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/proposal.md +0 -0
  328. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/tasks.md +0 -0
  329. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/test-plan.md +0 -0
  330. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/proposal.md +0 -0
  331. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/tasks.md +0 -0
  332. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/test-plan.md +0 -0
  333. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/proposal.md +0 -0
  334. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/tasks.md +0 -0
  335. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/test-plan.md +0 -0
  336. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/proposal.md +0 -0
  337. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/tasks.md +0 -0
  338. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/test-plan.md +0 -0
  339. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/proposal.md +0 -0
  340. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/tasks.md +0 -0
  341. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/test-plan.md +0 -0
  342. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/proposal.md +0 -0
  343. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/tasks.md +0 -0
  344. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/test-plan.md +0 -0
  345. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b18-b19-b24-cli-ux/proposal.md +0 -0
  346. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b18-b19-b24-cli-ux/tasks.md +0 -0
  347. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b18-b19-b24-cli-ux/test-plan.md +0 -0
  348. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b21-b22-b23-b25-daemon-lifecycle/proposal.md +0 -0
  349. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b21-b22-b23-b25-daemon-lifecycle/tasks.md +0 -0
  350. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b21-b22-b23-b25-daemon-lifecycle/test-plan.md +0 -0
  351. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-capture-process-leak-b26-b28/proposal.md +0 -0
  352. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-capture-process-leak-b26-b28/tasks.md +0 -0
  353. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-capture-process-leak-b26-b28/test-plan.md +0 -0
  354. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/proposal.md +0 -0
  355. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/tasks.md +0 -0
  356. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/test-plan.md +0 -0
  357. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/proposal.md +0 -0
  358. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/tasks.md +0 -0
  359. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/test-plan.md +0 -0
  360. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-bugs-b10-b15-b16/proposal.md +0 -0
  361. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-bugs-b10-b15-b16/tasks.md +0 -0
  362. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-bugs-b10-b15-b16/test-plan.md +0 -0
  363. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase-w2-build-script/proposal.md +0 -0
  364. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase-w2-build-script/tasks.md +0 -0
  365. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase-w2-build-script/test-plan.md +0 -0
  366. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/proposal.md +0 -0
  367. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/tasks.md +0 -0
  368. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/test-plan.md +0 -0
  369. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/proposal.md +0 -0
  370. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/tasks.md +0 -0
  371. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/test-plan.md +0 -0
  372. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/proposal.md +0 -0
  373. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/tasks.md +0 -0
  374. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/test-plan.md +0 -0
  375. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-b43-b44-remote-split/proposal.md +0 -0
  376. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-b43-b44-remote-split/tasks.md +0 -0
  377. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-b43-b44-remote-split/test-plan.md +0 -0
  378. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-m-macos-support/proposal.md +0 -0
  379. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-m-macos-support/tasks.md +0 -0
  380. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-m-macos-support/test-plan.md +0 -0
  381. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r1-quick-wins/proposal.md +0 -0
  382. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r1-quick-wins/tasks.md +0 -0
  383. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r1-quick-wins/test-plan.md +0 -0
  384. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r2-test-infrastructure/proposal.md +0 -0
  385. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r2-test-infrastructure/tasks.md +0 -0
  386. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r2-test-infrastructure/test-plan.md +0 -0
  387. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-26-phase-r3-usability-fixes/proposal.md +0 -0
  388. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-26-phase-r3-usability-fixes/tasks.md +0 -0
  389. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-26-phase-r3-usability-fixes/test-plan.md +0 -0
  390. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/proposal.md +0 -0
  391. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/tasks.md +0 -0
  392. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/test-plan.md +0 -0
  393. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/proposal.md +0 -0
  394. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/tasks.md +0 -0
  395. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/test-plan.md +0 -0
  396. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/architecture/spec.md +0 -0
  397. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/ci/spec.md +0 -0
  398. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/foundation/spec.md +0 -0
  399. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/packaging/spec.md +0 -0
  400. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/session/spec.md +0 -0
  401. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/tooling/spec.md +0 -0
  402. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pixi.lock +0 -0
  403. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pixi.toml +0 -0
  404. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pyproject.toml +0 -0
  405. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/release-please-config.json +0 -0
  406. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/ruff.toml +0 -0
  407. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/build-renderdoc.sh +0 -0
  408. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/build_renderdoc.py +0 -0
  409. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/capture_fixture.sh +0 -0
  410. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/dev_install.py +0 -0
  411. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/e2e_test.py +0 -0
  412. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-renderdoc.py +0 -0
  413. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-renderdoc.sh +0 -0
  414. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-skill-link.py +0 -0
  415. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-replay.py +0 -0
  416. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-skill-ref.py +0 -0
  417. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-stats.py +0 -0
  418. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen_and_check.py +0 -0
  419. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup-renderdoc.sh +0 -0
  420. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup-vulkan-samples.sh +0 -0
  421. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup_android_tools.py +0 -0
  422. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup_vulkan_samples.py +0 -0
  423. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/verify-package.sh +0 -0
  424. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/verify_package.py +0 -0
  425. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/setup.cfg +0 -0
  426. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/__init__.py +0 -0
  427. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_build_renderdoc.py +0 -0
  428. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_platform.py +0 -0
  429. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_progress.py +0 -0
  430. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/SKILL.md +0 -0
  431. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/__init__.py +0 -0
  432. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_transport.py +0 -0
  433. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/adapter.py +0 -0
  434. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/_helpers.py +0 -0
  435. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/android.py +0 -0
  436. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/assert_ci.py +0 -0
  437. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/assert_image.py +0 -0
  438. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capture.py +0 -0
  439. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capture_control.py +0 -0
  440. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capturefile.py +0 -0
  441. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/completion.py +0 -0
  442. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/counters.py +0 -0
  443. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/debug.py +0 -0
  444. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/diff.py +0 -0
  445. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/doctor.py +0 -0
  446. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/events.py +0 -0
  447. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/export.py +0 -0
  448. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/info.py +0 -0
  449. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/install_skill.py +0 -0
  450. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pick_pixel.py +0 -0
  451. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pipeline.py +0 -0
  452. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pixel.py +0 -0
  453. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/remote.py +0 -0
  454. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/resources.py +0 -0
  455. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/script.py +0 -0
  456. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/search.py +0 -0
  457. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/serve.py +0 -0
  458. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/session.py +0 -0
  459. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/setup_renderdoc.py +0 -0
  460. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/shader_edit.py +0 -0
  461. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/snapshot.py +0 -0
  462. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/tex_stats.py +0 -0
  463. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/unix_helpers.py +0 -0
  464. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/unused_targets.py +0 -0
  465. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/usage.py +0 -0
  466. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/vfs.py +0 -0
  467. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/daemon_client.py +0 -0
  468. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/__init__.py +0 -0
  469. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/alignment.py +0 -0
  470. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/draws.py +0 -0
  471. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/framebuffer.py +0 -0
  472. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/pipeline.py +0 -0
  473. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/resources.py +0 -0
  474. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/stats.py +0 -0
  475. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/summary.py +0 -0
  476. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/discover.py +0 -0
  477. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/json_fmt.py +0 -0
  478. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/kv.py +0 -0
  479. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/options.py +0 -0
  480. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/tsv.py +0 -0
  481. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/__init__.py +0 -0
  482. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/_helpers.py +0 -0
  483. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/_types.py +0 -0
  484. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/capturefile.py +0 -0
  485. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/core.py +0 -0
  486. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/debug.py +0 -0
  487. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/descriptor.py +0 -0
  488. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/pipe_state.py +0 -0
  489. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/pixel.py +0 -0
  490. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/query.py +0 -0
  491. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/script.py +0 -0
  492. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/shader.py +0 -0
  493. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/shader_edit.py +0 -0
  494. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/texture.py +0 -0
  495. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/unused.py +0 -0
  496. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/vfs.py +0 -0
  497. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/image_compare.py +0 -0
  498. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/protocol.py +0 -0
  499. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/remote_state.py +0 -0
  500. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/__init__.py +0 -0
  501. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/diff_service.py +0 -0
  502. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/query_service.py +0 -0
  503. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/session_state.py +0 -0
  504. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/target_state.py +0 -0
  505. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/__init__.py +0 -0
  506. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/formatter.py +0 -0
  507. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/tree_cache.py +0 -0
  508. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/dependency_links.txt +0 -0
  509. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/entry_points.txt +0 -0
  510. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/requires.txt +0 -0
  511. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/top_level.txt +0 -0
  512. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/conftest.py +0 -0
  513. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/__init__.py +0 -0
  514. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/blackbox_test_catalog.md +0 -0
  515. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/conftest.py +0 -0
  516. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/e2e_helpers.py +0 -0
  517. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_advanced.py +0 -0
  518. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_assert.py +0 -0
  519. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_capture.py +0 -0
  520. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_capturefile.py +0 -0
  521. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_debug.py +0 -0
  522. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_diff.py +0 -0
  523. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_export.py +0 -0
  524. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_formats.py +0 -0
  525. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_presession.py +0 -0
  526. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_query.py +0 -0
  527. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_session.py +0 -0
  528. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_shader_edit.py +0 -0
  529. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_vfs.py +0 -0
  530. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles-multipass-debug.apk +0 -0
  531. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles-triangle-debug.apk +0 -0
  532. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles_android_mali.rdc +0 -0
  533. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles_multipass_mali.rdc +0 -0
  534. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/hello_triangle.rdc +0 -0
  535. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/vkcube.rdc +0 -0
  536. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/vkcube_validation.rdc +0 -0
  537. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_build_renderdoc_integration.py +0 -0
  538. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_mock_api_sync.py +0 -0
  539. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_real_replay.py +0 -0
  540. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_vulkan_samples.py +0 -0
  541. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/conftest.py +0 -0
  542. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_adapter.py +0 -0
  543. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_android_commands.py +0 -0
  544. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_assert_ci_commands.py +0 -0
  545. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_assert_image_command.py +0 -0
  546. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_binary_daemon.py +0 -0
  547. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_build_renderdoc.py +0 -0
  548. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture.py +0 -0
  549. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_control.py +0 -0
  550. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capturefile_commands.py +0 -0
  551. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capturefile_handlers.py +0 -0
  552. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_ci_files.py +0 -0
  553. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_cli.py +0 -0
  554. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_cli_session_flag.py +0 -0
  555. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_completion.py +0 -0
  556. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_count_shadermap.py +0 -0
  557. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_counters_commands.py +0 -0
  558. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_counters_daemon.py +0 -0
  559. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_crash_regression.py +0 -0
  560. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_output_quality.py +0 -0
  561. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_pipeline_extended.py +0 -0
  562. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_shader_api_fix.py +0 -0
  563. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_shader_extended.py +0 -0
  564. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_transport.py +0 -0
  565. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_debug_commands.py +0 -0
  566. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_debug_handlers.py +0 -0
  567. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_descriptors_daemon.py +0 -0
  568. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_dev_install.py +0 -0
  569. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_alignment.py +0 -0
  570. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_command.py +0 -0
  571. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_draws.py +0 -0
  572. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_framebuffer.py +0 -0
  573. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_pipeline.py +0 -0
  574. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_resources.py +0 -0
  575. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_service.py +0 -0
  576. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_stats.py +0 -0
  577. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_summary.py +0 -0
  578. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_discover.py +0 -0
  579. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_doctor.py +0 -0
  580. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_doctor_hints.py +0 -0
  581. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_daemon.py +0 -0
  582. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_events_cli.py +0 -0
  583. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_events_daemon.py +0 -0
  584. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_eid_completion.py +0 -0
  585. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_events_commands.py +0 -0
  586. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_export_commands.py +0 -0
  587. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_export_overlay.py +0 -0
  588. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix1_draws_pass_name.py +0 -0
  589. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix2_vfs_intermediate_dirs.py +0 -0
  590. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix3_friendly_pass_name.py +0 -0
  591. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_formatters.py +0 -0
  592. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_formatters_kv.py +0 -0
  593. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_gen_skill_ref.py +0 -0
  594. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_handlers_remote.py +0 -0
  595. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_image_compare.py +0 -0
  596. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_info_commands.py +0 -0
  597. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_install_skill.py +0 -0
  598. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_json_errors.py +0 -0
  599. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_keep_remote.py +0 -0
  600. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mesh_handler.py +0 -0
  601. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mock_capture_types.py +0 -0
  602. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mock_renderdoc.py +0 -0
  603. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_open_remote.py +0 -0
  604. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_output_options.py +0 -0
  605. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_overlay_handler.py +0 -0
  606. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pass_deps.py +0 -0
  607. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pick_pixel_commands.py +0 -0
  608. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pick_pixel_daemon.py +0 -0
  609. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_cli_phase27.py +0 -0
  610. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_commands.py +0 -0
  611. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_daemon.py +0 -0
  612. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_section_routing.py +0 -0
  613. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_shader.py +0 -0
  614. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_state.py +0 -0
  615. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixel_history_commands.py +0 -0
  616. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixel_history_daemon.py +0 -0
  617. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixi_files.py +0 -0
  618. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_platform.py +0 -0
  619. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_progress.py +0 -0
  620. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_protocol.py +0 -0
  621. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_query_service.py +0 -0
  622. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_quickfix_batch.py +0 -0
  623. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_commands.py +0 -0
  624. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_setup.py +0 -0
  625. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_state.py +0 -0
  626. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_status_disconnect.py +0 -0
  627. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_require_pipe.py +0 -0
  628. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resource_semantic_completion.py +0 -0
  629. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resources_commands.py +0 -0
  630. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resources_filter.py +0 -0
  631. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_script_command.py +0 -0
  632. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_script_handler.py +0 -0
  633. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_search.py +0 -0
  634. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_semantic_completion.py +0 -0
  635. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_serve.py +0 -0
  636. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_commands.py +0 -0
  637. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_completion.py +0 -0
  638. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_state.py +0 -0
  639. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_setup_renderdoc.py +0 -0
  640. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_setup_vulkan_samples.py +0 -0
  641. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_edit_commands.py +0 -0
  642. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_edit_handlers.py +0 -0
  643. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_preload.py +0 -0
  644. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_skill_structure.py +0 -0
  645. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_snapshot_command.py +0 -0
  646. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_split_binary.py +0 -0
  647. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_split_core.py +0 -0
  648. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_target_state.py +0 -0
  649. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tex_stats_commands.py +0 -0
  650. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tex_stats_handler.py +0 -0
  651. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tooling_files.py +0 -0
  652. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_unix_helpers_commands.py +0 -0
  653. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_unused_targets.py +0 -0
  654. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_usage_commands.py +0 -0
  655. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_usage_daemon.py +0 -0
  656. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_binary.py +0 -0
  657. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_commands.py +0 -0
  658. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_completion.py +0 -0
  659. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_daemon.py +0 -0
  660. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_formatter.py +0 -0
  661. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_tree_cache.py +0 -0
  662. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_windows_compat.py +0 -0
  663. {rdc_cli-0.5.4 → rdc_cli-0.5.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdc-cli
3
- Version: 0.5.4
3
+ Version: 0.5.5
4
4
  Summary: CLI for RenderDoc .rdc captures
5
5
  Author: Jim
6
6
  License-Expression: MIT
@@ -201,6 +201,12 @@
201
201
  "help": "Export buffer raw data.",
202
202
  "usage": "rdc buffer <ID> [-o PATH] [--raw]"
203
203
  },
204
+ {
205
+ "name": "cbuffer",
206
+ "id": "cbuffer",
207
+ "help": "Decode a constant buffer to JSON or export its raw bytes.",
208
+ "usage": "rdc cbuffer [EID] [--stage CHOICE] [--set INTEGER] [--binding INTEGER] [--json] [--raw] [-o PATH]"
209
+ },
204
210
  {
205
211
  "name": "rt",
206
212
  "id": "rt",
@@ -0,0 +1,90 @@
1
+ # Fix #225: D3D12 Multi-GPU Capture Replay
2
+
3
+ ## Summary
4
+
5
+ Fix `_match_capture_gpu()` incorrectly returning the integrated GPU on multi-GPU
6
+ systems when replaying D3D12 captures, causing an `E_INVALIDARG` heap failure on
7
+ devices with insufficient VRAM.
8
+
9
+ ## Motivation
10
+
11
+ `_match_capture_gpu()` only matches GPUs via the Vulkan `vkEnumeratePhysicalDevices`
12
+ structured-data chunk. For D3D12 captures that chunk is absent, so the function
13
+ falls through to `return gpus[0]`. On reporter's machine the GPU enumeration order
14
+ was: AMD Radeon Graphics iGPU 2 GB, NVIDIA RTX 4500 Ada 24 GB, WARP. The iGPU was
15
+ selected, D3D12 heap creation required more VRAM than available, and renderdoc
16
+ returned `E_INVALIDARG`.
17
+
18
+ The same fall-through also affects the remote-replay call site at line 368, which
19
+ additionally never passes `sd` to the helper, so even the Vulkan path was silently
20
+ bypassed on every remote replay.
21
+
22
+ ## Design
23
+
24
+ ### 1. D3D12 structured-data matching
25
+
26
+ Walk the capture's structured data looking for chunks whose name contains
27
+ `DriverInit`, `EnumAdapters`, or `CreateDXGIFactory`. Inside each matching chunk
28
+ descend into child objects to find a child named `AdapterDesc` and within it a
29
+ string field named `Description` or `DeviceName`. Perform a case-insensitive
30
+ substring match of that string against `gpu.name`. Return the first GPU that
31
+ matches.
32
+
33
+ ### 2. Vendor-preference fallback
34
+
35
+ When no structured-data chunk produces a match, filter out Software/WARP adapters
36
+ (`renderdoc.GPUVendor.Software`), then rank remaining GPUs by vendor:
37
+ nVidia > AMD > Intel. Return the highest-ranked GPU, or the first non-Software GPU
38
+ if no ranked match exists.
39
+
40
+ ### 3. Single-GPU short-circuit
41
+
42
+ If `len(gpus) == 1` return that GPU immediately without inspecting structured data.
43
+
44
+ ### 4. Signature and call-site corrections
45
+
46
+ Pass `rd` (the renderdoc module) into `_match_capture_gpu()` so that
47
+ `GPUVendor` enum values are accessible without a module-level import assumption.
48
+ Update the remote-replay call site (line 368) to pass `sd` in addition to `rd`,
49
+ matching the local-replay call site.
50
+
51
+ ## Spec Delta
52
+
53
+ A new scenario "Multi-GPU capture replay" should be appended under the existing
54
+ **Requirement: Replay lifecycle** section in `openspec/specs/daemon/spec.md`:
55
+
56
+ ```
57
+ #### Scenario: Multi-GPU capture replay
58
+ - WHEN the capture was taken on a multi-GPU system
59
+ - AND multiple GPUs are available for replay
60
+ - THEN the daemon selects the GPU whose name matches structured-data adapter
61
+ metadata extracted from the capture
62
+ - AND if no structured-data match exists, Software/WARP adapters are excluded
63
+ and the highest-ranked discrete GPU is preferred (nVidia > AMD > Intel)
64
+ - AND a single available GPU is always returned directly without inspection
65
+ ```
66
+
67
+ This proposal targets that scenario. The spec file itself is not modified here;
68
+ the delta is applied in the implementing task (see `tasks.md`).
69
+
70
+ ## Files Changed
71
+
72
+ - `src/rdc/daemon_server.py` — `_match_capture_gpu` body; call sites at lines 223
73
+ and 368
74
+ - `tests/unit/test_daemon_server_unit.py` — new unit tests (see `test-plan.md`)
75
+
76
+ ## Risks
77
+
78
+ - The exact D3D12 chunk name (`DriverInit` / `EnumAdapters` / `CreateDXGIFactory`)
79
+ has not been confirmed against a real renderdoc 1.42 D3D12 capture. The matching
80
+ uses substring search rather than exact equality as a defensive measure; a real
81
+ capture should be obtained from the issue reporter for verification before merge.
82
+ - `renderdoc.GPUVendor.nVidia` uses a lower-case `n`. Attribute access should use
83
+ `getattr(rd.GPUVendor, "nVidia", 4)` with an integer fallback to avoid
84
+ `AttributeError` on builds where the spelling differs.
85
+ - The Vulkan low-VRAM edge case (structured-data match returns a GPU that has less
86
+ VRAM than required) is not addressed here; the fix only corrects selection
87
+ behaviour and does not validate VRAM sufficiency.
88
+ - Integration testing on Linux is not possible without Windows D3D12 multi-GPU
89
+ hardware. The unit tests use mocks. Full verification must be performed by the
90
+ issue reporter on their machine.
@@ -0,0 +1,10 @@
1
+ # Fix #225: Tasks
2
+
3
+ - [ ] `daemon_server.py`: add D3D12 structured-data matching to `_match_capture_gpu` (walk `DriverInit`/`EnumAdapters`/`CreateDXGIFactory` chunks, match `AdapterDesc.Description`/`DeviceName` against `gpu.name`)
4
+ - [ ] `daemon_server.py`: add vendor-preference fallback (drop Software/WARP, prefer nVidia > AMD > Intel via `getattr` on `rd.GPUVendor`)
5
+ - [ ] `daemon_server.py`: add single-GPU short-circuit at top of `_match_capture_gpu`
6
+ - [ ] `daemon_server.py`: add `rd` parameter to `_match_capture_gpu` signature; update both call sites (lines 223 and 368)
7
+ - [ ] `daemon_server.py`: pass `sd` at the remote-replay call site (line 368)
8
+ - [ ] `openspec/specs/daemon/spec.md`: append "Multi-GPU capture replay" scenario under **Requirement: Replay lifecycle**
9
+ - [ ] `tests/unit/test_daemon_server_unit.py`: implement all 8 unit test cases from `test-plan.md`
10
+ - [ ] `pixi run lint && pixi run test` passes
@@ -0,0 +1,33 @@
1
+ # Fix #225: Test Plan
2
+
3
+ ## Unit tests — `tests/unit/test_daemon_server_unit.py`
4
+
5
+ - [ ] `test_single_gpu_returns_it` — given `len(gpus) == 1` with any `sd` value
6
+ (including `None`), assert that GPU is returned without inspecting structured data
7
+
8
+ - [ ] `test_vulkan_match_by_devicename` — regression guard for the existing Vulkan
9
+ path; mock structured data containing a `vkEnumeratePhysicalDevices` chunk with a
10
+ `DeviceName` field matching one of two GPU names; assert the matching GPU is
11
+ returned
12
+
13
+ - [ ] `test_d3d12_match_via_driverinit_adapterdesc` — mock structured data with a
14
+ `DriverInit` chunk whose `AdapterDesc` child has a `Description` field matching
15
+ one GPU among three (iGPU, discrete, WARP); assert the discrete GPU is returned
16
+
17
+ - [ ] `test_d3d12_fallback_skips_warp_prefers_nvidia` — no structured-data match;
18
+ three GPUs with vendors Software (WARP), AMD (iGPU), nVidia (discrete); assert
19
+ the nVidia GPU is returned
20
+
21
+ - [ ] `test_d3d12_fallback_amd_over_intel` — no structured-data match; vendors
22
+ [Intel, AMD, Software]; assert the AMD GPU is returned
23
+
24
+ - [ ] `test_no_structured_data_uses_fallback_not_gpu0` — `sd=None`; two GPUs in
25
+ order [AMD iGPU, NVIDIA discrete]; assert NVIDIA is returned, reproducing the
26
+ literal issue #225 scenario (iGPU was previously returned as `gpus[0]`)
27
+
28
+ - [ ] `test_empty_gpu_list_returns_none` — `gpus=[]`; assert return value is `None`
29
+ (no exception raised)
30
+
31
+ - [ ] `test_remote_replay_passes_sd` — mock the `_match_capture_gpu` call site at
32
+ the remote-replay path (line 368); assert it is invoked with a non-`None` `sd`
33
+ argument when structured data is available
@@ -0,0 +1,95 @@
1
+ # OpenSpec: issue-224-cbuffer-export
2
+
3
+ ## Summary
4
+
5
+ Expose `rdc cbuffer` as a first-class CLI command with decoded JSON output and optional
6
+ raw binary export (`--raw`).
7
+
8
+ ## Context and Motivation
9
+
10
+ OpenSpec phase2-buffer-decode (archived 2026-02-19) originally planned three CLI commands:
11
+ `rdc cbuffer`, `rdc vbuffer`, and `rdc ibuffer`. The daemon handler `cbuffer_decode` and its
12
+ VFS route shipped in that phase. The CLI half — `rdc cbuffer` — was never implemented.
13
+ This change completes that unshipped work.
14
+
15
+ GitHub issue #224 (part 2) tracks the gap. Users who rely on `rdc buffer --raw` for raw bytes
16
+ have no ergonomic path to decoded constant-buffer variables without constructing VFS paths
17
+ manually.
18
+
19
+ **Scope note:** The archived phase2-buffer-decode plan envisioned `rdc cbuffer` as a thin VFS
20
+ `cat` wrapper; this change implements a richer direct command with decoded JSON output, a new
21
+ `cbuffer_raw` handler, and a new VFS `leaf_bin` route — reviewers should not expect a pure VFS
22
+ wrapper.
23
+
24
+ ## Design
25
+
26
+ ### New command: `rdc cbuffer`
27
+
28
+ ```
29
+ rdc cbuffer [EID] --stage [vs|hs|ds|gs|ps|cs] --set N --binding N [--json] [--raw -o file.bin]
30
+ ```
31
+
32
+ - `EID`: optional; resolved via `complete_eid` if omitted (matches existing `rdc buffer` pattern).
33
+ - `--stage`: default `ps`.
34
+ - `--set`: default `0`.
35
+ - `--binding`: default `0`.
36
+ - `--json`: emit decoded variables as JSON (default output mode).
37
+ - `--raw -o file.bin`: export the raw constant-buffer bytes to a file.
38
+
39
+ ### Decoded path
40
+
41
+ Calls the existing `cbuffer_decode` daemon handler unchanged. Returns
42
+ `{"eid", "set", "binding", "variables": [{name, type, value}, ...]}` and writes it via
43
+ `write_json`. No daemon changes required for this path.
44
+
45
+ ### Raw path
46
+
47
+ Adds a new `cbuffer_raw` daemon handler in `handlers/buffer.py`. The handler repeats the
48
+ reflection lookup (`fixedBindSetOrSpace` / `fixedBindNumber`), obtains
49
+ `GetConstantBlock(...).descriptor`, calls `controller.GetBufferData(resource, byteOffset,
50
+ byteSize)`, writes the bytes to `state.temp_dir/cbuffer_<eid>_<set>_<binding>.bin`, and
51
+ returns `{"path", "size"}`.
52
+
53
+ The handler is exposed as a VFS `leaf_bin` route at
54
+ `/draws/<eid>/cbuffer/<set>/<binding>/data` in `vfs/router.py`, mirroring the way `buf_raw`
55
+ is wired at `/buffers/<id>/data`. The CLI calls
56
+ `_export_vfs_path(f"/draws/{eid}/cbuffer/{set}/{binding}/data", output, raw)` (from
57
+ `commands/export.py`), which follows the same `vfs_ls` + `resolve_path` → `_deliver_binary`
58
+ flow used by `rdc buffer --raw`. `_deliver_binary` (vfs.py:216) is the final delivery
59
+ step — it calls `call(match.handler, match.args)` through the VFS resolve layer; it is NOT
60
+ a standalone "call handler, get path, write bytes" helper invoked directly.
61
+
62
+ The `hasattr(pipe_state, "GetConstantBlock")` guard present in `cbuffer_decode` is preserved
63
+ in `cbuffer_raw` for RenderDoc version drift safety.
64
+
65
+ ### New source file
66
+
67
+ `src/rdc/commands/cbuffer.py` — registered in `src/rdc/cli.py` adjacent to `buffer_cmd`
68
+ (~line 138).
69
+
70
+ ## Risks
71
+
72
+ ### Non-buffer-backed constant buffers
73
+
74
+ `ConstantBlock.bufferBacked == False` for push constants (Vulkan) and D3D12 root constants.
75
+ These have no backing buffer resource; `GetBufferData` would operate on a null resource.
76
+
77
+ Defined behavior: `--raw` MUST return a JSON-RPC error with a descriptive message
78
+ (e.g. `"cbuffer is not buffer-backed (push constant or root constant)"`) rather than crash
79
+ or silently return zero bytes. Decoded `--json` output is unaffected and continues to work
80
+ via `GetCBufferVariableContents`.
81
+
82
+ ### D3D12 root constants / register spaces
83
+
84
+ The `fixedBindSetOrSpace` / `fixedBindNumber` mapping for D3D12 root constants cannot be
85
+ verified on this Linux development machine. The Vulkan (vkcube) integration test exercises
86
+ the buffer-backed path only. Behavior on D3D12 root-constant captures is verified by
87
+ reporter @Misaka-Mikoto-Tech on real D3D12 hardware after the PR ships.
88
+
89
+ ### `_extract_value` type coverage (optional improvement)
90
+
91
+ The existing `_extract_value` helper (`buffer.py:163-173`) handles only `f32v` members;
92
+ integer and unsigned-integer shader variables degrade silently. `_flatten_shader_var`
93
+ in `handlers/_helpers.py` already handles `u32v`/`s32v` and is used by `shader_constants`.
94
+ Switching `cbuffer_decode` to use `_flatten_shader_var` is an optional polish step; it does
95
+ not block this change but is tracked as a separate optional task.
@@ -0,0 +1,40 @@
1
+ ## ADDED Requirements
2
+
3
+ ### Requirement: Constant Buffer Raw Export
4
+ The daemon SHALL expose a handler to export raw constant-buffer bytes to a temporary file.
5
+
6
+ #### Scenario: Export buffer-backed constant buffer
7
+ - **WHEN** client requests `cbuffer_raw` with `eid`, `set`, `binding`, and `stage`
8
+ - **THEN** daemon resolves the constant block via `fixedBindSetOrSpace` / `fixedBindNumber`,
9
+ calls `GetBufferData(resource, byteOffset, byteSize)`, writes bytes to
10
+ `state.temp_dir/cbuffer_<eid>_<set>_<binding>.bin`, and returns `{"path", "size"}`.
11
+ - **IF** `state.adapter` is None, return error -32002.
12
+ - **IF** `eid` is not a valid draw event, return error.
13
+
14
+ #### Scenario: Reject non-buffer-backed constant buffer
15
+ - **WHEN** client requests `cbuffer_raw` and `ConstantBlock.bufferBacked == False`
16
+ - **THEN** daemon returns a JSON-RPC error with a message indicating the cbuffer is not
17
+ buffer-backed (push constant or root constant) and does not write any file.
18
+
19
+ #### Scenario: RenderDoc version guard
20
+ - **WHEN** `GetConstantBlock` is not present on the pipeline state object
21
+ - **THEN** daemon returns an error indicating the API is unavailable on this RenderDoc version.
22
+
23
+ ### Requirement: Constant Buffer CLI Command
24
+ The CLI SHALL expose `rdc cbuffer` as a first-class command for decoded and raw export.
25
+
26
+ #### Scenario: Decoded JSON output
27
+ - **WHEN** user runs `rdc cbuffer [EID] --stage STAGE --set N --binding N`
28
+ - **THEN** CLI calls `cbuffer_decode` handler and writes the JSON response to stdout.
29
+ - **IF** `EID` is omitted, CLI resolves it via `complete_eid`.
30
+
31
+ #### Scenario: Raw binary export
32
+ - **WHEN** user runs `rdc cbuffer [EID] --raw -o FILE`
33
+ - **THEN** CLI resolves the VFS path `/draws/<eid>/cbuffer/<set>/<binding>/data` via
34
+ `_export_vfs_path` (vfs_ls + resolve_path → _deliver_binary), exactly mirroring how
35
+ `rdc buffer --raw` uses `/buffers/<id>/data`, and writes bytes to `FILE`.
36
+ - **IF** `-o` is not specified alongside `--raw`, CLI exits with a usage error.
37
+
38
+ #### Scenario: No active session
39
+ - **WHEN** user runs `rdc cbuffer` and no daemon session is active
40
+ - **THEN** CLI exits with code 1 and prints an error message to stderr.
@@ -0,0 +1,47 @@
1
+ # Tasks: issue-224-cbuffer-export
2
+
3
+ ## Phase A: Mock API additions
4
+
5
+ - [ ] Add `GetBufferData` stub to `mock_renderdoc.py` (anchor: ~line 1356 `GetConstantBlock`).
6
+ The happy-path test must give the mock `Descriptor` (returned via
7
+ `GetConstantBlock(...).descriptor`) a non-null `resource`, `byteOffset`, and `byteSize` —
8
+ these are the fields the raw-path handler keys off (`buffer.py:143-147`).
9
+ - [ ] Add `bufferBacked=False` variant to the mock `ConstantBlock` for the push-constant
10
+ clean-error test; this stubs the reflection-level field used to reject non-buffer-backed
11
+ cbuffers before `GetBufferData` is called.
12
+
13
+ ## Phase B: `cbuffer_raw` daemon handler (tests first)
14
+
15
+ - [ ] Extend `tests/unit/test_buffer_decode.py` with `cbuffer_raw` cases (happy path,
16
+ `bufferBacked=False` error, no-adapter guard)
17
+ - [ ] Implement `cbuffer_raw` handler in `src/rdc/handlers/buffer.py` (~line 370,
18
+ adjacent to `HANDLERS` dict)
19
+ - [ ] Register `cbuffer_raw` in `HANDLERS`
20
+ - [ ] Add VFS `leaf_bin` route for `/draws/<eid>/cbuffer/<set>/<binding>/data` →
21
+ `cbuffer_raw` in `src/rdc/vfs/router.py`, mirroring
22
+ `/buffers/<id>/data` → `buf_raw` (router.py:184)
23
+ - [ ] Verify handler unit tests pass
24
+
25
+ ## Phase C: `rdc cbuffer` CLI command (tests first)
26
+
27
+ - [ ] Write `tests/unit/test_cbuffer_commands.py` (JSON mode, `--raw -o`, no-session error,
28
+ `complete_eid` fallback, `--raw` without `-o` usage error)
29
+ - [ ] Implement `src/rdc/commands/cbuffer.py`; raw path calls
30
+ `_export_vfs_path(f"/draws/{eid}/cbuffer/{set}/{binding}/data", output, raw)` from
31
+ `commands/export.py` — no direct handler dispatch
32
+ - [ ] Register `cbuffer_cmd` in `src/rdc/cli.py` (~line 138, adjacent to `buffer_cmd`)
33
+ - [ ] Verify CLI unit tests pass
34
+
35
+ ## Phase D: Integration + verification
36
+
37
+ - [ ] Extend `tests/integration/test_daemon_handlers_real.py` with `@pytest.mark.gpu`
38
+ tests for `cbuffer_raw` (Vulkan vkcube capture)
39
+ - [ ] Run `pixi run lint && pixi run test` — all pass, coverage ≥ 80% for new paths
40
+ - [ ] Run GPU integration tests against real capture — pass
41
+ - [ ] Code review
42
+
43
+ ## Phase E: Optional polish (non-blocking)
44
+
45
+ - [ ] Switch `cbuffer_decode` to use `_flatten_shader_var` from `handlers/_helpers.py`
46
+ instead of `_extract_value` to fix int/uint member degradation
47
+ - [ ] Extend `test_buffer_decode.py` with int/uint value assertions
@@ -0,0 +1,78 @@
1
+ # Test Plan: issue-224-cbuffer-export
2
+
3
+ ## Scope
4
+
5
+ ### In scope
6
+ - New daemon handler `cbuffer_raw` (unit + integration)
7
+ - New CLI command `rdc cbuffer` (unit: JSON mode, raw mode, error paths)
8
+ - `bufferBacked == False` error path for `cbuffer_raw`
9
+ - Optional: `_extract_value` int/uint coverage in `test_buffer_decode.py`
10
+
11
+ ### Out of scope
12
+ - Existing `cbuffer_decode` handler correctness (covered by prior test suite)
13
+ - `rdc vbuffer` / `rdc ibuffer` (separate issue)
14
+ - D3D12 root-constant register-space mapping (cannot run on this Linux box; deferred to reporter verification)
15
+
16
+ ## Test Matrix
17
+
18
+ | Layer | Test Type | File |
19
+ |-------|-----------|------|
20
+ | Unit | `cbuffer_raw` handler (mock) | `tests/unit/test_buffer_decode.py` (extend) |
21
+ | Unit | `rdc cbuffer` CLI command | `tests/unit/test_cbuffer_commands.py` (new) |
22
+ | Integration | real capture decoded + raw | `tests/integration/test_daemon_handlers_real.py` (extend) |
23
+
24
+ ## Cases
25
+
26
+ ### `cbuffer_raw` handler (extend `test_buffer_decode.py`)
27
+
28
+ - **Happy path**: mock `GetConstantBlock` returns a buffer-backed descriptor (`bufferBacked=True`,
29
+ known `byteOffset`/`byteSize`); mock `GetBufferData` returns 16 known bytes.
30
+ Assert response contains `{"path": "...", "size": 16}` and the temp file exists with the
31
+ expected bytes.
32
+ - **bufferBacked=False**: mock `GetConstantBlock` returns `bufferBacked=False`.
33
+ Assert the handler returns a JSON-RPC error (code -32602 or equivalent) with a message
34
+ containing `"not buffer-backed"`. Assert no temp file is created.
35
+ - **No adapter**: `state.adapter is None` → assert error -32002 (standard no-adapter guard).
36
+ - **Missing eid**: invalid `eid` → assert error from `SetFrameEvent`.
37
+
38
+ Mock anchor: `mock_renderdoc.py` `GetConstantBlock` (~line 1356), `GetBufferData`.
39
+
40
+ ### `rdc cbuffer` CLI command (new `test_cbuffer_commands.py`)
41
+
42
+ Mirror structure of `tests/unit/test_mesh_commands.py` (monkeypatch `rdc.commands.cbuffer.call`).
43
+
44
+ - **JSON mode (default)**: monkeypatch `call("cbuffer_decode", ...)` returns
45
+ `{"eid": 10, "set": 0, "binding": 0, "variables": [{"name": "mvp", "type": "mat4", "value": [...]}]}`.
46
+ Invoke `rdc cbuffer 10 --stage ps --set 0 --binding 0`.
47
+ Assert exit code 0, stdout is valid JSON matching the payload.
48
+ - **`--json` explicit flag**: same as above with `--json` flag; assert identical output.
49
+ - **`--raw -o file.bin`**: monkeypatch `call("cbuffer_raw", ...)` returns `{"path": "/tmp/cbuffer_10_0_0.bin", "size": 16}`;
50
+ monkeypatch binary delivery (`_deliver_binary` / `fetch_remote_file`).
51
+ Assert exit code 0, output file contains the expected bytes.
52
+ - **No session**: `call` raises connection error → assert exit code 1, message on stderr.
53
+ - **`--raw` without `-o`**: assert exit code non-zero with usage error on stderr.
54
+ - **EID omitted**: monkeypatch `complete_eid` returns `42`; assert the handler is called with `eid=42`.
55
+
56
+ ### Integration (`test_daemon_handlers_real.py`, `@pytest.mark.gpu`)
57
+
58
+ Extend analogous to `test_cbuffer_decode_returns_data` (~line 1965), using a vkcube/Vulkan
59
+ capture with a known draw EID that has a buffer-backed cbuffer.
60
+
61
+ - **`cbuffer_raw` returns file**: call `cbuffer_raw` with valid `eid`/`set`/`binding`.
62
+ Assert response contains `path` and `size > 0`; assert temp file exists and `size` matches
63
+ `os.path.getsize(path)`.
64
+ - **`cbuffer_decode` + `cbuffer_raw` size agreement**: decoded `variables` total byte footprint
65
+ is consistent with the raw `size`.
66
+
67
+ ## Assertions (all tests)
68
+
69
+ - Exit code 0 on success, non-zero on error.
70
+ - JSON output: valid JSON, `variables` array present for decoded mode.
71
+ - Raw output: file written at `-o` path, byte count matches `size` from handler.
72
+ - Error messages go to stderr; stdout is empty on error.
73
+ - `bufferBacked=False` produces an error message containing `"not buffer-backed"` (case-insensitive).
74
+
75
+ ## Coverage Gate
76
+
77
+ CI enforces ≥ 80% line coverage for `src/rdc/commands/cbuffer.py` and the new
78
+ `cbuffer_raw` code path in `src/rdc/handlers/buffer.py`.
@@ -0,0 +1,95 @@
1
+ # OpenSpec: issue-224-vsin-mesh
2
+
3
+ ## Summary
4
+
5
+ Expose vertex shader input (VS-In) mesh geometry through the existing `rdc mesh` CLI command
6
+ and the underlying daemon mesh handler.
7
+
8
+ ## Motivation
9
+
10
+ The `rdc mesh` command currently supports `--stage vs-out` and `--stage gs-out` but not
11
+ `--stage vs-in`. VS-In corresponds to `MeshDataStage.VSIn = 0` in the RenderDoc API and
12
+ represents the raw per-vertex data fed to the Input Assembler — the most common geometry
13
+ inspection target for artists and tools debugging vertex attribute issues.
14
+
15
+ This change completes part of the unshipped geometry export plan from archived
16
+ `openspec/changes/archive/2026-02-19-phase2-buffer-decode`.
17
+
18
+ **Premise correction (adversarial review, 2026-05-15).** An earlier draft of this
19
+ proposal asserted that `_handle_mesh_data` and the OBJ-export path were "already generic;
20
+ only the stage map and the CLI option list need extending" and that "no changes needed
21
+ below the map". **That premise is RETRACTED.** Cross-checking against RenderDoc's official
22
+ `decode_mesh.py` reference revealed three correctness defects that are masked for
23
+ `vs-out`/`gs-out` (where `baseVertex == 0` and the position attribute is element 0) but
24
+ break `vs-in`:
25
+
26
+ 1. `mesh.baseVertex` was never applied to decoded indices. RenderDoc's reference adds
27
+ `mesh.baseVertex` to every index. For base-vertex `vs-in` draws the decoded mesh was
28
+ wrong; for `vs-out`/`gs-out` it is a no-op (`baseVertex == 0`).
29
+ 2. The position was read at `i*stride` (start of the interleaved vertex) instead of
30
+ `i*stride + mesh.vertexByteOffset`, so `vs-in` positions were wrong whenever POSITION
31
+ is not the first element of the vertex.
32
+ 3. Index-buffer width is honored from `mesh.indexByteStride` (16-bit vs 32-bit), matching
33
+ the reference; this is now covered by explicit regression tests.
34
+
35
+ The fix applies `baseVertex` and `vertexByteOffset` uniformly (not stage-special-cased),
36
+ exactly as the reference does, with a regression test asserting `vs-out` behavior is
37
+ unchanged.
38
+
39
+ ## Design
40
+
41
+ ### Daemon layer
42
+
43
+ `_MESH_STAGE_MAP` in `buffer.py` maps CLI stage strings to `MeshDataStage` integer values.
44
+ Add `"vs-in": 0` alongside the existing `"vs-out": 1` and `"gs-out": 2` entries.
45
+
46
+ The decode path calls `GetPostVSData(instance, view, stage_int)` and decodes the returned
47
+ `MeshFormat`. The decoder is corrected to match RenderDoc's `decode_mesh.py` reference:
48
+ indices are offset by `mesh.baseVertex`, the position attribute is read at
49
+ `i*stride + mesh.vertexByteOffset`, and the index width follows `mesh.indexByteStride`.
50
+ These corrections are applied uniformly across all stages (no stage special-casing); they
51
+ are no-ops for `vs-out`/`gs-out` where `baseVertex == 0` and the position is element 0.
52
+
53
+ The error string at the invalid-stage guard (~buffer.py:283) currently reads
54
+ `"invalid stage <name>; use vs-out or gs-out"`. This change must update that string to
55
+ include `vs-in` so callers see a consistent list of valid values.
56
+
57
+ ### CLI layer
58
+
59
+ The `--stage` Click `Choice` in `mesh_cmd` (`mesh.py`) hardcodes `["vs-out", "gs-out"]`.
60
+ Add `"vs-in"` as a valid choice. No other CLI logic changes.
61
+
62
+ ## Risks and Limitations
63
+
64
+ - **Non-draw events**: `GetPostVSData(VSIn)` returns an empty `MeshFormat` (zero
65
+ `vertexResourceId` / `vertexByteStride`) for compute or non-draw events. The existing
66
+ guard at ~buffer.py:293 returns JSON-RPC error `-32001` `"no PostVS data at this event"`
67
+ in this case — identical to the contract `vs-out` and `gs-out` already have. No
68
+ silent-empty path exists; behavior is consistent across all three stages.
69
+
70
+ ### What vs-in supports
71
+
72
+ - **Position geometry**: the single position attribute described by `mesh.format`,
73
+ located at `mesh.vertexByteOffset` within the interleaved vertex stride. Decoded
74
+ positions are `vertexByteOffset`-correct.
75
+ - **Triangle connectivity**: `TriangleList` / `TriangleStrip` / `TriangleFan`, with
76
+ indices that are `baseVertex`-correct (RenderDoc `decode_mesh` parity).
77
+
78
+ ### Known limitations (vs-in)
79
+
80
+ - **Only the position attribute is exported**, not full per-attribute IA. Other vertex
81
+ attributes (normals, UVs, colors) are not decoded. The lower-level fallback
82
+ (`GetVertexInputs` / `GetVBuffers` / `GetIBuffer`) for full per-attribute IA decoding is
83
+ explicitly out of scope for this change.
84
+ - **Packed / non-float position formats are unsupported**: the decoder only handles
85
+ 1/2/4-byte float-style components; packed formats (e.g. `R10G10B10A2`, SNORM/UNORM
86
+ integer-packed) are not decoded.
87
+ - **Non-triangle topology exports vertices only**: `LineList`, `PointList`, patch and
88
+ adjacency topologies produce no OBJ faces. Rather than silently emitting an empty/
89
+ face-less OBJ, the CLI now prints a clear stderr warning naming the topology
90
+ (e.g. `mesh: topology 'PatchList_3' has no OBJ face mapping; exported N vertices,
91
+ 0 faces`) so geometry loss is never silent.
92
+
93
+ - **D3D12 on Linux**: This development box runs Linux; D3D12 captures cannot be exercised
94
+ locally. Verification follows the established model: ship the change, reporter
95
+ (@Misaka-Mikoto-Tech) verifies against real D3D12 captures (same approach as PR #226).
@@ -0,0 +1,40 @@
1
+ ## ADDED Requirements
2
+
3
+ ### Requirement: VS-In Mesh Stage Support
4
+ The daemon SHALL accept `vs-in` as a valid mesh stage identifier in addition to the
5
+ existing `vs-out` and `gs-out` stages.
6
+
7
+ #### Scenario: VS-In Stage Accepted
8
+ - **WHEN** client requests `mesh_data` with `stage` equal to `"vs-in"`
9
+ - **THEN** daemon calls `GetPostVSData` with stage integer `0` (`MeshDataStage.VSIn`)
10
+ - **THEN** daemon decodes the returned `MeshFormat` using the existing geometry decode path
11
+ - **THEN** daemon returns vertex positions (and any available attributes) in OBJ format
12
+
13
+ #### Scenario: VS-In on Non-Draw Event
14
+ - **WHEN** client requests `mesh_data` with `stage` equal to `"vs-in"` for a non-draw event
15
+ (or any event where the IA/VSIn stage produced no data)
16
+ - **THEN** `GetPostVSData` returns a `MeshFormat` with zero `vertexResourceId` or zero `vertexByteStride`
17
+ - **THEN** daemon returns JSON-RPC error `-32001` with message `"no PostVS data at this event"`
18
+ - **NOTE** this is the same error contract `vs-out` and `gs-out` already have; no silent-empty
19
+ path exists
20
+
21
+ #### Scenario: Invalid Stage String
22
+ - **WHEN** client requests `mesh_data` with an unrecognized `stage` value
23
+ - **THEN** daemon returns an error response
24
+ - **AND** the error message SHALL list `vs-in`, `vs-out`, and `gs-out` as valid values
25
+ - **NOTE** the error string at ~buffer.py:283 currently omits `vs-in`; this change requires
26
+ updating it to `"invalid stage <name>; use vs-in, vs-out or gs-out"`
27
+
28
+ ## MODIFIED Requirements
29
+
30
+ ### Requirement: Mesh CLI Stage Option
31
+ The `rdc mesh` CLI command SHALL accept `vs-in` as a valid `--stage` argument.
32
+
33
+ #### Scenario: VS-In CLI Invocation
34
+ - **WHEN** user runs `rdc mesh <eid> --stage vs-in`
35
+ - **THEN** CLI forwards `stage: vs-in` to the daemon `mesh_data` handler
36
+ - **THEN** CLI writes the returned OBJ content to stdout
37
+
38
+ #### Scenario: Unknown Stage Rejected at CLI
39
+ - **WHEN** user supplies an unrecognized `--stage` value
40
+ - **THEN** Click validation rejects the input with exit code 2 before any daemon call is made
@@ -0,0 +1,31 @@
1
+ # Tasks: issue-224-vsin-mesh
2
+
3
+ ## Phase A: Mock
4
+
5
+ - [ ] Add stage int `0` entry to `GetPostVSData` mock in `tests/mocks/mock_renderdoc.py`
6
+ with a minimal `MeshFormat` (position attribute, Triangle topology, ≥3 vertices)
7
+ - [ ] Verify `tests/integration/test_mock_api_sync.py` still passes after mock change
8
+
9
+ ## Phase B: Daemon handler
10
+
11
+ - [ ] Add `"vs-in": 0` to `_MESH_STAGE_MAP` in `src/rdc/handlers/buffer.py`
12
+ - [ ] Update the invalid-stage error string (~buffer.py:283) to include `vs-in`
13
+ - [ ] Extend `tests/unit/test_buffer_decode.py`:
14
+ - happy-path test for `vs-in` stage
15
+ - empty-MeshFormat test for non-draw eid at stage `0`
16
+ - invalid-stage error message includes `vs-in`
17
+ - [ ] Run `pixi run test tests/unit/test_buffer_decode.py` — all pass
18
+
19
+ ## Phase C: CLI
20
+
21
+ - [ ] Add `"vs-in"` to `--stage` Click `Choice` in `src/rdc/commands/mesh.py`
22
+ - [ ] Extend `tests/unit/test_mesh_commands.py` with `vs-in` forwarding case
23
+ - [ ] Run `pixi run test tests/unit/test_mesh_commands.py` — all pass
24
+
25
+ ## Phase D: Integration + verification
26
+
27
+ - [ ] Extend `tests/integration/test_daemon_handlers_real.py` with `@pytest.mark.gpu`
28
+ VS-In test analogous to `test_mesh_data_real`
29
+ - [ ] Run `pixi run lint && pixi run test` — all pass, coverage ≥ 80%
30
+ - [ ] Run GPU integration test against vkcube capture — passes
31
+ - [ ] Code review