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.
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/PKG-INFO +1 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/commands.json +6 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/proposal.md +90 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/tasks.md +10 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-fix-225-d3d12-multi-gpu/test-plan.md +33 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/proposal.md +95 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/specs/daemon/spec.md +40 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/tasks.md +47 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/test-plan.md +78 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/proposal.md +95 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/specs/daemon/spec.md +40 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/tasks.md +31 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-vsin-mesh/test-plan.md +74 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/proposal.md +235 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/tasks.md +14 -0
- rdc_cli-0.5.5/openspec/changes/archive/2026-05-17-fix-225-d3d12-chunk-name/test-plan.md +232 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/daemon/spec.md +16 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-commands.py +1 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/references/commands-quick-ref.md +21 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/capture_core.py +28 -2
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/cli.py +2 -0
- rdc_cli-0.5.5/src/rdc/commands/cbuffer.py +61 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/mesh.py +14 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/daemon_server.py +215 -36
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/buffer.py +82 -7
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/capture.py +19 -14
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/remote_core.py +12 -4
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/session_service.py +2 -2
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/router.py +6 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/PKG-INFO +1 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/SOURCES.txt +16 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_daemon_handlers_real.py +31 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/mocks/mock_renderdoc.py +15 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_buffer_decode.py +377 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_core.py +34 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_handlers.py +91 -0
- rdc_cli-0.5.5/tests/unit/test_cbuffer_commands.py +132 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_server_unit.py +394 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mesh_commands.py +75 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_core.py +39 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_replay.py +165 -1
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_service.py +1 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_router.py +7 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.commitlintrc.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.githooks/pre-commit +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.githooks/pre-push +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/CODEOWNERS +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/aur.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/ci.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/commitlint.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.github/workflows/docs.yml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.gitignore +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.python-version +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/.release-please-manifest.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/CONTRIBUTING.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/LICENSE +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/Makefile +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/README.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/SECURITY.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/aur/PKGBUILD +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/aur/stable/PKGBUILD +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docker/Dockerfile +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/astro.config.mjs +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/package-lock.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/package.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/public/.nojekyll +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/public/favicon.svg +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Commands.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Demo.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Features.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Footer.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Hero.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Install.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Navbar.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Philosophy.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/Terminal.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/components/ThemeSwitcher.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/replay.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/data/stats.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/layouts/Base.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/layouts/Docs.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/ai-integration.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/commands.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/design.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/examples.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/index.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/install.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/remote.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/usage.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/docs/vfs.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/pages/index.astro +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/src/styles/global.css +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tailwind.config.mjs +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tapes/pipeline.tape +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tapes/quickstart.tape +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tests/validate.mjs +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/docs-astro/tsconfig.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/mypy.ini +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-03-bugfix-p2-batch/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/2026-03-04-w6-windows-bugfixes/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-bootstrap-foundation/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/specs/ci/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-ci-hardening/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-core-checks/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-protocol/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-daemon-transport/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-fixtures-docker/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-pixi-env/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-session-skeleton/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/design.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-18-phase0-structure-refactor/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-count-shadermap/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/proposal.md +0 -0
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-daemon-replay/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-draws-events/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-log/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-pass-detail/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/proposal.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-resources-passes/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1-shader-extended/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase1.5-vfs/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-api-fix/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-buffer-decode/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-pipeline-state/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-19-phase2-vfs-binary/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-counters/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-descriptors/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-search/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2-usage/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-aur-pkgbuild/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-aur-pkgbuild/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-cli-enhancements/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-cli-enhancements/tasks.md +0 -0
- {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
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-release-ci/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.5-release-ci/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-daemon-crash/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-daemon-crash/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-output-quality/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-output-quality/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-pipeline-extended/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-pipeline-extended/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-shader-api/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-phase2.6-shader-api/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-20-vfs-path-completion/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-daemon-startup-timeout/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-daemon-startup-timeout/tasks.md +0 -0
- {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
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-pass-detection/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-vfs-pass-consistency/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-fix-vfs-pass-consistency/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-bug-filters/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-bug-filters/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-refactor-structure/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-21-phase2.7-refactor-structure/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ai-agent-skill/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-blackbox-bug-fixes/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-bugfix-remaining-blackbox/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-ci-repo-hardening/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-code-maintainability/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-consistent-output-options/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-diff-completeness/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-design-deviation-diff-completeness/tasks.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-draws/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-framebuffer/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-infrastructure/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-pipeline/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-resources/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-diff-stats/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-docs-automation/test-plan.md +0 -0
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-image-compare/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3a-script/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-ci-assertions/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase3c-snapshot/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4a-shader-debug/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4b-shader-edit-replay/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4b-shader-edit-replay/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-mesh-export/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase4c-overlay/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-debug-thread/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-pick-pixel/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-phase5-tex-stats/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-renderdoc-build-helper/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-robustness-hardening/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-security-hardening-2/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-skill-auto-install/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-22-worktree-isolation/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-b17-eid-mutation/test-plan.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-docs-polish/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-fix-aur-build/test-plan.md +0 -0
- {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
- {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
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase-w2-build-script/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase-w2-build-script/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-phase5b-capture-unified/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-gpu-coverage/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-23-test-mock-accuracy/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-b43-b44-remote-split/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-b43-b44-remote-split/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-m-macos-support/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-m-macos-support/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r1-quick-wins/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r1-quick-wins/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r2-test-infrastructure/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-24-phase-r2-test-infrastructure/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-26-phase-r3-usability-fixes/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-26-phase-r3-usability-fixes/tasks.md +0 -0
- {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
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-design-deviation-fixes/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/proposal.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/tasks.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/changes/archive/2026-02-28-dev-install-enhancement/test-plan.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/architecture/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/ci/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/foundation/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/packaging/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/session/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/openspec/specs/tooling/spec.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pixi.lock +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pixi.toml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/pyproject.toml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/release-please-config.json +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/ruff.toml +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/build-renderdoc.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/build_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/capture_fixture.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/dev_install.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/e2e_test.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-renderdoc.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/ensure-skill-link.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-replay.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-skill-ref.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen-stats.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/gen_and_check.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup-renderdoc.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup-vulkan-samples.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup_android_tools.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/setup_vulkan_samples.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/verify-package.sh +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/scripts/verify_package.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/setup.cfg +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_build_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_platform.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_progress.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/SKILL.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_skills/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/_transport.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/adapter.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/_helpers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/android.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/assert_ci.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/assert_image.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capture.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capture_control.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/capturefile.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/counters.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/debug.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/diff.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/doctor.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/events.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/export.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/info.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/install_skill.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pick_pixel.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pipeline.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/pixel.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/remote.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/resources.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/script.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/search.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/serve.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/session.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/setup_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/shader_edit.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/snapshot.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/tex_stats.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/unix_helpers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/unused_targets.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/usage.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/commands/vfs.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/daemon_client.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/alignment.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/draws.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/framebuffer.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/pipeline.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/resources.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/stats.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/diff/summary.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/discover.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/json_fmt.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/kv.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/options.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/formatters/tsv.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/_helpers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/_types.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/capturefile.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/core.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/debug.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/descriptor.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/pipe_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/pixel.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/query.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/script.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/shader.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/shader_edit.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/texture.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/unused.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/handlers/vfs.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/image_compare.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/protocol.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/remote_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/diff_service.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/services/query_service.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/session_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/target_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/formatter.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc/vfs/tree_cache.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/dependency_links.txt +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/entry_points.txt +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/requires.txt +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/src/rdc_cli.egg-info/top_level.txt +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/conftest.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/__init__.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/blackbox_test_catalog.md +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/conftest.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/e2e_helpers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_advanced.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_assert.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_capture.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_capturefile.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_debug.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_diff.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_export.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_formats.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_presession.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_query.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_session.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_shader_edit.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/e2e/test_vfs.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles-multipass-debug.apk +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles-triangle-debug.apk +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles_android_mali.rdc +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/gles_multipass_mali.rdc +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/hello_triangle.rdc +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/vkcube.rdc +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/fixtures/vkcube_validation.rdc +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_build_renderdoc_integration.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_mock_api_sync.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_real_replay.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/integration/test_vulkan_samples.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/conftest.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_adapter.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_android_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_assert_ci_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_assert_image_command.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_binary_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_build_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capture_control.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capturefile_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_capturefile_handlers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_ci_files.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_cli.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_cli_session_flag.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_count_shadermap.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_counters_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_counters_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_crash_regression.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_output_quality.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_pipeline_extended.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_shader_api_fix.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_shader_extended.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_daemon_transport.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_debug_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_debug_handlers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_descriptors_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_dev_install.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_alignment.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_command.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_draws.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_framebuffer.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_pipeline.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_resources.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_service.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_stats.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_diff_summary.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_discover.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_doctor.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_doctor_hints.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_events_cli.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_draws_events_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_eid_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_events_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_export_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_export_overlay.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix1_draws_pass_name.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix2_vfs_intermediate_dirs.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_fix3_friendly_pass_name.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_formatters.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_formatters_kv.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_gen_skill_ref.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_handlers_remote.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_image_compare.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_info_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_install_skill.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_json_errors.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_keep_remote.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mesh_handler.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mock_capture_types.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_mock_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_open_remote.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_output_options.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_overlay_handler.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pass_deps.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pick_pixel_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pick_pixel_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_cli_phase27.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_section_routing.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_shader.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pipeline_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixel_history_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixel_history_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_pixi_files.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_platform.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_progress.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_protocol.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_query_service.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_quickfix_batch.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_setup.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_remote_status_disconnect.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_require_pipe.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resource_semantic_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resources_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_resources_filter.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_script_command.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_script_handler.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_search.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_semantic_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_serve.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_session_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_setup_renderdoc.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_setup_vulkan_samples.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_edit_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_edit_handlers.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_shader_preload.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_skill_structure.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_snapshot_command.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_split_binary.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_split_core.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_target_state.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tex_stats_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tex_stats_handler.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_tooling_files.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_unix_helpers_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_unused_targets.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_usage_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_usage_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_binary.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_commands.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_completion.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_daemon.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_formatter.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_vfs_tree_cache.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/tests/unit/test_windows_compat.py +0 -0
- {rdc_cli-0.5.4 → rdc_cli-0.5.5}/uv.lock +0 -0
|
@@ -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.
|
rdc_cli-0.5.5/openspec/changes/archive/2026-05-15-issue-224-cbuffer-export/specs/daemon/spec.md
ADDED
|
@@ -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
|