- Add scripts/motion_drift.py: analyzes SVD axis stability, semantic drift,
and cross-ideological voting patterns across annual windows
- Add analysis/motion_drift.py: core analysis functions with Procrustes
alignment fallback using party-based sign consistency
- Add matplotlib dependency for static chart generation
- Add tests/test_motion_drift.py: 12 tests covering all analysis functions
- Report output: markdown with embedded PNG charts
Key findings from real data:
- No axes are fully stable (>0.7) across 2019-2026
- All axes show moderate consistency (0.40-0.47) — stable within periods
but flip between cabinet periods (2019/2022/2026 vs 2023/2024/2025)
- Party voting analysis detects cross-ideological voting patterns
A small project that uses QWEN embeddings for semantic features. The codebase includes an example Ansible package under packages/@ansible/example and helper scripts for deployment.
Embeddings
This project uses QWEN embeddings (model: qwen/qwen3-embedding-4b) via OpenRouter-compatible APIs.
Preferred environment variable: OPENROUTER_API_KEY with a fallback to OPENAI_API_KEY.
Publishing and deploying the Ansible package
Package location: packages/@ansible/example — this contains the Ansible playbooks and packaging used by CI.
To publish the package (CI): create a git tag for the version and provide NPM_TOKEN as a secret to the CI runner so it can publish to npm.
To deploy the package (CI): set the following repository secrets in your CI pipeline:
DEPLOY_HOST (default: motief.sgeboers.nl)
DEPLOY_SSH_KEY (private key for the webapps user)
DEPLOY_USER (default: webapps)
Defaults
DEPLOY_HOST: motief.sgeboers.nl
DEPLOY_USER: webapps
See docs/deployment/ansible-package-deploy.md for more detailed deploy instructions and defaults.