Single source of truth for activities.type literals —
imported by both the backend (backend/src/...) and the frontend
(frontend/src/..., via a relative path that climbs into backend/).
Lives under backend/src/ rather than a repo-root shared/ directory
because the backend Docker image only copies backend/ — a sibling
shared/ would break the container build. The frontend already
reaches into backend/ via server.fs.allow: ['..'] in
frontend/vite.config.js, so cross-side import is unaffected.
Imperative <entity>.<verb> (test.approve, not test.approved).
- Source: