kinemotion 0.42.0__tar.gz → 0.44.0__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.

Potentially problematic release.


This version of kinemotion might be problematic. Click here for more details.

Files changed (502) hide show
  1. {kinemotion-0.42.0 → kinemotion-0.44.0}/CHANGELOG.md +26 -0
  2. {kinemotion-0.42.0 → kinemotion-0.44.0}/PKG-INFO +1 -1
  3. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/src/kinemotion_backend/logging_config.py +0 -1
  4. {kinemotion-0.42.0 → kinemotion-0.44.0}/justfile +11 -0
  5. {kinemotion-0.42.0 → kinemotion-0.44.0}/pyproject.toml +1 -1
  6. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/api.py +124 -229
  7. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/debug_overlay_utils.py +42 -9
  8. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/video_io.py +21 -9
  9. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/debug_overlay.py +48 -37
  10. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cli/test_cmj.py +71 -4
  11. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cli/test_dropjump.py +104 -0
  12. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/conftest.py +12 -8
  13. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_video_io.py +25 -2
  14. {kinemotion-0.42.0 → kinemotion-0.44.0}/uv.lock +1 -1
  15. kinemotion-0.42.0/.github/workflows/security.yml +0 -124
  16. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/README.md +0 -0
  17. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
  18. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
  19. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
  20. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
  21. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
  22. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
  23. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
  24. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
  25. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
  26. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
  27. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
  28. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
  29. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
  30. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
  31. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
  32. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
  33. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
  34. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
  35. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
  36. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
  37. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
  38. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
  39. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
  40. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
  41. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
  42. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
  43. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
  44. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
  45. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
  46. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
  47. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
  48. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
  49. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
  50. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
  51. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
  52. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
  53. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
  54. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
  55. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
  56. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
  57. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
  58. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
  59. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
  60. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
  61. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
  62. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
  63. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
  64. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
  65. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
  66. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
  67. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
  68. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
  69. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
  70. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
  71. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
  72. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
  73. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
  74. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
  75. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
  76. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/hook-quick-reference.md +0 -0
  77. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
  78. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
  79. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
  80. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
  81. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
  82. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
  83. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
  84. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
  85. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
  86. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
  87. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
  88. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
  89. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
  90. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
  91. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
  92. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
  93. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
  94. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
  95. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
  96. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
  97. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
  98. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
  99. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
  100. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
  101. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
  102. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
  103. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
  104. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
  105. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
  106. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
  107. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
  108. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
  109. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
  110. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
  111. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
  112. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
  113. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
  114. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
  115. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
  116. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
  117. {kinemotion-0.42.0 → kinemotion-0.44.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
  118. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/biomechanics-specialist.md +0 -0
  119. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/computer-vision-engineer.md +0 -0
  120. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/devops-cicd-engineer.md +0 -0
  121. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/frontend-developer.md +0 -0
  122. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/ml-data-scientist.md +0 -0
  123. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/project-manager.md +0 -0
  124. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/python-backend-developer.md +0 -0
  125. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/qa-test-engineer.md +0 -0
  126. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/agents/technical-writer.md +0 -0
  127. {kinemotion-0.42.0 → kinemotion-0.44.0}/.claude/settings.local.json +0 -0
  128. {kinemotion-0.42.0 → kinemotion-0.44.0}/.cursor/mcp.json +0 -0
  129. {kinemotion-0.42.0 → kinemotion-0.44.0}/.dockerignore +0 -0
  130. {kinemotion-0.42.0 → kinemotion-0.44.0}/.envrc +0 -0
  131. {kinemotion-0.42.0 → kinemotion-0.44.0}/.gitattributes +0 -0
  132. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  133. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  134. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  135. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/dependabot.yml +0 -0
  136. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/pull_request_template.md +0 -0
  137. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/workflows/deploy-backend.yml +0 -0
  138. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/workflows/docs.yml +0 -0
  139. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/workflows/release.yml +0 -0
  140. {kinemotion-0.42.0 → kinemotion-0.44.0}/.github/workflows/test.yml +0 -0
  141. {kinemotion-0.42.0 → kinemotion-0.44.0}/.gitignore +0 -0
  142. {kinemotion-0.42.0 → kinemotion-0.44.0}/.mcp.json +0 -0
  143. {kinemotion-0.42.0 → kinemotion-0.44.0}/.pre-commit-config.yaml +0 -0
  144. {kinemotion-0.42.0 → kinemotion-0.44.0}/.readthedocs.yml +0 -0
  145. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/.gitignore +0 -0
  146. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
  147. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
  148. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/code_style_and_conventions.md +0 -0
  149. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/current-project-architecture.md +0 -0
  150. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
  151. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/deployment-setup-complete.md +0 -0
  152. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/github-project-setup-summary.md +0 -0
  153. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/mvp-first-strategy.md +0 -0
  154. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
  155. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/project_overview.md +0 -0
  156. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/specialist-agents-routing.md +0 -0
  157. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/memories/suggested_commands.md +0 -0
  158. {kinemotion-0.42.0 → kinemotion-0.44.0}/.serena/project.yml +0 -0
  159. {kinemotion-0.42.0 → kinemotion-0.44.0}/.tool-versions +0 -0
  160. {kinemotion-0.42.0 → kinemotion-0.44.0}/.vercelignore +0 -0
  161. {kinemotion-0.42.0 → kinemotion-0.44.0}/CLAUDE.md +0 -0
  162. {kinemotion-0.42.0 → kinemotion-0.44.0}/CODE_OF_CONDUCT.md +0 -0
  163. {kinemotion-0.42.0 → kinemotion-0.44.0}/CONTRIBUTING.md +0 -0
  164. {kinemotion-0.42.0 → kinemotion-0.44.0}/Dockerfile +0 -0
  165. {kinemotion-0.42.0 → kinemotion-0.44.0}/GEMINI.md +0 -0
  166. {kinemotion-0.42.0 → kinemotion-0.44.0}/LICENSE +0 -0
  167. {kinemotion-0.42.0 → kinemotion-0.44.0}/README.md +0 -0
  168. {kinemotion-0.42.0 → kinemotion-0.44.0}/SECURITY.md +0 -0
  169. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/.dockerignore +0 -0
  170. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/.env.example +0 -0
  171. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/Dockerfile +0 -0
  172. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/README.md +0 -0
  173. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/docs/fly-deployment.md +0 -0
  174. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/docs/implementation-summary.md +0 -0
  175. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/docs/setup.md +0 -0
  176. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/docs/tests.md +0 -0
  177. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/pyproject.toml +0 -0
  178. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/src/kinemotion_backend/__init__.py +0 -0
  179. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/src/kinemotion_backend/app.py +0 -0
  180. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/src/kinemotion_backend/auth.py +0 -0
  181. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/src/kinemotion_backend/middleware.py +0 -0
  182. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/README.md +0 -0
  183. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/__init__.py +0 -0
  184. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/conftest.py +0 -0
  185. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/test_api_endpoints.py +0 -0
  186. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/test_error_handling.py +0 -0
  187. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/test_health.py +0 -0
  188. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/test_r2_integration.py +0 -0
  189. {kinemotion-0.42.0 → kinemotion-0.44.0}/backend/tests/test_validation.py +0 -0
  190. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/README.md +0 -0
  191. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/api/cmj.md +0 -0
  192. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/api/core.md +0 -0
  193. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/api/dropjump.md +0 -0
  194. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/api/overview.md +0 -0
  195. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/agents-guide.md +0 -0
  196. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/errors-findings.md +0 -0
  197. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/test-suite-review-december-2025.md +0 -0
  198. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/testing-standards.md +0 -0
  199. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/testing.md +0 -0
  200. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/type-hints.md +0 -0
  201. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/validation-plan.md +0 -0
  202. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/validation-roadmap.md +0 -0
  203. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/development/wallball-norep-detection.md +0 -0
  204. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/bulk-processing.md +0 -0
  205. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/camera-setup.md +0 -0
  206. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/cloud-run-deployment.md +0 -0
  207. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/cmj-guide.md +0 -0
  208. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
  209. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/cmj-recording-protocol.md +0 -0
  210. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/deployment-checklist.md +0 -0
  211. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/local-testing.md +0 -0
  212. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/guides/setup-issue-12.md +0 -0
  213. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/index.md +0 -0
  214. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/quick-start.md +0 -0
  215. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/reference/cloud-run-quick-reference.md +0 -0
  216. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/reference/json-output-format.md +0 -0
  217. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/reference/json-structure-comparison.md +0 -0
  218. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/reference/parameters.md +0 -0
  219. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/reference/pose-systems.md +0 -0
  220. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
  221. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/README.md +0 -0
  222. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/dois.txt +0 -0
  223. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/download.py +0 -0
  224. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/pyproject.toml +0 -0
  225. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/paper-downloader/uv.lock +0 -0
  226. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
  227. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
  228. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/README.md +0 -0
  229. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
  230. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
  231. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
  232. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
  233. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
  234. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
  235. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
  236. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
  237. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
  238. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
  239. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
  240. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
  241. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
  242. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
  243. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
  244. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
  245. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
  246. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
  247. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
  248. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
  249. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
  250. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
  251. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
  252. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
  253. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
  254. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
  255. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
  256. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
  257. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
  258. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
  259. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
  260. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
  261. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
  262. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
  263. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
  264. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
  265. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
  266. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
  267. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
  268. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
  269. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
  270. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
  271. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
  272. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
  273. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
  274. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
  275. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
  276. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
  277. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
  278. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
  279. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
  280. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
  281. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
  282. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
  283. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
  284. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
  285. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
  286. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
  287. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
  288. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
  289. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
  290. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
  291. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
  292. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
  293. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
  294. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
  295. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
  296. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
  297. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
  298. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
  299. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
  300. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
  301. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
  302. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
  303. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
  304. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
  305. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
  306. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
  307. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
  308. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
  309. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
  310. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
  311. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
  312. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
  313. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
  314. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
  315. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
  316. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
  317. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/README.md +0 -0
  318. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/STYLE_GUIDE.md +0 -0
  319. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
  320. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
  321. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
  322. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
  323. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
  324. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
  325. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
  326. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
  327. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
  328. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
  329. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
  330. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
  331. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
  332. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
  333. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
  334. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
  335. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
  336. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
  337. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
  338. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
  339. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
  340. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
  341. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
  342. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
  343. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
  344. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
  345. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
  346. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
  347. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
  348. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
  349. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
  350. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
  351. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
  352. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
  353. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
  354. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
  355. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/technical/framerate.md +0 -0
  356. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/technical/implementation-details.md +0 -0
  357. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/technical/imu-metadata.md +0 -0
  358. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/technical/real-time-analysis.md +0 -0
  359. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/technical/triple-extension.md +0 -0
  360. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/translations/es/camera-setup.md +0 -0
  361. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/validation/determinism-test.md +0 -0
  362. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/validation/known-height-validation.md +0 -0
  363. {kinemotion-0.42.0 → kinemotion-0.44.0}/docs/validation-status.md +0 -0
  364. {kinemotion-0.42.0 → kinemotion-0.44.0}/examples/bulk/README.md +0 -0
  365. {kinemotion-0.42.0 → kinemotion-0.44.0}/examples/bulk/bulk_processing.py +0 -0
  366. {kinemotion-0.42.0 → kinemotion-0.44.0}/examples/bulk/simple_example.py +0 -0
  367. {kinemotion-0.42.0 → kinemotion-0.44.0}/examples/programmatic_usage.py +0 -0
  368. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.editorconfig +0 -0
  369. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.env.example +0 -0
  370. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.gitattributes +0 -0
  371. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.gitignore +0 -0
  372. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
  373. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/.yarnrc.yml +0 -0
  374. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/README.md +0 -0
  375. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/index.html +0 -0
  376. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/package.json +0 -0
  377. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/App.tsx +0 -0
  378. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/Auth.tsx +0 -0
  379. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
  380. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
  381. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
  382. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/RecentUploads.tsx +0 -0
  383. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
  384. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
  385. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/components/UploadForm.tsx +0 -0
  386. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/hooks/useAnalysis.ts +0 -0
  387. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/hooks/useAuth.ts +0 -0
  388. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
  389. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
  390. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/index.css +0 -0
  391. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/lib/supabase.ts +0 -0
  392. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/main.tsx +0 -0
  393. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/types/api.ts +0 -0
  394. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/src/vite-env.d.ts +0 -0
  395. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/vercel.json +0 -0
  396. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/vite.config.ts +0 -0
  397. {kinemotion-0.42.0 → kinemotion-0.44.0}/frontend/yarn.lock +0 -0
  398. {kinemotion-0.42.0 → kinemotion-0.44.0}/local_dev.sh +0 -0
  399. {kinemotion-0.42.0 → kinemotion-0.44.0}/mkdocs.yml +0 -0
  400. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/.gitignore +0 -0
  401. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/README.md +0 -0
  402. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/demos/.gitignore +0 -0
  403. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/demos/README.md +0 -0
  404. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/demos/api_demo.ipynb +0 -0
  405. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/demos/batch_processing_demo.py +0 -0
  406. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/demos/sample_data/.gitkeep +0 -0
  407. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/presentation_guide.md +0 -0
  408. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/revealjs/.gitignore +0 -0
  409. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/revealjs/Makefile +0 -0
  410. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/revealjs/README.md +0 -0
  411. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/revealjs/slides.md +0 -0
  412. {kinemotion-0.42.0 → kinemotion-0.44.0}/presentation/speaker_script.md +0 -0
  413. {kinemotion-0.42.0 → kinemotion-0.44.0}/requirements-docs.txt +0 -0
  414. {kinemotion-0.42.0 → kinemotion-0.44.0}/samples/cmjs/README.md +0 -0
  415. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/README.md +0 -0
  416. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
  417. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/analyze_determinism_variance.py +0 -0
  418. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/basic-memory-utils.sh +0 -0
  419. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/debug_contact_states.py +0 -0
  420. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/debug_detection.py +0 -0
  421. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/find_unused_features.py +0 -0
  422. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/generate_test_data.py +0 -0
  423. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/optimize_detection_params.py +0 -0
  424. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/plot_cmj_velocities.py +0 -0
  425. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/plot_validation_results.py +0 -0
  426. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/plot_velocities.py +0 -0
  427. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/prepare_ground_truth.py +0 -0
  428. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/README.md +0 -0
  429. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/add-issue.sh +0 -0
  430. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/batch-set-fields.sh +0 -0
  431. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/helpers.sh +0 -0
  432. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/list.sh +0 -0
  433. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/set-field.sh +0 -0
  434. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/set-status.sh +0 -0
  435. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project/summary.sh +0 -0
  436. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/project.sh +0 -0
  437. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/setup-github-deploy.sh +0 -0
  438. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/setup-google-oauth.sh +0 -0
  439. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/setup-supabase-local.sh +0 -0
  440. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/setup-supabase-production.sh +0 -0
  441. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/test_acceleration_standing.py +0 -0
  442. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/test_determinism.sh +0 -0
  443. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/test_drop_start_debug.py +0 -0
  444. {kinemotion-0.42.0 → kinemotion-0.44.0}/scripts/validate_known_heights.py +0 -0
  445. {kinemotion-0.42.0 → kinemotion-0.44.0}/sonar-project.properties +0 -0
  446. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/__init__.py +0 -0
  447. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cli.py +0 -0
  448. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/__init__.py +0 -0
  449. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/analysis.py +0 -0
  450. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/cli.py +0 -0
  451. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
  452. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/joint_angles.py +0 -0
  453. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/kinematics.py +0 -0
  454. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
  455. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
  456. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/__init__.py +0 -0
  457. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/auto_tuning.py +0 -0
  458. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/cli_utils.py +0 -0
  459. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/determinism.py +0 -0
  460. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/experimental.py +0 -0
  461. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/filtering.py +0 -0
  462. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/formatting.py +0 -0
  463. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/metadata.py +0 -0
  464. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/pose.py +0 -0
  465. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/quality.py +0 -0
  466. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/smoothing.py +0 -0
  467. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/timing.py +0 -0
  468. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/core/validation.py +0 -0
  469. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/__init__.py +0 -0
  470. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/analysis.py +0 -0
  471. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/cli.py +0 -0
  472. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/kinematics.py +0 -0
  473. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
  474. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
  475. {kinemotion-0.42.0 → kinemotion-0.44.0}/src/kinemotion/py.typed +0 -0
  476. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/__init__.py +0 -0
  477. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cli/__init__.py +0 -0
  478. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cli/test_imports.py +0 -0
  479. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/__init__.py +0 -0
  480. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/test_analysis.py +0 -0
  481. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/test_api.py +0 -0
  482. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/test_joint_angles.py +0 -0
  483. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/test_kinematics.py +0 -0
  484. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/cmj/test_physiological_bounds.py +0 -0
  485. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/__init__.py +0 -0
  486. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_auto_tuning.py +0 -0
  487. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_filtering.py +0 -0
  488. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_formatting.py +0 -0
  489. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_metadata.py +0 -0
  490. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_pose.py +0 -0
  491. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_quality.py +0 -0
  492. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_smoothing.py +0 -0
  493. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_timing.py +0 -0
  494. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/core/test_validation.py +0 -0
  495. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/__init__.py +0 -0
  496. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
  497. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_analysis.py +0 -0
  498. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_api.py +0 -0
  499. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_contact_detection.py +0 -0
  500. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_kinematics.py +0 -0
  501. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_physiological_bounds.py +0 -0
  502. {kinemotion-0.42.0 → kinemotion-0.44.0}/tests/dropjump/test_validation_integration.py +0 -0
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  <!-- version list -->
9
9
 
10
+ ## v0.44.0 (2025-12-11)
11
+
12
+ ### Features
13
+
14
+ - Optimize debug video generation and fix logging warning
15
+ ([`619ccd5`](https://github.com/feniix/kinemotion/commit/619ccd53a4013457033749481cf6792f44529d93))
16
+
17
+
18
+ ## v0.43.0 (2025-12-11)
19
+
20
+ ### Continuous Integration
21
+
22
+ - Remove b ad workflow
23
+ ([`7584229`](https://github.com/feniix/kinemotion/commit/7584229682eb94ddf13a6becac7ad31b96d62f0f))
24
+
25
+ ### Features
26
+
27
+ - Optimize debug video generation and improve code quality
28
+ ([`81ce698`](https://github.com/feniix/kinemotion/commit/81ce698d5a0fa8dff6c20c6870a7bee52080cef0))
29
+
30
+ ### Testing
31
+
32
+ - Optimize test suite execution speed
33
+ ([`26ea210`](https://github.com/feniix/kinemotion/commit/26ea21072745ef606405b5f6f5277dd422636baf))
34
+
35
+
10
36
  ## v0.42.0 (2025-12-10)
11
37
 
12
38
  ### Documentation
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinemotion
3
- Version: 0.42.0
3
+ Version: 0.44.0
4
4
  Summary: Video-based kinematic analysis for athletic performance
5
5
  Project-URL: Homepage, https://github.com/feniix/kinemotion
6
6
  Project-URL: Repository, https://github.com/feniix/kinemotion
@@ -64,7 +64,6 @@ def setup_logging(*, json_logs: bool = False, log_level: str = "INFO") -> None:
64
64
  structlog.configure(
65
65
  processors=shared_processors
66
66
  + [
67
- structlog.processors.ExceptionRenderer(),
68
67
  structlog.dev.ConsoleRenderer(colors=True),
69
68
  ],
70
69
  wrapper_class=structlog.stdlib.BoundLogger,
@@ -1,3 +1,14 @@
1
+ # Check python sanity
2
+ python-check:
3
+ @echo "Running pyright..."
4
+ uv run pyright
5
+ (cd backend && uv run pyright)
6
+ @echo "Running ruff check and format..."
7
+ uv run ruff check --fix
8
+ uv run ruff format
9
+ (cd backend && uv run ruff check --fix)
10
+ (cd backend && uv run ruff format)
11
+
1
12
  # Clean generated and temporary files (preserves .claude/, .cursor/, .mcp.json)
2
13
  clean:
3
14
  @echo "Cleaning generated files..."
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kinemotion"
3
- version = "0.42.0"
3
+ version = "0.44.0"
4
4
  description = "Video-based kinematic analysis for athletic performance"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.13"
@@ -1,4 +1,4 @@
1
- """Public API for programmatic use of kinemotion analysis."""
1
+ "Public API for programmatic use of kinemotion analysis."
2
2
 
3
3
  import time
4
4
  from collections.abc import Callable
@@ -6,6 +6,7 @@ from concurrent.futures import ProcessPoolExecutor, as_completed
6
6
  from dataclasses import dataclass
7
7
  from pathlib import Path
8
8
 
9
+ import cv2
9
10
  import numpy as np
10
11
 
11
12
  from .cmj.analysis import compute_average_hip_position, detect_cmj_phases
@@ -37,7 +38,6 @@ from .core.smoothing import smooth_landmarks, smooth_landmarks_advanced
37
38
  from .core.timing import PerformanceTimer
38
39
  from .core.video_io import VideoProcessor
39
40
  from .dropjump.analysis import (
40
- ContactState,
41
41
  compute_average_foot_position,
42
42
  detect_ground_contact,
43
43
  find_contact_phases,
@@ -179,18 +179,26 @@ def _process_all_frames(
179
179
  verbose: bool,
180
180
  timer: PerformanceTimer | None = None,
181
181
  close_tracker: bool = True,
182
- ) -> tuple[list, list]:
182
+ target_debug_fps: float = 30.0,
183
+ max_debug_dim: int = 720,
184
+ ) -> tuple[list, list, list]:
183
185
  """Process all frames from video and extract pose landmarks.
184
186
 
187
+ Optimizes memory and speed by:
188
+ 1. Decimating frames stored for debug video (to target_debug_fps)
189
+ 2. Pre-resizing stored frames (to max_debug_dim)
190
+
185
191
  Args:
186
192
  video: Video processor to read frames from
187
193
  tracker: Pose tracker for landmark detection
188
194
  verbose: Print progress messages
189
195
  timer: Optional PerformanceTimer for measuring operations
190
196
  close_tracker: Whether to close the tracker after processing (default: True)
197
+ target_debug_fps: Target FPS for debug video (default: 30.0)
198
+ max_debug_dim: Max dimension for debug video frames (default: 720)
191
199
 
192
200
  Returns:
193
- Tuple of (frames, landmarks_sequence)
201
+ Tuple of (debug_frames, landmarks_sequence, frame_indices)
194
202
 
195
203
  Raises:
196
204
  ValueError: If no frames could be processed
@@ -199,7 +207,24 @@ def _process_all_frames(
199
207
  print("Tracking pose landmarks...")
200
208
 
201
209
  landmarks_sequence = []
202
- frames = []
210
+ debug_frames = []
211
+ frame_indices = []
212
+
213
+ # Calculate decimation and resize parameters
214
+ step = max(1, int(video.fps / target_debug_fps))
215
+
216
+ # Calculate resize dimensions maintaining aspect ratio
217
+ # Logic mirrors BaseDebugOverlayRenderer to ensure consistency
218
+ w, h = video.display_width, video.display_height
219
+ scale = 1.0
220
+ if max(w, h) > max_debug_dim:
221
+ scale = max_debug_dim / max(w, h)
222
+
223
+ debug_w = int(w * scale) // 2 * 2
224
+ debug_h = int(h * scale) // 2 * 2
225
+ should_resize = (debug_w != video.width) or (debug_h != video.height)
226
+
227
+ frame_idx = 0
203
228
 
204
229
  if timer:
205
230
  with timer.measure("pose_tracking"):
@@ -208,26 +233,54 @@ def _process_all_frames(
208
233
  if frame is None:
209
234
  break
210
235
 
211
- frames.append(frame)
236
+ # 1. Track on FULL resolution frame (preserves accuracy)
212
237
  landmarks = tracker.process_frame(frame)
213
238
  landmarks_sequence.append(landmarks)
239
+
240
+ # 2. Store frame for debug video ONLY if matches step
241
+ if frame_idx % step == 0:
242
+ # Pre-resize to save memory and later encoding time
243
+ if should_resize:
244
+ # Use simple linear interpolation for speed (debug only)
245
+ processed_frame = cv2.resize(
246
+ frame, (debug_w, debug_h), interpolation=cv2.INTER_LINEAR
247
+ )
248
+ else:
249
+ processed_frame = frame
250
+
251
+ debug_frames.append(processed_frame)
252
+ frame_indices.append(frame_idx)
253
+
254
+ frame_idx += 1
214
255
  else:
215
256
  while True:
216
257
  frame = video.read_frame()
217
258
  if frame is None:
218
259
  break
219
260
 
220
- frames.append(frame)
221
261
  landmarks = tracker.process_frame(frame)
222
262
  landmarks_sequence.append(landmarks)
223
263
 
264
+ if frame_idx % step == 0:
265
+ if should_resize:
266
+ processed_frame = cv2.resize(
267
+ frame, (debug_w, debug_h), interpolation=cv2.INTER_LINEAR
268
+ )
269
+ else:
270
+ processed_frame = frame
271
+
272
+ debug_frames.append(processed_frame)
273
+ frame_indices.append(frame_idx)
274
+
275
+ frame_idx += 1
276
+
224
277
  if close_tracker:
225
278
  tracker.close()
226
279
 
227
280
  if not landmarks_sequence:
228
281
  raise ValueError("No frames could be processed from video")
229
282
 
230
- return frames, landmarks_sequence
283
+ return debug_frames, landmarks_sequence, frame_indices
231
284
 
232
285
 
233
286
  def _apply_smoothing(
@@ -370,105 +423,15 @@ def _convert_timer_to_stage_names(
370
423
  "json_serialization": "JSON serialization",
371
424
  "debug_video_generation": "Debug video generation",
372
425
  "debug_video_reencode": "Debug video re-encoding",
426
+ "frame_rotation": "Frame rotation",
427
+ "debug_video_resize": "Debug video resizing",
428
+ "debug_video_copy": "Debug video frame copy",
429
+ "debug_video_draw": "Debug video drawing",
430
+ "debug_video_write": "Debug video encoding",
373
431
  }
374
432
  return {mapping.get(k, k): v for k, v in timer_metrics.items()}
375
433
 
376
434
 
377
- def _generate_dropjump_outputs(
378
- metrics: DropJumpMetrics,
379
- json_output: str | None,
380
- output_video: str | None,
381
- frames: list,
382
- smoothed_landmarks: list,
383
- contact_states: list[ContactState],
384
- video: VideoProcessor,
385
- verbose: bool,
386
- timer: PerformanceTimer | None = None,
387
- ) -> None:
388
- """Generate JSON and debug video outputs if requested.
389
-
390
- Args:
391
- metrics: Calculated drop jump metrics
392
- json_output: Optional path for JSON output
393
- output_video: Optional path for debug video
394
- frames: List of video frames
395
- smoothed_landmarks: Smoothed landmark sequence
396
- contact_states: Ground contact state for each frame
397
- video: Video processor with dimensions and fps
398
- verbose: Print progress messages
399
- timer: Optional PerformanceTimer for measuring operations
400
- """
401
- # Save JSON if requested
402
- if json_output:
403
- import json
404
-
405
- if timer:
406
- with timer.measure("json_serialization"):
407
- output_path = Path(json_output)
408
- metrics_dict = metrics.to_dict()
409
- json_str = json.dumps(metrics_dict, indent=2)
410
- output_path.write_text(json_str)
411
- else:
412
- output_path = Path(json_output)
413
- metrics_dict = metrics.to_dict()
414
- json_str = json.dumps(metrics_dict, indent=2)
415
- output_path.write_text(json_str)
416
-
417
- if verbose:
418
- print(f"Metrics written to: {json_output}")
419
-
420
- # Generate debug video if requested
421
- if output_video:
422
- if verbose:
423
- print(f"Generating debug video: {output_video}")
424
-
425
- if timer:
426
- with timer.measure("debug_video_generation"):
427
- with DebugOverlayRenderer(
428
- output_video,
429
- video.width,
430
- video.height,
431
- video.display_width,
432
- video.display_height,
433
- video.fps,
434
- ) as renderer:
435
- for i, frame in enumerate(frames):
436
- annotated = renderer.render_frame(
437
- frame,
438
- smoothed_landmarks[i],
439
- contact_states[i],
440
- i,
441
- metrics,
442
- use_com=False,
443
- )
444
- renderer.write_frame(annotated)
445
- # Capture re-encoding duration separately
446
- with timer.measure("debug_video_reencode"):
447
- pass # Re-encoding happens in context manager __exit__
448
- else:
449
- with DebugOverlayRenderer(
450
- output_video,
451
- video.width,
452
- video.height,
453
- video.display_width,
454
- video.display_height,
455
- video.fps,
456
- ) as renderer:
457
- for i, frame in enumerate(frames):
458
- annotated = renderer.render_frame(
459
- frame,
460
- smoothed_landmarks[i],
461
- contact_states[i],
462
- i,
463
- metrics,
464
- use_com=False,
465
- )
466
- renderer.write_frame(annotated)
467
-
468
- if verbose:
469
- print(f"Debug video saved: {output_video}")
470
-
471
-
472
435
  @dataclass
473
436
  class DropJumpVideoResult:
474
437
  """Result of processing a single drop jump video."""
@@ -583,11 +546,11 @@ def process_dropjump_video(
583
546
  )
584
547
  should_close_tracker = True
585
548
 
586
- frames, landmarks_sequence = _process_all_frames(
549
+ frames, landmarks_sequence, frame_indices = _process_all_frames(
587
550
  video, tracker, verbose, timer, close_tracker=should_close_tracker
588
551
  )
589
552
 
590
- # Analyze video characteristics and auto-tune parameters
553
+ # Auto-tune parameters
591
554
  with timer.measure("parameter_auto_tuning"):
592
555
  characteristics = analyze_video_sample(
593
556
  landmarks_sequence, video.fps, video.frame_count
@@ -731,22 +694,35 @@ def process_dropjump_video(
731
694
  if verbose:
732
695
  print(f"Generating debug video: {output_video}")
733
696
 
697
+ # Determine debug video properties from the pre-processed frames
698
+ debug_h, debug_w = frames[0].shape[:2]
699
+ if video.fps > 30:
700
+ debug_fps = video.fps / (video.fps / 30.0)
701
+ else:
702
+ debug_fps = video.fps
703
+ # Use approximate 30fps if decimated, or actual if not
704
+ if len(frames) < len(landmarks_sequence):
705
+ # Re-calculate step to get precise FPS
706
+ step = max(1, int(video.fps / 30.0))
707
+ debug_fps = video.fps / step
708
+
734
709
  if timer:
735
710
  with timer.measure("debug_video_generation"):
736
711
  with DebugOverlayRenderer(
737
712
  output_video,
738
- video.width,
739
- video.height,
740
- video.display_width,
741
- video.display_height,
742
- video.fps,
713
+ debug_w, # Encoded width = pre-resized width
714
+ debug_h, # Encoded height
715
+ debug_w, # Display width (already corrected)
716
+ debug_h, # Display height
717
+ debug_fps,
718
+ timer=timer,
743
719
  ) as renderer:
744
- for i, frame in enumerate(frames):
720
+ for frame, idx in zip(frames, frame_indices, strict=True):
745
721
  annotated = renderer.render_frame(
746
722
  frame,
747
- smoothed_landmarks[i],
748
- contact_states[i],
749
- i,
723
+ smoothed_landmarks[idx],
724
+ contact_states[idx],
725
+ idx,
750
726
  metrics,
751
727
  use_com=False,
752
728
  )
@@ -757,18 +733,19 @@ def process_dropjump_video(
757
733
  else:
758
734
  with DebugOverlayRenderer(
759
735
  output_video,
760
- video.width,
761
- video.height,
762
- video.display_width,
763
- video.display_height,
764
- video.fps,
736
+ debug_w,
737
+ debug_h,
738
+ debug_w,
739
+ debug_h,
740
+ debug_fps,
741
+ timer=timer,
765
742
  ) as renderer:
766
- for i, frame in enumerate(frames):
743
+ for frame, idx in zip(frames, frame_indices, strict=True):
767
744
  annotated = renderer.render_frame(
768
745
  frame,
769
- smoothed_landmarks[i],
770
- contact_states[i],
771
- i,
746
+ smoothed_landmarks[idx],
747
+ contact_states[idx],
748
+ idx,
772
749
  metrics,
773
750
  use_com=False,
774
751
  )
@@ -843,7 +820,7 @@ def process_dropjump_video(
843
820
  dur_ms = duration * 1000
844
821
  print(f"{stage:.<40} {dur_ms:>6.0f}ms ({percentage:>5.1f}%)")
845
822
  total_ms = total_time * 1000
846
- print(f"{'Total':.>40} {total_ms:>6.0f}ms (100.0%)")
823
+ print(f"{('Total'):.>40} {total_ms:>6.0f}ms (100.0%)")
847
824
  print()
848
825
  print("Analysis complete!")
849
826
 
@@ -994,95 +971,6 @@ class CMJVideoResult:
994
971
  processing_time: float = 0.0
995
972
 
996
973
 
997
- def _generate_cmj_outputs(
998
- output_video: str | None,
999
- json_output: str | None,
1000
- metrics: CMJMetrics,
1001
- frames: list,
1002
- smoothed_landmarks: list,
1003
- video_width: int,
1004
- video_height: int,
1005
- video_display_width: int,
1006
- video_display_height: int,
1007
- video_fps: float,
1008
- verbose: bool,
1009
- timer: PerformanceTimer | None = None,
1010
- ) -> None:
1011
- """Generate JSON and debug video outputs for CMJ analysis.
1012
-
1013
- Args:
1014
- output_video: Optional path for debug video output
1015
- json_output: Optional path for JSON output
1016
- metrics: Calculated CMJ metrics
1017
- frames: List of video frames
1018
- smoothed_landmarks: Smoothed landmark sequence
1019
- video_width: Video width in pixels
1020
- video_height: Video height in pixels
1021
- video_display_width: Display width considering aspect ratio
1022
- video_display_height: Display height considering aspect ratio
1023
- video_fps: Video frames per second
1024
- verbose: Print progress messages
1025
- timer: Optional PerformanceTimer for measuring operations
1026
- """
1027
- if json_output:
1028
- import json
1029
-
1030
- if timer:
1031
- with timer.measure("json_serialization"):
1032
- output_path = Path(json_output)
1033
- metrics_dict = metrics.to_dict()
1034
- json_str = json.dumps(metrics_dict, indent=2)
1035
- output_path.write_text(json_str)
1036
- else:
1037
- output_path = Path(json_output)
1038
- metrics_dict = metrics.to_dict()
1039
- json_str = json.dumps(metrics_dict, indent=2)
1040
- output_path.write_text(json_str)
1041
-
1042
- if verbose:
1043
- print(f"Metrics written to: {json_output}")
1044
-
1045
- if output_video:
1046
- if verbose:
1047
- print(f"Generating debug video: {output_video}")
1048
-
1049
- if timer:
1050
- with timer.measure("debug_video_generation"):
1051
- with CMJDebugOverlayRenderer(
1052
- output_video,
1053
- video_width,
1054
- video_height,
1055
- video_display_width,
1056
- video_display_height,
1057
- video_fps,
1058
- ) as renderer:
1059
- for i, frame in enumerate(frames):
1060
- annotated = renderer.render_frame(
1061
- frame, smoothed_landmarks[i], i, metrics
1062
- )
1063
- renderer.write_frame(annotated)
1064
- # Capture re-encoding duration separately
1065
- with timer.measure("debug_video_reencode"):
1066
- pass # Re-encoding happens in context manager __exit__
1067
- else:
1068
- with CMJDebugOverlayRenderer(
1069
- output_video,
1070
- video_width,
1071
- video_height,
1072
- video_display_width,
1073
- video_display_height,
1074
- video_fps,
1075
- ) as renderer:
1076
- for i, frame in enumerate(frames):
1077
- annotated = renderer.render_frame(
1078
- frame, smoothed_landmarks[i], i, metrics
1079
- )
1080
- renderer.write_frame(annotated)
1081
-
1082
- if verbose:
1083
- print(f"Debug video saved: {output_video}")
1084
-
1085
-
1086
974
  def process_cmj_video(
1087
975
  video_path: str,
1088
976
  quality: str = "balanced",
@@ -1177,7 +1065,7 @@ def process_cmj_video(
1177
1065
  )
1178
1066
  should_close_tracker = True
1179
1067
 
1180
- frames, landmarks_sequence = _process_all_frames(
1068
+ frames, landmarks_sequence, frame_indices = _process_all_frames(
1181
1069
  video, tracker, verbose, timer, close_tracker=should_close_tracker
1182
1070
  )
1183
1071
 
@@ -1331,19 +1219,25 @@ def process_cmj_video(
1331
1219
  if verbose:
1332
1220
  print(f"Generating debug video: {output_video}")
1333
1221
 
1222
+ # Determine debug video properties from the pre-processed frames
1223
+ debug_h, debug_w = frames[0].shape[:2]
1224
+ step = max(1, int(video.fps / 30.0))
1225
+ debug_fps = video.fps / step
1226
+
1334
1227
  if timer:
1335
1228
  with timer.measure("debug_video_generation"):
1336
1229
  with CMJDebugOverlayRenderer(
1337
1230
  output_video,
1338
- video.width,
1339
- video.height,
1340
- video.display_width,
1341
- video.display_height,
1342
- video.fps,
1231
+ debug_w,
1232
+ debug_h,
1233
+ debug_w,
1234
+ debug_h,
1235
+ debug_fps,
1236
+ timer=timer, # Passing timer here too
1343
1237
  ) as renderer:
1344
- for i, frame in enumerate(frames):
1238
+ for frame, idx in zip(frames, frame_indices, strict=True):
1345
1239
  annotated = renderer.render_frame(
1346
- frame, smoothed_landmarks[i], i, metrics
1240
+ frame, smoothed_landmarks[idx], idx, metrics
1347
1241
  )
1348
1242
  renderer.write_frame(annotated)
1349
1243
  # Capture re-encoding duration separately
@@ -1352,15 +1246,16 @@ def process_cmj_video(
1352
1246
  else:
1353
1247
  with CMJDebugOverlayRenderer(
1354
1248
  output_video,
1355
- video.width,
1356
- video.height,
1357
- video.display_width,
1358
- video.display_height,
1359
- video.fps,
1249
+ debug_w,
1250
+ debug_h,
1251
+ debug_w,
1252
+ debug_h,
1253
+ debug_fps,
1254
+ timer=timer, # Passing timer here too
1360
1255
  ) as renderer:
1361
- for i, frame in enumerate(frames):
1256
+ for frame, idx in zip(frames, frame_indices, strict=True):
1362
1257
  annotated = renderer.render_frame(
1363
- frame, smoothed_landmarks[i], i, metrics
1258
+ frame, smoothed_landmarks[idx], idx, metrics
1364
1259
  )
1365
1260
  renderer.write_frame(annotated)
1366
1261
 
@@ -1433,7 +1328,7 @@ def process_cmj_video(
1433
1328
  dur_ms = duration * 1000
1434
1329
  print(f"{stage:.<40} {dur_ms:>6.0f}ms ({percentage:>5.1f}%)")
1435
1330
  total_ms = total_time * 1000
1436
- print(f"{'Total':.>40} {total_ms:>6.0f}ms (100.0%)")
1331
+ print(f"{('Total'):.>40} {total_ms:>6.0f}ms (100.0%)")
1437
1332
  print()
1438
1333
 
1439
1334
  print(f"\nJump height: {metrics.jump_height:.3f}m")
@@ -9,6 +9,8 @@ from pathlib import Path
9
9
  import cv2
10
10
  import numpy as np
11
11
 
12
+ from .timing import PerformanceTimer
13
+
12
14
 
13
15
  def create_video_writer(
14
16
  output_path: str,
@@ -104,6 +106,7 @@ class BaseDebugOverlayRenderer:
104
106
  display_width: int,
105
107
  display_height: int,
106
108
  fps: float,
109
+ timer: PerformanceTimer | None = None,
107
110
  ):
108
111
  """
109
112
  Initialize overlay renderer.
@@ -115,16 +118,30 @@ class BaseDebugOverlayRenderer:
115
118
  display_width: Display width (considering SAR)
116
119
  display_height: Display height (considering SAR)
117
120
  fps: Frames per second
121
+ timer: Optional PerformanceTimer for measuring operations
118
122
  """
119
123
  self.output_path = output_path
120
124
  self.width = width
121
125
  self.height = height
122
- self.display_width = display_width
123
- self.display_height = display_height
126
+ self.timer = timer
127
+
128
+ # Optimize debug video resolution: Cap max dimension to 720p
129
+ # Reduces software encoding time on single-core Cloud Run instances.
130
+ # while keeping sufficient quality for visual debugging.
131
+ max_dimension = 720
132
+ if max(display_width, display_height) > max_dimension:
133
+ scale = max_dimension / max(display_width, display_height)
134
+ # Ensure dimensions are even for codec compatibility
135
+ self.display_width = int(display_width * scale) // 2 * 2
136
+ self.display_height = int(display_height * scale) // 2 * 2
137
+ else:
138
+ self.display_width = display_width
139
+ self.display_height = display_height
140
+
124
141
  # Duration of ffmpeg re-encoding (0.0 if not needed)
125
142
  self.reencode_duration_s = 0.0
126
143
  self.writer, self.needs_resize, self.used_codec = create_video_writer(
127
- output_path, width, height, display_width, display_height, fps
144
+ output_path, width, height, self.display_width, self.display_height, fps
128
145
  )
129
146
 
130
147
  def write_frame(self, frame: np.ndarray) -> None:
@@ -148,13 +165,29 @@ class BaseDebugOverlayRenderer:
148
165
 
149
166
  # Resize to display dimensions if needed (to handle SAR)
150
167
  if self.needs_resize:
151
- frame = cv2.resize(
152
- frame,
153
- (self.display_width, self.display_height),
154
- interpolation=cv2.INTER_LANCZOS4,
155
- )
168
+ if self.timer:
169
+ with self.timer.measure("debug_video_resize"):
170
+ frame = cv2.resize(
171
+ frame,
172
+ (self.display_width, self.display_height),
173
+ interpolation=cv2.INTER_LINEAR,
174
+ )
175
+ else:
176
+ frame = cv2.resize(
177
+ frame,
178
+ (self.display_width, self.display_height),
179
+ interpolation=cv2.INTER_LINEAR,
180
+ )
156
181
 
157
- write_overlay_frame(self.writer, frame, self.display_width, self.display_height)
182
+ if self.timer:
183
+ with self.timer.measure("debug_video_write"):
184
+ write_overlay_frame(
185
+ self.writer, frame, self.display_width, self.display_height
186
+ )
187
+ else:
188
+ write_overlay_frame(
189
+ self.writer, frame, self.display_width, self.display_height
190
+ )
158
191
 
159
192
  def close(self) -> None:
160
193
  """Release video writer and re-encode if possible."""