Prefer async FastAPI endpoints, pydantic-v2 models, and service-to-service
messaging over RabbitMQ (direct exchange, JSON body, snake_case keys).
All DB migrations via Flyway; never mutate schemas ad-hoc.
For OpenSearch:
• index templates live in /search/templates/*.json
• vector fields use dense_vector (dims=1536, similarity=l2_norm)
• default sharding: 1 × replica, 3 × primary
AI pipelines follow this order: data-loader ▸ splitter ▸ embed (model:
voyage-code-3) ▸ store (OpenSearch) ▸ LLM (Claude 3.7) ▸ output guard.
New Python must meet 99 % coverage in pytest --cov, typed with
mypy --strict, and logged via structlog.
Pull requests include:
• short title (< 50 chars) + body with “Why / How / Risk”
• screenshot / asciinema for UX changes
• link to Jira ticket in DEV-### format