Progress board
Where the v1 to v2 port stands — measured from the spec, the scenario files and a real test run
Everything below is generated by python scripts/cb.py docs-sync, which reads
the migration spec (scripts/spec.py), counts the Gherkin scenarios in the v1
QA repository and in qa/features/, and runs the offline suite. No number here
was typed by a person.
Offline suite at generation time: 2 failed, 3445 passed, 44 skipped, 232 deselected, 2 warnings in 32.19s. Measured from commit 1aa8c83 on 2026-08-30.
Milestones
A milestone is a shipping unit, not a calendar date: M1 is "the bot can survive in a group unattended", M2 is "the commands people actually use every day".
Every feature, one page each
Grouped by area, with what must not change.
Scenario ledger
Every spec file: written, ported, green, failing.
Carried v1 defects
Thirteen known v1 bugs, each owed a regression test.
Consistency
The spec says what should be true; the suite measures what is. Where they
disagree, the disagreement is the report — a done row with no passing
scenario is a claim, and this is where claims get checked. cb.py status --check fails CI on the same list.
scripts/spec.py.Everything, in one table
| Feature | Status | Milestone | Layer | Scenarios | Triggers |
|---|---|---|---|---|---|
| Workspace, 3 services, CI platform_skeleton | Done | M0 | platform | — | — |
| OTel traces, Prometheus, structlog platform_observability | Done | M0 | platform | — | — |
| Citus schema, colocation, UUIDv7 platform_citus | Done | M0 | platform | — | — |
| Compiled hot path with benchmark gate platform_cython | Done | M0 | platform | — | — |
| Mock Telegram + executable Gherkin platform_qa_harness | Done | M0 | platform | — | — |
| Blob storage: GCS, S3, local, memory platform_storage | Done | M0 | core | — | — |
| Multi-provider LLM with configurable models platform_llm | Done | M0 | core | — | — |
| Self-hosted Telegram Bot API server platform_selfhosted_api | Done | M0 | gateway | — | — |
| Multi-tenant registry and schema platform_tenancy | Done | M1 | core | — | — |
| String catalog ported from v1 locales platform_locales | Done | M1 | core | — | — |
| Group config repository with shared cache platform_group_config | Done | M1 | core | — | — |
| Admin resolution and cache platform_admin_resolution | Done | M1 | core | — | — |
| Mongo -> Citus backfill platform_migration_etl | Done | M4 | worker | — | — |
| Health check from chat util_isalive | Done | M0 | gateway | 4 green | /isalive/tavivo |
| List available commands core_listcommand | Done | M1 | gateway | 6 green | /commands/comandos |
| Privacy policy core_privacy | Done | M1 | gateway | 8 green | /privacy/privacidade/privacidad |
| Reload cached admins and settings core_reload | Done | M1 | gateway | 3 green | /reload/recarregar |
| Group rules and /newrules core_rules | Done | M1 | gateway | 14 green | /rules/regras/newrules/novasregras |
| Welcome message and /newwelcome core_welcome | Done | M1 | gateway | 18 green | /newwelcome/novobemvindo |
| Join captcha core_groupguardian | Done | M1 | gateway | 9 green | — |
| Anti sticker spam core_stickerspam | Done | M1 | gateway | 9 green | — |
| Media restriction for new members core_mediarestrict | Done | M1 | gateway | 9 green | — |
| Admin configuration menu util_config | Done | M1 | gateway | 6 green | /config/configure/configurar |
| Block listed users from joining util_doomlist | Done | M1 | gateway | 4 green | — |
| Language selection core_setlang | Done | M1 | gateway | 8 green | — |
| Per-event bot skins core_botskins | Done | M1 | gateway | 5 green | — |
| Roll an n-sided die fun_dice | Done | M2 | gateway | 9 green | /dice/dado/d20 |
| Ship two members fun_ship | Done | M2 | gateway | 8 green | /ship/shippar/shipp |
| Random cause of death fun_death | Done | M2 | gateway | 8 green | /death/morte/muerte |
| Meme generator fun_meme | Done | M2 | worker | 4 green | /meme |
| Battle poll fun_battle | Done | M2 | gateway | 10 green | /battle/batalha/batalla |
| Random media from the group fun_random | Done | M2 | gateway | 33 green | /random/aleatorio |
| Firecracker sequence fun_firecracker | Done | M2 | gateway | 2 green | /firecracker/rojao/fogos |
| Complaint bit fun_complaint | Done | M2 | gateway | 4 green | /complaint/milton/reclamacao/reclamação/queja |
| Partnered convention posters fun_partneredcons | Done | M2 | gateway | 10 green | /bff/patas/fursmeet/trex/furcamp/pawstral |
| Today's birthdays util_birthday | Done | M2 | worker | 3 green | /birthday/aniversario/cumpleanos |
| Upcoming birthdays util_nextbirthday | Done | M2 | gateway | 2 green | /nextbirthday/proximosaniversarios |
| Ping every member util_everyone | Done | M2 | worker | 3 green | /everyone@everyone |
| Call the admins util_calladms | Done | M2 | worker | 7 green | /adm@admin/report |
| Rewrite social links util_embedder | Done | M2 | gateway | 16 green | — |
| YouTube search util_youtube | Done | M2 | worker | 1 green | /youtube |
| Identify music in voice notes core_musicdetection | Done | M3 | worker | 5 green | — |
| Cross-group post forwarding util_postforwarder | Done | M3 | worker | 8 green | /divulgar/publish/publicar/repost/repostar/reenviar |
| Receive forwarded posts util_postgetter | Done | M3 | gateway | 4 green | — |
| Delete scheduled reposts util_deletereposts | Done | M3 | gateway | 2 green | /deletereposts/deleteposts/apagarposts |
| Giveaways x_giveaways | Done | M3 | gateway | 10 green | /giveaway |
| Conversational AI replies x_conversational_ai | Done | M3 | gateway | 7 green | — |
| Voice transcription x_speech_to_text | Done | M3 | gateway | 6 green | /transcribe/transcrever/transcribir |
| Reverse image search x_reverse_search | Done | M3 | worker | 6 green | /searchsource/buscarfonte/buscarfuente |
| Media distortion x_distortion | Done | M3 | worker | 12 green | /destroy/zoar/destruir |
| Owner-only operations x_owner_commands | Done | M3 | gateway | 9 green | /grupos/groups/broadcast/leave/blacklist/unblacklist/stop/restart |
| Per-group custom commands x_custom_commands | Done | M3 | gateway | 6 green | — |
| Age guess (agify.io) x_age_guess | Done | M3 | gateway | 7 green | /idade/age/edad |
| Gender guess (genderize.io) x_gender_guess | Done | M3 | gateway | 8 green | /genero/gênero/gender |
| Unearth a random old message x_unearth | Done | M3 | gateway | 6 green | /desenterrar/unearth |
| Fortune cookie x_fortune_cookie | Done | M3 | gateway | 5 green | /sorte/fortunecookie/suerte |
| Image search (v1's catch-all) x_image_search | Done | M3 | gateway | 10 green | /qualquercoisa/anything/cualquiercosa |
| Drawing idea prompt x_drawing_idea | Done | M3 | gateway | 5 green | /ideiadesenho/drawingidea/ideadibujo |
| Message analysis (reply_to_message dump) x_analysis | Done | M3 | gateway | 7 green | /analise/analisis/analysis |
| Sticker DB auto-reply x_sticker_autoreply | Done | M3 | gateway | 6 green | — |
| Telegram-login JWT for the web console x_webhub_login | Done | M4 | api | — | — |
| Per-group analytics endpoints x_analytics_api | Done | M4 | api | — | — |
| OAuth2 token issuer for the Telegram Mini App x_miniapp_auth | Done | M4 | api | — | — |
| Group settings over HTTP, admin-gated x_group_config_api | Done | M4 | api | — | — |
| Fleet-wide analytics and the group directory, owners only x_admin_api | Done | M4 | api | — | — |
| Per-group audit trail x_audit_log | Done | M4 | api | — | — |