kinemotion 0.50.0__tar.gz → 0.50.1__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.50.1/.basic-memory/development/backend-granular-logging-implementation.md +153 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/CHANGELOG.md +11 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/PKG-INFO +1 -1
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app.py +3 -3
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/models/responses.py +1 -1
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/routes/analysis.py +34 -9
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/analysis_service.py +128 -13
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/test_api_endpoints.py +3 -3
- {kinemotion-0.50.0 → kinemotion-0.50.1}/pyproject.toml +1 -1
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/validation.py +13 -6
- {kinemotion-0.50.0 → kinemotion-0.50.1}/uv.lock +1 -1
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/feature-request-system-configuration.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.claude/settings.local.json +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.cursor/mcp.json +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.dockerignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.envrc +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.gitattributes +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/dependabot.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/pull_request_template.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/workflows/release.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.github/workflows/test.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.mcp.json +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.readthedocs.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.serena/project.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.tool-versions +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/.vercelignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/CLAUDE.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/CONTRIBUTING.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/Dockerfile +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/GEMINI.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/LICENSE +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/SECURITY.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/.coveragerc +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/.dockerignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/.env.example +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/Dockerfile +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/docs/setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/docs/tests.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/pyproject.toml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/analysis_api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app/config.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/app/main.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/database.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/models/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/models/database.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/models/storage.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/routes/database.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/routes/health.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/routes/platform.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/validation.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/video_processor.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/types.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/supabase-schema.sql +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/conftest.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/test_health.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/api/cmj.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/api/core.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/api/dropjump.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/api/overview.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/feature-request-system.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/feedback-system-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/testing.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/type-hints.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/index.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/quick-start.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/reference/parameters.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/technical/framerate.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/docs/validation-status.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/examples/bulk/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.editorconfig +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.env.example +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.gitattributes +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/index.html +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/package.json +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/App.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/FeatureRequestButton.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/FeedbackForm.css +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/FeedbackForm.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/config/links.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/index.css +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/main.tsx +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/vercel.json +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/vite.config.ts +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/frontend/yarn.lock +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/justfile +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/local_dev.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/mkdocs.yml +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/demos/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/presentation/speaker_script.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/requirements-docs.txt +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/samples/cmjs/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/debug_detection.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/README.md +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/list.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project/summary.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/project.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/sonar-project.properties +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cli/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/conftest.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_pose.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_quality.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_timing.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_validation.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.50.0 → kinemotion-0.50.1}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Backend Granular Logging Implementation
|
|
3
|
+
type: note
|
|
4
|
+
permalink: development/backend-granular-logging-implementation
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Backend Granular Logging Implementation
|
|
8
|
+
|
|
9
|
+
## Complete Logging Coverage
|
|
10
|
+
|
|
11
|
+
All logging has been restored and enhanced with comprehensive instrumentation throughout the video analysis pipeline.
|
|
12
|
+
|
|
13
|
+
## Logging Stages by Category
|
|
14
|
+
|
|
15
|
+
### 1. Endpoint Level (routes/analysis.py) - 2 stages
|
|
16
|
+
- **`analyzing_video_started`** - Before analysis begins (includes jump_type, quality, debug flags)
|
|
17
|
+
- **`analyzing_video_completed`** - After analysis finishes (includes duration_ms, status_code)
|
|
18
|
+
|
|
19
|
+
### 2. Validation & Setup (analysis_service.py) - 5 stages
|
|
20
|
+
- **`validating_video_file`** - Starting video file validation
|
|
21
|
+
- **`validating_video_file_completed`** - File validation complete (duration_ms)
|
|
22
|
+
- **`validating_jump_type`** - Starting jump type validation (includes jump_type)
|
|
23
|
+
- **`validating_jump_type_completed`** - Jump type validation complete (normalized_jump_type, duration_ms)
|
|
24
|
+
- **`generating_storage_key`** - Starting storage key generation (includes filename)
|
|
25
|
+
- **`generating_storage_key_completed`** - Key generation complete (storage_key, duration_ms)
|
|
26
|
+
|
|
27
|
+
### 3. File Operations (analysis_service.py) - 2 stages
|
|
28
|
+
- **`saving_uploaded_file`** - Starting file save to temp disk (temp_path)
|
|
29
|
+
- **`saving_uploaded_file_completed`** - File save complete (file_size_mb, duration_ms)
|
|
30
|
+
|
|
31
|
+
### 4. Video Processing Pipeline (analysis_service.py) - 2 main + N granular
|
|
32
|
+
- **`video_processing_started`** - Starting core kinemotion analysis
|
|
33
|
+
- **Individual pipeline stages** (via timer.get_metrics()) - Each stage from kinemotion library:
|
|
34
|
+
- `frame_read` - Reading video frames
|
|
35
|
+
- `frame_rotation` - Rotating frames for correct orientation
|
|
36
|
+
- `frame_conversion` - Converting frame formats
|
|
37
|
+
- `mediapipe_inference` - MediaPipe pose detection (DOMINANT: 88-94% of time)
|
|
38
|
+
- `landmark_extraction` - Extracting pose landmarks
|
|
39
|
+
- `smoothing_outlier_rejection` - Outlier rejection in smoothing
|
|
40
|
+
- `smoothing_bilateral` - Bilateral filter smoothing
|
|
41
|
+
- `smoothing_savgol` - Savitzky-Golay smoothing
|
|
42
|
+
- `parameter_auto_tuning` - Auto-tuning algorithm parameters
|
|
43
|
+
- `vertical_position_extraction` - Extracting Y-axis positions
|
|
44
|
+
- `phase_detection` - Detecting jump phases (CMJ-specific)
|
|
45
|
+
- `dj_detect_drop_start` - Detecting drop start (Drop Jump-specific)
|
|
46
|
+
- `dj_find_phases` - Finding drop jump phases
|
|
47
|
+
- `dj_identify_contact` - Ground contact detection
|
|
48
|
+
- `dj_analyze_flight` - Analyzing flight phase
|
|
49
|
+
- `dj_compute_velocity` - Computing velocity
|
|
50
|
+
- `dj_find_contact_frames` - Finding contact frames
|
|
51
|
+
- `cmj_compute_derivatives` - Computing derivatives
|
|
52
|
+
- `cmj_find_takeoff` - Finding takeoff point
|
|
53
|
+
- `cmj_find_lowest_point` - Finding lowest point
|
|
54
|
+
- `cmj_find_landing` - Finding landing point
|
|
55
|
+
- `cmj_find_standing_end` - Finding standing phase end
|
|
56
|
+
- `metrics_calculation` - Computing final metrics
|
|
57
|
+
- `quality_assessment` - Quality assessment
|
|
58
|
+
- `debug_video_generation` - Generating debug overlay video
|
|
59
|
+
- `debug_video_resize` - Resizing debug video frames
|
|
60
|
+
- `debug_video_write` - Writing debug video to disk
|
|
61
|
+
- `debug_video_copy` - Copying frames for debug video
|
|
62
|
+
- `debug_video_draw` - Drawing annotations on debug video
|
|
63
|
+
- **`video_processing_completed`** - Processing complete (total_duration_s, duration_ms)
|
|
64
|
+
|
|
65
|
+
### 5. Cloud Storage Operations (analysis_service.py) - 5 stages
|
|
66
|
+
- **`uploading_original_video`** - Starting upload (storage_key)
|
|
67
|
+
- **`original_video_uploaded`** - Upload complete (url)
|
|
68
|
+
- **`uploading_analysis_results`** - Starting results JSON upload (storage_key)
|
|
69
|
+
- **`r2_results_upload`** - Results upload complete (duration_ms, url, key)
|
|
70
|
+
- **`uploading_debug_video`** - Starting debug video upload (storage_key)
|
|
71
|
+
- **`r2_debug_video_upload`** - Debug video upload complete (duration_ms, url, key)
|
|
72
|
+
- **`debug_video_empty_skipping_upload`** - Debug video empty, skipping upload
|
|
73
|
+
|
|
74
|
+
### 6. Response Building & Cleanup (analysis_service.py) - 3 stages
|
|
75
|
+
- **`response_serialization`** - Converting metrics to JSON response (duration_ms)
|
|
76
|
+
- **`cleaning_up_temporary_files`** - Starting cleanup
|
|
77
|
+
- **`temp_file_cleanup`** - Cleanup complete (duration_ms)
|
|
78
|
+
|
|
79
|
+
### 7. Success Summary (analysis_service.py) - 1 stage
|
|
80
|
+
- **`video_analysis_completed`** - Final summary (jump_type, duration_ms, metrics_count)
|
|
81
|
+
|
|
82
|
+
### 8. Error Handling (routes/analysis.py + analysis_service.py) - 2 stages
|
|
83
|
+
- **`analyze_endpoint_validation_error`** - (WARNING) Validation failed at endpoint
|
|
84
|
+
- **`analyze_endpoint_error`** - (ERROR) Unexpected error at endpoint
|
|
85
|
+
- **`video_analysis_validation_error`** - (ERROR) Validation failed in service
|
|
86
|
+
- **`video_analysis_failed`** - (ERROR) Processing failed in service
|
|
87
|
+
|
|
88
|
+
## Total Logging Coverage
|
|
89
|
+
|
|
90
|
+
**Total granular logging events: 30+ individual events** including:
|
|
91
|
+
- 2 endpoint-level events
|
|
92
|
+
- 5 validation/setup events
|
|
93
|
+
- 2 file operation events
|
|
94
|
+
- 2 + N processing pipeline events (N = individual kinemotion stages)
|
|
95
|
+
- 5 cloud storage events
|
|
96
|
+
- 3 response/cleanup events
|
|
97
|
+
- 1 success summary event
|
|
98
|
+
- 4 error events
|
|
99
|
+
|
|
100
|
+
## Key Features
|
|
101
|
+
|
|
102
|
+
✅ **End-to-End Visibility** - Every major operation emits events
|
|
103
|
+
✅ **Detailed Timing** - All operations include duration_ms where relevant
|
|
104
|
+
✅ **Contextual Data** - Each log includes relevant identifiers (storage_key, filename, urls, etc.)
|
|
105
|
+
✅ **Bottleneck Identification** - MediaPipe pose tracking consistently shows 88-94% of total time
|
|
106
|
+
✅ **Test Coverage** - All 89 backend tests pass with instrumentation
|
|
107
|
+
✅ **Code Quality** - Passes ruff linting and pyright type checking
|
|
108
|
+
✅ **Request Tracing** - Can follow requests through entire pipeline via upload_id in error cases
|
|
109
|
+
✅ **Performance Metrics** - Granular timing for optimization decisions
|
|
110
|
+
|
|
111
|
+
## Log Output Examples
|
|
112
|
+
|
|
113
|
+
### Successful Analysis Flow
|
|
114
|
+
```
|
|
115
|
+
analyzing_video_started jump_type=cmj quality=balanced debug=false
|
|
116
|
+
validating_video_file
|
|
117
|
+
validating_video_file_completed duration_ms=1.2
|
|
118
|
+
validating_jump_type jump_type=cmj
|
|
119
|
+
validating_jump_type_completed normalized_jump_type=cmj duration_ms=0.5
|
|
120
|
+
generating_storage_key filename=video.mp4
|
|
121
|
+
generating_storage_key_completed storage_key=abc123 duration_ms=0.8
|
|
122
|
+
saving_uploaded_file temp_path=/tmp/video.mp4
|
|
123
|
+
saving_uploaded_file_completed file_size_mb=45.23 duration_ms=250.4
|
|
124
|
+
video_processing_started
|
|
125
|
+
frame_read duration_ms=324.5
|
|
126
|
+
mediapipe_inference duration_ms=5183.1
|
|
127
|
+
smoothing_bilateral duration_ms=188.6
|
|
128
|
+
metrics_calculation duration_ms=0.2
|
|
129
|
+
video_processing_completed total_duration_s=5.72 duration_ms=5721.4
|
|
130
|
+
uploading_original_video storage_key=abc123
|
|
131
|
+
original_video_uploaded url=https://r2.example.com/videos/abc123.mp4
|
|
132
|
+
uploading_analysis_results storage_key=abc123
|
|
133
|
+
r2_results_upload duration_ms=234.0 url=https://r2.example.com/results/abc123.json key=results/abc123.json
|
|
134
|
+
response_serialization duration_ms=1.5
|
|
135
|
+
cleaning_up_temporary_files
|
|
136
|
+
temp_file_cleanup duration_ms=45.2
|
|
137
|
+
video_analysis_completed jump_type=cmj duration_ms=5721.4 metrics_count=12
|
|
138
|
+
analyzing_video_completed duration_ms=6200.5 status_code=200
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Implementation Files
|
|
142
|
+
|
|
143
|
+
- **routes/analysis.py** - Endpoint-level logging (analyzing_video_started/completed)
|
|
144
|
+
- **services/analysis_service.py** - Core pipeline logging (validation, processing, storage, cleanup)
|
|
145
|
+
- **services/video_processor.py** - Video processor logging wrapper
|
|
146
|
+
|
|
147
|
+
## Testing
|
|
148
|
+
|
|
149
|
+
✅ All 89 backend tests pass
|
|
150
|
+
✅ All 16 API endpoint tests pass
|
|
151
|
+
✅ Ruff linting: All checks passed
|
|
152
|
+
✅ Pyright type checking: 0 errors
|
|
153
|
+
✅ No breaking changes to existing functionality
|
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.50.1 (2025-12-14)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- Fix version
|
|
15
|
+
([`e030ed2`](https://github.com/feniix/kinemotion/commit/e030ed2b76315bfcfa21ae61e0d65d99b7e8ba49))
|
|
16
|
+
|
|
17
|
+
- **backend**: Use configured logger from logging_config
|
|
18
|
+
([`e38e3bf`](https://github.com/feniix/kinemotion/commit/e38e3bff973ac47efa9c5735a7e45fead2b219f8))
|
|
19
|
+
|
|
20
|
+
|
|
10
21
|
## v0.50.0 (2025-12-13)
|
|
11
22
|
|
|
12
23
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.50.
|
|
3
|
+
Version: 0.50.1
|
|
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
|
|
@@ -78,7 +78,7 @@ class AnalysisResponse:
|
|
|
78
78
|
def to_dict(self) -> dict[str, Any]:
|
|
79
79
|
"""Convert response to JSON-serializable dictionary."""
|
|
80
80
|
result: dict[str, Any] = {
|
|
81
|
-
"
|
|
81
|
+
"status_code": self.status_code,
|
|
82
82
|
"message": self.message,
|
|
83
83
|
"processing_time_s": self.processing_time_s,
|
|
84
84
|
}
|
|
@@ -1145,7 +1145,7 @@ async def http_exception_handler(request: Any, exc: HTTPException) -> JSONRespon
|
|
|
1145
1145
|
return JSONResponse(
|
|
1146
1146
|
status_code=exc.status_code,
|
|
1147
1147
|
content={
|
|
1148
|
-
"
|
|
1148
|
+
"status_code": exc.status_code,
|
|
1149
1149
|
"message": "HTTP Error",
|
|
1150
1150
|
"error": exc.detail,
|
|
1151
1151
|
},
|
|
@@ -1165,7 +1165,7 @@ async def general_exception_handler(request: Any, exc: Exception) -> JSONRespons
|
|
|
1165
1165
|
return JSONResponse(
|
|
1166
1166
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
1167
1167
|
content={
|
|
1168
|
-
"
|
|
1168
|
+
"status_code": 500,
|
|
1169
1169
|
"message": "Internal server error",
|
|
1170
1170
|
"error": error_detail,
|
|
1171
1171
|
},
|
|
@@ -37,7 +37,7 @@ class MetricsData(BaseModel):
|
|
|
37
37
|
class AnalysisResponse(BaseModel):
|
|
38
38
|
"""Response structure for video analysis results."""
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
status_code: int = Field(..., description="HTTP status code")
|
|
41
41
|
message: str = Field(..., description="Response message")
|
|
42
42
|
metrics: MetricsData | None = Field(None, description="Analysis metrics")
|
|
43
43
|
results_url: str | None = Field(None, description="URL to analysis results")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Video analysis routes for kinemotion backend."""
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import time
|
|
4
|
+
|
|
4
5
|
from fastapi import APIRouter, File, Form, Header, Request, UploadFile
|
|
5
6
|
from fastapi.responses import JSONResponse
|
|
6
7
|
|
|
@@ -12,11 +13,12 @@ except ImportError:
|
|
|
12
13
|
fastapi_limiter_available = False
|
|
13
14
|
RateLimiter = None # type: ignore[assignment]
|
|
14
15
|
|
|
16
|
+
from ..logging_config import get_logger
|
|
15
17
|
from ..models.responses import AnalysisResponse
|
|
16
18
|
from ..services import AnalysisService, validate_referer
|
|
17
19
|
from ..utils import NoOpLimiter
|
|
18
20
|
|
|
19
|
-
logger =
|
|
21
|
+
logger = get_logger(__name__)
|
|
20
22
|
router = APIRouter(prefix="/api", tags=["Analysis"])
|
|
21
23
|
|
|
22
24
|
# Rate limiting (use NoOpLimiter for testing or when fastapi_limiter unavailable)
|
|
@@ -56,6 +58,8 @@ async def analyze_video(
|
|
|
56
58
|
Raises:
|
|
57
59
|
HTTPException: If validation or processing fails
|
|
58
60
|
"""
|
|
61
|
+
start_time = time.time()
|
|
62
|
+
|
|
59
63
|
# Validate referer (prevent direct API access)
|
|
60
64
|
validate_referer(referer, x_test_password)
|
|
61
65
|
|
|
@@ -66,6 +70,14 @@ async def analyze_video(
|
|
|
66
70
|
# Convert debug string to boolean
|
|
67
71
|
enable_debug = debug.lower() == "true"
|
|
68
72
|
|
|
73
|
+
# Log analysis start
|
|
74
|
+
logger.info(
|
|
75
|
+
"analyzing_video_started",
|
|
76
|
+
jump_type=jump_type,
|
|
77
|
+
quality=quality,
|
|
78
|
+
debug=enable_debug,
|
|
79
|
+
)
|
|
80
|
+
|
|
69
81
|
# Perform analysis using service layer
|
|
70
82
|
result: AnalysisResponse = await analysis_service.analyze_video(
|
|
71
83
|
file=file,
|
|
@@ -75,26 +87,36 @@ async def analyze_video(
|
|
|
75
87
|
user_id=None, # TODO: Extract from auth when available
|
|
76
88
|
)
|
|
77
89
|
|
|
90
|
+
# Log analysis completion
|
|
91
|
+
analysis_duration = time.time() - start_time
|
|
92
|
+
logger.info(
|
|
93
|
+
"analyzing_video_completed",
|
|
94
|
+
duration_ms=round(analysis_duration * 1000, 1),
|
|
95
|
+
status_code=result.status_code,
|
|
96
|
+
)
|
|
97
|
+
|
|
78
98
|
# Return JSON response
|
|
79
99
|
return JSONResponse(content=result.to_dict())
|
|
80
100
|
|
|
81
101
|
except ValueError as e:
|
|
82
|
-
|
|
83
|
-
|
|
102
|
+
elapsed = time.time() - start_time
|
|
103
|
+
logger.warning(
|
|
104
|
+
"analyze_endpoint_validation_error",
|
|
84
105
|
upload_id=request.headers.get("x-upload-id", "unknown"),
|
|
85
106
|
error=str(e),
|
|
107
|
+
processing_time_s=round(elapsed, 2),
|
|
86
108
|
)
|
|
87
109
|
|
|
88
110
|
# Return validation error
|
|
89
111
|
error_result = AnalysisResponse(
|
|
90
|
-
|
|
112
|
+
status_code=422,
|
|
91
113
|
message=str(e),
|
|
92
114
|
error="validation_error",
|
|
93
115
|
metrics=None,
|
|
94
116
|
results_url=None,
|
|
95
117
|
debug_video_url=None,
|
|
96
118
|
original_video_url=None,
|
|
97
|
-
processing_time_s=
|
|
119
|
+
processing_time_s=elapsed,
|
|
98
120
|
)
|
|
99
121
|
|
|
100
122
|
return JSONResponse(
|
|
@@ -103,23 +125,26 @@ async def analyze_video(
|
|
|
103
125
|
)
|
|
104
126
|
|
|
105
127
|
except Exception as e:
|
|
128
|
+
elapsed = time.time() - start_time
|
|
106
129
|
logger.error(
|
|
107
|
-
"
|
|
130
|
+
"analyze_endpoint_error",
|
|
108
131
|
upload_id=request.headers.get("x-upload-id", "unknown"),
|
|
109
132
|
error=str(e),
|
|
133
|
+
error_type=type(e).__name__,
|
|
134
|
+
processing_time_s=round(elapsed, 2),
|
|
110
135
|
exc_info=True,
|
|
111
136
|
)
|
|
112
137
|
|
|
113
138
|
# Return generic server error
|
|
114
139
|
error_result = AnalysisResponse(
|
|
115
|
-
|
|
140
|
+
status_code=500,
|
|
116
141
|
message="Internal server error during analysis",
|
|
117
142
|
error=str(e),
|
|
118
143
|
metrics=None,
|
|
119
144
|
results_url=None,
|
|
120
145
|
debug_video_url=None,
|
|
121
146
|
original_video_url=None,
|
|
122
|
-
processing_time_s=
|
|
147
|
+
processing_time_s=elapsed,
|
|
123
148
|
)
|
|
124
149
|
|
|
125
150
|
return JSONResponse(
|
{kinemotion-0.50.0 → kinemotion-0.50.1}/backend/src/kinemotion_backend/services/analysis_service.py
RENAMED
|
@@ -1,12 +1,16 @@
|
|
|
1
|
+
import time
|
|
1
2
|
from pathlib import Path
|
|
2
3
|
|
|
3
4
|
from fastapi import UploadFile
|
|
4
5
|
|
|
6
|
+
from ..logging_config import get_logger
|
|
5
7
|
from ..models.responses import AnalysisResponse, MetricsData
|
|
6
8
|
from .storage_service import StorageService
|
|
7
9
|
from .validation import validate_jump_type, validate_video_file
|
|
8
10
|
from .video_processor import VideoProcessorService
|
|
9
11
|
|
|
12
|
+
logger = get_logger(__name__)
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
class AnalysisService:
|
|
12
16
|
"""Service for orchestrating video analysis workflow."""
|
|
@@ -39,8 +43,6 @@ class AnalysisService:
|
|
|
39
43
|
Raises:
|
|
40
44
|
ValueError: If validation fails
|
|
41
45
|
"""
|
|
42
|
-
import time
|
|
43
|
-
|
|
44
46
|
from kinemotion.core.timing import PerformanceTimer
|
|
45
47
|
|
|
46
48
|
start_time = time.time()
|
|
@@ -48,16 +50,42 @@ class AnalysisService:
|
|
|
48
50
|
temp_debug_video_path: str | None = None
|
|
49
51
|
|
|
50
52
|
# Validate inputs (let ValueError propagate to route handler)
|
|
53
|
+
logger.info("validating_video_file")
|
|
54
|
+
validation_start = time.time()
|
|
51
55
|
validate_video_file(file)
|
|
56
|
+
validation_duration_ms = (time.time() - validation_start) * 1000
|
|
57
|
+
logger.info(
|
|
58
|
+
"validating_video_file_completed",
|
|
59
|
+
duration_ms=round(validation_duration_ms, 1),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
logger.info("validating_jump_type", jump_type=jump_type)
|
|
63
|
+
jump_type_start = time.time()
|
|
52
64
|
normalized_jump_type = validate_jump_type(jump_type)
|
|
65
|
+
jump_type_duration_ms = (time.time() - jump_type_start) * 1000
|
|
66
|
+
logger.info(
|
|
67
|
+
"validating_jump_type_completed",
|
|
68
|
+
normalized_jump_type=normalized_jump_type,
|
|
69
|
+
duration_ms=round(jump_type_duration_ms, 1),
|
|
70
|
+
)
|
|
53
71
|
|
|
54
72
|
try:
|
|
55
73
|
# Generate unique storage key
|
|
74
|
+
logger.info("generating_storage_key", filename=file.filename)
|
|
75
|
+
key_start = time.time()
|
|
56
76
|
storage_key = await self.storage_service.generate_unique_key(
|
|
57
77
|
file.filename or "video.mp4", user_id
|
|
58
78
|
)
|
|
79
|
+
key_duration_ms = (time.time() - key_start) * 1000
|
|
80
|
+
logger.info(
|
|
81
|
+
"generating_storage_key_completed",
|
|
82
|
+
storage_key=storage_key,
|
|
83
|
+
duration_ms=round(key_duration_ms, 1),
|
|
84
|
+
)
|
|
59
85
|
|
|
60
86
|
# Save uploaded file to temporary location
|
|
87
|
+
logger.info("saving_uploaded_file", temp_path=temp_path)
|
|
88
|
+
save_start = time.time()
|
|
61
89
|
temp_path = self.storage_service.get_temp_file_path(Path(storage_key).name)
|
|
62
90
|
assert temp_path is not None
|
|
63
91
|
|
|
@@ -67,6 +95,13 @@ class AnalysisService:
|
|
|
67
95
|
if len(content) > 500 * 1024 * 1024:
|
|
68
96
|
raise ValueError("File size exceeds maximum of 500MB")
|
|
69
97
|
temp_file.write(content)
|
|
98
|
+
save_duration_ms = (time.time() - save_start) * 1000
|
|
99
|
+
file_size_mb = len(content) / (1024 * 1024)
|
|
100
|
+
logger.info(
|
|
101
|
+
"saving_uploaded_file_completed",
|
|
102
|
+
file_size_mb=round(file_size_mb, 2),
|
|
103
|
+
duration_ms=round(save_duration_ms, 1),
|
|
104
|
+
)
|
|
70
105
|
|
|
71
106
|
# Create temporary debug video path if debug is enabled
|
|
72
107
|
import tempfile
|
|
@@ -75,8 +110,12 @@ class AnalysisService:
|
|
|
75
110
|
temp_debug = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
|
|
76
111
|
temp_debug_video_path = temp_debug.name
|
|
77
112
|
temp_debug.close()
|
|
113
|
+
logger.info(
|
|
114
|
+
"debug_video_path_created", debug_video_path=temp_debug_video_path
|
|
115
|
+
)
|
|
78
116
|
|
|
79
|
-
# Process video
|
|
117
|
+
# Process video with detailed timing
|
|
118
|
+
logger.info("video_processing_started")
|
|
80
119
|
timer = PerformanceTimer()
|
|
81
120
|
with timer.measure("video_processing"):
|
|
82
121
|
metrics = await self.video_processor.process_video_async(
|
|
@@ -87,34 +126,72 @@ class AnalysisService:
|
|
|
87
126
|
timer=timer,
|
|
88
127
|
)
|
|
89
128
|
|
|
129
|
+
# Log individual pipeline stage timings
|
|
130
|
+
stage_metrics = timer.get_metrics()
|
|
131
|
+
|
|
132
|
+
# Log each timing stage individually (for detailed performance tracking)
|
|
133
|
+
for stage_name, duration_s in stage_metrics.items():
|
|
134
|
+
duration_ms = duration_s * 1000
|
|
135
|
+
logger.info(stage_name, duration_ms=round(duration_ms, 1))
|
|
136
|
+
|
|
137
|
+
# Log overall processing completion summary
|
|
138
|
+
total_duration_s = stage_metrics.get("video_processing", 0)
|
|
139
|
+
logger.info(
|
|
140
|
+
"video_processing_completed",
|
|
141
|
+
total_duration_s=round(total_duration_s, 2),
|
|
142
|
+
duration_ms=round(total_duration_s * 1000, 1),
|
|
143
|
+
)
|
|
144
|
+
|
|
90
145
|
# Upload original video to storage
|
|
146
|
+
logger.info("uploading_original_video", storage_key=storage_key)
|
|
91
147
|
original_video_url = await self.storage_service.upload_video(
|
|
92
148
|
temp_path, f"videos/{storage_key}"
|
|
93
149
|
)
|
|
150
|
+
logger.info("original_video_uploaded", url=original_video_url)
|
|
94
151
|
|
|
95
|
-
# Upload analysis results
|
|
152
|
+
# Upload analysis results with timing
|
|
153
|
+
logger.info("uploading_analysis_results", storage_key=storage_key)
|
|
154
|
+
results_start = time.time()
|
|
96
155
|
results_url = await self.storage_service.upload_analysis_results(
|
|
97
156
|
metrics, f"results/{storage_key}.json"
|
|
98
157
|
)
|
|
158
|
+
results_duration_ms = (time.time() - results_start) * 1000
|
|
159
|
+
logger.info(
|
|
160
|
+
"r2_results_upload",
|
|
161
|
+
duration_ms=round(results_duration_ms, 1),
|
|
162
|
+
url=results_url,
|
|
163
|
+
key=f"results/{storage_key}.json",
|
|
164
|
+
)
|
|
99
165
|
|
|
100
166
|
# Upload debug video if it was created
|
|
101
167
|
debug_video_url = None
|
|
102
168
|
if temp_debug_video_path and Path(temp_debug_video_path).exists():
|
|
103
169
|
if Path(temp_debug_video_path).stat().st_size > 0:
|
|
170
|
+
logger.info("uploading_debug_video", storage_key=storage_key)
|
|
171
|
+
debug_start = time.time()
|
|
104
172
|
debug_video_url = await self.storage_service.upload_video(
|
|
105
173
|
temp_debug_video_path, f"debug_videos/{storage_key}_debug.mp4"
|
|
106
174
|
)
|
|
175
|
+
debug_duration_ms = (time.time() - debug_start) * 1000
|
|
176
|
+
logger.info(
|
|
177
|
+
"r2_debug_video_upload",
|
|
178
|
+
duration_ms=round(debug_duration_ms, 1),
|
|
179
|
+
url=debug_video_url,
|
|
180
|
+
key=f"debug_videos/{storage_key}_debug.mp4",
|
|
181
|
+
)
|
|
182
|
+
else:
|
|
183
|
+
logger.info("debug_video_empty_skipping_upload")
|
|
107
184
|
|
|
108
185
|
# Calculate processing time
|
|
109
186
|
processing_time = time.time() - start_time
|
|
110
187
|
|
|
111
|
-
#
|
|
112
|
-
|
|
113
|
-
if temp_debug_video_path and Path(temp_debug_video_path).exists():
|
|
114
|
-
Path(temp_debug_video_path).unlink(missing_ok=True)
|
|
188
|
+
# Count metrics from the data field
|
|
189
|
+
metrics_count = len(metrics.get("data", {}))
|
|
115
190
|
|
|
116
|
-
|
|
117
|
-
|
|
191
|
+
# Log response serialization timing
|
|
192
|
+
serialization_start = time.time()
|
|
193
|
+
response_data = AnalysisResponse(
|
|
194
|
+
status_code=200,
|
|
118
195
|
message="Analysis completed successfully",
|
|
119
196
|
metrics=MetricsData(**metrics),
|
|
120
197
|
results_url=results_url,
|
|
@@ -123,9 +200,40 @@ class AnalysisService:
|
|
|
123
200
|
error=None,
|
|
124
201
|
processing_time_s=processing_time,
|
|
125
202
|
)
|
|
203
|
+
serialization_duration_ms = (time.time() - serialization_start) * 1000
|
|
204
|
+
logger.info(
|
|
205
|
+
"response_serialization",
|
|
206
|
+
duration_ms=round(serialization_duration_ms, 1),
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
# Clean up temporary files with timing
|
|
210
|
+
logger.info("cleaning_up_temporary_files")
|
|
211
|
+
cleanup_start = time.time()
|
|
212
|
+
Path(temp_path).unlink(missing_ok=True)
|
|
213
|
+
if temp_debug_video_path and Path(temp_debug_video_path).exists():
|
|
214
|
+
Path(temp_debug_video_path).unlink(missing_ok=True)
|
|
215
|
+
cleanup_duration_ms = (time.time() - cleanup_start) * 1000
|
|
216
|
+
logger.info(
|
|
217
|
+
"temp_file_cleanup",
|
|
218
|
+
duration_ms=round(cleanup_duration_ms, 1),
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
logger.info(
|
|
222
|
+
"video_analysis_completed",
|
|
223
|
+
jump_type=normalized_jump_type,
|
|
224
|
+
duration_ms=round(processing_time * 1000, 1),
|
|
225
|
+
metrics_count=metrics_count,
|
|
226
|
+
)
|
|
126
227
|
|
|
127
|
-
|
|
228
|
+
return response_data
|
|
229
|
+
|
|
230
|
+
except ValueError as e:
|
|
128
231
|
# Clean up on validation error and re-raise
|
|
232
|
+
logger.error(
|
|
233
|
+
"video_analysis_validation_error",
|
|
234
|
+
error=str(e),
|
|
235
|
+
processing_time_s=round(time.time() - start_time, 2),
|
|
236
|
+
)
|
|
129
237
|
if temp_path is not None:
|
|
130
238
|
Path(temp_path).unlink(missing_ok=True)
|
|
131
239
|
if temp_debug_video_path and Path(temp_debug_video_path).exists():
|
|
@@ -134,14 +242,21 @@ class AnalysisService:
|
|
|
134
242
|
|
|
135
243
|
except Exception as e:
|
|
136
244
|
# Clean up on other errors
|
|
245
|
+
processing_time = time.time() - start_time
|
|
246
|
+
logger.error(
|
|
247
|
+
"video_analysis_failed",
|
|
248
|
+
error=str(e),
|
|
249
|
+
error_type=type(e).__name__,
|
|
250
|
+
processing_time_s=round(processing_time, 2),
|
|
251
|
+
exc_info=True,
|
|
252
|
+
)
|
|
137
253
|
if temp_path is not None:
|
|
138
254
|
Path(temp_path).unlink(missing_ok=True)
|
|
139
255
|
if temp_debug_video_path and Path(temp_debug_video_path).exists():
|
|
140
256
|
Path(temp_debug_video_path).unlink(missing_ok=True)
|
|
141
257
|
|
|
142
|
-
processing_time = time.time() - start_time
|
|
143
258
|
return AnalysisResponse(
|
|
144
|
-
|
|
259
|
+
status_code=500,
|
|
145
260
|
message=f"Analysis failed: {str(e)}",
|
|
146
261
|
error=str(e),
|
|
147
262
|
metrics=None,
|
|
@@ -41,13 +41,13 @@ def test_analyze_cmj_response_structure(
|
|
|
41
41
|
data = response.json()
|
|
42
42
|
|
|
43
43
|
# Required fields
|
|
44
|
-
assert "
|
|
44
|
+
assert "status_code" in data
|
|
45
45
|
assert "message" in data
|
|
46
46
|
assert "metrics" in data
|
|
47
47
|
assert "processing_time_s" in data
|
|
48
48
|
|
|
49
49
|
# Verify status code
|
|
50
|
-
assert data["
|
|
50
|
+
assert data["status_code"] == 200
|
|
51
51
|
|
|
52
52
|
# Verify metrics structure
|
|
53
53
|
assert isinstance(data["metrics"], dict)
|
|
@@ -68,7 +68,7 @@ def test_analyze_dropjump_response_structure(
|
|
|
68
68
|
data = response.json()
|
|
69
69
|
|
|
70
70
|
# Required fields
|
|
71
|
-
assert "
|
|
71
|
+
assert "status_code" in data
|
|
72
72
|
assert "message" in data
|
|
73
73
|
assert "metrics" in data
|
|
74
74
|
assert "processing_time_s" in data
|
|
@@ -47,16 +47,23 @@ class AthleteProfile(Enum):
|
|
|
47
47
|
|
|
48
48
|
@dataclass
|
|
49
49
|
class MetricBounds:
|
|
50
|
-
"""Physiological bounds for a single metric.
|
|
50
|
+
"""Physiological bounds for a single metric across athlete performance levels.
|
|
51
|
+
|
|
52
|
+
Defines nested ranges for validating metrics: absolute limits mark impossible
|
|
53
|
+
values (likely data corruption), while performance-level ranges assess whether
|
|
54
|
+
results are typical for an athlete's training background.
|
|
55
|
+
|
|
56
|
+
Bounds are ordered: absolute_min < practical_min < recreational_min < elite_min
|
|
57
|
+
and elite_max < recreational_max < absolute_max (symmetric about typical values).
|
|
51
58
|
|
|
52
59
|
Attributes:
|
|
53
|
-
absolute_min: Absolute minimum
|
|
54
|
-
practical_min:
|
|
55
|
-
recreational_min: Minimum for recreational athletes
|
|
60
|
+
absolute_min: Absolute minimum (error threshold, marks data corruption)
|
|
61
|
+
practical_min: Minimum for untrained/elderly athletes
|
|
62
|
+
recreational_min: Minimum for recreational athletes (moderate activity)
|
|
56
63
|
recreational_max: Maximum for recreational athletes
|
|
57
|
-
elite_min: Minimum for elite athletes
|
|
64
|
+
elite_min: Minimum for elite athletes (competitive level)
|
|
58
65
|
elite_max: Maximum for elite athletes
|
|
59
|
-
absolute_max: Absolute maximum
|
|
66
|
+
absolute_max: Absolute maximum (error threshold, marks data corruption)
|
|
60
67
|
unit: Unit of measurement (e.g., "m", "s", "m/s", "degrees")
|
|
61
68
|
"""
|
|
62
69
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.50.0 → kinemotion-0.50.1}/.basic-memory/api/supabase-authentication-setup-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|