kinemotion 0.39.1__tar.gz → 0.41.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.41.0/.basic-memory/development/comprehensive-timing-instrumentation.md +274 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/CHANGELOG.md +29 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/GEMINI.md +11 -9
- {kinemotion-0.39.1 → kinemotion-0.41.0}/PKG-INFO +1 -1
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/src/kinemotion_backend/app.py +83 -9
- {kinemotion-0.39.1 → kinemotion-0.41.0}/pyproject.toml +1 -1
- {kinemotion-0.39.1 → kinemotion-0.41.0}/sonar-project.properties +1 -1
- kinemotion-0.41.0/src/kinemotion/api.py +1433 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/__init__.py +3 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/debug_overlay_utils.py +6 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/metadata.py +9 -1
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/pose.py +11 -2
- kinemotion-0.41.0/src/kinemotion/core/timing.py +49 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/video_io.py +11 -2
- kinemotion-0.41.0/tests/core/test_timing.py +72 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_kinematics.py +4 -2
- {kinemotion-0.39.1 → kinemotion-0.41.0}/uv.lock +1 -1
- kinemotion-0.39.1/src/kinemotion/api.py +0 -1212
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.dockerignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.gitattributes +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/workflows/security.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.mcp.json +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.readthedocs.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.serena/project.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.tool-versions +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/.vercelignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/CLAUDE.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/Dockerfile +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/LICENSE +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/SECURITY.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/.dockerignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/.env.example +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/Dockerfile +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/api/core.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/api/overview.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/testing.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/index.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/quick-start.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/docs/validation-status.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.env.example +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/index.html +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/package.json +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/index.css +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/vercel.json +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/justfile +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/local_dev.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/mkdocs.yml +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/requirements-docs.txt +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/README.md +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/project.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/conftest.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.39.1 → kinemotion-0.41.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Comprehensive Timing Instrumentation
|
|
3
|
+
type: note
|
|
4
|
+
permalink: development/comprehensive-timing-instrumentation
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Comprehensive Timing Instrumentation
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Complete timing instrumentation implemented across the entire backend and core analysis pipeline. Every significant operation now emits structured timing events for full end-to-end visibility. Analysis reveals **MediaPipe pose tracking dominates processing time (88-94%)**.
|
|
12
|
+
|
|
13
|
+
## Architecture & Data Flow
|
|
14
|
+
|
|
15
|
+
### Complete Data Flow
|
|
16
|
+
```
|
|
17
|
+
process_cmj_video / process_dropjump_video (API)
|
|
18
|
+
↓
|
|
19
|
+
stage_times dict (collected during analysis)
|
|
20
|
+
├─ timing_video_initialization
|
|
21
|
+
├─ timing_pose_tracking
|
|
22
|
+
├─ timing_parameter_auto_tuning
|
|
23
|
+
├─ timing_smoothing
|
|
24
|
+
├─ timing_vertical_position_extraction
|
|
25
|
+
├─ timing_phase_detection
|
|
26
|
+
├─ timing_metrics_calculation
|
|
27
|
+
└─ timing_quality_assessment
|
|
28
|
+
↓
|
|
29
|
+
ProcessingInfo.timing_breakdown (stored in metrics metadata)
|
|
30
|
+
↓
|
|
31
|
+
metrics.to_dict() includes timing_breakdown_ms
|
|
32
|
+
↓
|
|
33
|
+
Backend extracts and emits individual timing events
|
|
34
|
+
↓
|
|
35
|
+
Structured logs (JSON in production, colored in development)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Complete List of All Timing Events (20 Total)
|
|
39
|
+
|
|
40
|
+
### Backend Operations (5 events)
|
|
41
|
+
1. **`timing_video_validation`** - Validating uploaded video file format/codec
|
|
42
|
+
2. **`timing_video_file_save`** - Writing uploaded video file to temporary disk
|
|
43
|
+
3. **`timing_r2_input_video_upload`** - Uploading input video to R2 storage
|
|
44
|
+
4. **`timing_response_serialization`** - Converting metrics to JSON and building HTTP response
|
|
45
|
+
5. **`timing_temp_file_cleanup`** - Cleaning up temporary video files
|
|
46
|
+
|
|
47
|
+
### Core Analysis Pipeline (8 events)
|
|
48
|
+
6. **`timing_video_initialization`** - VideoProcessor setup and frame reading
|
|
49
|
+
7. **`timing_pose_tracking`** - MediaPipe pose detection on all frames (~90% of total)
|
|
50
|
+
8. **`timing_parameter_auto_tuning`** - Auto-tuning algorithm parameters
|
|
51
|
+
9. **`timing_smoothing`** - Savitzky-Golay smoothing filter
|
|
52
|
+
10. **`timing_vertical_position_extraction`** - Extracting Y-axis positions
|
|
53
|
+
11. **`timing_phase_detection`** - Detecting jump phases
|
|
54
|
+
12. **`timing_metrics_calculation`** - Computing final metrics
|
|
55
|
+
13. **`timing_quality_assessment`** - Quality assessment
|
|
56
|
+
|
|
57
|
+
### Output Generation (3 events)
|
|
58
|
+
14. **`timing_metadata_building`** - Creating VideoInfo, ProcessingInfo, AlgorithmConfig, ResultMetadata
|
|
59
|
+
15. **`timing_metrics_validation`** - Running DropJumpMetricsValidator or CMJMetricsValidator
|
|
60
|
+
16. **`timing_json_serialization`** - Converting metrics.to_dict() to JSON string
|
|
61
|
+
|
|
62
|
+
### Debug Video Processing (2 events)
|
|
63
|
+
17. **`timing_debug_video_generation`** - Rendering annotated frames and writing to disk (always logged when requested)
|
|
64
|
+
18. **`timing_debug_video_reencode`** - FFmpeg re-encoding for browser compatibility (only if codec fallback)
|
|
65
|
+
|
|
66
|
+
### Cloud Storage (2 events)
|
|
67
|
+
19. **`timing_r2_results_upload`** - Uploading metrics JSON to R2
|
|
68
|
+
20. **`timing_r2_debug_video_upload`** - Uploading debug video to R2
|
|
69
|
+
|
|
70
|
+
## Implementation Details
|
|
71
|
+
|
|
72
|
+
### Core API Changes (src/kinemotion/api.py)
|
|
73
|
+
|
|
74
|
+
**Renamed function for consistency:**
|
|
75
|
+
- `_generate_outputs()` → `_generate_dropjump_outputs()`
|
|
76
|
+
- Ensures both jump types use consistent naming pattern
|
|
77
|
+
|
|
78
|
+
**Updated `_generate_dropjump_outputs()` and `_generate_cmj_outputs()`:**
|
|
79
|
+
- Now returns `tuple[float, float, float]` instead of `None`
|
|
80
|
+
- Returns: `(generation_duration, reencode_duration, json_duration)`
|
|
81
|
+
- Measures JSON serialization, debug video generation, and re-encoding separately
|
|
82
|
+
|
|
83
|
+
**Updated both `process_dropjump_video()` and `process_cmj_video()`:**
|
|
84
|
+
- Capture timing for metadata building (VideoInfo, ProcessingInfo, AlgorithmConfig, ResultMetadata)
|
|
85
|
+
- Capture timing for metrics validation
|
|
86
|
+
- Unpack all three duration values from output generator
|
|
87
|
+
- Add all timings to `stage_times` dict
|
|
88
|
+
|
|
89
|
+
### Backend Changes (backend/src/kinemotion_backend/app.py)
|
|
90
|
+
|
|
91
|
+
**Added timing event emissions:**
|
|
92
|
+
- `timing_video_validation` (line 507) - Validates uploaded video
|
|
93
|
+
- `timing_video_file_save` (line 519) - Writes to temporary disk
|
|
94
|
+
- `timing_r2_input_video_upload` (line 534) - Renamed from `video_uploaded_to_r2` for consistency
|
|
95
|
+
- `timing_response_serialization` (line 654) - JSON serialization overhead
|
|
96
|
+
- `timing_temp_file_cleanup` (line 732) - Temporary file cleanup
|
|
97
|
+
|
|
98
|
+
All backend timings logged at INFO level with `logger.info()` and `duration_ms` field.
|
|
99
|
+
|
|
100
|
+
### Metadata Changes (src/kinemotion/core/metadata.py)
|
|
101
|
+
|
|
102
|
+
**Added to `ProcessingInfo` dataclass:**
|
|
103
|
+
- `timing_breakdown: dict[str, float] | None = None`
|
|
104
|
+
- `to_dict()` converts timings to milliseconds as `timing_breakdown_ms`
|
|
105
|
+
- Included in returned metrics metadata
|
|
106
|
+
|
|
107
|
+
### Debug Overlay Changes (src/kinemotion/core/debug_overlay_utils.py)
|
|
108
|
+
|
|
109
|
+
**Updated `BaseDebugOverlayRenderer`:**
|
|
110
|
+
- Added `reencode_duration_s = 0.0` attribute
|
|
111
|
+
- `close()` method captures FFmpeg re-encoding time
|
|
112
|
+
- Only populated if codec fallback occurs (mp4v → H.264)
|
|
113
|
+
|
|
114
|
+
## Log Output Examples
|
|
115
|
+
|
|
116
|
+
### Development Mode (Colored)
|
|
117
|
+
```
|
|
118
|
+
2024-12-10T14:23:45.123456+00:00 [INFO] timing_pose_tracking duration_ms=5183.1
|
|
119
|
+
2024-12-10T14:23:45.234567+00:00 [INFO] timing_debug_video_generation duration_ms=850.3
|
|
120
|
+
2024-12-10T14:23:48.234567+00:00 [INFO] timing_debug_video_reencode duration_ms=400.2
|
|
121
|
+
2024-12-10T14:23:49.345678+00:00 [INFO] timing_r2_results_upload duration_ms=234.0
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Production Mode (JSON)
|
|
125
|
+
```json
|
|
126
|
+
{"timestamp": "2025-12-10T14:23:45.123456Z", "severity": "INFO", "event": "timing_pose_tracking", "duration_ms": 5183.1}
|
|
127
|
+
{"timestamp": "2025-12-10T14:23:45.234567Z", "severity": "INFO", "event": "timing_debug_video_generation", "duration_ms": 850.3}
|
|
128
|
+
{"timestamp": "2025-12-10T14:23:48.234567Z", "severity": "INFO", "event": "timing_debug_video_reencode", "duration_ms": 400.2}
|
|
129
|
+
{"timestamp": "2025-12-10T14:23:49.345678Z", "severity": "INFO", "event": "timing_r2_results_upload", "duration_ms": 234.0}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Metrics JSON Response
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"metadata": {
|
|
136
|
+
"processing": {
|
|
137
|
+
"version": "0.39.1",
|
|
138
|
+
"timestamp": "2025-12-10T13:41:33.547498+00:00",
|
|
139
|
+
"quality_preset": "balanced",
|
|
140
|
+
"processing_time_s": 5.713,
|
|
141
|
+
"timing_breakdown_ms": {
|
|
142
|
+
"Video initialization": 325.4,
|
|
143
|
+
"Pose tracking": 5183.1,
|
|
144
|
+
"Parameter auto-tuning": 2.0,
|
|
145
|
+
"Smoothing": 188.6,
|
|
146
|
+
"Vertical position extraction": 4.6,
|
|
147
|
+
"Phase detection": 1.2,
|
|
148
|
+
"Metrics calculation": 0.2,
|
|
149
|
+
"Quality assessment": 7.7
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Performance Analysis
|
|
157
|
+
|
|
158
|
+
### CMJ Analysis (236 frames @ 29.58fps, 8s video)
|
|
159
|
+
```
|
|
160
|
+
Video initialization..................... 128ms ( 2.3%)
|
|
161
|
+
Pose tracking........................... 5196ms ( 94.1%) ← BOTTLENECK
|
|
162
|
+
Parameter auto-tuning................... 2ms ( 0.0%)
|
|
163
|
+
Smoothing............................... 179ms ( 3.2%)
|
|
164
|
+
Vertical position extraction............ 5ms ( 0.1%)
|
|
165
|
+
Phase detection......................... 1ms ( 0.0%)
|
|
166
|
+
Metrics calculation..................... 0ms ( 0.0%)
|
|
167
|
+
Quality assessment...................... 8ms ( 0.2%)
|
|
168
|
+
Total................................... 5521ms (100.0%)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Drop Jump Analysis (89 frames @ 29.73fps, 3s video)
|
|
172
|
+
```
|
|
173
|
+
Pose tracking........................... 2114ms ( 92.1%) ← BOTTLENECK
|
|
174
|
+
Parameter auto-tuning................... 1ms ( 0.0%)
|
|
175
|
+
Smoothing............................... 70ms ( 3.0%)
|
|
176
|
+
Vertical position extraction............ 1ms ( 0.0%)
|
|
177
|
+
Ground contact detection................ 0ms ( 0.0%)
|
|
178
|
+
Metrics calculation..................... 4ms ( 0.2%)
|
|
179
|
+
Quality assessment...................... 3ms ( 0.1%)
|
|
180
|
+
Total................................... 2294ms (100.0%)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Key Findings
|
|
184
|
+
- **Primary Bottleneck**: MediaPipe pose tracking (88-94% of time)
|
|
185
|
+
- Processes every frame through neural network
|
|
186
|
+
- ~22-23ms per frame on average
|
|
187
|
+
- Scales linearly with frame count
|
|
188
|
+
|
|
189
|
+
- **Fast Operations**:
|
|
190
|
+
- Smoothing: 3%
|
|
191
|
+
- Video initialization: 2-4%
|
|
192
|
+
- All other operations: <1% each
|
|
193
|
+
|
|
194
|
+
## Google Cloud Logging Queries
|
|
195
|
+
|
|
196
|
+
**Find all timing events:**
|
|
197
|
+
```
|
|
198
|
+
jsonPayload.event=~"^timing_"
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Find specific stage:**
|
|
202
|
+
```
|
|
203
|
+
jsonPayload.event="timing_pose_tracking"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Find R2 operations:**
|
|
207
|
+
```
|
|
208
|
+
jsonPayload.event=~"^timing_r2_"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Find analysis pipeline only (exclude R2/debug):**
|
|
212
|
+
```
|
|
213
|
+
jsonPayload.event=~"^timing_" AND NOT jsonPayload.event=~"^timing_r2_|timing_debug"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Find slow stages (>1 second):**
|
|
217
|
+
```
|
|
218
|
+
jsonPayload.event=~"^timing_" AND jsonPayload.duration_ms > 1000
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Timeline of all operations:**
|
|
222
|
+
```
|
|
223
|
+
jsonPayload.event=~"^timing_" AND timestamp>="2025-12-10T14:23:45Z" AND timestamp<"2025-12-10T14:24:00Z"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Average duration per stage:**
|
|
227
|
+
```
|
|
228
|
+
# Use Cloud Monitoring to aggregate by event name and calculate mean(duration_ms)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Optimization Recommendations
|
|
232
|
+
|
|
233
|
+
### High Impact (Address Pose Tracking Bottleneck)
|
|
234
|
+
1. **Reduce frame rate** - Process every Nth frame (e.g., 15fps instead of 30fps)
|
|
235
|
+
2. **GPU acceleration** - MediaPipe supports GPU if available
|
|
236
|
+
3. **Async processing** - Pre-process poses while waiting for upload
|
|
237
|
+
4. **Frame batching** - Process multiple frames in parallel if memory permits
|
|
238
|
+
|
|
239
|
+
### Medium Impact
|
|
240
|
+
1. **Optimize smoothing** - Already efficient (3%), but FFT possible for large videos
|
|
241
|
+
2. **Lazy output generation** - Only generate debug video if requested
|
|
242
|
+
|
|
243
|
+
### Low Impact (Already fast)
|
|
244
|
+
- Phase detection, metrics calculation, quality assessment already negligible
|
|
245
|
+
|
|
246
|
+
## Benefits of Complete Instrumentation
|
|
247
|
+
|
|
248
|
+
✅ **Full Pipeline Visibility** - See every stage from upload to response
|
|
249
|
+
✅ **Bottleneck Identification** - Pose tracking consistently ~90% (MediaPipe limitation)
|
|
250
|
+
✅ **Backend vs Analysis** - Measure server overhead vs. analysis time
|
|
251
|
+
✅ **Debug Overhead** - Track cost of generating debug videos
|
|
252
|
+
✅ **Storage Costs** - Monitor R2 upload times
|
|
253
|
+
✅ **Response Latency** - Measure serialization overhead
|
|
254
|
+
✅ **Validation Performance** - Track metrics validation timing
|
|
255
|
+
✅ **Metadata Building** - Measure config object creation time
|
|
256
|
+
✅ **Granular Querying** - Each event independently queryable
|
|
257
|
+
✅ **Optimization Targets** - Data-driven decisions on improvements
|
|
258
|
+
|
|
259
|
+
## Testing
|
|
260
|
+
|
|
261
|
+
✅ All 38 API tests pass (cmj and dropjump)
|
|
262
|
+
✅ All 85 backend tests pass
|
|
263
|
+
✅ Type checking passes (pyright strict)
|
|
264
|
+
✅ Linting passes (ruff)
|
|
265
|
+
✅ Timing data flows correctly through entire pipeline
|
|
266
|
+
✅ JSON output includes timing_breakdown_ms
|
|
267
|
+
✅ Individual timing events properly logged at INFO level
|
|
268
|
+
|
|
269
|
+
## Files Modified
|
|
270
|
+
|
|
271
|
+
- `src/kinemotion/api.py` - Renamed `_generate_outputs()`, added timing capture for all stages
|
|
272
|
+
- `src/kinemotion/core/metadata.py` - Added `timing_breakdown` field to `ProcessingInfo`
|
|
273
|
+
- `src/kinemotion/core/debug_overlay_utils.py` - Added `reencode_duration_s` attribute
|
|
274
|
+
- `backend/src/kinemotion_backend/app.py` - Added 5 new timing event emissions
|
|
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.41.0 (2025-12-10)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- Add comprehensive timing instrumentation across backend and core pipeline
|
|
15
|
+
([`acb3df6`](https://github.com/feniix/kinemotion/commit/acb3df65d2895fbdae7fcc7f52a73bf7b6fb36d1))
|
|
16
|
+
|
|
17
|
+
- Implement hybrid timing instrumentation with PerformanceTimer abstraction
|
|
18
|
+
([`b207193`](https://github.com/feniix/kinemotion/commit/b207193e047c869e52dfe5303616806f491f938f))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## v0.40.0 (2025-12-10)
|
|
22
|
+
|
|
23
|
+
### Documentation
|
|
24
|
+
|
|
25
|
+
- Switch formatting tool from black to ruff in GEMINI.md
|
|
26
|
+
([`7bf2e3e`](https://github.com/feniix/kinemotion/commit/7bf2e3e073fea368470359a0bdff65b8568e48e1))
|
|
27
|
+
|
|
28
|
+
### Features
|
|
29
|
+
|
|
30
|
+
- Add detailed timing logs to analysis pipeline
|
|
31
|
+
([`4c75820`](https://github.com/feniix/kinemotion/commit/4c758201be03dbd06f463e2434ca287bb123bfd5))
|
|
32
|
+
|
|
33
|
+
### Testing
|
|
34
|
+
|
|
35
|
+
- Relax flight time assertion in kinematics test
|
|
36
|
+
([`b360c4d`](https://github.com/feniix/kinemotion/commit/b360c4de88c92e365657775041fe7eea04892a27))
|
|
37
|
+
|
|
38
|
+
|
|
10
39
|
## v0.39.1 (2025-12-10)
|
|
11
40
|
|
|
12
41
|
### Bug Fixes
|
|
@@ -20,18 +20,18 @@ The project uses `uv` for dependency management and `asdf` for Python version ma
|
|
|
20
20
|
**Key Libraries:**
|
|
21
21
|
|
|
22
22
|
- **Production**: `click`, `opencv-python`, `mediapipe`, `numpy`, `scipy`.
|
|
23
|
-
- **Development**: `pytest`, `
|
|
23
|
+
- **Development**: `pytest`, `ruff`, `pyright`.
|
|
24
24
|
|
|
25
25
|
### Development Commands
|
|
26
26
|
|
|
27
27
|
- **Run CLI**: `uv run kinemotion dropjump-analyze <video_path>`
|
|
28
28
|
- **Install/Sync Dependencies**: `uv sync`
|
|
29
29
|
- **Run Tests**: `uv run pytest`
|
|
30
|
-
- **Format Code**: `uv run
|
|
30
|
+
- **Format Code**: `uv run ruff format .`
|
|
31
31
|
- **Lint Code**: `uv run ruff check`
|
|
32
32
|
- **Auto-fix Linting**: `uv run ruff check --fix`
|
|
33
|
-
- **Type Check**: `uv run
|
|
34
|
-
- **Run All Checks**: `uv run ruff check && uv run
|
|
33
|
+
- **Type Check**: `uv run pyright`
|
|
34
|
+
- **Run All Checks**: `uv run ruff check && uv run pyright && uv run pytest`
|
|
35
35
|
|
|
36
36
|
## Architecture
|
|
37
37
|
|
|
@@ -127,18 +127,20 @@ docs/ # Documentation (PARAMETERS.md is key)
|
|
|
127
127
|
|
|
128
128
|
## Code Quality & Workflow
|
|
129
129
|
|
|
130
|
+
**CRITICAL**: Never commit code that fails sanity checks. Always run `ruff`, `pyright`, and `pytest` locally before committing.
|
|
131
|
+
|
|
130
132
|
When contributing code, strictly adhere to the project's quality standards.
|
|
131
133
|
|
|
132
|
-
1. **Format Code**: `uv run
|
|
134
|
+
1. **Format Code**: `uv run ruff format .`
|
|
133
135
|
1. **Lint and Fix**: `uv run ruff check --fix`
|
|
134
|
-
1. **Type Check**: `uv run
|
|
136
|
+
1. **Type Check**: `uv run pyright`
|
|
135
137
|
1. **Run Tests**: `uv run pytest`
|
|
136
138
|
|
|
137
|
-
**Run all checks before committing**: `uv run ruff check && uv run
|
|
139
|
+
**Run all checks before committing**: `uv run ruff check && uv run pyright && uv run pytest`
|
|
138
140
|
|
|
139
|
-
- **Type Safety**: The project uses `
|
|
141
|
+
- **Type Safety**: The project uses `pyright` in strict mode. All functions must have full type annotations.
|
|
140
142
|
- **Linting**: `ruff` is used for linting. Configuration is in `pyproject.toml`.
|
|
141
|
-
- **Formatting**: `
|
|
143
|
+
- **Formatting**: `ruff` is used for code formatting.
|
|
142
144
|
|
|
143
145
|
## Common Development Tasks
|
|
144
146
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.41.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
|
|
@@ -24,6 +24,7 @@ from fastapi import (
|
|
|
24
24
|
from fastapi.middleware.cors import CORSMiddleware
|
|
25
25
|
from fastapi.responses import JSONResponse
|
|
26
26
|
from kinemotion.api import process_cmj_video, process_dropjump_video
|
|
27
|
+
from kinemotion.core.timing import PerformanceTimer
|
|
27
28
|
from slowapi import Limiter, _rate_limit_exceeded_handler
|
|
28
29
|
from slowapi.util import get_remote_address
|
|
29
30
|
|
|
@@ -395,6 +396,7 @@ async def _process_video_async(
|
|
|
395
396
|
jump_type: JumpType,
|
|
396
397
|
quality: str = "balanced",
|
|
397
398
|
output_video: str | None = None,
|
|
399
|
+
timer: PerformanceTimer | None = None,
|
|
398
400
|
) -> dict[str, Any]:
|
|
399
401
|
"""Process video and return metrics.
|
|
400
402
|
|
|
@@ -403,6 +405,7 @@ async def _process_video_async(
|
|
|
403
405
|
jump_type: Type of jump analysis
|
|
404
406
|
quality: Analysis quality preset
|
|
405
407
|
output_video: Optional path for debug video output
|
|
408
|
+
timer: Optional PerformanceTimer for measuring operations
|
|
406
409
|
|
|
407
410
|
Returns:
|
|
408
411
|
Dictionary with metrics
|
|
@@ -412,11 +415,11 @@ async def _process_video_async(
|
|
|
412
415
|
"""
|
|
413
416
|
if jump_type == "drop_jump":
|
|
414
417
|
metrics = process_dropjump_video(
|
|
415
|
-
video_path, quality=quality, output_video=output_video
|
|
418
|
+
video_path, quality=quality, output_video=output_video, timer=timer
|
|
416
419
|
)
|
|
417
420
|
else: # cmj
|
|
418
421
|
metrics = process_cmj_video(
|
|
419
|
-
video_path, quality=quality, output_video=output_video
|
|
422
|
+
video_path, quality=quality, output_video=output_video, timer=timer
|
|
420
423
|
)
|
|
421
424
|
|
|
422
425
|
return cast(dict[str, Any], metrics.to_dict())
|
|
@@ -499,15 +502,26 @@ async def analyze_video(
|
|
|
499
502
|
# Normalize to lowercase
|
|
500
503
|
jump_type = cast(JumpType, _validate_jump_type(jump_type))
|
|
501
504
|
await file.seek(0)
|
|
505
|
+
|
|
506
|
+
# Validate video file
|
|
507
|
+
validation_start = time.time()
|
|
502
508
|
_validate_video_file(file)
|
|
509
|
+
validation_duration = time.time() - validation_start
|
|
510
|
+
logger.info(
|
|
511
|
+
"timing_video_validation",
|
|
512
|
+
duration_ms=round(validation_duration * 1000),
|
|
513
|
+
)
|
|
503
514
|
|
|
504
515
|
# Create temporary file for processing
|
|
505
516
|
suffix = Path(file.filename or "video.mp4").suffix
|
|
506
517
|
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as temp_file:
|
|
507
518
|
temp_video_path = temp_file.name
|
|
508
519
|
# Write uploaded file to temp location
|
|
520
|
+
save_start = time.time()
|
|
509
521
|
content = await file.read()
|
|
510
522
|
temp_file.write(content)
|
|
523
|
+
save_duration = time.time() - save_start
|
|
524
|
+
logger.info("timing_video_file_save", duration_ms=round(save_duration * 1000))
|
|
511
525
|
|
|
512
526
|
# Create temporary path for debug video output
|
|
513
527
|
with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as temp_debug:
|
|
@@ -515,10 +529,16 @@ async def analyze_video(
|
|
|
515
529
|
|
|
516
530
|
# Upload to R2 if client available
|
|
517
531
|
if r2_client:
|
|
532
|
+
upload_start = time.time()
|
|
518
533
|
r2_video_key = f"videos/{jump_type}/{file.filename}"
|
|
519
534
|
try:
|
|
520
535
|
r2_client.upload_file(temp_video_path, r2_video_key)
|
|
521
|
-
|
|
536
|
+
upload_duration = time.time() - upload_start
|
|
537
|
+
logger.info(
|
|
538
|
+
"timing_r2_input_video_upload",
|
|
539
|
+
key=r2_video_key,
|
|
540
|
+
duration_ms=round(upload_duration * 1000),
|
|
541
|
+
)
|
|
522
542
|
except OSError as e:
|
|
523
543
|
logger.error("r2_upload_failed", error=str(e), key=r2_video_key)
|
|
524
544
|
raise HTTPException(
|
|
@@ -527,17 +547,41 @@ async def analyze_video(
|
|
|
527
547
|
) from e
|
|
528
548
|
|
|
529
549
|
# Process video with real kinemotion analysis
|
|
550
|
+
analysis_start = time.time()
|
|
551
|
+
timer = PerformanceTimer()
|
|
530
552
|
metrics = await _process_video_async(
|
|
531
553
|
temp_video_path,
|
|
532
554
|
jump_type,
|
|
533
555
|
quality,
|
|
534
556
|
output_video=temp_debug_video_path,
|
|
557
|
+
timer=timer,
|
|
535
558
|
) # type: ignore[arg-type]
|
|
559
|
+
analysis_duration = time.time() - analysis_start
|
|
560
|
+
|
|
561
|
+
# Log detailed timing breakdown if available in metadata
|
|
562
|
+
if (
|
|
563
|
+
"metadata" in metrics
|
|
564
|
+
and "processing" in metrics["metadata"]
|
|
565
|
+
and "timing_breakdown_ms" in metrics["metadata"]["processing"]
|
|
566
|
+
):
|
|
567
|
+
timing_breakdown = metrics["metadata"]["processing"]["timing_breakdown_ms"]
|
|
568
|
+
# Normalize keys for easier jq parsing: spaces → underscores, lowercase
|
|
569
|
+
normalized_timings = {
|
|
570
|
+
stage.lower().replace(" ", "_") + "_ms": duration
|
|
571
|
+
for stage, duration in timing_breakdown.items()
|
|
572
|
+
}
|
|
573
|
+
# Log each timing stage as a separate event for granular monitoring
|
|
574
|
+
for stage_key, duration_ms in normalized_timings.items():
|
|
575
|
+
# Remove "_ms" suffix and create timing event name
|
|
576
|
+
stage_name = stage_key.replace("_ms", "")
|
|
577
|
+
event_name = f"timing_{stage_name}"
|
|
578
|
+
logger.info(event_name, duration_ms=round(duration_ms, 1))
|
|
536
579
|
|
|
537
580
|
logger.info(
|
|
538
581
|
"video_analysis_completed",
|
|
539
582
|
jump_type=jump_type,
|
|
540
|
-
metrics_count=len(metrics),
|
|
583
|
+
metrics_count=len(metrics.get("data", {})),
|
|
584
|
+
duration_ms=round(analysis_duration * 1000),
|
|
541
585
|
)
|
|
542
586
|
|
|
543
587
|
# Upload results and debug video to R2 if client available
|
|
@@ -552,12 +596,17 @@ async def analyze_video(
|
|
|
552
596
|
# Upload Metrics JSON
|
|
553
597
|
r2_results_key = f"results/{jump_type}/{file_stem}_results.json"
|
|
554
598
|
try:
|
|
599
|
+
results_upload_start = time.time()
|
|
555
600
|
results_json = json.dumps(metrics, indent=2)
|
|
556
601
|
results_url = r2_client.put_object(
|
|
557
602
|
r2_results_key, results_json.encode()
|
|
558
603
|
)
|
|
604
|
+
results_upload_duration = time.time() - results_upload_start
|
|
559
605
|
logger.info(
|
|
560
|
-
"
|
|
606
|
+
"timing_r2_results_upload",
|
|
607
|
+
key=r2_results_key,
|
|
608
|
+
url=results_url,
|
|
609
|
+
duration_ms=round(results_upload_duration * 1000),
|
|
561
610
|
)
|
|
562
611
|
except OSError as e:
|
|
563
612
|
# Log error but don't fail - results still available in response
|
|
@@ -573,13 +622,16 @@ async def analyze_video(
|
|
|
573
622
|
):
|
|
574
623
|
r2_debug_video_key = f"debug_videos/{jump_type}/{file_stem}_debug.mp4"
|
|
575
624
|
try:
|
|
625
|
+
debug_upload_start = time.time()
|
|
576
626
|
debug_video_url = r2_client.upload_file(
|
|
577
627
|
temp_debug_video_path, r2_debug_video_key
|
|
578
628
|
)
|
|
629
|
+
debug_upload_duration = time.time() - debug_upload_start
|
|
579
630
|
logger.info(
|
|
580
|
-
"
|
|
631
|
+
"timing_r2_debug_video_upload",
|
|
581
632
|
key=r2_debug_video_key,
|
|
582
633
|
url=debug_video_url,
|
|
634
|
+
duration_ms=round(debug_upload_duration * 1000),
|
|
583
635
|
)
|
|
584
636
|
except OSError as e:
|
|
585
637
|
logger.warning(
|
|
@@ -600,9 +652,18 @@ async def analyze_video(
|
|
|
600
652
|
processing_time_s=processing_time,
|
|
601
653
|
)
|
|
602
654
|
|
|
655
|
+
# Serialize response to JSON
|
|
656
|
+
serialization_start = time.time()
|
|
657
|
+
response_dict = response.to_dict()
|
|
658
|
+
serialization_duration = time.time() - serialization_start
|
|
659
|
+
logger.info(
|
|
660
|
+
"timing_response_serialization",
|
|
661
|
+
duration_ms=round(serialization_duration * 1000),
|
|
662
|
+
)
|
|
663
|
+
|
|
603
664
|
return JSONResponse(
|
|
604
665
|
status_code=200,
|
|
605
|
-
content=
|
|
666
|
+
content=response_dict,
|
|
606
667
|
)
|
|
607
668
|
|
|
608
669
|
except ValueError as e:
|
|
@@ -646,6 +707,9 @@ async def analyze_video(
|
|
|
646
707
|
)
|
|
647
708
|
|
|
648
709
|
finally:
|
|
710
|
+
# Clean up temporary files
|
|
711
|
+
cleanup_start = time.time()
|
|
712
|
+
|
|
649
713
|
# Clean up temporary video file
|
|
650
714
|
if temp_video_path and Path(temp_video_path).exists():
|
|
651
715
|
try:
|
|
@@ -668,6 +732,13 @@ async def analyze_video(
|
|
|
668
732
|
error=str(e),
|
|
669
733
|
)
|
|
670
734
|
|
|
735
|
+
cleanup_duration = time.time() - cleanup_start
|
|
736
|
+
if cleanup_duration > 0:
|
|
737
|
+
logger.info(
|
|
738
|
+
"timing_temp_file_cleanup",
|
|
739
|
+
duration_ms=round(cleanup_duration * 1000),
|
|
740
|
+
)
|
|
741
|
+
|
|
671
742
|
# Clean up R2 video if results failed (optional - adjust based on policy)
|
|
672
743
|
# if r2_client and r2_video_key and not results_url:
|
|
673
744
|
# try:
|
|
@@ -705,7 +776,7 @@ async def analyze_local_video(
|
|
|
705
776
|
|
|
706
777
|
try:
|
|
707
778
|
# Validate inputs
|
|
708
|
-
jump_type = _validate_jump_type(jump_type)
|
|
779
|
+
jump_type = cast(JumpType, _validate_jump_type(jump_type))
|
|
709
780
|
|
|
710
781
|
if not Path(video_path).exists():
|
|
711
782
|
raise HTTPException(
|
|
@@ -714,7 +785,10 @@ async def analyze_local_video(
|
|
|
714
785
|
)
|
|
715
786
|
|
|
716
787
|
# Process video
|
|
717
|
-
|
|
788
|
+
timer = PerformanceTimer()
|
|
789
|
+
metrics = await _process_video_async(
|
|
790
|
+
video_path, jump_type, quality, timer=timer
|
|
791
|
+
) # type: ignore[arg-type]
|
|
718
792
|
|
|
719
793
|
processing_time = time.time() - start_time
|
|
720
794
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
sonar.projectKey=feniix_kinemotion
|
|
3
3
|
sonar.projectName=Kinemotion
|
|
4
4
|
sonar.organization=feniix
|
|
5
|
-
sonar.projectVersion=0.
|
|
5
|
+
sonar.projectVersion=0.38.0
|
|
6
6
|
|
|
7
7
|
# Project metadata
|
|
8
8
|
sonar.projectDescription=Video-based kinematic analysis for athletic performance using MediaPipe pose tracking
|