This document tracks known MVP limitations, stubs, and out-of-scope features. Check this before implementing or testing features that may depend on unfinished functionality.
Last updated: 2026-05-23
Active Limitations
Stripe Billing — Test Mode Only (Stopa C)
-
Status: Partially implemented (Stopa C, UC-10001–UC-10007)
-
Detail: Stripe integration is implemented in test mode only — no real money flows. After Stopa C is deployed, the following billing features are real (no longer mockup):
- Payment method — Stripe SetupIntent flow, card registration via Stripe Elements (UC-10001). Displayed card (brand, last4, expiry) is from live Stripe Customer data (UC-10002).
- Billing email — editable, persisted to Stripe Customer object (UC-10003).
- Invoices — fetched from Stripe Invoices API, paginated, with PDF download link (UC-10004).
- Spending limit —
user_budget.spending_limit_usdcolumn, GET/PUT via BudgetController, soft alert at 80 % and 100 %, Mara soft-stop at 100 % (UC-10005). - Stripe webhook —
POST /api/v1/stripe/webhookprocessespayment_method.attached,customer.updated,invoice.paid,invoice.payment_failed,invoice.voided,payment_intent.succeeded,payment_intent.payment_failed(UC-10006, UC-10007). - Credit top-up — jednorázové dobití AI kreditu zvolenou částkou ($5–$500) přes Stripe
PaymentIntent s uloženou kartou (test mode). Kredit je připsán asynchronně po potvrzení
Stripe webhookem (
payment_intent.succeeded). Tabulkacredit_topup(migrace0027) sleduje stav PENDING → SUCCEEDED / FAILED. FE může pollovat stav přesGET /api/v1/users/me/billing/topup/{id}/status(UC-10007).
Still not implemented after Stopa C + top-up:
- Real money / live Stripe mode — requires explicit go-live switch (Stripe test → live keys).
- Actual email sending for billing alerts (stub:
Slf4jlog only in MVP — billing alert e-mail is out of scope for ADR-025 Mailgun integration; planned as Stopa C follow-up). - Hosting cost billing (agent compute fees, hosting hours) — separate future effort.
- Tax / VAT ID field — still mockup in UI, no backend.
- Subscription / recurring billing — no Stripe Products or Prices used; payment method on file only.
- Auto-recharge (automatic top-up when balance drops below threshold) — not planned in MVP.
- Fixed credit packages / bundles — top-up is free-form amount only.
-
Impact: Users can register a test card and see invoice history. Spending limit is enforced as a soft cap. No real charges occur until Stripe live mode is activated (separate release).
Profile Settings Hub — Billing Section Status After Stopa C (UC-01006)
-
Status: Partially real after Stopa C — 5 of 8 billing rows are real API
-
Detail: After Stopa C deployment, the Billing & Usage section in
BillingSection.vueconnects to real backend APIs for:- Payment method display and registration (UC-10001, UC-10002)
- Billing email (UC-10003)
- Invoice list (UC-10004)
- Spending limit (UC-10005)
- AI usage quota bars (UC-08006, already real)
- Credit top-up — “Add credit” button, amount input, PaymentIntent flow, status polling (UC-10007)
Still mockup / not implemented:
- Estimated cost card (hosting hours, agent compute breakdown)
- Tax / VAT ID field
- Notification preference toggles (Notifications section, separate feature)
-
Impact: The previously fully-mocked Billing section is now largely functional. Users experience a real billing workflow backed by Stripe test mode.
No Live Technician Support UI
- Status: Not implemented (MVP)
- Detail: Live technician support is a planned monetization feature where a human expert can join a user’s session. The backend model does not yet include support sessions or technician accounts.
- Impact: Users can only interact with the AI PM; no human escalation path.
Claude Code CLI and Network Worker Must Be Available
- Status: External dependency (MVP / production)
- Detail: TalkIDE depends on either Claude Code CLI (lokální vývoj, Max plán) nebo
talkide-workerNode.js pod (cloud / produkce, ADR-024) being available and authenticated. The backend communicates with the network worker via HTTP+SSE; if worker pod není připraven nebo identity token je prošlý, vibecoding selže.executor.type = CLI— vyžaduje nainstalovaný a autentizovanýclaudeCLI (local dev)executor.type = NETWORK_WORKER(default a prod) — vyžaduje běžícítalkide-workerpod v tenant-env namespace, validníTALKIDE_WORKER_IDENTITY_TOKENv K8s Secrettalkide-worker-tokena dosažitelný control-plane BE pro mint endpoint
- Impact: First-time setup requires worker pod provisioning (handled automatically by
K8sWorkerProvisioneron first conversation turn); worker pod restart recovers from NFS session state (viz worker-runtime.md).
Concierge Panel — Mockup Only
-
Status: Frontend mockup — no backend connection
-
Detail: The Concierge panel (support/chat widget in the bottom-right corner of the UI) is entirely static — no backend endpoint exists, no messages are sent or received. All other major screens are connected to real backend APIs with real AI integration:
Fully implemented (real backend API + real Mara responses):
- Projects screen — project list loaded from API; search, filter, sort, and grid/list view operate on real project data
- New Project screen — form submits to API and creates a real project record
- Studio Dashboard — project list/grid and activity feed loaded from API
- Workspace (chat) — conversation API connected; users can start conversations, send messages, view message history. Mara responses are real AI responses via Anthropic (no mock). Conversation history panel shows past conversations.
Still mockup / static:
- Concierge panel — entirely static; no backend connection; planned as paid live-technician support feature
-
Impact: Users can create, list, and manage projects via a real backend. Users can have real AI-powered conversations with Mara. Only the Concierge support widget remains non-functional until implemented.
Profile Settings Hub — Partially Mockup (UC-01006)
-
Status: Partial — 3 of 7 sections use real APIs after Stopa C (Billing section upgraded); 4 sections remain frontend mockup
-
Detail: The My Profile screen is a full-page settings hub with 7 sections. After Stopa C:
- Profile section — display name and email via
GET /api/v1/users/meandPUT /api/v1/users/me— real - Account section — password change via
PUT /api/v1/users/me/password; language picker viaPUT /api/v1/users/me/locale— real - Billing & usage — payment method, billing email, invoices, spending limit backed by Stripe APIs (UC-10001–UC-10005); AI quota bars real via UC-08006. Estimated cost card and Tax/VAT ID still mockup. — partially real after Stopa C
The remaining 4 sections are frontend mockups with static/hardcoded data:
- Notifications — no notification preferences API; toggle states are local component state only
- Team — no collaborator/invite API; collaborator list and invite flow are static
- Connected accounts — no OAuth account management API; connect/disconnect buttons are non-functional
- Danger zone — export and account deletion are not implemented
Additional fields in the Profile section (handle, role, bio, website, social links, “currently working with” tags) are displayed in the UI but not yet persisted via API.
- Profile section — display name and email via
-
Impact: After Stopa C, users can register a payment method, manage billing email, view invoices, and set a spending limit. Profile and Account sections remain real. Notifications, Team, Connected accounts, and Danger zone remain visual-only.
Single-pod assumption pro real-time stream (SSE)
-
Status: By design (MVP) — single instance
-
Detail:
ActivityEventBusje in-memory pub/sub běžící uvnitř JVM procesu. SSE klient připojený k podu A dostane pouze události publikované na témž podu A — události vzniklé na jiných podech se k němu nedostanou. Při horizontal scaling (N > 1 pod za load balancerem) by každý SSE klient viděl jen výřez aktivit odpovídající podu, na který byl požadavek nasměrován.Stejný charakter má i Caffeine cache
projectId → ProjectInfouvnitřActivityEventBus: každý pod má vlastní lokální cache. Cold-start cost se násobí počtem podů, ale nejde o korektnostní chybu — cache-aside pattern zajistí, že chybějící záznam se doplní z DB.Současný stav: TalkIDE běží na jediném podu, takže toto omezení nemá žádný praktický dopad.
Před horizontálním škálováním bude nutné zvolit jednu z variant:
- (a) Sticky sessions — klient je vždy směrován na tentýž pod; křehké řešení, blokuje rolling deploy a zero-downtime aktualizace.
- (b) Distribuovaný event bus (Redis pub/sub, RabbitMQ, NATS) — preferovaná varianta; všechny pody publikují do sdíleného brokeru a každý pod doručí události svým SSE klientům.
- (c) Centralizovaný event-router pod — single point of failure, nedoporučeno.
Plánované řešení: V rámci UC-08 (Mara Platform) zavádíme Redis pro FUP quota tracking. Stejná Redis instance může sloužit jako distributed event bus (pub/sub) — preferovaná varianta (b) z výše uvedených. Follow-up po dokončení UC-08001 a UC-08002.
-
Impact: Týká se UC-05001 (workspace activity feed) a UC-06001 (Studio recent activity). V MVP bez horizontálního škálování je dopad nulový.
Waitlist “Copied!” Feedback Missing in HTTP Context
- Status: Known cosmetic limitation, follow-up tracked (GitLab issue v talkide-fe)
- Detail: Na success obrazovce waitlistu po kliknutí na “Copy” u invite linku se nezobrazí vizuální “Copied!” feedback, pokud běží stránka v HTTP (např. localhost dev / lokální E2E).
navigator.clipboard.writeText()je prohlížečem blokována mimo secure context (non-HTTPS). Samotná clipboard akce máexecCommandfallback, ale UI “Copied!” indikace se při selhání clipboard API nezobrazí. - Impact: Pouze HTTP/localhost. V produkci (https://talkide.app, secure context) clipboard API funguje a feedback se zobrazuje normálně. Žádný dopad na produkční uživatele.
- TODO: Frontend — zobrazit “Copied!” feedback i při selhání
clipboard.writeText(graceful degradation přes execCommand path).
BOGO Credit Bonus — Threshold nelze měnit přes UI (UC-10017)
- Status: By design (MVP) — admin UI pro
pricing_markup_configzatím neexistuje - Detail: Threshold
bogo_max_generationv tabulcepricing_markup_confignelze měnit přes žádné administrátorské UI. Admin musí editovat přímo v DB:
Hodnoty se projeví okamžitě (bez redeploye) —UPDATE pricing_markup_config SET bogo_max_generation = X;PricingMarkupConfigRepositoryčte singleton row read-through (bez cache). Rezervovaná hodnota-1= BOGO zcela vypnuto (podmínkainvite_generation <= -1nikdy nenastane, protožeinvite_generation >= 0). - Důvod: Admin UI pro
pricing_markup_config(marže / BOGO threshold) nebylo součástí scope UC-10008 (Apply Markup to Billing). Přímá DB editace je dostačující pro alfa fázi s omezeným počtem adminů. - Follow-up: Rozšířit admin UI z UC-10008 o pole
bogo_max_generation(číselné pole s validací>= -1). Otevřít jako follow-up issue k UC-10017. - Impact: Pouze admin operace. Běžní uživatelé ani BOGO logika samotná nejsou ovlivněni —
threshold se čte korektně při každém
payment_intent.succeededwebhookem.
Transactional E-mail — Mailgun Integration (ADR-025)
- Status: Implemented for waitlist confirmation (UC-11001) and forgot-password reset link (UC-01005). See ADR-025.
- Detail: E-mail is sent via Mailgun HTTP API from
noreply@mail.talkide.app(sender name: TalkIDE).EmailSenderabstraction withMailgunEmailSender(prod) andNoOpEmailSender(dev/test). Audit log inemail_logtable (migration0028). - Residual limitations:
- DNS prerequisite: prod e-mail delivery requires Mailgun domain verification for
mail.talkide.app(SPF, DKIM, tracking CNAME). If DNS records are not verified in Mailgun, no e-mails will be delivered in production even though the code path is active. This is a manual infrastructure step, not a code change. - Billing spending alert (UC-10005, 80 %/100 % threshold) — still a
Slf4jlog stub; e-mail delivery for billing alerts is out of scope for this iteration (Stopa C follow-up). - No retry logic in MVP — if Mailgun API returns 5xx, the failure is recorded in
email_logwithstatus=FAILEDbut no automatic retry or dead-letter queue is implemented.
- DNS prerequisite: prod e-mail delivery requires Mailgun domain verification for
GDPR Features — Export User Data (UC-01008) and Delete Account (UC-01009)
-
Status: Implemented (Stopa D.2, fe#20). Both features are functional after migration
0048and0049are applied. -
Detail: Two GDPR compliance features are live:
- Export User Data (UC-01008) — async ZIP export, delivered via email with a 7-day signed download link. Backed by
gdpr_export_requesttable (migration0048) and DO Spacesplatform/exports/prefix. - Delete Account (UC-01009) — 14-day grace period, soft-delete with
deletion_requested_at, email undo link, nightly hard purge job. Backed by three new columns inuserstable (migration0049).
- Export User Data (UC-01008) — async ZIP export, delivered via email with a 7-day signed download link. Backed by
-
Known limitations:
- K8s Deployment/Ingress cleanup during hard purge — If the K8s API is unavailable at purge time, published app Deployments and Ingresses are NOT deleted automatically. Manual admin cleanup is required:
kubectl delete deployment -n talkide -l talkide.app/user-id={userId}. This is the most significant operational gap; a future follow-up should add a retry queue or reconciler. - Stripe invoice retention — Invoices are deliberately NOT deleted from Stripe during hard purge. Czech tax law requires 7-year retention. The Stripe Customer object remains. The local
usersrow is removed; no reference to the Stripe Customer ID is kept post-purge. - Cluster B schema drop on PgBouncer error — If the data-plane PgBouncer is unreachable during purge,
DROP SCHEMAmay fail. Job logs ERROR and continues. Manual cleanup:DROP SCHEMA IF EXISTS tk_t{tenantId}_p{slug}_{env} CASCADEon cluster B (talkide_dataplane). - No export during grace period — User is locked out immediately after delete request; cannot submit a new GDPR export. Admin can manually extract data if needed.
- Mailgun failure = export/purge FAILED — If Mailgun is unavailable, the export job marks status
FAILEDand no email is sent. The user must re-request from the UI. No silent fallback, no retry queue in MVP. - DO Spaces lifecycle policy is bucket-level — ZIP files are cleaned up by a bucket-level lifecycle rule (7 days). This means ALL objects in
platform/exports/are deleted after 7 days regardless of their individualexpires_at. If the lifecycle policy is misconfigured, old export ZIPs persist. Monitor via DO Spaces console.
- K8s Deployment/Ingress cleanup during hard purge — If the K8s API is unavailable at purge time, published app Deployments and Ingresses are NOT deleted automatically. Manual admin cleanup is required:
-
Impact: GDPR Article 15 (right of access) and Article 17 (right to erasure) are operationally satisfied. K8s cleanup gap is the main residual risk for published apps of deleted users — admin must perform manual cleanup until the reconciler follow-up is implemented.
GDPR Export — DO Spaces Wiring Pending
- Status: BE talkide-be#136 follow-up — DOSpacesGdprExportStorage je stub v production
- Detail: DOSpacesGdprExportStorage.upload() a generateSignedUrl() throwují GdprExportStorageException v production profilu, takže první GDPR export v produkci skončí status=FAILED s errorMessage=“Upload failed, please try again later”. Email se neodešle.
- Required follow-up: AWS S3 SDK wiring s endpoint override na nyc3.digitaloceanspaces.com, presigned URL pro 7-day expiry.
- Impact: GDPR export endpoint je k dispozici (request → PENDING → PROCESSING → FAILED), ale uživatel data nedostane dokud SDK wiring není hotov.
Liquibase — production mode (forward-only, immutable)
Status: Resolved — projekt je v PRODUCTION fázi od 2026-05-12.
spring.liquibase.drop-first: false v application-local.yaml. Migrace jsou immutable — nikdy needituj existující changeset soubory v db/changelog/changes/ (rozbil bys checksum). Vždy přidávej nový soubor s dalším pořadovým číslem.
Seed data (9999-test-data.xml, context "dev") jsou taktéž immutable. Další seed data přidávej jako nový soubor 9XXX-test-data.xml (998, 997, …) s context="dev".
Při startu BE Liquibase aplikuje pouze pending changesety — žádný drop, žádný rerun.
Thanks for the feedback.