kinemotion 0.66.2__tar.gz → 0.66.4__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 (614) hide show
  1. {kinemotion-0.66.2 → kinemotion-0.66.4}/CHANGELOG.md +12 -0
  2. {kinemotion-0.66.2 → kinemotion-0.66.4}/PKG-INFO +1 -1
  3. {kinemotion-0.66.2 → kinemotion-0.66.4}/pyproject.toml +1 -1
  4. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/api.py +192 -113
  5. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/debug_overlay_utils.py +146 -131
  6. {kinemotion-0.66.2 → kinemotion-0.66.4}/uv.lock +1 -1
  7. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/README.md +0 -0
  8. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/api-reference-quick-commands.md +0 -0
  9. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
  10. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
  11. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/testing-backend-authentication-quick-reference.md +0 -0
  12. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
  13. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
  14. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
  15. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
  16. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
  17. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
  18. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
  19. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
  20. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
  21. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
  22. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
  23. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
  24. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
  25. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
  26. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
  27. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
  28. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
  29. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
  30. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
  31. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
  32. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
  33. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
  34. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
  35. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
  36. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
  37. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
  38. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
  39. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
  40. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
  41. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
  42. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
  43. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3-d-validation-status-and-pending-work.md +0 -0
  44. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
  45. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
  46. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
  47. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
  48. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
  49. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
  50. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
  51. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-granular-logging-implementation.md +0 -0
  52. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
  53. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
  54. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
  55. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
  56. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
  57. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
  58. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
  59. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
  60. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
  61. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
  62. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/database-setup-scripts-complete-implementation.md +0 -0
  63. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/development-standards-quality-gates.md +0 -0
  64. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
  65. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
  66. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
  67. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
  68. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
  69. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/feature-request-system-configuration.md +0 -0
  70. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
  71. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
  72. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
  73. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
  74. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
  75. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-configuration-audit.md +0 -0
  76. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-quick-reference.md +0 -0
  77. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/i18n-implementation-plan-for-validation-messages.md +0 -0
  78. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
  79. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
  80. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
  81. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
  82. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
  83. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
  84. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
  85. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
  86. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pyright-strict-mode-fix-patterns.md +0 -0
  87. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
  88. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/structured-logging-implementation.md +0 -0
  89. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
  90. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
  91. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-documentation-validation-december-2025.md +0 -0
  92. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
  93. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
  94. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
  95. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
  96. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
  97. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
  98. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
  99. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
  100. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
  101. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
  102. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
  103. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
  104. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
  105. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/backend-debug-video-logging-reference.md +0 -0
  106. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/debug-video-logging-complete-end-to-end-reference.md +0 -0
  107. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/kinemotion-logs-in-cloud-logging-production-analysis.md +0 -0
  108. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/kinemotion-logs-in-cloud-logging-ready.md +0 -0
  109. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/complete-solution-i-os-structured-logging.md +0 -0
  110. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/debug-video-codec-fix-and-logging-enhancement.md +0 -0
  111. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/i-phone-video-playback-issue-vp9-codec-not-supported.md +0 -0
  112. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/agent-documentation-standards-update.md +0 -0
  113. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/backend-authentication-architecture-decision.md +0 -0
  114. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/backend-authentication-implementation-complete.md +0 -0
  115. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
  116. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/i18n-documentation-cleanup-completed.md +0 -0
  117. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
  118. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
  119. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
  120. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
  121. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
  122. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
  123. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
  124. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
  125. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
  126. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
  127. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
  128. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/research/performance-improvement-analysis-30s-18s.md +0 -0
  129. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
  130. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
  131. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
  132. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
  133. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
  134. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
  135. {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
  136. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/biomechanics-specialist.md +0 -0
  137. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/computer-vision-engineer.md +0 -0
  138. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/devops-cicd-engineer.md +0 -0
  139. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/frontend-developer.md +0 -0
  140. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/ml-data-scientist.md +0 -0
  141. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/project-manager.md +0 -0
  142. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/python-backend-developer.md +0 -0
  143. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/qa-test-engineer.md +0 -0
  144. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/technical-writer.md +0 -0
  145. {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/settings.local.json +0 -0
  146. {kinemotion-0.66.2 → kinemotion-0.66.4}/.cursor/mcp.json +0 -0
  147. {kinemotion-0.66.2 → kinemotion-0.66.4}/.dockerignore +0 -0
  148. {kinemotion-0.66.2 → kinemotion-0.66.4}/.envrc +0 -0
  149. {kinemotion-0.66.2 → kinemotion-0.66.4}/.gitattributes +0 -0
  150. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  151. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  152. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  153. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/dependabot.yml +0 -0
  154. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/pull_request_template.md +0 -0
  155. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/deploy-backend.yml +0 -0
  156. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/docs.yml +0 -0
  157. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/release.yml +0 -0
  158. {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/test.yml +0 -0
  159. {kinemotion-0.66.2 → kinemotion-0.66.4}/.gitignore +0 -0
  160. {kinemotion-0.66.2 → kinemotion-0.66.4}/.mcp.json +0 -0
  161. {kinemotion-0.66.2 → kinemotion-0.66.4}/.pre-commit-config.yaml +0 -0
  162. {kinemotion-0.66.2 → kinemotion-0.66.4}/.readthedocs.yml +0 -0
  163. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/.gitignore +0 -0
  164. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
  165. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/camera-perspective-validation-study.md +0 -0
  166. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/code_style_and_conventions.md +0 -0
  167. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/current-project-architecture.md +0 -0
  168. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
  169. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/deployment-setup-complete.md +0 -0
  170. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/github-project-setup-summary.md +0 -0
  171. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/mvp-first-strategy.md +0 -0
  172. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
  173. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/project_overview.md +0 -0
  174. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/specialist-agents-routing.md +0 -0
  175. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/suggested_commands.md +0 -0
  176. {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/project.yml +0 -0
  177. {kinemotion-0.66.2 → kinemotion-0.66.4}/.tool-versions +0 -0
  178. {kinemotion-0.66.2 → kinemotion-0.66.4}/.vercelignore +0 -0
  179. {kinemotion-0.66.2 → kinemotion-0.66.4}/CLAUDE.md +0 -0
  180. {kinemotion-0.66.2 → kinemotion-0.66.4}/CODE_OF_CONDUCT.md +0 -0
  181. {kinemotion-0.66.2 → kinemotion-0.66.4}/CONTRIBUTING.md +0 -0
  182. {kinemotion-0.66.2 → kinemotion-0.66.4}/Dockerfile +0 -0
  183. {kinemotion-0.66.2 → kinemotion-0.66.4}/GEMINI.md +0 -0
  184. {kinemotion-0.66.2 → kinemotion-0.66.4}/LICENSE +0 -0
  185. {kinemotion-0.66.2 → kinemotion-0.66.4}/README.md +0 -0
  186. {kinemotion-0.66.2 → kinemotion-0.66.4}/SECURITY.md +0 -0
  187. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.coveragerc +0 -0
  188. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.dockerignore +0 -0
  189. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.env.example +0 -0
  190. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/Dockerfile +0 -0
  191. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/README.md +0 -0
  192. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/implementation-summary.md +0 -0
  193. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/setup.md +0 -0
  194. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/tests.md +0 -0
  195. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/pyproject.toml +0 -0
  196. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/__init__.py +0 -0
  197. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/analysis_api.py +0 -0
  198. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/__init__.py +0 -0
  199. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/config.py +0 -0
  200. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
  201. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
  202. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/main.py +0 -0
  203. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app.py +0 -0
  204. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/auth.py +0 -0
  205. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/database.py +0 -0
  206. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/logging_config.py +0 -0
  207. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/middleware.py +0 -0
  208. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/__init__.py +0 -0
  209. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/database.py +0 -0
  210. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/responses.py +0 -0
  211. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/storage.py +0 -0
  212. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
  213. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/analysis.py +0 -0
  214. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/database.py +0 -0
  215. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/health.py +0 -0
  216. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/platform.py +0 -0
  217. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/__init__.py +0 -0
  218. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/analysis_service.py +0 -0
  219. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
  220. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/validation.py +0 -0
  221. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/video_processor.py +0 -0
  222. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/types.py +0 -0
  223. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
  224. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
  225. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/supabase-schema.sql +0 -0
  226. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/README.md +0 -0
  227. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/__init__.py +0 -0
  228. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/conftest.py +0 -0
  229. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_api_endpoints.py +0 -0
  230. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_error_handling.py +0 -0
  231. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_health.py +0 -0
  232. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_r2_integration.py +0 -0
  233. {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_validation.py +0 -0
  234. {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/README.md +0 -0
  235. {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/annotations/.gitkeep +0 -0
  236. {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/ground_truth/.gitkeep +0 -0
  237. {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/videos/.gitkeep +0 -0
  238. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/README.md +0 -0
  239. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/cmj.md +0 -0
  240. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/core.md +0 -0
  241. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/dropjump.md +0 -0
  242. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/overview.md +0 -0
  243. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/I18N-README.md +0 -0
  244. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/agents-guide.md +0 -0
  245. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/errors-findings.md +0 -0
  246. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/feature-request-system.md +0 -0
  247. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/feedback-system-setup.md +0 -0
  248. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-architecture-diagram.md +0 -0
  249. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-cheat-sheet.md +0 -0
  250. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-quick-start-guide.md +0 -0
  251. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-summary.md +0 -0
  252. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-validation-messages-specification.md +0 -0
  253. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/supabase-database-setup.md +0 -0
  254. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/test-suite-review-december-2025.md +0 -0
  255. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/testing-standards.md +0 -0
  256. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/testing.md +0 -0
  257. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/type-hints.md +0 -0
  258. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/validation-plan.md +0 -0
  259. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/validation-roadmap.md +0 -0
  260. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/wallball-norep-detection.md +0 -0
  261. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/bulk-processing.md +0 -0
  262. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/camera-setup.md +0 -0
  263. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cloud-run-deployment.md +0 -0
  264. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-guide.md +0 -0
  265. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-recording-protocol-es.md +0 -0
  266. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-recording-protocol.md +0 -0
  267. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/deployment-checklist.md +0 -0
  268. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/local-testing.md +0 -0
  269. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/setup-issue-12.md +0 -0
  270. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/README.md +0 -0
  271. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/quickstart.md +0 -0
  272. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/scripts-reference.md +0 -0
  273. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/setup-guide.md +0 -0
  274. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/index.md +0 -0
  275. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/quick-start.md +0 -0
  276. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/cloud-run-quick-reference.md +0 -0
  277. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/json-output-format.md +0 -0
  278. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/json-structure-comparison.md +0 -0
  279. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/parameters.md +0 -0
  280. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/pose-systems.md +0 -0
  281. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
  282. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/README.md +0 -0
  283. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/dois.txt +0 -0
  284. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/download.py +0 -0
  285. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/pyproject.toml +0 -0
  286. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/uv.lock +0 -0
  287. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
  288. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
  289. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/README.md +0 -0
  290. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/convert_pdfs.py +0 -0
  291. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
  292. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
  293. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
  294. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
  295. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
  296. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
  297. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
  298. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
  299. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
  300. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
  301. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
  302. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
  303. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
  304. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
  305. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
  306. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
  307. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
  308. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
  309. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
  310. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
  311. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
  312. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
  313. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
  314. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
  315. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
  316. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
  317. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
  318. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
  319. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
  320. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
  321. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
  322. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
  323. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
  324. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
  325. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
  326. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
  327. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
  328. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
  329. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
  330. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
  331. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
  332. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/online-references-for-papers.md +0 -0
  333. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
  334. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
  335. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
  336. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
  337. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
  338. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
  339. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
  340. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
  341. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
  342. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
  343. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
  344. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
  345. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
  346. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
  347. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
  348. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
  349. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
  350. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
  351. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
  352. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
  353. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
  354. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
  355. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
  356. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
  357. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
  358. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
  359. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
  360. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
  361. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
  362. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
  363. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
  364. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
  365. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
  366. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
  367. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
  368. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
  369. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
  370. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
  371. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
  372. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
  373. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
  374. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
  375. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
  376. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
  377. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
  378. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/README.md +0 -0
  379. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/STYLE_GUIDE.md +0 -0
  380. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
  381. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
  382. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
  383. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
  384. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
  385. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
  386. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
  387. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
  388. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
  389. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
  390. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
  391. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
  392. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
  393. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
  394. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
  395. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
  396. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
  397. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
  398. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
  399. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
  400. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
  401. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
  402. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
  403. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
  404. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
  405. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
  406. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
  407. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
  408. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
  409. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
  410. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
  411. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
  412. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
  413. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
  414. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
  415. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
  416. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/framerate.md +0 -0
  417. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/implementation-details.md +0 -0
  418. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/imu-metadata.md +0 -0
  419. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/real-time-analysis.md +0 -0
  420. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/triple-extension.md +0 -0
  421. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/translations/es/camera-setup.md +0 -0
  422. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/athletepose3d-methodology.md +0 -0
  423. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/determinism-test.md +0 -0
  424. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/known-height-validation.md +0 -0
  425. {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation-status.md +0 -0
  426. {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/README.md +0 -0
  427. {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/bulk_processing.py +0 -0
  428. {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/simple_example.py +0 -0
  429. {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/programmatic_usage.py +0 -0
  430. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.editorconfig +0 -0
  431. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.env.example +0 -0
  432. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.gitattributes +0 -0
  433. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.gitignore +0 -0
  434. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
  435. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.yarnrc.yml +0 -0
  436. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/README.md +0 -0
  437. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/index.html +0 -0
  438. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/package.json +0 -0
  439. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.i18n.integration.test.tsx +0 -0
  440. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.test.tsx +0 -0
  441. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.tsx +0 -0
  442. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/Auth.test.tsx +0 -0
  443. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/Auth.tsx +0 -0
  444. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorBoundary.test.tsx +0 -0
  445. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorBoundary.tsx +0 -0
  446. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorDisplay.tsx +0 -0
  447. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeatureRequestButton.tsx +0 -0
  448. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.css +0 -0
  449. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.test.tsx +0 -0
  450. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.tsx +0 -0
  451. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.css +0 -0
  452. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.test.tsx +0 -0
  453. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.tsx +0 -0
  454. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LoadingSpinner.test.tsx +0 -0
  455. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LoadingSpinner.tsx +0 -0
  456. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/RecentUploads.test.tsx +0 -0
  457. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/RecentUploads.tsx +0 -0
  458. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
  459. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsDisplay.tsx +0 -0
  460. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsSkeleton.tsx +0 -0
  461. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/UploadForm.test.tsx +0 -0
  462. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/UploadForm.tsx +0 -0
  463. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/config/links.ts +0 -0
  464. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAnalysis.test.ts +0 -0
  465. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAnalysis.ts +0 -0
  466. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAuth.ts +0 -0
  467. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useBackendVersion.ts +0 -0
  468. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
  469. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useLanguage.test.ts +0 -0
  470. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useLanguage.ts +0 -0
  471. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useRecentUploads.ts +0 -0
  472. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/config.ts +0 -0
  473. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/en/translation.json +0 -0
  474. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/es/translation.json +0 -0
  475. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/fr/translation.json +0 -0
  476. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/index.css +0 -0
  477. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/lib/supabase.ts +0 -0
  478. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/main.tsx +0 -0
  479. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/test/setup.ts +0 -0
  480. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/types/api.ts +0 -0
  481. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/vite-env.d.ts +0 -0
  482. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/vercel.json +0 -0
  483. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/vite.config.ts +0 -0
  484. {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/yarn.lock +0 -0
  485. {kinemotion-0.66.2 → kinemotion-0.66.4}/justfile +0 -0
  486. {kinemotion-0.66.2 → kinemotion-0.66.4}/local_dev.sh +0 -0
  487. {kinemotion-0.66.2 → kinemotion-0.66.4}/mkdocs.yml +0 -0
  488. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/.gitignore +0 -0
  489. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/README.md +0 -0
  490. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/.gitignore +0 -0
  491. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/README.md +0 -0
  492. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/api_demo.ipynb +0 -0
  493. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/batch_processing_demo.py +0 -0
  494. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/sample_data/.gitkeep +0 -0
  495. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/presentation_guide.md +0 -0
  496. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/.gitignore +0 -0
  497. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/Makefile +0 -0
  498. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/README.md +0 -0
  499. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/slides.md +0 -0
  500. {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/speaker_script.md +0 -0
  501. {kinemotion-0.66.2 → kinemotion-0.66.4}/requirements-docs.txt +0 -0
  502. {kinemotion-0.66.2 → kinemotion-0.66.4}/samples/cmjs/README.md +0 -0
  503. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/README.md +0 -0
  504. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/SCRIPTS_QUICKREF.md +0 -0
  505. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/analyze_determinism_variance.py +0 -0
  506. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/PENDING.md +0 -0
  507. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/ap3d_validator.py +0 -0
  508. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/prepare_ap3d_data.py +0 -0
  509. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/validate_baseline.py +0 -0
  510. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/basic-memory-utils.sh +0 -0
  511. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/debug_contact_states.py +0 -0
  512. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/debug_detection.py +0 -0
  513. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/find_unused_features.py +0 -0
  514. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/generate_test_data.py +0 -0
  515. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/optimize_detection_params.py +0 -0
  516. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_cmj_velocities.py +0 -0
  517. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_validation_results.py +0 -0
  518. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_velocities.py +0 -0
  519. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/prepare_ground_truth.py +0 -0
  520. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/README.md +0 -0
  521. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/add-issue.sh +0 -0
  522. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/batch-set-fields.sh +0 -0
  523. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/helpers.sh +0 -0
  524. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/list.sh +0 -0
  525. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/set-field.sh +0 -0
  526. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/set-status.sh +0 -0
  527. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/summary.sh +0 -0
  528. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project.sh +0 -0
  529. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-github-deploy.sh +0 -0
  530. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-google-oauth.sh +0 -0
  531. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-supabase-local.sh +0 -0
  532. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-supabase-production.sh +0 -0
  533. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/supabasedb/setup-supabase-database.sh +0 -0
  534. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/supabasedb/setup_supabase_db.py +0 -0
  535. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_acceleration_standing.py +0 -0
  536. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_determinism.sh +0 -0
  537. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_drop_start_debug.py +0 -0
  538. {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/validate_known_heights.py +0 -0
  539. {kinemotion-0.66.2 → kinemotion-0.66.4}/sonar-project.properties +0 -0
  540. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/__init__.py +0 -0
  541. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/api.py +0 -0
  542. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cli.py +0 -0
  543. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/__init__.py +0 -0
  544. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/analysis.py +0 -0
  545. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/cli.py +0 -0
  546. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/debug_overlay.py +0 -0
  547. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/joint_angles.py +0 -0
  548. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/kinematics.py +0 -0
  549. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/metrics_validator.py +0 -0
  550. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/validation_bounds.py +0 -0
  551. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/__init__.py +0 -0
  552. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/auto_tuning.py +0 -0
  553. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/cli_utils.py +0 -0
  554. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/determinism.py +0 -0
  555. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/experimental.py +0 -0
  556. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/filtering.py +0 -0
  557. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/formatting.py +0 -0
  558. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/metadata.py +0 -0
  559. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/pipeline_utils.py +0 -0
  560. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/pose.py +0 -0
  561. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/quality.py +0 -0
  562. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/smoothing.py +0 -0
  563. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/timing.py +0 -0
  564. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/types.py +0 -0
  565. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/validation.py +0 -0
  566. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/video_io.py +0 -0
  567. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/__init__.py +0 -0
  568. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/analysis.py +0 -0
  569. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/api.py +0 -0
  570. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/cli.py +0 -0
  571. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/debug_overlay.py +0 -0
  572. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/kinematics.py +0 -0
  573. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/metrics_validator.py +0 -0
  574. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/validation_bounds.py +0 -0
  575. {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/py.typed +0 -0
  576. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/__init__.py +0 -0
  577. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/__init__.py +0 -0
  578. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_cmj.py +0 -0
  579. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_dropjump.py +0 -0
  580. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_imports.py +0 -0
  581. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/__init__.py +0 -0
  582. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_analysis.py +0 -0
  583. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_api.py +0 -0
  584. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_cli.py +0 -0
  585. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_joint_angles.py +0 -0
  586. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_kinematics.py +0 -0
  587. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_physiological_bounds.py +0 -0
  588. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/conftest.py +0 -0
  589. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/__init__.py +0 -0
  590. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_auto_tuning.py +0 -0
  591. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_cli_utils.py +0 -0
  592. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_debug_overlay_utils.py +0 -0
  593. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_filtering.py +0 -0
  594. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_formatting.py +0 -0
  595. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_metadata.py +0 -0
  596. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_pipeline_utils.py +0 -0
  597. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_pose.py +0 -0
  598. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_quality.py +0 -0
  599. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_smoothing.py +0 -0
  600. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_timing.py +0 -0
  601. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_validation.py +0 -0
  602. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_video_io.py +0 -0
  603. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/__init__.py +0 -0
  604. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_adaptive_threshold.py +0 -0
  605. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_analysis.py +0 -0
  606. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_api.py +0 -0
  607. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_cli.py +0 -0
  608. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_contact_detection.py +0 -0
  609. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_kinematics.py +0 -0
  610. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_physiological_bounds.py +0 -0
  611. {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_validation_integration.py +0 -0
  612. {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/__init__.pyi +0 -0
  613. {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/solutions/__init__.pyi +0 -0
  614. {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/solutions/pose.pyi +0 -0
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  <!-- version list -->
9
9
 
10
+ ## kinemotion-v0.66.4 (2025-12-19)
11
+
12
+ ### Refactor
13
+
14
+ - reduce cognitive complexity in debug_overlay_utils and cmj api
15
+
16
+ ## kinemotion-v0.66.3 (2025-12-19)
17
+
18
+ ### Fix
19
+
20
+ - remove duplicate 'message' parameter in _log call
21
+
10
22
  ## kinemotion-v0.66.2 (2025-12-19)
11
23
 
12
24
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kinemotion
3
- Version: 0.66.2
3
+ Version: 0.66.4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kinemotion"
3
- version = "0.66.2"
3
+ version = "0.66.4"
4
4
  description = "Video-based kinematic analysis for athletic performance"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10,<3.13"
@@ -214,6 +214,169 @@ def _create_result_metadata(
214
214
  )
215
215
 
216
216
 
217
+ def _run_pose_tracking(
218
+ video: VideoProcessor,
219
+ quality_preset: QualityPreset,
220
+ detection_confidence: float | None,
221
+ tracking_confidence: float | None,
222
+ pose_tracker: PoseTracker | None,
223
+ verbose: bool,
224
+ timer: Timer,
225
+ ) -> tuple[list[NDArray[np.uint8]], list, list[int]]:
226
+ """Initialize tracker and process all frames."""
227
+ if verbose:
228
+ print(
229
+ f"Video: {video.width}x{video.height} @ {video.fps:.2f} fps, "
230
+ f"{video.frame_count} frames"
231
+ )
232
+
233
+ det_conf, track_conf = determine_confidence_levels(
234
+ quality_preset, detection_confidence, tracking_confidence
235
+ )
236
+
237
+ if verbose:
238
+ print("Processing all frames with MediaPipe pose tracking...")
239
+
240
+ tracker = pose_tracker or PoseTracker(
241
+ min_detection_confidence=det_conf,
242
+ min_tracking_confidence=track_conf,
243
+ timer=timer,
244
+ )
245
+ should_close_tracker = pose_tracker is None
246
+
247
+ return process_all_frames(video, tracker, verbose, timer, close_tracker=should_close_tracker)
248
+
249
+
250
+ def _get_tuned_parameters(
251
+ video: VideoProcessor,
252
+ landmarks_sequence: list,
253
+ quality_preset: QualityPreset,
254
+ overrides: AnalysisOverrides | None,
255
+ verbose: bool,
256
+ timer: Timer,
257
+ ) -> AnalysisParameters:
258
+ """Analyze sample and tune parameters with expert overrides."""
259
+ with timer.measure("parameter_auto_tuning"):
260
+ characteristics = analyze_video_sample(landmarks_sequence, video.fps, video.frame_count)
261
+ params = auto_tune_parameters(characteristics, quality_preset)
262
+ params = apply_expert_overrides(
263
+ params,
264
+ overrides.smoothing_window if overrides else None,
265
+ overrides.velocity_threshold if overrides else None,
266
+ overrides.min_contact_frames if overrides else None,
267
+ overrides.visibility_threshold if overrides else None,
268
+ )
269
+
270
+ if verbose:
271
+ print_verbose_parameters(video, characteristics, quality_preset, params)
272
+
273
+ return params
274
+
275
+
276
+ def _run_kinematic_analysis(
277
+ video: VideoProcessor,
278
+ smoothed_landmarks: list,
279
+ params: AnalysisParameters,
280
+ verbose: bool,
281
+ timer: Timer,
282
+ ) -> tuple[CMJMetrics, NDArray[np.float64], NDArray[np.float64]]:
283
+ """Extract positions, detect phases, and calculate metrics."""
284
+ if verbose:
285
+ print("Extracting vertical positions (Hip and Foot)...")
286
+ with timer.measure("vertical_position_extraction"):
287
+ vertical_positions, visibilities = extract_vertical_positions(
288
+ smoothed_landmarks, target="hip"
289
+ )
290
+ foot_positions, _ = extract_vertical_positions(smoothed_landmarks, target="foot")
291
+
292
+ if verbose:
293
+ print("Detecting CMJ phases...")
294
+ with timer.measure("phase_detection"):
295
+ phases = detect_cmj_phases(
296
+ vertical_positions,
297
+ video.fps,
298
+ window_length=params.smoothing_window,
299
+ polyorder=params.polyorder,
300
+ landing_positions=foot_positions,
301
+ timer=timer,
302
+ )
303
+
304
+ if phases is None:
305
+ raise ValueError("Could not detect CMJ phases in video")
306
+
307
+ standing_end, lowest_point, takeoff_frame, landing_frame = phases
308
+
309
+ if verbose:
310
+ print("Calculating metrics...")
311
+ with timer.measure("metrics_calculation"):
312
+ velocities = compute_signed_velocity(
313
+ vertical_positions,
314
+ window_length=params.smoothing_window,
315
+ polyorder=params.polyorder,
316
+ )
317
+ metrics = calculate_cmj_metrics(
318
+ vertical_positions,
319
+ velocities,
320
+ standing_end,
321
+ lowest_point,
322
+ takeoff_frame,
323
+ landing_frame,
324
+ video.fps,
325
+ tracking_method="hip_hybrid",
326
+ )
327
+
328
+ return metrics, vertical_positions, visibilities
329
+
330
+
331
+ def _finalize_analysis_results(
332
+ metrics: CMJMetrics,
333
+ video: VideoProcessor,
334
+ video_path: str,
335
+ vertical_positions: NDArray[np.float64],
336
+ visibilities: NDArray[np.float64],
337
+ params: AnalysisParameters,
338
+ quality_preset: QualityPreset,
339
+ start_time: float,
340
+ timer: Timer,
341
+ verbose: bool,
342
+ ) -> None:
343
+ """Assess quality, validate metrics, and attach metadata."""
344
+ if verbose:
345
+ print("Assessing tracking quality...")
346
+ with timer.measure("quality_assessment"):
347
+ _, outlier_mask = reject_outliers(
348
+ vertical_positions,
349
+ use_ransac=True,
350
+ use_median=True,
351
+ interpolate=False,
352
+ )
353
+ quality_result = assess_jump_quality(
354
+ visibilities=visibilities,
355
+ positions=vertical_positions,
356
+ outlier_mask=outlier_mask,
357
+ fps=video.fps,
358
+ phases_detected=True,
359
+ phase_count=4,
360
+ )
361
+
362
+ _print_quality_warnings(quality_result, verbose)
363
+
364
+ with timer.measure("metrics_validation"):
365
+ validator = CMJMetricsValidator()
366
+ validation_result = validator.validate(metrics.to_dict()) # type: ignore[arg-type]
367
+ metrics.validation_result = validation_result
368
+
369
+ algorithm_config = _create_algorithm_config(params)
370
+ video_info = _create_video_info(video_path, video)
371
+ processing_info = _create_processing_info(start_time, quality_preset, timer)
372
+ result_metadata = _create_result_metadata(
373
+ quality_result, video_info, processing_info, algorithm_config
374
+ )
375
+ metrics.result_metadata = result_metadata
376
+
377
+ _print_validation_results(validation_result, verbose)
378
+
379
+
217
380
  @dataclass
218
381
  class CMJVideoConfig:
219
382
  """Configuration for processing a single CMJ video."""
@@ -285,112 +448,29 @@ def process_cmj_video(
285
448
 
286
449
  with timer.measure("video_initialization"):
287
450
  with VideoProcessor(video_path, timer=timer) as video:
288
- if verbose:
289
- print(
290
- f"Video: {video.width}x{video.height} @ {video.fps:.2f} fps, "
291
- f"{video.frame_count} frames"
292
- )
293
-
294
- det_conf, track_conf = determine_confidence_levels(
295
- quality_preset, detection_confidence, tracking_confidence
296
- )
297
-
298
- if verbose:
299
- print("Processing all frames with MediaPipe pose tracking...")
300
-
301
- tracker = pose_tracker or PoseTracker(
302
- min_detection_confidence=det_conf,
303
- min_tracking_confidence=track_conf,
304
- timer=timer,
451
+ # 1. Pose Tracking
452
+ frames, landmarks_sequence, frame_indices = _run_pose_tracking(
453
+ video,
454
+ quality_preset,
455
+ detection_confidence,
456
+ tracking_confidence,
457
+ pose_tracker,
458
+ verbose,
459
+ timer,
305
460
  )
306
- should_close_tracker = pose_tracker is None
307
461
 
308
- frames, landmarks_sequence, frame_indices = process_all_frames(
309
- video, tracker, verbose, timer, close_tracker=should_close_tracker
462
+ # 2. Parameters & Smoothing
463
+ params = _get_tuned_parameters(
464
+ video, landmarks_sequence, quality_preset, overrides, verbose, timer
310
465
  )
311
-
312
- with timer.measure("parameter_auto_tuning"):
313
- characteristics = analyze_video_sample(
314
- landmarks_sequence, video.fps, video.frame_count
315
- )
316
- params = auto_tune_parameters(characteristics, quality_preset)
317
- params = apply_expert_overrides(
318
- params,
319
- overrides.smoothing_window if overrides else None,
320
- overrides.velocity_threshold if overrides else None,
321
- overrides.min_contact_frames if overrides else None,
322
- overrides.visibility_threshold if overrides else None,
323
- )
324
-
325
- if verbose:
326
- print_verbose_parameters(video, characteristics, quality_preset, params)
327
-
328
466
  smoothed_landmarks = apply_smoothing(landmarks_sequence, params, verbose, timer)
329
467
 
330
- if verbose:
331
- print("Extracting vertical positions (Hip and Foot)...")
332
- with timer.measure("vertical_position_extraction"):
333
- vertical_positions, visibilities = extract_vertical_positions(
334
- smoothed_landmarks, target="hip"
335
- )
336
- foot_positions, _ = extract_vertical_positions(smoothed_landmarks, target="foot")
337
-
338
- if verbose:
339
- print("Detecting CMJ phases...")
340
- with timer.measure("phase_detection"):
341
- phases = detect_cmj_phases(
342
- vertical_positions,
343
- video.fps,
344
- window_length=params.smoothing_window,
345
- polyorder=params.polyorder,
346
- landing_positions=foot_positions,
347
- timer=timer,
348
- )
349
-
350
- if phases is None:
351
- raise ValueError("Could not detect CMJ phases in video")
352
-
353
- standing_end, lowest_point, takeoff_frame, landing_frame = phases
354
-
355
- if verbose:
356
- print("Calculating metrics...")
357
- with timer.measure("metrics_calculation"):
358
- velocities = compute_signed_velocity(
359
- vertical_positions,
360
- window_length=params.smoothing_window,
361
- polyorder=params.polyorder,
362
- )
363
- metrics = calculate_cmj_metrics(
364
- vertical_positions,
365
- velocities,
366
- standing_end,
367
- lowest_point,
368
- takeoff_frame,
369
- landing_frame,
370
- video.fps,
371
- tracking_method="hip_hybrid",
372
- )
373
-
374
- if verbose:
375
- print("Assessing tracking quality...")
376
- with timer.measure("quality_assessment"):
377
- _, outlier_mask = reject_outliers(
378
- vertical_positions,
379
- use_ransac=True,
380
- use_median=True,
381
- interpolate=False,
382
- )
383
- quality_result = assess_jump_quality(
384
- visibilities=visibilities,
385
- positions=vertical_positions,
386
- outlier_mask=outlier_mask,
387
- fps=video.fps,
388
- phases_detected=True,
389
- phase_count=4,
390
- )
391
-
392
- _print_quality_warnings(quality_result, verbose)
468
+ # 3. Kinematic Analysis
469
+ metrics, vertical_positions, visibilities = _run_kinematic_analysis(
470
+ video, smoothed_landmarks, params, verbose, timer
471
+ )
393
472
 
473
+ # 4. Debug Video Generation (Optional)
394
474
  if output_video:
395
475
  _generate_debug_video(
396
476
  output_video,
@@ -403,24 +483,23 @@ def process_cmj_video(
403
483
  verbose,
404
484
  )
405
485
 
406
- with timer.measure("metrics_validation"):
407
- validator = CMJMetricsValidator()
408
- validation_result = validator.validate(metrics.to_dict()) # type: ignore[arg-type]
409
- metrics.validation_result = validation_result
410
-
411
- algorithm_config = _create_algorithm_config(params)
412
- video_info = _create_video_info(video_path, video)
413
- processing_info = _create_processing_info(start_time, quality_preset, timer)
414
- result_metadata = _create_result_metadata(
415
- quality_result, video_info, processing_info, algorithm_config
486
+ # 5. Finalization (Quality, Metadata, Validation)
487
+ _finalize_analysis_results(
488
+ metrics,
489
+ video,
490
+ video_path,
491
+ vertical_positions,
492
+ visibilities,
493
+ params,
494
+ quality_preset,
495
+ start_time,
496
+ timer,
497
+ verbose,
416
498
  )
417
- metrics.result_metadata = result_metadata
418
499
 
419
500
  if json_output:
420
501
  _save_metrics_to_json(metrics, json_output, timer, verbose)
421
502
 
422
- _print_validation_results(validation_result, verbose)
423
-
424
503
  if verbose:
425
504
  _print_timing_summary(start_time, timer, metrics)
426
505
 
@@ -6,6 +6,7 @@ import shutil
6
6
  import subprocess
7
7
  import time
8
8
  from pathlib import Path
9
+ from typing import Any
9
10
 
10
11
  import cv2
11
12
  import numpy as np
@@ -73,53 +74,67 @@ def create_video_writer(
73
74
  # ⚠️ CRITICAL: VP9 (vp09) is EXCLUDED - not supported on iOS/iPhone/iPad browsers!
74
75
  # Adding VP9 will break debug video playback on all iOS devices.
75
76
  codecs_to_try = ["avc1", "mp4v"]
76
-
77
- writer = None
78
- used_codec = "mp4v" # Default fallback
79
- codec_attempt_log = []
77
+ codec_attempt_log: list[dict[str, Any]] = []
80
78
 
81
79
  for codec in codecs_to_try:
82
- try:
83
- fourcc = cv2.VideoWriter_fourcc(*codec) # type: ignore[attr-defined]
84
- writer = cv2.VideoWriter(output_path, fourcc, fps, (display_width, display_height))
85
- if writer.isOpened():
86
- used_codec = codec
87
- codec_attempt_log.append({"codec": codec, "status": "success"})
88
- _log(
89
- "info",
90
- "debug_video_codec_selected",
91
- codec=codec,
92
- width=display_width,
93
- height=display_height,
94
- fps=fps,
95
- )
96
- if codec == "mp4v":
97
- msg = (
98
- "Using fallback MPEG-4 codec; will re-encode with ffmpeg for "
99
- "browser compatibility"
100
- )
101
- _log("warning", "debug_video_fallback_codec", codec="mp4v", message=msg)
102
- break
103
- except Exception as e:
104
- codec_attempt_log.append({"codec": codec, "status": "failed", "error": str(e)})
105
- _log("info", "debug_video_codec_attempt_failed", codec=codec, error=str(e))
106
- continue
107
-
108
- if writer is None or not writer.isOpened():
109
- _log(
110
- "error",
111
- "debug_video_writer_creation_failed",
112
- output_path=output_path,
113
- dimensions=f"{display_width}x{display_height}",
114
- fps=fps,
115
- codec_attempts=codec_attempt_log,
80
+ writer = _try_open_video_writer(
81
+ output_path, codec, fps, display_width, display_height, codec_attempt_log
116
82
  )
117
- raise ValueError(
118
- f"Failed to create video writer for {output_path} with dimensions "
119
- f"{display_width}x{display_height}"
83
+ if writer:
84
+ return writer, needs_resize, codec
85
+
86
+ _log(
87
+ "error",
88
+ "debug_video_writer_creation_failed",
89
+ output_path=output_path,
90
+ dimensions=f"{display_width}x{display_height}",
91
+ fps=fps,
92
+ codec_attempts=codec_attempt_log,
93
+ )
94
+ raise ValueError(
95
+ f"Failed to create video writer for {output_path} with dimensions "
96
+ f"{display_width}x{display_height}"
97
+ )
98
+
99
+
100
+ def _try_open_video_writer(
101
+ output_path: str,
102
+ codec: str,
103
+ fps: float,
104
+ width: int,
105
+ height: int,
106
+ attempt_log: list[dict[str, Any]],
107
+ ) -> cv2.VideoWriter | None:
108
+ """Attempt to open a video writer with a specific codec."""
109
+ try:
110
+ fourcc = cv2.VideoWriter_fourcc(*codec) # type: ignore[attr-defined]
111
+ writer = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
112
+ if writer.isOpened():
113
+ attempt_log.append({"codec": codec, "status": "success"})
114
+ _log(
115
+ "info",
116
+ "debug_video_codec_selected",
117
+ codec=codec,
118
+ width=width,
119
+ height=height,
120
+ fps=fps,
121
+ )
122
+ if codec == "mp4v":
123
+ msg = (
124
+ "Using fallback MPEG-4 codec; will re-encode with ffmpeg for "
125
+ "browser compatibility"
126
+ )
127
+ _log("warning", "debug_video_fallback_codec", codec="mp4v", warning=msg)
128
+ return writer
129
+
130
+ attempt_log.append(
131
+ {"codec": codec, "status": "failed", "error": "isOpened() returned False"}
120
132
  )
133
+ except Exception as e:
134
+ attempt_log.append({"codec": codec, "status": "failed", "error": str(e)})
135
+ _log("info", "debug_video_codec_attempt_failed", codec=codec, error=str(e))
121
136
 
122
- return writer, needs_resize, used_codec
137
+ return None
123
138
 
124
139
 
125
140
  def write_overlay_frame(
@@ -262,92 +277,17 @@ class BaseDebugOverlayRenderer:
262
277
  codec=self.used_codec,
263
278
  )
264
279
 
265
- # Post-process with ffmpeg ONLY if we fell back to the incompatible mp4v codec
266
- if self.used_codec == "mp4v" and shutil.which("ffmpeg"):
267
- temp_path = None
268
- try:
269
- temp_path = str(
270
- Path(self.output_path).with_suffix(".temp" + Path(self.output_path).suffix)
271
- )
272
-
273
- # Convert to H.264 with yuv420p pixel format for browser compatibility
274
- # -y: Overwrite output file
275
- # -vcodec libx264: Use H.264 codec
276
- # -pix_fmt yuv420p: Required for wide browser support (Chrome,
277
- # Safari, Firefox, iOS)
278
- # -preset fast: Reasonable speed/compression tradeoff
279
- # -crf 23: Standard quality
280
- # -an: Remove audio (debug video has no audio)
281
- cmd = [
282
- "ffmpeg",
283
- "-y",
284
- "-i",
285
- self.output_path,
286
- "-vcodec",
287
- "libx264",
288
- "-pix_fmt",
289
- "yuv420p",
290
- "-preset",
291
- "fast",
292
- "-crf",
293
- "23",
294
- "-an",
295
- temp_path,
296
- ]
297
-
298
- _log(
299
- "info",
300
- "debug_video_ffmpeg_reencoding_start",
301
- input_file=self.output_path,
302
- output_file=temp_path,
303
- output_codec="libx264",
304
- pixel_format="yuv420p",
305
- reason="iOS_compatibility",
306
- )
307
-
308
- # Suppress output unless error
309
- reencode_start = time.time()
310
- subprocess.run(
311
- cmd,
312
- check=True,
313
- stdout=subprocess.DEVNULL,
314
- stderr=subprocess.PIPE,
315
- )
316
- self.reencode_duration_s = time.time() - reencode_start
317
-
318
- _log(
319
- "info",
320
- "debug_video_ffmpeg_reencoding_complete",
321
- duration_ms=round(self.reencode_duration_s * 1000, 1),
322
- )
323
-
324
- # Overwrite original file
325
- os.replace(temp_path, self.output_path)
326
- _log(
327
- "info",
328
- "debug_video_reencoded_file_replaced",
329
- output_path=self.output_path,
330
- final_codec="libx264",
331
- pixel_format="yuv420p",
332
- )
280
+ if self.used_codec != "mp4v":
281
+ _log(
282
+ "info",
283
+ "debug_video_ready_for_playback",
284
+ codec=self.used_codec,
285
+ path=self.output_path,
286
+ )
287
+ return
333
288
 
334
- except subprocess.CalledProcessError as e:
335
- stderr_msg = e.stderr.decode("utf-8", errors="ignore") if e.stderr else "N/A"
336
- _log(
337
- "warning",
338
- "debug_video_ffmpeg_reencoding_failed",
339
- error=str(e),
340
- stderr=stderr_msg,
341
- )
342
- if temp_path and os.path.exists(temp_path):
343
- os.remove(temp_path)
344
- _log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
345
- except Exception as e:
346
- _log("warning", "debug_video_post_processing_error", error=str(e))
347
- if temp_path and os.path.exists(temp_path):
348
- os.remove(temp_path)
349
- _log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
350
- elif self.used_codec == "mp4v" and not shutil.which("ffmpeg"):
289
+ ffmpeg_path = shutil.which("ffmpeg")
290
+ if not ffmpeg_path:
351
291
  _log(
352
292
  "warning",
353
293
  "debug_video_ffmpeg_not_available",
@@ -355,13 +295,88 @@ class BaseDebugOverlayRenderer:
355
295
  output_path=self.output_path,
356
296
  warning="Video may not play in all browsers",
357
297
  )
358
- else:
298
+ return
299
+
300
+ self._reencode_to_h264()
301
+
302
+ def _reencode_to_h264(self) -> None:
303
+ """Re-encode video to H.264 for browser compatibility using ffmpeg."""
304
+ temp_path = str(
305
+ Path(self.output_path).with_suffix(".temp" + Path(self.output_path).suffix)
306
+ )
307
+
308
+ # Convert to H.264 with yuv420p pixel format for browser compatibility
309
+ # -y: Overwrite output file
310
+ # -vcodec libx264: Use H.264 codec
311
+ # -pix_fmt yuv420p: Required for wide browser support (Chrome, Safari, Firefox, iOS)
312
+ # -preset fast: Reasonable speed/compression tradeoff
313
+ # -crf 23: Standard quality
314
+ # -an: Remove audio (debug video has no audio)
315
+ cmd = [
316
+ "ffmpeg",
317
+ "-y",
318
+ "-i",
319
+ self.output_path,
320
+ "-vcodec",
321
+ "libx264",
322
+ "-pix_fmt",
323
+ "yuv420p",
324
+ "-preset",
325
+ "fast",
326
+ "-crf",
327
+ "23",
328
+ "-an",
329
+ temp_path,
330
+ ]
331
+
332
+ _log(
333
+ "info",
334
+ "debug_video_ffmpeg_reencoding_start",
335
+ input_file=self.output_path,
336
+ output_file=temp_path,
337
+ output_codec="libx264",
338
+ pixel_format="yuv420p",
339
+ reason="iOS_compatibility",
340
+ )
341
+
342
+ try:
343
+ reencode_start = time.time()
344
+ subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
345
+ self.reencode_duration_s = time.time() - reencode_start
346
+
359
347
  _log(
360
348
  "info",
361
- "debug_video_ready_for_playback",
362
- codec=self.used_codec,
363
- path=self.output_path,
349
+ "debug_video_ffmpeg_reencoding_complete",
350
+ duration_ms=round(self.reencode_duration_s * 1000, 1),
351
+ )
352
+
353
+ os.replace(temp_path, self.output_path)
354
+ _log(
355
+ "info",
356
+ "debug_video_reencoded_file_replaced",
357
+ output_path=self.output_path,
358
+ final_codec="libx264",
359
+ pixel_format="yuv420p",
364
360
  )
361
+ except (subprocess.CalledProcessError, Exception) as e:
362
+ self._handle_reencode_error(e, temp_path)
363
+
364
+ def _handle_reencode_error(self, e: Exception, temp_path: str) -> None:
365
+ """Handle errors during ffmpeg re-encoding."""
366
+ if isinstance(e, subprocess.CalledProcessError):
367
+ stderr_msg = e.stderr.decode("utf-8", errors="ignore") if e.stderr else "N/A"
368
+ _log(
369
+ "warning",
370
+ "debug_video_ffmpeg_reencoding_failed",
371
+ error=str(e),
372
+ stderr=stderr_msg,
373
+ )
374
+ else:
375
+ _log("warning", "debug_video_post_processing_error", error=str(e))
376
+
377
+ if os.path.exists(temp_path):
378
+ os.remove(temp_path)
379
+ _log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
365
380
 
366
381
  def __enter__(self) -> Self:
367
382
  return self