kinemotion 0.36.0__tar.gz → 0.37.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.36.0 → kinemotion-0.37.0}/.claude/settings.local.json +3 -2
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/workflows/deploy-backend.yml +1 -1
- {kinemotion-0.36.0 → kinemotion-0.37.0}/CHANGELOG.md +26 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/PKG-INFO +1 -1
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/src/kinemotion_backend/app.py +81 -0
- kinemotion-0.37.0/docs/strategy/pose2sim-migration-evaluation.md +269 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/pyproject.toml +1 -1
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/api.py +7 -0
- kinemotion-0.37.0/src/kinemotion/core/determinism.py +85 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/pose.py +1 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/kinematics.py +40 -7
- {kinemotion-0.36.0 → kinemotion-0.37.0}/uv.lock +1 -1
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.claude/hooks/fix-basic-memory-names.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.dockerignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.gitattributes +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/workflows/security.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.mcp.json +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.readthedocs.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.serena/project.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.tool-versions +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/.vercelignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/CLAUDE.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/Dockerfile +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/GEMINI.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/LICENSE +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/SECURITY.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/.dockerignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/.env.example +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/Dockerfile +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/backend/uv.lock +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/api/core.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/api/overview.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/testing.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/index.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/quick-start.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/docs/validation-status.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.env.example +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/index.html +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/package.json +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/index.css +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/vercel.json +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/justfile +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/local_dev.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/mkdocs.yml +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/requirements-docs.txt +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/README.md +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/project.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/sonar-project.properties +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/conftest.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.36.0 → kinemotion-0.37.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"Bash(cat:*)",
|
|
6
6
|
"Bash(chmod:*)",
|
|
7
7
|
"Bash(curl:*)",
|
|
8
|
+
"Bash(ffmpeg:*)",
|
|
8
9
|
"Bash(ffprobe:*)",
|
|
9
10
|
"Bash(find:*)",
|
|
10
11
|
"Bash(gh run view:*)",
|
|
@@ -37,6 +38,7 @@
|
|
|
37
38
|
"mcp__ref__ref_read_url",
|
|
38
39
|
"mcp__ref__ref_search_documentation",
|
|
39
40
|
"mcp__sequential__sequentialthinking",
|
|
41
|
+
"mcp__sequential-thinking__generate_summary",
|
|
40
42
|
"mcp__sequential-thinking__process_thought",
|
|
41
43
|
"mcp__sequential-thinking__sequentialthinking",
|
|
42
44
|
"mcp__serena__check_onboarding_performed",
|
|
@@ -63,8 +65,7 @@
|
|
|
63
65
|
"WebFetch(domain:realpython.com)",
|
|
64
66
|
"WebFetch(domain:sonarcloud.io)",
|
|
65
67
|
"WebFetch(domain:www.pyopensci.org)",
|
|
66
|
-
"WebFetch(domain:www.sonarsource.com)"
|
|
67
|
-
"Bash(ffmpeg:*)"
|
|
68
|
+
"WebFetch(domain:www.sonarsource.com)"
|
|
68
69
|
]
|
|
69
70
|
},
|
|
70
71
|
"enableAllProjectMcpServers": true,
|
|
@@ -130,7 +130,7 @@ jobs:
|
|
|
130
130
|
region: ${{ env.GCP_REGION }}
|
|
131
131
|
image: ${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }}
|
|
132
132
|
flags: |
|
|
133
|
-
--memory=
|
|
133
|
+
--memory=4Gi
|
|
134
134
|
--allow-unauthenticated
|
|
135
135
|
--service-account=kinemotion-backend-runtime@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com
|
|
136
136
|
--set-env-vars=CORS_ORIGINS=https://kinemotion.vercel.app,JSON_LOGS=true,LOG_LEVEL=INFO
|
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.37.0 (2025-12-09)
|
|
11
|
+
|
|
12
|
+
### Chores
|
|
13
|
+
|
|
14
|
+
- Organize permissions list and add sequential-thinking tool
|
|
15
|
+
([`64aaf72`](https://github.com/feniix/kinemotion/commit/64aaf72b44fbb3561f84ec5e12f9ec14c2d0d05b))
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
- **backend**: Add determinism testing endpoints for M1 vs Intel comparison
|
|
20
|
+
([`8447790`](https://github.com/feniix/kinemotion/commit/8447790f6aef2bd11fdfa086ce4e67b5226de9e2))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## v0.36.1 (2025-12-08)
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
- **dropjump**: Improve analysis reproducibility with temporal averaging
|
|
28
|
+
([`6f98b1f`](https://github.com/feniix/kinemotion/commit/6f98b1f918539e714b604ac1a0bf6187c6ff28a6))
|
|
29
|
+
|
|
30
|
+
### Chores
|
|
31
|
+
|
|
32
|
+
- Up the mem of the backend
|
|
33
|
+
([`67133ca`](https://github.com/feniix/kinemotion/commit/67133ca2cded45df74ef5bfe3e9d9b7d85bde1a9))
|
|
34
|
+
|
|
35
|
+
|
|
10
36
|
## v0.36.0 (2025-12-07)
|
|
11
37
|
|
|
12
38
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.37.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
|
|
@@ -682,6 +682,87 @@ async def analyze_local_video(
|
|
|
682
682
|
# ========== Error Handlers ==========
|
|
683
683
|
|
|
684
684
|
|
|
685
|
+
@app.get("/determinism/platform-info", tags=["Determinism"])
|
|
686
|
+
async def get_platform_info() -> dict[str, Any]:
|
|
687
|
+
"""Get platform info for cross-platform determinism testing."""
|
|
688
|
+
import platform
|
|
689
|
+
|
|
690
|
+
import cv2
|
|
691
|
+
import numpy as np
|
|
692
|
+
|
|
693
|
+
return {
|
|
694
|
+
"platform": {
|
|
695
|
+
"machine": platform.machine(),
|
|
696
|
+
"processor": platform.processor(),
|
|
697
|
+
"python_version": platform.python_version(),
|
|
698
|
+
},
|
|
699
|
+
"libraries": {
|
|
700
|
+
"numpy": np.__version__,
|
|
701
|
+
"opencv": cv2.__version__,
|
|
702
|
+
},
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
@app.post("/determinism/extract-landmarks", tags=["Determinism"])
|
|
707
|
+
async def extract_landmarks_determinism(video: UploadFile = File(...)) -> JSONResponse: # noqa: B008
|
|
708
|
+
"""Extract raw MediaPipe landmarks for cross-platform comparison."""
|
|
709
|
+
import platform
|
|
710
|
+
|
|
711
|
+
from kinemotion.core.pose import PoseTracker
|
|
712
|
+
from kinemotion.core.video_io import VideoProcessor
|
|
713
|
+
|
|
714
|
+
with tempfile.NamedTemporaryFile(delete=False, suffix=".MOV") as tmp:
|
|
715
|
+
content = await video.read()
|
|
716
|
+
tmp.write(content)
|
|
717
|
+
tmp_path = tmp.name
|
|
718
|
+
|
|
719
|
+
try:
|
|
720
|
+
tracker = PoseTracker()
|
|
721
|
+
video_proc = VideoProcessor(tmp_path)
|
|
722
|
+
|
|
723
|
+
all_landmarks = []
|
|
724
|
+
frame_idx = 0
|
|
725
|
+
|
|
726
|
+
while True:
|
|
727
|
+
ret, frame = video_proc.cap.read()
|
|
728
|
+
if not ret:
|
|
729
|
+
break
|
|
730
|
+
|
|
731
|
+
landmarks = tracker.process_frame(frame)
|
|
732
|
+
|
|
733
|
+
if landmarks:
|
|
734
|
+
frame_landmarks = {
|
|
735
|
+
"frame": frame_idx,
|
|
736
|
+
"landmarks": {
|
|
737
|
+
name: {
|
|
738
|
+
"x": float(coords[0]),
|
|
739
|
+
"y": float(coords[1]),
|
|
740
|
+
"visibility": float(coords[2]),
|
|
741
|
+
}
|
|
742
|
+
for name, coords in landmarks.items()
|
|
743
|
+
},
|
|
744
|
+
}
|
|
745
|
+
else:
|
|
746
|
+
frame_landmarks = {"frame": frame_idx, "landmarks": None}
|
|
747
|
+
|
|
748
|
+
all_landmarks.append(frame_landmarks)
|
|
749
|
+
frame_idx += 1
|
|
750
|
+
|
|
751
|
+
video_proc.close()
|
|
752
|
+
|
|
753
|
+
return JSONResponse(
|
|
754
|
+
content={
|
|
755
|
+
"video_filename": video.filename,
|
|
756
|
+
"platform": platform.machine(),
|
|
757
|
+
"num_frames": frame_idx,
|
|
758
|
+
"landmarks": all_landmarks,
|
|
759
|
+
}
|
|
760
|
+
)
|
|
761
|
+
|
|
762
|
+
finally:
|
|
763
|
+
os.unlink(tmp_path)
|
|
764
|
+
|
|
765
|
+
|
|
685
766
|
@app.exception_handler(HTTPException)
|
|
686
767
|
async def http_exception_handler(request: Any, exc: HTTPException) -> JSONResponse:
|
|
687
768
|
"""Handle HTTP exceptions with consistent response format."""
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# Pose2Sim Migration Evaluation and Strategy
|
|
2
|
+
|
|
3
|
+
**Date:** 2025-12-08
|
|
4
|
+
**Analysis Method:** Sequential thinking + Multi-tool research (exa, ref, serena, basic-memory)
|
|
5
|
+
**Decision:** DEFER to Phase 2+ (post-MVP)
|
|
6
|
+
|
|
7
|
+
______________________________________________________________________
|
|
8
|
+
|
|
9
|
+
## Executive Summary
|
|
10
|
+
|
|
11
|
+
**Recommendation: DO NOT migrate to Pose2Sim during MVP phase (Weeks 1-3)**
|
|
12
|
+
|
|
13
|
+
Pose2Sim would provide 67-73% accuracy improvement but requires:
|
|
14
|
+
|
|
15
|
+
- 2-4 weeks integration time (delays MVP launch)
|
|
16
|
+
- $2,000-5,000 hardware investment (premature before market validation)
|
|
17
|
+
- Multi-camera setup (adds complexity for users)
|
|
18
|
+
- Batch processing only (may conflict with real-time needs)
|
|
19
|
+
|
|
20
|
+
**Strategic timing is wrong.** Focus on MVP launch, gather user feedback, then reassess based on validated market needs.
|
|
21
|
+
|
|
22
|
+
______________________________________________________________________
|
|
23
|
+
|
|
24
|
+
## Current State Analysis
|
|
25
|
+
|
|
26
|
+
### MediaPipe Monocular (Kinemotion Current)
|
|
27
|
+
|
|
28
|
+
- **Joint angle error:** ~10-15°
|
|
29
|
+
- **Position RMSE:** 56mm
|
|
30
|
+
- **Ankle/knee visibility:** 18-27% (lateral view, occlusion issues)
|
|
31
|
+
- **Cost:** $0 (single camera/smartphone)
|
|
32
|
+
- **Setup time:** Minutes
|
|
33
|
+
- **Processing:** Real-time capable
|
|
34
|
+
- **Architecture:** PoseTracker class wraps MediaPipe, processes frames sequentially
|
|
35
|
+
|
|
36
|
+
### Recent Optimizations (Dec 2025)
|
|
37
|
+
|
|
38
|
+
- 92% improvement in detection accuracy (within 5 frames target)
|
|
39
|
+
- Fixed non-deterministic analysis (temporal averaging)
|
|
40
|
+
- 45° oblique angle validated as optimal for MediaPipe
|
|
41
|
+
|
|
42
|
+
______________________________________________________________________
|
|
43
|
+
|
|
44
|
+
## Pose2Sim Technical Analysis
|
|
45
|
+
|
|
46
|
+
### Accuracy Improvements
|
|
47
|
+
|
|
48
|
+
| Metric | Current (MediaPipe) | Pose2Sim | Improvement |
|
|
49
|
+
| --------------------- | ------------------- | --------- | -------------- |
|
|
50
|
+
| Joint angle error | ~10-15° | 3-4° | **67-73%** ↓ |
|
|
51
|
+
| Position RMSE | 56mm | 30-40mm | **29-46%** ↓ |
|
|
52
|
+
| Ankle/knee visibility | 18-27% | 80-95% | **3-5x** ↑ |
|
|
53
|
+
| CMC correlation | Not available | 0.90-0.98 | Research-grade |
|
|
54
|
+
|
|
55
|
+
### Technical Requirements
|
|
56
|
+
|
|
57
|
+
- **Hardware:** 4-8 RGB cameras (1080p+, 60-240 Hz)
|
|
58
|
+
- **Sync:** Hardware preferred, software acceptable
|
|
59
|
+
- **Calibration:** ChArUco board, intrinsic + extrinsic
|
|
60
|
+
- **Compute:** GPU recommended but NOT required (CPU works, 2-3x slower)
|
|
61
|
+
- **Software:** Python, OpenSim, pose2sim package
|
|
62
|
+
|
|
63
|
+
### Integration Architecture
|
|
64
|
+
|
|
65
|
+
**Pose2Sim Pipeline:**
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from Pose2Sim import Pose2Sim
|
|
69
|
+
|
|
70
|
+
Pose2Sim.calibration() # Camera calibration
|
|
71
|
+
Pose2Sim.poseEstimation() # 2D pose (uses OpenPose/MediaPipe/AlphaPose)
|
|
72
|
+
Pose2Sim.triangulation() # 3D reconstruction
|
|
73
|
+
Pose2Sim.filtering() # Butterworth smoothing (6 Hz)
|
|
74
|
+
Pose2Sim.kinematics() # OpenSim inverse kinematics
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Kinemotion Integration Points:**
|
|
78
|
+
|
|
79
|
+
1. Replace `PoseTracker` class (src/kinemotion/core/pose.py)
|
|
80
|
+
1. Modify `process_dropjump_video()` / `process_cmj_video()` (src/kinemotion/api.py)
|
|
81
|
+
1. Keep existing: smoothing, signed velocity, backward search, analysis logic
|
|
82
|
+
1. Add: multi-camera input handling, calibration management, OpenSim output parsing
|
|
83
|
+
|
|
84
|
+
______________________________________________________________________
|
|
85
|
+
|
|
86
|
+
## Cost-Benefit Analysis
|
|
87
|
+
|
|
88
|
+
### Investment Required
|
|
89
|
+
|
|
90
|
+
| Item | Cost | Time |
|
|
91
|
+
| ---------------------------------- | ---------------- | ------------- |
|
|
92
|
+
| 4-8 RGB cameras (1080p, 60-120 Hz) | $2,000-3,000 | 1 week |
|
|
93
|
+
| Optional GPU for faster 2D pose | $1,000-2,000 | N/A |
|
|
94
|
+
| Integration development | $0 (internal) | 2-4 weeks |
|
|
95
|
+
| Testing & validation | $0 (internal) | 1 week |
|
|
96
|
+
| **Total** | **$2,000-5,000** | **3-5 weeks** |
|
|
97
|
+
|
|
98
|
+
### Benefits
|
|
99
|
+
|
|
100
|
+
- **Accuracy:** Research-grade (publishable validation studies)
|
|
101
|
+
- **Credibility:** Gold-standard validation vs Vicon/Qualisys
|
|
102
|
+
- **Market differentiation:** Can claim highest accuracy in market
|
|
103
|
+
- **Biomechanical validity:** OpenSim constraints ensure physically plausible poses
|
|
104
|
+
- **Multi-view:** Eliminates occlusion problems (45° + frontal + lateral)
|
|
105
|
+
|
|
106
|
+
### Risks
|
|
107
|
+
|
|
108
|
+
- **Complexity:** Multi-camera setup increases user friction
|
|
109
|
+
- **Cost barrier:** $2-5k hardware may limit adoption
|
|
110
|
+
- **No real-time:** Batch processing only (if real-time needed, Pose2Sim won't work)
|
|
111
|
+
- **Integration delay:** 3-5 weeks delays MVP launch and market feedback
|
|
112
|
+
- **Premature optimization:** Unknown if accuracy is validated user pain point
|
|
113
|
+
|
|
114
|
+
______________________________________________________________________
|
|
115
|
+
|
|
116
|
+
## Go/No-Go Decision Framework
|
|
117
|
+
|
|
118
|
+
**Phase 1 (MVP - Weeks 1-3): GO = 0/5 ❌**
|
|
119
|
+
|
|
120
|
+
| Criteria | Status | Weight |
|
|
121
|
+
| ---------------------------------------- | ---------------------- | -------- |
|
|
122
|
+
| Is MediaPipe accuracy blocking adoption? | ❌ NO (no users yet) | Critical |
|
|
123
|
+
| User feedback demanding better accuracy? | ❌ NO (pre-launch) | Critical |
|
|
124
|
+
| Research publication planned? | ⚠️ TBD (not immediate) | High |
|
|
125
|
+
| Can afford 3-5 week delay? | ❌ NO (Week 3 of MVP) | Critical |
|
|
126
|
+
| $2-5k justified by revenue? | ❌ NO (pre-revenue) | High |
|
|
127
|
+
|
|
128
|
+
**Recommendation: DEFER**
|
|
129
|
+
|
|
130
|
+
**Phase 2+ (Post-MVP): Reassess when GO ≥ 3/5**
|
|
131
|
+
|
|
132
|
+
Wait for:
|
|
133
|
+
|
|
134
|
+
1. MVP launch (Week 3)
|
|
135
|
+
1. User feedback (Weeks 4-8)
|
|
136
|
+
1. Market validation (revenue/engagement)
|
|
137
|
+
1. Feature prioritization from actual users
|
|
138
|
+
|
|
139
|
+
______________________________________________________________________
|
|
140
|
+
|
|
141
|
+
## Phased Migration Roadmap (IF NEEDED)
|
|
142
|
+
|
|
143
|
+
### Immediate (Week 4 - Post-MVP Launch)
|
|
144
|
+
|
|
145
|
+
**Action:** Test OpenCap as low-risk validation
|
|
146
|
+
|
|
147
|
+
- Record sample videos with 2 smartphones
|
|
148
|
+
- Upload to opencap.ai, download results
|
|
149
|
+
- Compare accuracy vs MediaPipe on validation dataset
|
|
150
|
+
- Assess if improvement justifies complexity
|
|
151
|
+
- **Cost:** $0, **Time:** 2-3 days
|
|
152
|
+
|
|
153
|
+
### Short-term (Weeks 5-8 - IF accuracy validated as pain point)
|
|
154
|
+
|
|
155
|
+
**Action:** Implement hybrid architecture
|
|
156
|
+
|
|
157
|
+
- Create `Pose2SimAdapter` class alongside `PoseTracker`
|
|
158
|
+
- Add `--multi-camera` flag to CLI
|
|
159
|
+
- Keep MediaPipe for single-camera (backward compatible)
|
|
160
|
+
- Add Pose2Sim for research-grade offline analysis
|
|
161
|
+
- Share analysis logic (smoothing, metrics calculation)
|
|
162
|
+
- **Cost:** $2-3k (cameras), **Time:** 2-4 weeks
|
|
163
|
+
|
|
164
|
+
### Long-term (Months 2-3 - IF market demands it)
|
|
165
|
+
|
|
166
|
+
**Action:** Full Pose2Sim integration
|
|
167
|
+
|
|
168
|
+
- Multi-camera calibration UI
|
|
169
|
+
- Batch processing optimization
|
|
170
|
+
- OpenSim biomechanical constraints
|
|
171
|
+
- Validation study publication (if academic goals)
|
|
172
|
+
- Market as "research-grade" premium tier
|
|
173
|
+
- **Cost:** $2-5k, **Time:** 4-6 weeks
|
|
174
|
+
|
|
175
|
+
______________________________________________________________________
|
|
176
|
+
|
|
177
|
+
## Alternative: OpenCap Comparison
|
|
178
|
+
|
|
179
|
+
### OpenCap Advantages vs Pose2Sim
|
|
180
|
+
|
|
181
|
+
- **Cost:** $0 (use existing smartphones)
|
|
182
|
+
- **Setup:** Minutes (no calibration needed)
|
|
183
|
+
- **Processing:** Cloud-based (no local compute)
|
|
184
|
+
- **Accuracy:** ~4-6° joint angle errors (vs 3-4° for Pose2Sim)
|
|
185
|
+
- **Biomechanics:** Automatic OpenSim constraints
|
|
186
|
+
|
|
187
|
+
### OpenCap Disadvantages
|
|
188
|
+
|
|
189
|
+
- **Internet required:** Cloud processing dependency
|
|
190
|
+
- **Less control:** Can't customize pipeline
|
|
191
|
+
- **Validation:** Still emerging (fewer published studies than Pose2Sim)
|
|
192
|
+
- **Output format:** May require parsing/conversion
|
|
193
|
+
|
|
194
|
+
### Recommendation
|
|
195
|
+
|
|
196
|
+
**Test OpenCap first** (Week 4) before committing to Pose2Sim hardware investment.
|
|
197
|
+
|
|
198
|
+
______________________________________________________________________
|
|
199
|
+
|
|
200
|
+
## Key Technical Insights
|
|
201
|
+
|
|
202
|
+
### GPU Requirements
|
|
203
|
+
|
|
204
|
+
- **OpenCap:** NO GPU needed (cloud processing)
|
|
205
|
+
- **Pose2Sim:** GPU only speeds up 2D pose step (3-5x faster)
|
|
206
|
+
- With GPU: ~2-5 min per camera (1000 frames)
|
|
207
|
+
- With CPU: ~10-30 min per camera (1000 frames)
|
|
208
|
+
- **Recommendation:** CPU-only Pose2Sim acceptable for research use
|
|
209
|
+
|
|
210
|
+
### Current Architecture (Kinemotion)
|
|
211
|
+
|
|
212
|
+
- **PoseTracker:** Wraps MediaPipe, processes frames sequentially
|
|
213
|
+
- **API entry points:** `process_dropjump_video()`, `process_cmj_video()` (376-628 lines)
|
|
214
|
+
- **Data flow:** Video → PoseTracker.process_frame() → landmarks → smoothing → analysis → metrics
|
|
215
|
+
- **Integration points:** Replace PoseTracker or add parallel Pose2Sim path
|
|
216
|
+
|
|
217
|
+
### Integration Complexity
|
|
218
|
+
|
|
219
|
+
- **Low:** OpenCap (parse output, feed to existing analysis)
|
|
220
|
+
- **Medium:** Hybrid Pose2Sim (new code path, keep MediaPipe)
|
|
221
|
+
- **High:** Full Pose2Sim replacement (breaking change)
|
|
222
|
+
|
|
223
|
+
______________________________________________________________________
|
|
224
|
+
|
|
225
|
+
## Strategic Recommendation
|
|
226
|
+
|
|
227
|
+
### Phase 1 (NOW): Ship MVP with MediaPipe
|
|
228
|
+
|
|
229
|
+
**Focus:** Get product in coaches' hands, gather feedback
|
|
230
|
+
|
|
231
|
+
- Current accuracy sufficient for initial validation
|
|
232
|
+
- Real-time capability preserved (may be needed)
|
|
233
|
+
- No hardware barriers for early adopters
|
|
234
|
+
- Fast time-to-market
|
|
235
|
+
|
|
236
|
+
### Phase 2 (Week 4+): Market-Driven Decision
|
|
237
|
+
|
|
238
|
+
**If users say:** "Accuracy is not good enough" → Pose2Sim migration
|
|
239
|
+
**If users say:** "Real-time feedback is critical" → Stay with MediaPipe
|
|
240
|
+
**If users say:** "Both accuracy and real-time needed" → Hybrid architecture
|
|
241
|
+
|
|
242
|
+
### Key Principle
|
|
243
|
+
|
|
244
|
+
**Optimize for learning, not accuracy.** Ship fast, validate with real users, then invest based on validated needs rather than technical possibilities.
|
|
245
|
+
|
|
246
|
+
______________________________________________________________________
|
|
247
|
+
|
|
248
|
+
## References
|
|
249
|
+
|
|
250
|
+
- **Pose2Sim validation:** Pagnon et al. (2022), Sensors 22(7), 2712
|
|
251
|
+
- **Stereo MediaPipe:** Dill et al. (2024), Sensors 24(23), 7772
|
|
252
|
+
- **AthletePose3D dataset:** Yeung et al. (2025), arXiv:2503.07499
|
|
253
|
+
- **Kinemotion docs:** docs/reference/pose-systems.md, docs/research/sports-biomechanics-pose-estimation.md
|
|
254
|
+
- **Current architecture:** src/kinemotion/core/pose.py, src/kinemotion/api.py
|
|
255
|
+
|
|
256
|
+
______________________________________________________________________
|
|
257
|
+
|
|
258
|
+
## Conclusion
|
|
259
|
+
|
|
260
|
+
Pose2Sim migration is **technically feasible** (2-4 weeks, $2-5k) and would provide **67-73% accuracy improvement**, but **strategic timing is wrong**.
|
|
261
|
+
|
|
262
|
+
**Action:** Focus on MVP launch (Phase 1), gather real market feedback, then decide based on validated user needs rather than technical possibilities.
|
|
263
|
+
|
|
264
|
+
**Next steps:**
|
|
265
|
+
|
|
266
|
+
1. Complete MVP launch (Week 3)
|
|
267
|
+
1. Collect user feedback (Weeks 4-8)
|
|
268
|
+
1. Test OpenCap if accuracy emerges as pain point (Week 4)
|
|
269
|
+
1. Reassess Pose2Sim decision when GO score ≥ 3/5
|
|
@@ -417,6 +417,13 @@ def process_dropjump_video(
|
|
|
417
417
|
if not Path(video_path).exists():
|
|
418
418
|
raise FileNotFoundError(f"Video file not found: {video_path}")
|
|
419
419
|
|
|
420
|
+
# Set deterministic mode for drop jump reproducibility
|
|
421
|
+
# Note: MediaPipe has inherent non-determinism (Google issue #3945)
|
|
422
|
+
# This improves consistency but cannot eliminate all variation
|
|
423
|
+
from .core.determinism import set_deterministic_mode
|
|
424
|
+
|
|
425
|
+
set_deterministic_mode(seed=42)
|
|
426
|
+
|
|
420
427
|
# Start timing
|
|
421
428
|
start_time = time.time()
|
|
422
429
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""Determinism utilities for reproducible analysis.
|
|
2
|
+
|
|
3
|
+
Provides functions to set random seeds for NumPy, Python's random module,
|
|
4
|
+
and TensorFlow (used by MediaPipe) to ensure deterministic behavior.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import hashlib
|
|
8
|
+
import os
|
|
9
|
+
import random
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_video_hash_seed(video_path: str) -> int:
|
|
16
|
+
"""Generate deterministic seed from video file path.
|
|
17
|
+
|
|
18
|
+
Uses video filename (not contents) to generate a consistent seed
|
|
19
|
+
for the same video across multiple runs.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
video_path: Path to video file
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
Integer seed value derived from filename
|
|
26
|
+
"""
|
|
27
|
+
# Use filename only (not full path) for consistency
|
|
28
|
+
filename = Path(video_path).name
|
|
29
|
+
# Hash filename to get deterministic seed
|
|
30
|
+
hash_value = hashlib.md5(filename.encode()).hexdigest()
|
|
31
|
+
# Convert first 8 hex chars to integer
|
|
32
|
+
return int(hash_value[:8], 16)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def set_deterministic_mode(
|
|
36
|
+
seed: int | None = None, video_path: str | None = None
|
|
37
|
+
) -> None:
|
|
38
|
+
"""Set random seeds for reproducible analysis.
|
|
39
|
+
|
|
40
|
+
Sets seeds for:
|
|
41
|
+
- Python's random module
|
|
42
|
+
- NumPy random number generator
|
|
43
|
+
- TensorFlow (via environment variable for TFLite)
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
seed: Random seed value. If None and video_path provided,
|
|
47
|
+
generates seed from video filename.
|
|
48
|
+
video_path: Optional video path to generate deterministic seed
|
|
49
|
+
|
|
50
|
+
Note:
|
|
51
|
+
This should be called before any MediaPipe or analysis operations
|
|
52
|
+
to ensure deterministic pose detection and metric calculation.
|
|
53
|
+
"""
|
|
54
|
+
# Generate seed from video if not provided
|
|
55
|
+
if seed is None and video_path is not None:
|
|
56
|
+
seed = get_video_hash_seed(video_path)
|
|
57
|
+
elif seed is None:
|
|
58
|
+
seed = 42 # Default
|
|
59
|
+
|
|
60
|
+
# Python random
|
|
61
|
+
random.seed(seed)
|
|
62
|
+
|
|
63
|
+
# NumPy random
|
|
64
|
+
np.random.seed(seed)
|
|
65
|
+
|
|
66
|
+
# TensorFlow/TFLite (used by MediaPipe)
|
|
67
|
+
# Set via environment variable before TF is initialized
|
|
68
|
+
os.environ["PYTHONHASHSEED"] = str(seed)
|
|
69
|
+
os.environ["TF_DETERMINISTIC_OPS"] = "1"
|
|
70
|
+
|
|
71
|
+
# Try to set TensorFlow seed if available
|
|
72
|
+
try:
|
|
73
|
+
import tensorflow as tf
|
|
74
|
+
|
|
75
|
+
tf.random.set_seed(seed)
|
|
76
|
+
|
|
77
|
+
# Disable GPU non-determinism if CUDA is available
|
|
78
|
+
try:
|
|
79
|
+
tf.config.experimental.enable_op_determinism()
|
|
80
|
+
except AttributeError:
|
|
81
|
+
# Older TensorFlow versions don't have this
|
|
82
|
+
pass
|
|
83
|
+
except ImportError:
|
|
84
|
+
# TensorFlow not directly available (only via MediaPipe's bundled version)
|
|
85
|
+
pass
|
|
@@ -22,6 +22,7 @@ class PoseTracker:
|
|
|
22
22
|
"""
|
|
23
23
|
self.mp_pose = mp.solutions.pose
|
|
24
24
|
self.pose = self.mp_pose.Pose(
|
|
25
|
+
static_image_mode=False, # Use tracking mode for better performance
|
|
25
26
|
min_detection_confidence=min_detection_confidence,
|
|
26
27
|
min_tracking_confidence=min_tracking_confidence,
|
|
27
28
|
model_complexity=1,
|
|
@@ -202,6 +202,36 @@ def _filter_phases_after_drop(
|
|
|
202
202
|
return filtered_phases, filtered_interpolated
|
|
203
203
|
|
|
204
204
|
|
|
205
|
+
def _compute_robust_phase_position(
|
|
206
|
+
foot_y_positions: NDArray[np.float64],
|
|
207
|
+
phase_start: int,
|
|
208
|
+
phase_end: int,
|
|
209
|
+
temporal_window: int = 11,
|
|
210
|
+
) -> float:
|
|
211
|
+
"""Compute robust position estimate using temporal averaging.
|
|
212
|
+
|
|
213
|
+
Uses median over a fixed temporal window to reduce sensitivity to
|
|
214
|
+
MediaPipe landmark noise, improving reproducibility.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
foot_y_positions: Vertical position array
|
|
218
|
+
phase_start: Start frame of phase
|
|
219
|
+
phase_end: End frame of phase
|
|
220
|
+
temporal_window: Number of frames to average (default: 11)
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Robust position estimate using median
|
|
224
|
+
"""
|
|
225
|
+
# Center the temporal window on the phase midpoint
|
|
226
|
+
phase_mid = (phase_start + phase_end) // 2
|
|
227
|
+
window_start = max(0, phase_mid - temporal_window // 2)
|
|
228
|
+
window_end = min(len(foot_y_positions), phase_mid + temporal_window // 2 + 1)
|
|
229
|
+
|
|
230
|
+
# Use median for robustness to outliers
|
|
231
|
+
window_positions = foot_y_positions[window_start:window_end]
|
|
232
|
+
return float(np.median(window_positions))
|
|
233
|
+
|
|
234
|
+
|
|
205
235
|
def _identify_main_contact_phase(
|
|
206
236
|
phases: list[tuple[int, int, ContactState]],
|
|
207
237
|
ground_phases: list[tuple[int, int, int]],
|
|
@@ -237,17 +267,20 @@ def _identify_main_contact_phase(
|
|
|
237
267
|
|
|
238
268
|
if ground_after_air and first_ground_idx < first_air_idx:
|
|
239
269
|
# Check if first ground is at higher elevation (lower y) than
|
|
240
|
-
# ground after air
|
|
241
|
-
first_ground_y =
|
|
242
|
-
|
|
270
|
+
# ground after air using robust temporal averaging
|
|
271
|
+
first_ground_y = _compute_robust_phase_position(
|
|
272
|
+
foot_y_positions, first_ground_start, first_ground_end
|
|
243
273
|
)
|
|
244
274
|
second_ground_start, second_ground_end, _ = ground_after_air[0]
|
|
245
|
-
second_ground_y =
|
|
246
|
-
|
|
275
|
+
second_ground_y = _compute_robust_phase_position(
|
|
276
|
+
foot_y_positions, second_ground_start, second_ground_end
|
|
247
277
|
)
|
|
248
278
|
|
|
249
|
-
# If first ground is significantly higher (>
|
|
250
|
-
|
|
279
|
+
# If first ground is significantly higher (>7% of frame), it's a drop jump
|
|
280
|
+
# Increased from 0.05 to 0.07 with 11-frame temporal averaging
|
|
281
|
+
# for reproducibility (balances detection sensitivity with noise robustness)
|
|
282
|
+
# Note: MediaPipe has inherent non-determinism (Google issue #3945)
|
|
283
|
+
if second_ground_y - first_ground_y > 0.07:
|
|
251
284
|
is_drop_jump = True
|
|
252
285
|
contact_start, contact_end = second_ground_start, second_ground_end
|
|
253
286
|
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.36.0 → kinemotion-0.37.0}/.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
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/authentication/supabase-quick-start-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.36.0 → kinemotion-0.37.0}/.basic-memory/codebase/codebase-architecture-overview.md
RENAMED
|
File without changes
|