The canonical 22-point TaTech build standard every app must ship, and how CivicLoop County OS meets each. (Copy of the locked signature; per-app notes added.)
| # | Standard | CivicLoop status |
|---|---|---|
| 1 | Light + dark theme, toggle, persisted | Yes - next-themes, theme toggle, persisted |
| 2 | Mobile-first + offline PWA | Yes - responsive, service worker (public/sw.js), /offline route, installable |
| 3 | Multilingual from day one | Yes - English + Spanish, every string keyed; no English fallthrough for ES |
| 4 | Great UI/UX, back-nav, in-app guided tour | Yes - back-nav on every sub-page; first-run dashboard tour (welcome-tour.tsx), re-openable |
| 5 | Named AI assistant + knowledge base + Anthropic fallback | Yes - "Ada" (/assistant), county_kb knowledge base, falls back to general guidance; renameable in county_ai_config |
| 6 | Self-testing suite (full-stack E2E + every-button per-role) | Yes - Playwright suite + scripts/ui-sweep.mjs (every safe button, per role, fails on JS error) |
| 7 | Voiced walkthrough (detailed + short reel, all languages) | Yes - scripts/make-walkthrough-video.mjs renders detailed + 90s reel in EN + ES; hosted at /[locale]/walkthrough |
| 8 | How-to docs, updated every patch | Yes - this docs set + docs site; updated with each change |
| 9 | Platform console (TaTech-engineer tier, separate from tenant admin; access levels, kill-switch, impersonation+audit, billing) | Mostly - /platform is a distinct TaTech tier (table platform_admins, levels owner/engineer/support) with cross-tenant health/usage, a kill-switch (suspend/restore a county), and audited impersonation ("view as a tenant"). The county boss is the separate tenant admin (/admin, county_admin). Per-tenant billing is the one remaining sub-item (see TATECH_GAPS.md) |
| 10 | Observability ("our own Datadog") | Yes - Sentry (DSN-gated), synthetic uptime monitor (/api/cron/synthetic) + Platform health panel, prod-smoke |
| 11 | Source of truth + brief/exec tab | Yes - architecture docs 00-14 + 14-executive-summary; this suite is the operator source of truth |
| 12 | Branding (logo, PWA icon, printables, Powered by TA-Tech, no em-dash) | Yes - branded printable reports on every module + public portals; "Powered by TA-Tech" everywhere; build fails on em-dash |
| 13 | DB discipline (snapshots, dev-first, RLS, audit) | Yes - RLS on every table; schema dump source of truth; check information_schema before SQL |
| 14 | RBAC + privacy by default | Yes - requireStaff(locale, minRole) (agent/supervisor/department_head/director/county_admin), DB-enforced RLS, no PII on public pages |
| 15 | Everything editable + removable (full CRUD) | Yes - schema-driven RecordEditor gives New/Edit/Delete on every module's core entity + feeds + KB |
| 16 | Highly customizable, no hardcoding | Partial - feeds/KB/assistant name are tenant-editable; County identity is single-tenant by design (PG County) |
| 17 | White-label isolation | N/A for the single-county deployment; lands with the multi-county product (roadmap) |
| 18 | AI onboarding questionnaire seeding the KB | Yes - onboarding questions seeded as editable county_kb rows the County answers |
| 19 | Slack-grade in-app comms | Partial - /channels (channels + threads); WhatsApp/SMS bridge + AI persona on roadmap |
| 20 | Smart forms + address autocomplete | Partial - real dropdowns/money/date controls on every form; 311 has photo + EXIF + geolocation address; places-autocomplete library on roadmap |
| 21 | Engineering hygiene & release gates | Yes - build-before-push, click-through-in-dev, docs-with-every-patch, no .test on prod |
| 22 | Global-ready units | Partial - generic per-feed units (user-defined); 311 is not unit-heavy; locale-aware dates/numbers |
Branded-domain hosting (locked 2026-05-26): every standalone product gets its OWN domain, with all hosting on branded subdomains - never a raw *.netlify.app in public. CivicLoop = civicloop.us (apex/www -> app, docs. -> docs, watch. -> walkthrough videos). tatech.dev is the storefront and only EMBEDS the demo reel + walkthrough; it does not host the product. Owning the domain makes the public URLs portable (change hosts without changing links).
Automation (locked): Yes - event + agentic. Scheduled secret-gated /api/automations (reminders, janitor, feed forecasts) + AI bid evaluation, all on cheap Claude Haiku.
Open items are tracked in TATECH_GAPS.md. The full cross-app signature lives in the canonical TaTech standards memory.