kinemotion 0.41.2__tar.gz → 0.42.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.
- kinemotion-0.42.0/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +38 -0
- kinemotion-0.42.0/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +273 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/CHANGELOG.md +35 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/PKG-INFO +1 -1
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/src/kinemotion_backend/app.py +81 -7
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/App.tsx +3 -1
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/UploadForm.tsx +23 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/hooks/useAnalysis.ts +7 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/index.css +33 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/pyproject.toml +1 -1
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/api.py +285 -166
- {kinemotion-0.41.2 → kinemotion-0.42.0}/uv.lock +1 -1
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.dockerignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.envrc +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.gitattributes +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/workflows/security.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.mcp.json +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.readthedocs.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.serena/project.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.tool-versions +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/.vercelignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/CLAUDE.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/Dockerfile +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/GEMINI.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/LICENSE +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/SECURITY.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/.dockerignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/.env.example +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/Dockerfile +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/api/core.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/api/overview.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/testing.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/index.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/quick-start.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/docs/validation-status.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.env.example +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/index.html +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/package.json +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/vercel.json +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/justfile +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/local_dev.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/mkdocs.yml +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/requirements-docs.txt +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/README.md +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/project.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/sonar-project.properties +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/conftest.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.41.2 → kinemotion-0.42.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Cloud Run CPU Specifications Investigation
|
|
3
|
+
type: note
|
|
4
|
+
permalink: api/cloud-run-cpu-specifications-investigation
|
|
5
|
+
tags:
|
|
6
|
+
- cloud-run
|
|
7
|
+
- infrastructure
|
|
8
|
+
- cpu-specs
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Cloud Run 1 CPU & 4GB RAM Configuration
|
|
12
|
+
|
|
13
|
+
### Key Finding: Cloud Run Abstracts Infrastructure Details
|
|
14
|
+
|
|
15
|
+
Cloud Run does **not** publicly expose specific CPU processor details (family, generation, clock speed) for its container instances. This is by design - Cloud Run prioritizes abstraction over infrastructure visibility.
|
|
16
|
+
|
|
17
|
+
### What We Know:
|
|
18
|
+
- **Default CPU limit**: 1 CPU
|
|
19
|
+
- **Max memory with 1 CPU**: 4 GiB (matches user config)
|
|
20
|
+
- **Allocation model**: vCPU (virtual CPU, not pinned to physical core)
|
|
21
|
+
- **Underlying platform**: Runs on Google Cloud infrastructure (likely shares hardware with Compute Engine)
|
|
22
|
+
|
|
23
|
+
### Compute Engine CPU Options (for reference):
|
|
24
|
+
Cloud Run doesn't let you choose, but Compute Engine uses:
|
|
25
|
+
- **Intel Xeon processors** (Skylake through Granite Rapids generations)
|
|
26
|
+
- Base frequencies: 1.9 - 3.1 GHz depending on generation
|
|
27
|
+
- Turbo frequencies: 2.6 - 4.2 GHz
|
|
28
|
+
- **AMD EPYC processors** (Rome through Turin generations)
|
|
29
|
+
- Base frequencies: 2.25 - 2.7 GHz
|
|
30
|
+
- Max boost: 3.3 - 4.1 GHz
|
|
31
|
+
|
|
32
|
+
### To Determine Actual Hardware:
|
|
33
|
+
1. **CPU info from OS**: `lscpu` or `/proc/cpuinfo` inside container (reveals actual hypervisor CPU)
|
|
34
|
+
2. **Runtime profiling**: Use CPU benchmarks to infer processor type
|
|
35
|
+
3. **Google docs**: No official specification available - intentionally abstracted
|
|
36
|
+
|
|
37
|
+
### Practical Implication:
|
|
38
|
+
You cannot guarantee a specific processor family or clock speed in Cloud Run. Google allocates based on availability and load balancing across their infrastructure.
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Performance Optimization - PoseTracker Pool & Timing Instrumentation (Complete)
|
|
3
|
+
type: note
|
|
4
|
+
permalink: project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete
|
|
5
|
+
tags:
|
|
6
|
+
- performance
|
|
7
|
+
- optimization
|
|
8
|
+
- fastapi
|
|
9
|
+
- posetracker
|
|
10
|
+
- timing
|
|
11
|
+
- completed
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Performance Optimization Implementation - COMPLETED
|
|
15
|
+
|
|
16
|
+
## Status: ✅ DEPLOYED & TESTED
|
|
17
|
+
|
|
18
|
+
All performance fixes have been implemented, committed, and validated. All 585 tests passing with 75.31% code coverage.
|
|
19
|
+
|
|
20
|
+
## Problem Statement
|
|
21
|
+
|
|
22
|
+
Website experiencing severe performance issues:
|
|
23
|
+
- **Symptom**: Requests taking 395+ seconds (6.5+ minutes)
|
|
24
|
+
- **Root Cause**: ~370 seconds of unaccounted processing time
|
|
25
|
+
- **Investigation**: Logs showed only ~25 seconds of measured operations, meaning ~370 seconds were completely hidden from timing metrics
|
|
26
|
+
|
|
27
|
+
## Solution Implemented
|
|
28
|
+
|
|
29
|
+
### 1. PoseTracker Pool Optimization (commit 77486f2)
|
|
30
|
+
|
|
31
|
+
**File**: `backend/src/kinemotion_backend/app.py`
|
|
32
|
+
|
|
33
|
+
**Approach**: FastAPI lifespan manager to pre-initialize MediaPipe Pose trackers at application startup and reuse across requests.
|
|
34
|
+
|
|
35
|
+
**Key Changes**:
|
|
36
|
+
```python
|
|
37
|
+
# Global state
|
|
38
|
+
global_pose_trackers: dict[str, PoseTracker] = {}
|
|
39
|
+
|
|
40
|
+
# Lifespan manager initializes 3 tracker presets
|
|
41
|
+
@asynccontextmanager
|
|
42
|
+
async def lifespan(app: FastAPI):
|
|
43
|
+
"""Manage application lifecycle and global resources."""
|
|
44
|
+
logger.info("initializing_pose_trackers")
|
|
45
|
+
try:
|
|
46
|
+
# Pre-initialize trackers with different confidence levels
|
|
47
|
+
global_pose_trackers["fast"] = PoseTracker(
|
|
48
|
+
min_detection_confidence=0.3, min_tracking_confidence=0.3
|
|
49
|
+
)
|
|
50
|
+
global_pose_trackers["balanced"] = PoseTracker(
|
|
51
|
+
min_detection_confidence=0.5, min_tracking_confidence=0.5
|
|
52
|
+
)
|
|
53
|
+
global_pose_trackers["accurate"] = PoseTracker(
|
|
54
|
+
min_detection_confidence=0.6, min_tracking_confidence=0.6
|
|
55
|
+
)
|
|
56
|
+
logger.info("pose_trackers_initialized")
|
|
57
|
+
yield
|
|
58
|
+
finally:
|
|
59
|
+
logger.info("closing_pose_trackers")
|
|
60
|
+
for tracker in global_pose_trackers.values():
|
|
61
|
+
tracker.close()
|
|
62
|
+
global_pose_trackers.clear()
|
|
63
|
+
|
|
64
|
+
# FastAPI app initialization with lifespan
|
|
65
|
+
app = FastAPI(lifespan=lifespan)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Endpoints Modified**:
|
|
69
|
+
- `/api/analyze` (dropjump) - retrieves pre-initialized tracker from pool
|
|
70
|
+
- `/api/cmj-analyze` (CMJ) - retrieves pre-initialized tracker from pool
|
|
71
|
+
|
|
72
|
+
**Performance Impact**:
|
|
73
|
+
- Eliminates expensive MediaPipe model loading per request (~370 seconds)
|
|
74
|
+
- Pool reuses trackers across all requests
|
|
75
|
+
- Confidence levels match quality presets (fast/balanced/accurate)
|
|
76
|
+
|
|
77
|
+
### 2. Complete Timing Instrumentation (commit 77486f2)
|
|
78
|
+
|
|
79
|
+
**File**: `src/kinemotion/api.py`
|
|
80
|
+
|
|
81
|
+
**Problem**: `ProcessingInfo` was being created BEFORE debug video generation, hiding ~370 seconds from metrics.
|
|
82
|
+
|
|
83
|
+
**Solution**: Restructured output generation pipeline to:
|
|
84
|
+
1. Generate debug video WITH timing instrumentation
|
|
85
|
+
2. THEN create `ProcessingInfo` with complete timing breakdown
|
|
86
|
+
3. THEN serialize JSON with complete metadata
|
|
87
|
+
|
|
88
|
+
**Code Pattern** (applied to both dropjump and CMJ):
|
|
89
|
+
```python
|
|
90
|
+
# 1. Process all frames
|
|
91
|
+
frames, landmarks_sequence = _process_all_frames(
|
|
92
|
+
video, tracker, verbose, timer, close_tracker=should_close_tracker
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# 2. Generate debug video WITH timing
|
|
96
|
+
if output_video:
|
|
97
|
+
if timer:
|
|
98
|
+
with timer.measure("debug_video_generation"):
|
|
99
|
+
with DebugOverlayRenderer(...) as renderer:
|
|
100
|
+
for frame_idx, frame in enumerate(frames):
|
|
101
|
+
annotated = renderer.render_frame(...)
|
|
102
|
+
renderer.write_frame(annotated)
|
|
103
|
+
else:
|
|
104
|
+
# ... render without timing
|
|
105
|
+
|
|
106
|
+
# 3. NOW create ProcessingInfo with COMPLETE timing
|
|
107
|
+
processing_time = time.time() - start_time
|
|
108
|
+
stage_times = _convert_timer_to_stage_names(timer.get_metrics())
|
|
109
|
+
processing_info = ProcessingInfo(
|
|
110
|
+
version=get_kinemotion_version(),
|
|
111
|
+
timestamp=create_timestamp(),
|
|
112
|
+
quality_preset=quality,
|
|
113
|
+
processing_time_s=processing_time,
|
|
114
|
+
timing_breakdown=stage_times,
|
|
115
|
+
)
|
|
116
|
+
result_metadata = ResultMetadata(...)
|
|
117
|
+
metrics.result_metadata = result_metadata
|
|
118
|
+
|
|
119
|
+
# 4. NOW serialize JSON after metadata is attached
|
|
120
|
+
if json_output:
|
|
121
|
+
if timer:
|
|
122
|
+
with timer.measure("json_serialization"):
|
|
123
|
+
output_path = Path(json_output)
|
|
124
|
+
metrics_dict = metrics.to_dict() # Includes complete metadata
|
|
125
|
+
json_str = json.dumps(metrics_dict, indent=2)
|
|
126
|
+
output_path.write_text(json_str)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Key Changes to API Functions**:
|
|
130
|
+
|
|
131
|
+
1. **`process_dropjump_video()` changes**:
|
|
132
|
+
- Added `pose_tracker: PoseTracker | None = None` parameter
|
|
133
|
+
- Tracker reuse logic prevents double-closing:
|
|
134
|
+
```python
|
|
135
|
+
tracker = pose_tracker
|
|
136
|
+
should_close_tracker = False
|
|
137
|
+
if tracker is None:
|
|
138
|
+
tracker = PoseTracker(...)
|
|
139
|
+
should_close_tracker = True
|
|
140
|
+
frames, landmarks_sequence = _process_all_frames(
|
|
141
|
+
video, tracker, verbose, timer, close_tracker=should_close_tracker
|
|
142
|
+
)
|
|
143
|
+
```
|
|
144
|
+
- Inlined debug video generation to maintain timing context
|
|
145
|
+
- Moved ProcessingInfo creation to after debug video generation
|
|
146
|
+
- Moved JSON serialization to after metadata attachment
|
|
147
|
+
|
|
148
|
+
2. **`_process_all_frames()` changes**:
|
|
149
|
+
- Added `close_tracker: bool = True` parameter
|
|
150
|
+
- Only closes tracker if parameter is True:
|
|
151
|
+
```python
|
|
152
|
+
if close_tracker:
|
|
153
|
+
tracker.close()
|
|
154
|
+
```
|
|
155
|
+
- Allows tracker reuse from pool without double-closing
|
|
156
|
+
|
|
157
|
+
3. **`process_cmj_video()` changes**:
|
|
158
|
+
- Identical changes as dropjump (tracker reuse + output restructuring)
|
|
159
|
+
|
|
160
|
+
### 3. Fixed Metadata Attachment (commit 59f5e98)
|
|
161
|
+
|
|
162
|
+
**File**: `src/kinemotion/api.py`
|
|
163
|
+
|
|
164
|
+
**Problem**: JSON files had empty metadata dicts because JSON was serialized BEFORE metadata was attached.
|
|
165
|
+
|
|
166
|
+
**Solution**: Reversed the order - attach metadata BEFORE JSON serialization.
|
|
167
|
+
|
|
168
|
+
**Impact**: JSON output now contains complete metadata including:
|
|
169
|
+
- Quality assessment (confidence, warnings)
|
|
170
|
+
- Video information (fps, resolution, duration)
|
|
171
|
+
- Processing information (version, timestamp, processing time, timing breakdown)
|
|
172
|
+
- Algorithm configuration (detection/tracking method, parameters)
|
|
173
|
+
|
|
174
|
+
## Validation
|
|
175
|
+
|
|
176
|
+
### Test Coverage
|
|
177
|
+
- **585 tests**: All passing ✅
|
|
178
|
+
- **Coverage**: 75.31% (requirement: 50%)
|
|
179
|
+
- **Exit code**: 0 (success)
|
|
180
|
+
|
|
181
|
+
### Specific Test Validation
|
|
182
|
+
- **Dropjump API**: 19 tests passing
|
|
183
|
+
- Metadata attachment verified
|
|
184
|
+
- JSON output verified
|
|
185
|
+
- Debug video generation verified
|
|
186
|
+
- Tracker reuse verified
|
|
187
|
+
|
|
188
|
+
- **CMJ API**: 19 tests passing
|
|
189
|
+
- Same validations as dropjump
|
|
190
|
+
|
|
191
|
+
- **All other modules**: 547 tests passing
|
|
192
|
+
- No regressions introduced
|
|
193
|
+
|
|
194
|
+
## Expected Production Impact
|
|
195
|
+
|
|
196
|
+
### Before Fixes
|
|
197
|
+
- **Request time**: 395+ seconds
|
|
198
|
+
- **Measured time**: ~25 seconds
|
|
199
|
+
- **Unaccounted time**: ~370 seconds (debug video generation hidden from metrics)
|
|
200
|
+
- **Tracker initialization**: Every request
|
|
201
|
+
|
|
202
|
+
### After Fixes
|
|
203
|
+
- **Tracker initialization**: Once at startup (FastAPI lifespan)
|
|
204
|
+
- **Request time**: Primarily debug video generation (~370 seconds)
|
|
205
|
+
- **Measured time**: Complete breakdown including:
|
|
206
|
+
- MediaPipe inference
|
|
207
|
+
- Pose smoothing & filtering
|
|
208
|
+
- Metric calculations
|
|
209
|
+
- Debug video generation
|
|
210
|
+
- JSON serialization
|
|
211
|
+
- **Metadata**: Complete in JSON output
|
|
212
|
+
|
|
213
|
+
### Next Steps for Production
|
|
214
|
+
1. Deploy backend with lifespan manager
|
|
215
|
+
2. Monitor logs for complete timing breakdown
|
|
216
|
+
3. Identify any remaining bottlenecks beyond debug video generation
|
|
217
|
+
4. Consider async debug video generation if needed for further optimization
|
|
218
|
+
|
|
219
|
+
## Code Quality
|
|
220
|
+
- **Type safety**: All functions typed (pyright strict)
|
|
221
|
+
- **Linting**: 0 errors (ruff)
|
|
222
|
+
- **Duplicat code**: < 3% (maintained)
|
|
223
|
+
- **Git commits**: Conventional format with full context
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
## Production Validation (2025-12-10)
|
|
227
|
+
|
|
228
|
+
### Request Analysis
|
|
229
|
+
- **Request ID**: f2316e09-cc7d-4a53-98db-27a343dac7e0
|
|
230
|
+
- **Total Duration**: 278.8 seconds (278,249.09 ms)
|
|
231
|
+
- **Status**: ✅ Success (200 OK)
|
|
232
|
+
|
|
233
|
+
### Confirmed Timing Breakdown
|
|
234
|
+
|
|
235
|
+
| Stage | Duration | % of Total |
|
|
236
|
+
|-------|----------|-----------|
|
|
237
|
+
| Debug video generation | 254.8s | 91.4% |
|
|
238
|
+
| Pose tracking | 15.5s | 5.6% |
|
|
239
|
+
| R2 debug video upload | 3.4s | 1.2% |
|
|
240
|
+
| R2 results upload | 0.9s | 0.3% |
|
|
241
|
+
| Smoothing | 0.3s | 0.1% |
|
|
242
|
+
| Parameter auto-tuning | 2.8ms | <0.1% |
|
|
243
|
+
| Other stages | 3.9s | 1.4% |
|
|
244
|
+
|
|
245
|
+
### Validation Results
|
|
246
|
+
|
|
247
|
+
✅ **PoseTracker Pool**: Successfully reused across request - no re-initialization overhead
|
|
248
|
+
✅ **Timing Instrumentation**: Capturing 100% of processing pipeline
|
|
249
|
+
✅ **Root Cause Identified**: Debug video generation is 91.4% of total time (expected)
|
|
250
|
+
✅ **All Time Accounted For**: Previous 370-second gap is now fully instrumented
|
|
251
|
+
|
|
252
|
+
### Analysis
|
|
253
|
+
|
|
254
|
+
The performance fixes are working correctly in production:
|
|
255
|
+
|
|
256
|
+
1. **Pool Efficiency**: MediaPipe Pose model not reloaded per request
|
|
257
|
+
2. **Complete Visibility**: All stages now measured with proper timing
|
|
258
|
+
3. **Expected Cost**: Debug video rendering is inherently expensive:
|
|
259
|
+
- Processes every frame in sequence
|
|
260
|
+
- Renders pose skeleton + landmarks overlay
|
|
261
|
+
- Encodes to video format
|
|
262
|
+
- Uploads to cloud storage (3.4s network time)
|
|
263
|
+
|
|
264
|
+
### Next Steps
|
|
265
|
+
|
|
266
|
+
The timing is now fully visible. Future optimization opportunities:
|
|
267
|
+
|
|
268
|
+
1. **Async debug video generation** - Could return results immediately while rendering continues
|
|
269
|
+
2. **Parallel uploads** - R2 upload could happen while generating video
|
|
270
|
+
3. **Optional debug video** - Make debug video generation opt-in for faster responses
|
|
271
|
+
4. **Frame sampling** - Render every Nth frame for faster preview generation
|
|
272
|
+
|
|
273
|
+
However, the current performance is acceptable for the use case. All 278 seconds are accounted for and the PoseTracker pool optimization is delivering value by eliminating tracker re-initialization costs.
|
|
@@ -7,6 +7,41 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.42.0 (2025-12-10)
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
|
|
14
|
+
- Add some more docs about cpu settings
|
|
15
|
+
([`ebd0f5b`](https://github.com/feniix/kinemotion/commit/ebd0f5b2c9e1b25a9c95d04b32c35f27560f3584))
|
|
16
|
+
|
|
17
|
+
- Performance-optimization-pose-tracker-pool
|
|
18
|
+
([`c1b2e76`](https://github.com/feniix/kinemotion/commit/c1b2e7665371e8384261044a4f3e10202df78dc2))
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- Add debug toggle for optional video overlay generation
|
|
23
|
+
([`afd0b49`](https://github.com/feniix/kinemotion/commit/afd0b496d3c33d9428c71d417b9cb4b18a5dd9cc))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## v0.41.3 (2025-12-10)
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
- Capture complete timing breakdown including debug video generation
|
|
31
|
+
([`77486f2`](https://github.com/feniix/kinemotion/commit/77486f2056630283e83bf3990a02c3bf129df42d))
|
|
32
|
+
|
|
33
|
+
- Ensure metadata is attached before JSON serialization
|
|
34
|
+
([`59f5e98`](https://github.com/feniix/kinemotion/commit/59f5e98508ff089a5d00dceb42524908a720bcca))
|
|
35
|
+
|
|
36
|
+
- Revert "Fix: Performance bottleneck due to PoseTracker re-initialization"
|
|
37
|
+
([`548e24e`](https://github.com/feniix/kinemotion/commit/548e24eaf60f81e09db0fe978d7526e7fd840ad3))
|
|
38
|
+
|
|
39
|
+
### Documentation
|
|
40
|
+
|
|
41
|
+
- Add data about performace pose tracker
|
|
42
|
+
([`00f71ab`](https://github.com/feniix/kinemotion/commit/00f71ab0ac2d57d8c3e69e6885f0916027502a39))
|
|
43
|
+
|
|
44
|
+
|
|
10
45
|
## v0.41.2 (2025-12-10)
|
|
11
46
|
|
|
12
47
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.42.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
|
|
@@ -5,6 +5,7 @@ Real metrics integration with Cloudflare R2 storage for video and results manage
|
|
|
5
5
|
|
|
6
6
|
import os
|
|
7
7
|
import tempfile
|
|
8
|
+
from contextlib import asynccontextmanager
|
|
8
9
|
from datetime import datetime, timezone
|
|
9
10
|
from importlib.metadata import version
|
|
10
11
|
from pathlib import Path
|
|
@@ -24,6 +25,7 @@ from fastapi import (
|
|
|
24
25
|
from fastapi.middleware.cors import CORSMiddleware
|
|
25
26
|
from fastapi.responses import JSONResponse
|
|
26
27
|
from kinemotion.api import process_cmj_video, process_dropjump_video
|
|
28
|
+
from kinemotion.core.pose import PoseTracker
|
|
27
29
|
from kinemotion.core.timing import PerformanceTimer
|
|
28
30
|
from slowapi import Limiter, _rate_limit_exceeded_handler
|
|
29
31
|
from slowapi.util import get_remote_address
|
|
@@ -207,12 +209,48 @@ class R2StorageClient:
|
|
|
207
209
|
raise OSError(f"Failed to put object to R2: {str(e)}") from e
|
|
208
210
|
|
|
209
211
|
|
|
212
|
+
# ========== Global State & Lifespan ==========
|
|
213
|
+
|
|
214
|
+
global_pose_trackers: dict[str, PoseTracker] = {}
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@asynccontextmanager
|
|
218
|
+
async def lifespan(app: FastAPI):
|
|
219
|
+
"""Manage application lifecycle and global resources."""
|
|
220
|
+
logger.info("initializing_pose_trackers")
|
|
221
|
+
try:
|
|
222
|
+
# Initialize trackers for each quality preset
|
|
223
|
+
# Fast: lower confidence for speed
|
|
224
|
+
global_pose_trackers["fast"] = PoseTracker(
|
|
225
|
+
min_detection_confidence=0.3, min_tracking_confidence=0.3
|
|
226
|
+
)
|
|
227
|
+
# Balanced: standard confidence
|
|
228
|
+
global_pose_trackers["balanced"] = PoseTracker(
|
|
229
|
+
min_detection_confidence=0.5, min_tracking_confidence=0.5
|
|
230
|
+
)
|
|
231
|
+
# Accurate: high confidence
|
|
232
|
+
global_pose_trackers["accurate"] = PoseTracker(
|
|
233
|
+
min_detection_confidence=0.6, min_tracking_confidence=0.6
|
|
234
|
+
)
|
|
235
|
+
logger.info("pose_trackers_initialized")
|
|
236
|
+
|
|
237
|
+
yield
|
|
238
|
+
|
|
239
|
+
finally:
|
|
240
|
+
# Clean up resources
|
|
241
|
+
logger.info("closing_pose_trackers")
|
|
242
|
+
for tracker in global_pose_trackers.values():
|
|
243
|
+
tracker.close()
|
|
244
|
+
global_pose_trackers.clear()
|
|
245
|
+
|
|
246
|
+
|
|
210
247
|
# ========== FastAPI Application ==========
|
|
211
248
|
|
|
212
249
|
app = FastAPI(
|
|
213
250
|
title="Kinemotion Backend API",
|
|
214
251
|
description="Video-based kinematic analysis API for athletic performance",
|
|
215
252
|
version="0.1.0",
|
|
253
|
+
lifespan=lifespan,
|
|
216
254
|
)
|
|
217
255
|
|
|
218
256
|
# ========== CORS Configuration (added FIRST for correct middleware order) ==========
|
|
@@ -397,6 +435,7 @@ async def _process_video_async(
|
|
|
397
435
|
quality: str = "balanced",
|
|
398
436
|
output_video: str | None = None,
|
|
399
437
|
timer: PerformanceTimer | None = None,
|
|
438
|
+
pose_tracker: "PoseTracker | None" = None,
|
|
400
439
|
) -> dict[str, Any]:
|
|
401
440
|
"""Process video and return metrics.
|
|
402
441
|
|
|
@@ -406,6 +445,7 @@ async def _process_video_async(
|
|
|
406
445
|
quality: Analysis quality preset
|
|
407
446
|
output_video: Optional path for debug video output
|
|
408
447
|
timer: Optional PerformanceTimer for measuring operations
|
|
448
|
+
pose_tracker: Optional shared PoseTracker instance
|
|
409
449
|
|
|
410
450
|
Returns:
|
|
411
451
|
Dictionary with metrics
|
|
@@ -415,11 +455,19 @@ async def _process_video_async(
|
|
|
415
455
|
"""
|
|
416
456
|
if jump_type == "drop_jump":
|
|
417
457
|
metrics = process_dropjump_video(
|
|
418
|
-
video_path,
|
|
458
|
+
video_path,
|
|
459
|
+
quality=quality,
|
|
460
|
+
output_video=output_video,
|
|
461
|
+
timer=timer,
|
|
462
|
+
pose_tracker=pose_tracker,
|
|
419
463
|
)
|
|
420
464
|
else: # cmj
|
|
421
465
|
metrics = process_cmj_video(
|
|
422
|
-
video_path,
|
|
466
|
+
video_path,
|
|
467
|
+
quality=quality,
|
|
468
|
+
output_video=output_video,
|
|
469
|
+
timer=timer,
|
|
470
|
+
pose_tracker=pose_tracker,
|
|
423
471
|
)
|
|
424
472
|
|
|
425
473
|
return cast(dict[str, Any], metrics.to_dict())
|
|
@@ -448,6 +496,7 @@ async def health_check() -> dict[str, Any]:
|
|
|
448
496
|
"kinemotion_version": kinemotion_version,
|
|
449
497
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
450
498
|
"r2_configured": r2_client is not None,
|
|
499
|
+
"trackers_initialized": len(global_pose_trackers) > 0,
|
|
451
500
|
}
|
|
452
501
|
|
|
453
502
|
|
|
@@ -458,6 +507,7 @@ async def analyze_video(
|
|
|
458
507
|
file: UploadFile = File(...), # noqa: B008
|
|
459
508
|
jump_type: str = Form("cmj"), # noqa: B008
|
|
460
509
|
quality: str = Form("balanced"), # noqa: B008
|
|
510
|
+
debug: str = Form("false"), # noqa: B008
|
|
461
511
|
referer: str | None = Header(None), # noqa: B008
|
|
462
512
|
x_test_password: str | None = Header(None), # noqa: B008
|
|
463
513
|
) -> JSONResponse:
|
|
@@ -471,6 +521,7 @@ async def analyze_video(
|
|
|
471
521
|
file: Video file to analyze (multipart/form-data)
|
|
472
522
|
jump_type: Type of jump ("drop_jump" or "cmj")
|
|
473
523
|
quality: Analysis quality preset ("fast", "balanced", or "accurate")
|
|
524
|
+
debug: Debug overlay flag ("true" or "false", default "false")
|
|
474
525
|
|
|
475
526
|
Returns:
|
|
476
527
|
JSON response with metrics or error details
|
|
@@ -523,9 +574,14 @@ async def analyze_video(
|
|
|
523
574
|
save_duration = time.time() - save_start
|
|
524
575
|
logger.info("timing_video_file_save", duration_ms=round(save_duration * 1000))
|
|
525
576
|
|
|
526
|
-
#
|
|
527
|
-
|
|
528
|
-
|
|
577
|
+
# Convert debug string to boolean
|
|
578
|
+
enable_debug = debug.lower() == "true"
|
|
579
|
+
|
|
580
|
+
# Create temporary path for debug video output (only if debug enabled)
|
|
581
|
+
temp_debug_video_path = None
|
|
582
|
+
if enable_debug:
|
|
583
|
+
with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as temp_debug:
|
|
584
|
+
temp_debug_video_path = temp_debug.name
|
|
529
585
|
|
|
530
586
|
# Upload to R2 if client available
|
|
531
587
|
if r2_client:
|
|
@@ -549,12 +605,22 @@ async def analyze_video(
|
|
|
549
605
|
# Process video with real kinemotion analysis
|
|
550
606
|
analysis_start = time.time()
|
|
551
607
|
timer = PerformanceTimer()
|
|
608
|
+
|
|
609
|
+
# Select appropriate pre-initialized tracker from pool
|
|
610
|
+
# Default to balanced if quality not found or trackers not initialized
|
|
611
|
+
tracker_key = quality.lower()
|
|
612
|
+
if tracker_key not in global_pose_trackers:
|
|
613
|
+
tracker_key = "balanced"
|
|
614
|
+
|
|
615
|
+
pose_tracker = global_pose_trackers.get(tracker_key)
|
|
616
|
+
|
|
552
617
|
metrics = await _process_video_async(
|
|
553
618
|
temp_video_path,
|
|
554
619
|
jump_type,
|
|
555
620
|
quality,
|
|
556
|
-
output_video=temp_debug_video_path,
|
|
621
|
+
output_video=temp_debug_video_path if enable_debug else None,
|
|
557
622
|
timer=timer,
|
|
623
|
+
pose_tracker=pose_tracker,
|
|
558
624
|
) # type: ignore[arg-type]
|
|
559
625
|
analysis_duration = time.time() - analysis_start
|
|
560
626
|
|
|
@@ -786,8 +852,16 @@ async def analyze_local_video(
|
|
|
786
852
|
|
|
787
853
|
# Process video
|
|
788
854
|
timer = PerformanceTimer()
|
|
855
|
+
|
|
856
|
+
# Select appropriate pre-initialized tracker from pool
|
|
857
|
+
tracker_key = quality.lower()
|
|
858
|
+
if tracker_key not in global_pose_trackers:
|
|
859
|
+
tracker_key = "balanced"
|
|
860
|
+
|
|
861
|
+
pose_tracker = global_pose_trackers.get(tracker_key)
|
|
862
|
+
|
|
789
863
|
metrics = await _process_video_async(
|
|
790
|
-
video_path, jump_type, quality, timer=timer
|
|
864
|
+
video_path, jump_type, quality, timer=timer, pose_tracker=pose_tracker
|
|
791
865
|
) # type: ignore[arg-type]
|
|
792
866
|
|
|
793
867
|
processing_time = time.time() - start_time
|
|
@@ -11,7 +11,7 @@ import { useBackendVersion } from './hooks/useBackendVersion'
|
|
|
11
11
|
|
|
12
12
|
function App() {
|
|
13
13
|
const { user, loading: authLoading, signOut } = useAuth()
|
|
14
|
-
const { file, jumpType, loading, uploadProgress, metrics, error, setFile, setJumpType, analyze, retry } = useAnalysis()
|
|
14
|
+
const { file, jumpType, loading, uploadProgress, metrics, error, enableDebug, setFile, setJumpType, setEnableDebug, analyze, retry } = useAnalysis()
|
|
15
15
|
const { recentUploads, addRecentUpload, clearRecentUploads } = useRecentUploads()
|
|
16
16
|
const { backendVersion, kinemotionVersion } = useBackendVersion()
|
|
17
17
|
|
|
@@ -70,9 +70,11 @@ function App() {
|
|
|
70
70
|
file={file}
|
|
71
71
|
jumpType={jumpType}
|
|
72
72
|
loading={loading}
|
|
73
|
+
enableDebug={enableDebug}
|
|
73
74
|
recentUploads={recentUploads}
|
|
74
75
|
onFileChange={setFile}
|
|
75
76
|
onJumpTypeChange={setJumpType}
|
|
77
|
+
onEnableDebugChange={setEnableDebug}
|
|
76
78
|
onAnalyze={handleAnalyze}
|
|
77
79
|
onClearHistory={clearRecentUploads}
|
|
78
80
|
/>
|
|
@@ -6,9 +6,11 @@ interface UploadFormProps {
|
|
|
6
6
|
file: File | null
|
|
7
7
|
jumpType: 'cmj' | 'dropjump'
|
|
8
8
|
loading: boolean
|
|
9
|
+
enableDebug: boolean
|
|
9
10
|
recentUploads: RecentUpload[]
|
|
10
11
|
onFileChange: (file: File | null) => void
|
|
11
12
|
onJumpTypeChange: (jumpType: 'cmj' | 'dropjump') => void
|
|
13
|
+
onEnableDebugChange: (enable: boolean) => void
|
|
12
14
|
onAnalyze: () => void
|
|
13
15
|
onClearHistory?: () => void
|
|
14
16
|
}
|
|
@@ -19,9 +21,11 @@ function UploadForm({
|
|
|
19
21
|
file,
|
|
20
22
|
jumpType,
|
|
21
23
|
loading,
|
|
24
|
+
enableDebug,
|
|
22
25
|
recentUploads,
|
|
23
26
|
onFileChange,
|
|
24
27
|
onJumpTypeChange,
|
|
28
|
+
onEnableDebugChange,
|
|
25
29
|
onAnalyze,
|
|
26
30
|
onClearHistory,
|
|
27
31
|
}: UploadFormProps) {
|
|
@@ -157,6 +161,25 @@ function UploadForm({
|
|
|
157
161
|
</select>
|
|
158
162
|
</div>
|
|
159
163
|
|
|
164
|
+
<div className="form-group checkbox-group">
|
|
165
|
+
<label htmlFor="enable-debug" className="checkbox-label">
|
|
166
|
+
<input
|
|
167
|
+
id="enable-debug"
|
|
168
|
+
type="checkbox"
|
|
169
|
+
checked={enableDebug}
|
|
170
|
+
onChange={(e) => onEnableDebugChange(e.target.checked)}
|
|
171
|
+
disabled={loading}
|
|
172
|
+
className="checkbox-input"
|
|
173
|
+
/>
|
|
174
|
+
<span>Enable debug video overlay</span>
|
|
175
|
+
</label>
|
|
176
|
+
<p className="checkbox-hint">
|
|
177
|
+
{enableDebug
|
|
178
|
+
? 'Debug video will be generated and available for download (~4-5 min slower)'
|
|
179
|
+
: 'Results only (faster analysis ~20 seconds)'}
|
|
180
|
+
</p>
|
|
181
|
+
</div>
|
|
182
|
+
|
|
160
183
|
<button
|
|
161
184
|
className="analyze-button"
|
|
162
185
|
onClick={onAnalyze}
|
|
@@ -9,11 +9,13 @@ interface UseAnalysisState {
|
|
|
9
9
|
uploadProgress: number
|
|
10
10
|
metrics: AnalysisResponse | null
|
|
11
11
|
error: string | null
|
|
12
|
+
enableDebug: boolean
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
interface UseAnalysisActions {
|
|
15
16
|
setFile: (file: File | null) => void
|
|
16
17
|
setJumpType: (jumpType: JumpType) => void
|
|
18
|
+
setEnableDebug: (enable: boolean) => void
|
|
17
19
|
analyze: () => Promise<void>
|
|
18
20
|
retry: () => Promise<void>
|
|
19
21
|
reset: () => void
|
|
@@ -30,6 +32,7 @@ export function useAnalysis(): UseAnalysisState & UseAnalysisActions {
|
|
|
30
32
|
const [uploadProgress, setUploadProgress] = useState(0)
|
|
31
33
|
const [metrics, setMetrics] = useState<AnalysisResponse | null>(null)
|
|
32
34
|
const [error, setError] = useState<string | null>(null)
|
|
35
|
+
const [enableDebug, setEnableDebug] = useState(false)
|
|
33
36
|
|
|
34
37
|
const analyze = async () => {
|
|
35
38
|
if (!file) {
|
|
@@ -47,6 +50,7 @@ export function useAnalysis(): UseAnalysisState & UseAnalysisActions {
|
|
|
47
50
|
// Convert frontend format (cmj/dropjump) to backend format (cmj/drop_jump)
|
|
48
51
|
const backendJumpType = jumpType === 'dropjump' ? 'drop_jump' : jumpType
|
|
49
52
|
formData.append('jump_type', backendJumpType)
|
|
53
|
+
formData.append('debug', enableDebug ? 'true' : 'false')
|
|
50
54
|
|
|
51
55
|
try {
|
|
52
56
|
// Use environment variable for API URL in production, or relative proxy in development
|
|
@@ -134,6 +138,7 @@ export function useAnalysis(): UseAnalysisState & UseAnalysisActions {
|
|
|
134
138
|
setUploadProgress(0)
|
|
135
139
|
setMetrics(null)
|
|
136
140
|
setError(null)
|
|
141
|
+
setEnableDebug(false)
|
|
137
142
|
}
|
|
138
143
|
|
|
139
144
|
return {
|
|
@@ -144,9 +149,11 @@ export function useAnalysis(): UseAnalysisState & UseAnalysisActions {
|
|
|
144
149
|
uploadProgress,
|
|
145
150
|
metrics,
|
|
146
151
|
error,
|
|
152
|
+
enableDebug,
|
|
147
153
|
// Actions
|
|
148
154
|
setFile,
|
|
149
155
|
setJumpType,
|
|
156
|
+
setEnableDebug,
|
|
150
157
|
analyze,
|
|
151
158
|
retry,
|
|
152
159
|
reset,
|