## 0.4.0-alpha.50.9.13 (candidate — production infrastructure)

- Adds isolated DigiDala production systemd services under `/opt/digidala`.
- Adds production Nginx bootstrap and HTTPS configuration for `digidala.ru`.
- Adds production deployment and rollback scripts using the same tagged release that passed staging QA.
- Adds a separate production SQLite database and campaign-assets path.
- Keeps the existing `im-test.bktis.ru` / `@PixDala_bot` staging environment unchanged.
- Does not switch DNS, issue the production certificate, or start `@DigiDala_bot` in this candidate.

## 0.4.0-alpha.50.9.12 (candidate — environment-configurable Mini App URL)

- Makes the Telegram bot Mini App URL configurable through `MINI_APP_URL`.
- Preserves `https://im-test.bktis.ru/apps/miniapp/` as the fallback for the existing test environment.
- Prepares the same release-managed codebase for separate DigiDala staging and production environments.
- Allows production to point `@DigiDala_bot` to `https://digidala.ru/apps/miniapp/` through environment configuration only.
- Adds regression coverage preventing the bot from reverting to a hard-coded Mini App URL.
- No Mandala, payment, moderation, navigation or localization mechanics are changed by this release.
- No production infrastructure, DNS, systemd or database migration is introduced by this candidate.

## 0.4.0-alpha.50.9.11 (candidate — localized legal documents follow-up)

- Adds English source versions of the four public legal documents under `docs/legal/en/`.
- Generates a localized English legal document set under `apps/miniapp/legal/en/` while keeping the existing Russian paths stable.
- Makes Mini App legal footer links follow the active RU/EN locale.
- Makes Telegram bot legal-document and `/paysupport` links follow the user's saved RU/EN locale.
- Opens legal documents inside Telegram Mini App/WebView: private-chat buttons use `web_app`, while group-chat buttons use Main Mini App `startapp` deep links.
- Keeps Mini App footer legal links in the current WebView instead of opening a new browser tab.
- Updates legal publication tests and the publication map for both language sets.
- Bumps the Mini App `app.js` cache-busting reference for the locale-aware legal-link logic.
- No Mandala, payment, moderation or navigation mechanics are intended to change.
- Manual QA for Alpha 50.9.10 found that the published documents had no English version; this candidate addresses that QA gap.

## 0.4.0-alpha.50.9.10 (candidate — not yet committed/tagged/deployed)

- Publishes the release-managed legal documents through stable Mini App HTML pages generated from `docs/legal/`.
- Adds permanent Mini App footer links to the User Agreement, Rules, Privacy Policy and Payments & Refunds.
- Adds a `📄 Документы` / `📄 Documents` bot menu entry with direct links to all four public documents.
- Adds `/terms`, `/rules`, `/privacy` and `/payments` bot commands.
- Adds `/paysupport` as the user-facing payment-support entry point with operator contact details and a link to Payments & Refunds.
- Keeps the automated refund workflow, refund audit storage and pre-payment acceptance persistence as separate follow-up work.
- Adds generated legal-page integrity tests and updates the internal publication/payment-support documentation.
- Local automated verification passes: Structure OK, JavaScript syntax OK, Unit 53/53, Integration 58/58, API 23/23 (134/134 total).
- No Mandala, payment, moderation, navigation or localization mechanics are intentionally changed by this candidate.

## 0.4.0-alpha.50.9.9 (deployed; manual Telegram/Mini App QA passed)

- Carries forward the Alpha.50.9.8 report-control readability and moderator complaint-context improvements.
- Adds the missing `mandala_cols` field to the moderation repository query so row/column coordinate calculation has the configured Mandala grid width.
- Applies the dedicated `report-action` styling hook to both Mini App report buttons so the new readable secondary visual treatment is actually used.
- The earlier `v0.4.0-alpha.50.9.8` tag was superseded before deployment after review found those two follow-up pieces missing; Alpha.50.9.8 was not deployed.
- Automated verification passed 131/131: Structure OK, JavaScript syntax OK, Unit 50/50, Integration 58/58, API 23/23.
- Released as `v0.4.0-alpha.50.9.9` from commit `7b9c70a` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.9.9`.
- Manual Telegram/Mini App QA passed for report-button readability, moderator complaint details (reason, comment, cell number and row/column coordinates), and opening the new Mini App release without clearing client cache.
- Test-VPS Nginx separately serves `/apps/miniapp/` and `/apps/miniapp/index.html` with `Cache-Control: no-store, no-cache, must-revalidate, max-age=0`, while versioned JavaScript and CSS remain normally cacheable.
- Technical moderation/localization/cache-refresh work is complete; the next planned phase is Terms/User Agreement and Rules/Policies.

## 0.4.0-alpha.50.9.8 (superseded candidate)

- Refines the Mini App report controls with a dedicated, subdued report-action style so the button text remains readable without drawing attention away from primary actions.
- Adds 1-based row/column coordinates to Telegram moderator notifications for cell-content complaints, derived from the current Mandala grid position.
- Keeps the complaint reason and moderator comment visible alongside Mandala, cycle, cell, participant, reporter, name and message context.
- Adds regression coverage for report-action styling and moderator notification context.
- Automated verification passed 131/131 in the working tree.
- Tag `v0.4.0-alpha.50.9.8` was created from commit `51c1fef`, then superseded before deployment after review identified missing repository/query and HTML hook follow-ups.

## Alpha.50.9.7 — 2026-10-03 (deployed; manual Telegram/Mini App QA passed)

- Fixed Mini App static-asset cache invalidation by versioning `styles.css` and `app.js` references in `apps/miniapp/index.html` for the 50.9.7 hotfix. This ensures the Alpha.50.9.6 quarantine presentation and shared bot/Mini App locale synchronization code are actually loaded by browsers after deployment.


- Fixes whole-Mandala quarantine presentation in the Mini App: the original artwork is removed from the public visual layer and replaced by an in-place moderation card while the cell structure remains available.
- Makes moderation visibility changes advance the affected Mandala `revision`, allowing the existing 2-second client synchronization to propagate hide/restore/quarantine changes without a manual refresh.
- Connects the Telegram bot and Mini App language preference through the existing persistent `bot_user_locales` table: changing the locale in one surface becomes the shared preference used by the other.
- Preserves the existing locale rules: the Mini App still starts from its saved local preference and Telegram language fallback, while bot locale resolution still uses the saved preference and Telegram language fallback.
- Adds regression coverage for shared locale synchronization, moderation revision propagation and the quarantined visual layout.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 48/48, Integration 58/58, API 23/23 (129/129 total).
- Released as `v0.4.0-alpha.50.9.7` from commit `42b3a62` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.9.7`.
- Manual Telegram/Mini App QA passed for quarantine, realtime moderation updates, RU↔EN locale synchronization, and Mandala completion/destruction with a hidden visual.

## 0.4.0-alpha.50.9.6 (deployed; manual Telegram/Mini App QA passed)

- Released from commit `ea7d839` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.9.6`.
- Fixes whole-Mandala quarantine presentation by fully replacing the public artwork with an in-place moderation card.
- Advances Mandala `revision` when moderation visibility changes so already-open Mini Apps receive the updated state through existing polling.
- Connects the Bot and Mini App to the same per-user locale preference without adding a new persistence layer or realtime transport.
- Automated verification passed 129/129: Structure OK, JavaScript syntax OK, Unit 48/48, Integration 58/58, API 23/23.
- Manual Telegram/Mini App QA passed.

## 0.4.0-alpha.50.9.3 (candidate)

- Replaces the previous gold Mini App header diamond with the approved DigiDala logo.
- Preserves the approved logo geometry, pixel structure and proportions; changes only the logo palette and Mini App integration.
- Keeps all Mandala, navigation, payment, Pix, authentication, archive, localization and bot mechanics unchanged.
- Automated verification after the logo change passed: Structure OK, JavaScript syntax OK, Unit 43/43, Integration 50/50, API 17/17 (110/110 total).
- Browser visual check passed for the Mini App header logo.
- Exact-tag deployment and Telegram QA are pending.

## 0.4.0-alpha.50.9.2 (deployed; manual Telegram QA passed)

- Fixes Telegram bot welcome text that was rendered with literal `\n` sequences from Alpha 50.9.1 migration defaults.
- Repairs existing system-default localized bot content without touching administrator-edited text.
- Makes `/language` immediately replace the current welcome message with the selected locale instead of showing a separate language-changed notice and requiring `/start`.
- Keeps the existing language preference, menus, bot content editing and all Mandala/payment mechanics unchanged.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 43/43, Integration 50/50, API 17/17 (110/110 total).
- Released as `v0.4.0-alpha.50.9.2` from commit `75c430c` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.9.2`.
- Migration `018_bot_localization_newline_fix.sql` was applied successfully on the test database.
- Manual Telegram QA passed: English welcome renders with real line breaks; switching RU↔EN replaces the current welcome message immediately, updates the keyboard, and does not require `/start` or show a separate language-changed notice.

## 0.4.0-alpha.50.9.1 (deployed; manual Telegram QA passed)

- Completes RU/EN localization of the Git-managed Telegram bot without changing its existing functional flows.
- Adds a shared supported-locale registry and a bot-specific i18n layer independent of Mini App source files.
- Adds persistent per-user language preference with Telegram-language detection and English fallback.
- Adds `/language` and localizes public bot menus, commands, support/payment text, errors, administration UI and Competitive Mandala management.
- Stores localized `welcome_message` and `about_message` content, including the approved DigiDala concept text and future visual-donation direction.
- Removes the Alpha 50.9 startup defect caused by the bot importing `apps/miniapp/i18n/locales.mjs` from inside `bot/`.
- Preserves the existing Telegram account, username `@PixDala_bot`, token and technical `pixdala` deployment identifiers.
- Preserves Mandala, payment, Pix, authentication, queue, archive, navigation, deep-link and synchronization mechanics.
- Adds regression coverage for shared locale metadata, bot dictionaries, persistent locale preference and the fixed bot import boundary.
- Preserves existing administrator-edited legacy welcome/about text during the localization migration.
- Rejects invalid localization codes at the internal content-update boundary and keeps Competitive creation confirmations localized.
- Final automated verification passed: Structure OK, JavaScript syntax OK, Unit 42/42, Integration 49/49, API 17/17 (108/108 total).
- Released as `v0.4.0-alpha.50.9.1` from commit `3200550` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.9.1`.
- Manual Telegram QA confirmed RU/EN language switching, persisted language preference and localized bot content. During QA, the approved Russian `О нас` text was restored through the bot's administrative content editor because the test database contained legacy default text; this was a runtime data correction and did not require a code change.

## 0.4.0-alpha.50.9 (localization checkpoint)

- Adds the first RU/EN localization foundation for the DigiDala Mini App.
- Adds automatic locale selection from Telegram `language_code` and persisted manual locale selection.
- Adds English fallback when no supported Telegram locale is available.
- Moves approved user-facing Mini App copy into dedicated i18n dictionaries and localized bindings.
- Adds localized campaign content storage for titles, descriptions and goal text.
- Adds localized campaign content handling to bot-managed Competitive Mandalas.
- Keeps the existing Mandala, payment, Pix, authentication, destruction, archive, navigation and share-link mechanics unchanged.
- Adds regression coverage for locale selection, localized UI and campaign localization behavior.
- Automated verification: Structure OK, JavaScript syntax OK, Unit 35/35, Integration 47/47, API 17/17 (99/99 total).
- This localization-foundation checkpoint was superseded by Alpha.50.9.1 before a separate final deployment/Telegram-QA claim was made for Alpha.50.9 itself.

## 0.4.0-alpha.50.6.13 (deployed; manual QA passed)

- Refines the Russian Mini App status UI: keeps `Состояние сервера` as the label and uses compact green `OK` / red `ERROR` indicators without changing API state handling.
- Preserves user-facing occupation errors as a temporary message below the server-status row.
- Makes the Pix purchase select use the dark color scheme and dark option styling.
- Places Mandala descriptions in the same compact framed treatment as the state block, with minimal lotus and Buddhist-inspired corner ornamentation implemented in CSS/SVG data.
- Version/cache-busters move to `0.4.0-alpha.50.6.13`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 31/31, Integration 47/47, API 17/17 (95/95 total).
- Released as `v0.4.0-alpha.50.6.13` from commit `1c9b5c6` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.13`.
- Manual Telegram QA passed for the final Russian UI refinement: server-status presentation, dark Pix select, framed Mandala descriptions and the lotus/rounded corner ornaments. No regression was observed in the tested surrounding layout or existing Mini App behavior.
- The next planned phase is the English-localization pass followed by the transition to the multilingual interface.


## 0.4.0-alpha.50.6.12 (candidate)

- Applies the approved Russian UI-copy pass across the Mini App without changing Mandala, navigation, payment, authentication or lifecycle mechanics.
- Updates Sandbox, Support, Creative, Special/Competitive, Archive, modal and user-facing error copy according to the approved RU copy table.
- Removes approved technical UI text while preserving the underlying functionality, including Telegram identity handling and Mandala lifecycle behavior.
- Uses dynamic `cell_price_pix` for paid copy and shows no occupation-price text when the current ordinary cell price is `0`.
- Version/cache-busters move to `0.4.0-alpha.50.6.12`.
- Automated verification: Structure OK, JavaScript syntax OK, Unit 31/31, Integration 47/47, API 17/17 (95/95 total).

## 0.4.0-alpha.50.6.11 (candidate)

- Gives ordinary, Special and Competitive Mandalas independent user-facing `#NNN` sequences while preserving the global internal Mandala number.
- Prevents the archive `← Назад` control from overlapping long archive path/title text by using a dedicated flex header layout.
- Replaces the archive participant table with a three-column card grid where each card contains the participant name, contribution and cell count.
- Preserves participant trace highlighting between archive cells and participant cards.
- Adds backend and Mini App regression coverage for type-specific numbering and the revised archive layout.
- Version/cache-busters move to `0.4.0-alpha.50.6.11`.
- Deployment: pending.
- Manual Telegram QA: pending.

## 0.4.0-alpha.50.6.10 (candidate)

- Renames the user-facing archive to `Эфирный след (архив)` across the Mini App archive entry and archive views.
- Gives Competitive Mandalas the same compact `#NNN` secondary number treatment as other Mandalas.
- Replaces the ambiguous `Открыть архив в Telegram` archive-detail action with a clear top-right `← Назад` control to the archive index.
- Adds a top-right `← Назад` control to the archive index that returns to the route from which the archive was opened; direct archive entry falls back to Sandbox.
- Removes the duplicate bottom archive-index button and the old Telegram archive deep-link action from archive detail.
- Keeps archive navigation and campaign lifecycle behavior unchanged.
- Adds focused regression coverage for archive naming, return routing, header controls and Competitive number presentation.
- Presents archive participants in a compact three-column table (participant, contribution, cells) while preserving participant-trace highlighting.
- Version/cache-busters move to `0.4.0-alpha.50.6.10`.
- Deployment: pending.
- Manual Telegram QA: pending.

## 0.4.0-alpha.50.6.9 (candidate)

- UI cleanup: removes obsolete `future`, `preview` and `immutable` sidebar blocks from the Mini App.
- Fixes the Archive → `К мандалам` path so the Mandala navigation catalog is initialized before archive routes are opened or left.
- Keeps the permanent `Архив` entry reachable on mobile by exposing only that topbar action on narrow screens.
- Reduces the Mandala navigation heading size, keeps titles on one line with ellipsis, and separates the Mandala number into a compact secondary label.
- Removes dead Mini App references left over from the removed legacy sidebar blocks.
- Adds focused regression coverage for archive/navigation initialization and the compact Mandala heading.
- Version/cache-busters move to `0.4.0-alpha.50.6.9`.
- Deployment: pending.
- Manual Telegram QA: pending.

## 0.4.0-alpha.50.6.8 (deployed; initial manual QA passed)

- Fixes stale Competitive artwork caused by long-lived browser caching by adding generation-specific asset URL versions to active campaigns and campaign archives.
- Adds a permanent Mini App `Архив` entry point and a real archive index backed by the existing campaign-archive API.
- Keeps the existing user-visible archive scope limited to Special and Competitive Mandalas; Sandbox, Support and Creative remain cyclic Mandalas without a user archive snapshot.
- Makes empty Special and Competitive spaces navigable and reachable through the left/right Mandala carousel even when no active campaign exists.
- Closes the Mandala carousel into a circular sequence, with the last Competitive node wrapping to Sandbox and Sandbox wrapping back to the last node.
- Introduces explicit navigation-space metadata and a route/bootstrap dispatch map so additional navigation-space types can be added without changing the circular navigation mechanism.
- Adds regression coverage for circular navigation, inactive campaign-space nodes, archive routing and versioned campaign/archive artwork URLs.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 21/21, Integration 46/46, API 17/17 (84/84 total).
- Released as `v0.4.0-alpha.50.6.8` from commit `6af8591` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.8`.
- Initial manual Telegram QA passed for the permanent Archive entry/index, empty Special/Competitive navigation, circular left/right traversal and the previously affected Competitive artwork-cache case.
- On the client where stale Owl/Lark artwork had previously appeared, a newly created Competitive campaign now shows the current uploaded artwork; two Competitive campaigns were also created for queued-lifecycle verification.
- The complete Competitive lifecycle remains a separate open manual verification item.

## 0.4.0-alpha.50.6.7 (deployed; manual QA passed)

- Fixes “Копировать ссылку” so it generates Telegram Main Mini App deep links (`https://t.me/PixDala_bot?startapp=...`) instead of copying the current browser URL and Telegram WebApp runtime data.
- Generates the correct start parameter for ordinary Mandalas, Special Mandalas and Competitive Mandalas, with QA campaign links preserved in the test route.
- Adds unit coverage for Telegram share-link generation and parameter encoding.
- Improves share-button contrast and copied-state feedback on the dark Mini App UI.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 19/19, Integration 46/46, API 17/17 (82/82 total).
- Released as `v0.4.0-alpha.50.6.7` from commit `42445ea` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.7`.
- Manual Telegram QA passed for share links under all tested Mandala types: ordinary Mandalas, Special, Competitive, Support and Creative. The links open the requested Mandala in the Mini App and no longer expose the current browser URL or Telegram WebApp runtime data.
- The share button uses the intended high-contrast DigiDala styling and shows visible copied-state feedback.
- The full Competitive lifecycle remains a separate open manual verification item.

## 0.4.0-alpha.50.6.6 (deployed; manual QA passed)

- Fixes left/right Mini App navigation between ordinary Mandalas and active Special/Competitive spaces by invalidating in-flight requests and resetting the previous Mandala sync state before the route change.
- Restarts server synchronization after a successful transition into a Special or Competitive space.
- Prevents stale background API responses from the previous Mandala from overwriting the newly selected route.
- Distinguishes an actually empty Special/Competitive space from a loading/API error instead of showing the empty-state message for every bootstrap failure.
- Adds a Mini App navigation regression contract test covering stale-request invalidation, sync restart and error-state separation.
- Refreshes the Mini App/package version and cache-busters to `0.4.0-alpha.50.6.6`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 16/16, Integration 46/46, API 17/17 (79/79 total).
- Released as `v0.4.0-alpha.50.6.6` from commit `d07f2ce` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.6`.
- Manual Telegram QA passed for left/right navigation into active Special and Competitive spaces without a page refresh; the previous false empty-state behavior was not reproduced.
- The full Competitive lifecycle remains a separate open manual verification item.

## 0.4.0-alpha.50.6.5 (deployed; queued creation QA passed)

- Fixes Competitive campaign creation from the admin bot when a Competitive campaign is already active and the new campaign is queued.
- Makes the internal Competitive creation API return the same full campaign shape for both active and queued campaigns, including `campaign.mandala`.
- Adds regression assertions for the queued create response price and dimensions.
- No Mini App client change; the Alpha.50.6.4 size-selector behavior remains unchanged.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 14/14, Integration 46/46, API 17/17 (77/77 total).
- Released as `v0.4.0-alpha.50.6.5` from commit `25d4186` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.5`.
- Manual Telegram QA passed for queued Competitive campaign creation after the response-shape fix.

## 0.4.0-alpha.50.6.4 (deployed; manual QA found follow-up defect)

- Adds a fixed size selector to `/new_competitive` with exactly three choices: 36 cells (6×6), 100 cells (10×10) and 400 cells (20×20).
- Stores the selected size on the Competitive campaign and creates the corresponding square Mandala; omitted size remains backward-compatible with 400 cells.
- Rejects any other Competitive size at the backend boundary.
- Keeps Competitive winner detection dynamic from the concrete Mandala `rows`/`cols`, so one half remains the winner target for all supported sizes.
- Updates the post-destruction campaign message to: `Благодаря участникам рисунок полностью открыт, и мандала завершена. История мандалы сохранена в архиве.`
- Refreshes the Mini App client version and cache-busters to `0.4.0-alpha.50.6.4`.
- Adds regression coverage for all three supported sizes and rejection of an unsupported size.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 14/14, Integration 46/46, API 17/17 (77/77 total).
- `git diff --check` passes for the files changed by this candidate; the uploaded archive also contains unrelated pre-existing working-tree modifications that produce whitespace warnings under a repository-wide `git diff --check`.
- Released as `v0.4.0-alpha.50.6.4` from commit `fe368c5` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.4`.
- Manual Telegram QA then found the queued Competitive creation response-shape defect fixed in Alpha 50.6.5.

## 0.4.0-alpha.50.6.3 (candidate)

- Fixes the Competitive Mandala completion overlay so it opens when the server marks a Competitive cycle `complete` after one 200-cell side is filled, instead of waiting for all 400 cells to be occupied.
- Keeps the existing `can_destroy` authorization path unchanged; the fix only restores the completion UI that contains the destruction control.
- Keeps ordinary Mandala completion behavior unchanged.
- Refreshes the Mini App client version and cache-busters to `0.4.0-alpha.50.6.3`.
- Adds focused unit coverage for Competitive completion, ordinary incomplete/completed states, and destruction-state suppression.
- Automated verification: pending.
- Deployment: pending.
- Manual Telegram QA: pending.

## 0.4.0-alpha.50.6.1 (deployed; manual QA almost complete)

- Fixes Competitive Mandala Mini App synchronization status so a successfully loaded competitive state reaches `Синхронизировано` instead of remaining at `Подключение…`.
- Makes Competitive Mandala cell price an administrator-provided value during bot creation instead of a hard-coded 10 Pix.
- Adds `/competitive_edit <slug>` for editing the queued/active competitive campaign cell price and description.
- Locks competitive cell-price changes after the first cell is occupied; description editing remains available.
- Adds the active Competitive Mandala to the Mini App navigation-only list used by the existing left/right arrows without adding competitive campaigns to the regular cyclic catalog.
- Adds a competitive-only vertical divider between the left and right 10-column halves of the 20×20 field.
- Adds regression coverage that keeps Sandbox, Support and the regular Mandala catalog behavior unchanged when competitive campaigns are created or edited.
- Keeps all new behavior behind the existing competitive campaign mode; no shared visual or navigation behavior is intentionally changed for other Mandala types.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 44/44, API 17/17 (71/71 total).
- Released as `v0.4.0-alpha.50.6.1` from commit `97df895` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.6.1`.
- Manual Telegram QA passed on Mobile and Desktop for Competitive synchronization, navigation, configurable pricing, editing, occupation, center divider and regression scenarios.
- The only remaining manual QA item is the full Competitive lifecycle from one side reaching 200 cells through `destroying`/`archived` and automatic activation of the next queued Competitive campaign.

## 0.4.0-alpha.50.6 (deployed checkpoint; manual QA found defects)

- Adds the first administration layer to the existing `@PixDala_bot`: authorized administrative commands work only in private chats, with roles `content_admin` and `superadmin`.
- Adds persistent bot settings for the main menu message and the `О нас` private message; both texts can be changed by authorized administrators without a code release.
- Reshapes the public bot menu into one full-width `Открыть DigiDala` button, a 2×2 Mandala selection grid, and a final `О нас` / `Поддержать проект` row.
- Adds `Мандалы состязаний`: 20×20 / 400 cells, two side-by-side artwork halves, one cell per user per cycle, and first fully opened half as the winner.
- Uses two separate PNG artwork files per competitive Mandala, each exactly 1024×2048, RGB/RGBA, 8-bit; together they form one 2048×2048 composition.
- Adds a persistent competitive-campaign queue with automatic activation of the next queued campaign after archive.
- Reuses the existing campaign archive trace model and stores `winner_side`; the winning artwork remains color and the losing artwork is shown in grayscale.
- Adds bot-driven competitive-campaign creation from two artwork files plus a description, without requiring a future release for new content.
- Adds administration of bot welcome/about copy and administrator roles; bootstrap administrators are supplied through the external `TELEGRAM_SUPERADMIN_IDS` environment variable and are not committed to Git.
- Keeps free-cell presentation on the existing Sandbox/Support grayscale SVG marker.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 43/43, API 17/17 (70/70 total).
- Released as `v0.4.0-alpha.50.6` from commit `810c210` and deployed successfully.
- Manual Telegram QA found four follow-up defects/requirements: Competitive Mandala remained at `Подключение…`; cell price was fixed at 10 Pix and could not be edited; the active competitive campaign was absent from arrow navigation; the two hidden-artwork halves lacked a clear visual divider.
- Competitive Mandala creation itself was manually completed successfully; the follow-up defects were found after creation and inspection of the resulting Mini App.

## 0.4.0-alpha.50.5.9

- Makes the Alpha50.5 trembling-state hint show the actual number of remaining cells with correct Russian singular and plural forms.
- Removes the extra `Поможем ей дорисовать мечту? 🎨` sentence from the Daughter campaign description for existing databases and future QA campaign copies.
- Adds database migration `014_daughter_copy_cleanup.sql`; the migration is idempotent and targets both `daughter` and `daughter-qa`.
- Refreshes the Mini App client/cache version to `0.4.0-alpha.50.5.9`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Released as `v0.4.0-alpha.50.5.9` from commit `ab31892` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.5.9`.
- Manual Telegram QA passed: the dynamic remaining-cell copy, the cleaned Daughter campaign description, the Daughter lifecycle/destruction/archive flow, and the existing archive trace behavior all matched expectations.
- The temporary QA campaign `daughter-qa` was cleaned up after manual testing; `campaign-qa.mjs list` returned no remaining QA campaigns.

## 0.4.0-alpha.50.5.8

- Replaces archive message dots with small transparent vector message icons using each participant's trace color.
- Preserves participant trace highlighting, archive deep links and the Alpha50.5.7 archive data model unchanged.
- Refreshes Mini App client/cache version to `0.4.0-alpha.50.5.8`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Released as `v0.4.0-alpha.50.5.8` from commit `7e4f58c` and deployed successfully.
- Manual Telegram QA passed: archive message icons render correctly, use participant trace colors, and preserve whole-trace hover highlighting and archive navigation.

## 0.4.0-alpha.50.5.7

- Adds participant-level archive traces: distinct participant colors, whole-pattern hover highlighting and colored message markers.
- Exposes complete occupied-cell positions in campaign archive API responses without a new archive table or migration.
- Adds Telegram archive deep links in the form `startapp=archive-<slug>`.
- Refreshes Mini App client/cache version to `0.4.0-alpha.50.5.7`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Released as `v0.4.0-alpha.50.5.7` from commit `3638445` and deployed successfully.
- Manual Telegram QA passed: participant-specific archive colors, whole-trace hover highlighting and archive deep-link navigation work as expected.

## 0.4.0-alpha.50.5.6

- Refreshes the Mini App asset cache-busters to `0.4.0-alpha.50.5.6` so Telegram Desktop loads the Alpha50.5.5 QA-routing fix instead of the cached Alpha50.5.4 client.
- Preserves the Alpha50.5.5 Telegram `campaigns-qa-<slug>` routing logic unchanged.
- Automated verification: pending.
- Deployment: pending.
- Manual Telegram QA: pending.

## 0.4.0-alpha.50.5.4

- Fixes the destruction preview path by explicitly resolving the destruction artwork asset for ordinary and campaign Mandalas.
- Preserves the Alpha50.5.3 campaign-state/navigation fixes unchanged.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Released as `v0.4.0-alpha.50.5.4` from commit `277a071` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.5.4`.
- Manual Telegram QA passed: Sandbox and Small Creative Mandala were filled and destroyed through the expected scenario; destruction sound, particle animation and other effects worked; post-destruction state and navigation behavior remained correct; no visual impact on other Mandalas was observed.
- Support and campaign artwork paths were not separately distinguishable in the manual visual check; no regression of their existing behavior was observed.

## 0.4.0-alpha.50.5.3 (superseded candidate)

- Clears stale campaign state when switching from an active campaign Mandala to a regular Mandala, preventing a transient daughter-campaign title during ordinary Mandala navigation.
- Makes the Mandala title fallback depend on the currently loaded Mandala type instead of reusing a previous campaign title while the next API response is loading.
- Updates Mini App cache-busters and package/client version to `0.4.0-alpha.50.5.3`.
- Superseded by the subsequent Alpha.50.5.x follow-up releases; final verification is recorded under Alpha.50.5.4.

## 0.4.0-alpha.50.5.2 (superseded candidate)

- Fixes the hidden Special Mandala route container so it cannot reserve viewport space when not displayed.
- Keeps campaign background synchronization from rebuilding the route every polling cycle, preventing `Синхронизировано` / `Подключение…` flicker.
- Ignores stale Mandala API responses after navigation to a different Mandala, preventing transient cross-Mandala title flashes.
- Updates Mini App cache-busters and version to `0.4.0-alpha.50.5.2`.
- Superseded by the subsequent Alpha.50.5.x follow-up releases; final verification is recorded under Alpha.50.5.4.

## 0.4.0-alpha.50.5.1 (superseded candidate)

- Fixes the Mini App mobile composition so the Mandala appears immediately after the heading instead of being pushed below the first viewport by the status block.
- Restores normal left/right navigation and swipe access for an active campaign Mandala while keeping campaign Mandalas separate from the regular catalog payload.
- Extends the `/api/v1/mandalas` response with a navigation-only list that includes the active public campaign without changing the regular catalog.
- Updates Mini App cache-busters and package/client version to `0.4.0-alpha.50.5.1`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Superseded by subsequent Alpha.50.5.x follow-up releases; final deployment and manual QA status is recorded under Alpha.50.5.4.

## 0.4.0-alpha.50.5 (superseded candidate)

- Introduces the first **Особая мандала** as technical `campaigns` with a permanent special-mandal entry point.
- Adds migration `012_campaign_archives_and_daughter.sql` with daughter campaign Mandala #5: 10×10 / 100 cells / 370 Pix per cell.
- Adds the supplied daughter PNG as hidden target artwork and the supplied cat SVG as the campaign-only free-cell marker.
- Adds short campaign lifecycle handling: campaign Mandalas archive after destruction and never start a new cycle.
- Adds immutable campaign archives with goal, dates, final artwork, aggregate statistics, per-participant contributions and preserved non-empty user messages by cell.
- Adds post-destruction thank-you state and archive navigation, plus the permanent bot entry **Особые мандалы**.
- Keeps Sandbox, Support, Small Creative and Large Creative outside the campaign catalog and preserves their existing cyclic behavior.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total).
- Superseded by subsequent Alpha.50.5.x follow-up releases; final deployment and manual QA status is recorded under Alpha.50.5.4.

## 0.4.0-alpha.50.4

- Adds `cell_price_pix` to the paid Mandala detail API payload so the Alpha.50.3 client microcopy can display the server price.
- Adds API regression coverage for the Support Mandala price (`95` Pix).
- Fixes the Pix purchase-row layout on narrow screens: the package label/select spacing is explicit and the `Купить` button keeps a stable width instead of being squeezed.
- Updates Mini App cache-busters and client/package version to `0.4.0-alpha.50.4`.
- Preserves all Alpha.50.3 product text and purchase behavior.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Released as `v0.4.0-alpha.50.4` from commit `59b4be3` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.4`.
- Manual Telegram QA passed on Android and Desktop: paid-cell price text is visible under the Support Mandala and inside the occupation modal; other Mandalas remain unchanged; the Pix purchase row and `Купить` button are correctly spaced and remain fully visible on narrow screens.

## 0.4.0-alpha.50.3

- Added the paid-Mandala cell price to the persistent microcopy below the Mandala.
- For every paid Mandala, the displayed price was intended to come from the server-side `cell_price_pix`.
- Preserved the existing free Sandbox and Creative microcopy and the cell occupation modal price announcement.
- Released as `v0.4.0-alpha.50.3` from commit `1a0efa3` and deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.50.3`.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Manual Telegram QA found two release-gating issues: the Support cell price was not visible because the Mandala detail API did not expose `cell_price_pix`, and the Pix purchase row layout squeezed the `Купить` button on narrow screens and lacked the requested spacing before the package selector.

## 0.4.0-alpha.50.2

- Changes the internal Pix exchange model to **1 Star = 1 Pix**.
- Keeps Pix as the reusable internal balance; purchases still create Telegram Stars invoices and credit the selected Pix amount after server-side payment finalization.
- Changes Pix purchase options to **1 / 50 / 100 / 500 / 1000 / 2000 Pix**, with the same amount in Telegram Stars.
- Changes the paid Support Mandala cell price from **1 Pix** to **95 Pix**.
- Adds migration `011_pix_economy_1_to_1_and_cell_prices.sql`; existing Pix ledger balances are not converted or rewritten.
- Adds regression coverage for the new exchange rate, purchase options and Support cell price.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Released as `v0.4.0-alpha.50.2` from commit `be9db62`.
- Deployed successfully from the exact tag; current test release is `/opt/pixdala/releases/v0.4.0-alpha.50.2`.
- Manual Telegram QA confirmed the new purchase UI and observed overall behavior; direct paid-cell debit was not manually completed because the test balance remained below 95 Pix.

## 0.4.0-alpha.50.1

- Added a compact occupied-cell information popup for both Creative Mandalas.
- Clicking an occupied visual cell now opens a small name-only plate; the participant name is preserved as the only user-facing information in this popup.
- Preserved the existing detailed occupied-cell information window for message-mode Mandalas.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Released as `v0.4.0-alpha.50.1` from commit `53c2def` and deployed successfully from the exact tag.
- Manual Telegram QA passed on Android and Desktop for both Small and Large Creative Mandalas.

## 0.4.0-alpha.50

- Preserved the existing `creative` Mandala as **Малая мандала творчества**, 10×10 / 100 cells.
- Added `creative-large` as **Большая мандала творчества**, 20×20 / 400 cells.
- Both Creative Mandalas use the existing `visual` mode, color palette, lifecycle, destruction flow and cycle reset behavior.
- Added separate Telegram Mini App deep links and separate bot inline buttons for the Small and Large Creative Mandalas.
- Added migration `010_large_creative_mandala.sql` and backend/API coverage for the new Mandala identity, 400-cell capacity and independent state.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Released as `v0.4.0-alpha.50` from commit `4c3876c` and deployed successfully from the exact tag.
- Manual Telegram QA passed on Android and Desktop for Small and Large Creative rendering and cell occupation. 400-cell filling was considered usable but close to the practical convenience limit.
- Full manual destruction/reset of the Large Creative Mandala was not completed because filling all 400 cells is time-consuming; this remains an explicit verification gap.

## 0.4.0-alpha.49.7

- Fixed the client-side false conflict notice that could appear after the current Telegram user successfully occupied a free Mandala cell.
- The fix tracks the selected cell with a pending own-occupation marker instead of comparing the API `owner_user_id` with the Telegram user ID. This avoids mixing the internal database user identifier with the Telegram identifier.
- Preserved the genuine concurrent-occupation path: when another participant occupies the selected cell while the current user is composing a message, the conflict notice remains visible and the occupation button is disabled.
- No changes to the Pix exchange rate, Pix ledger, payment flow, database schema, API or server-side cell occupation semantics.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Deployed successfully from the exact tag `v0.4.0-alpha.49.7`; active test release: `/opt/pixdala/releases/v0.4.0-alpha.49.7`.
- Manual Telegram QA passed for both own successful occupation and genuine concurrent occupation between different users.

## 0.4.0-alpha.49.6

- Attempted to fix the client-side false conflict notice after the current Telegram user successfully occupied a free Mandala cell by comparing the API owner with the current Telegram user.
- The attempted comparison was incorrect because `owner_user_id` is the internal database `users.id`, not the Telegram user ID.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- The exact tag `v0.4.0-alpha.49.6` was deployed, but manual Telegram QA showed the false conflict persisted (with the new Alpha49.6 conflict text).
- Alpha49.6 was therefore not accepted as a verified functional checkpoint and was superseded by Alpha49.7.

## 0.4.0-alpha.49.5

- Changed the internal Pix exchange model from the test direction `1 Star -> 20 Pix` to a configurable rate of **135 Stars -> 1 Pix**.
- Renamed the stored exchange-rate field from `stars_to_pix` to `stars_per_pix` and added migration `009_pix_exchange_rate_direction.sql`.
- Made the Pix purchase API accept `pixAmount`; the backend calculates the required Stars from the current server-side rate.
- Added compact Pix purchase options `1 / 5 / 10 / 20 / 50 pix` with automatic Stars calculation.
- Removed the `test` label from the internal Pix UI and removed the hard-coded old exchange text.
- Kept `Support.cell_price_pix = 1` unchanged and preserved historical payment records and legacy Pix ledger entries.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Deployed successfully from the exact tag `v0.4.0-alpha.49.5`; active test release: `/opt/pixdala/releases/v0.4.0-alpha.49.5`.
- Manual Telegram QA passed on Desktop and Android: the new purchase selector, 135 Stars -> 1 Pix rate, Pix crediting and paid cell occupation behaved as expected.
- Historical Pix purchased under the previous rate remain valid as ordinary Pix balances; no conversion is required.

## 0.4.0-alpha.49.4

- Fixed the insufficient-Pix error presentation in the paid Support Mandala cell modal.
- When the server returns `INSUFFICIENT_PIX`, the cell modal remains open and displays the existing user-facing error message inside the modal.
- The selected cell remains available and is not occupied when the user's Pix balance is insufficient.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Deployed successfully from the exact tag `v0.4.0-alpha.49.4`.
- Manual Telegram QA passed on Desktop and Android.

## 0.4.0-alpha.49.3

- Fixed the paid Support cell modal so an `INSUFFICIENT_PIX` response no longer closes the modal before the user can continue.
- The cell remains unoccupied when the Pix balance is insufficient.
- Automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- Deployed successfully from the exact tag `v0.4.0-alpha.49.3`.
- Manual Telegram QA confirmed that the modal remains open, but the insufficient-Pix message was not yet visible inside the modal; this was corrected in alpha.49.4.

## 0.4.0-alpha.49.2 (candidate)

- Added Mandala cycles and first-class cell occupation events for the internal `pix` economy.
- New paid cell debits now reference `occupation_id` instead of reusable `cell_id`.
- Resets/destruction resets create a new active cycle while the previous cycle is archived.
- Occupation creation, Pix debit and live-cell ownership are committed in one server transaction.
- Existing legacy Pix ledger rows are preserved unchanged; historical occupation reconstruction is intentionally not performed.
- Added regression coverage for migration, occupation/ledger linkage, cell reuse across cycles, insufficient Pix rollback and Sandbox occupation.
- Local automated verification passed: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 37/37, API 15/15 (62/62 total).
- This is a local release candidate only; it has not yet been tagged, pushed or deployed.

## 0.4.0-alpha.49.1

- Clarified the user-facing error path for insufficient Pix balance when a paid Support cell cannot be acquired.
- Preserved the existing Pix ledger and paid Support Mandala flow.

## 0.4.0-alpha.49

- Added the internal `pix` economy and Pix ledger.
- Added the paid Support Mandala cell price and server-side Pix debit flow.
- Added the Stars-to-Pix exchange setting and Pix credit path from Telegram Stars purchases.
- Kept Sandbox free and separate from the internal Pix economy.

## 0.4.0-alpha.48.3

- Updated the Mini App JS and CSS cache-busters to Alpha.48.3.
- Fixed Creative palette visibility so the palette is shown only for Creative visual mode.
- Preserved the Alpha.48.2 Mini App routing logic for `mandala`, `startapp`, `tgWebAppStartParam` and Telegram `initDataUnsafe.start_param`.
- No Telegram bot, payment or backend code changed in alpha.48.3.
- Manual Telegram verification completed after configuring the bot's **Main Mini App** in BotFather to `https://im-test.bktis.ru/apps/miniapp/`.
- After that configuration, group `?startapp` links work on Android and Desktop: Sandbox opens by default, `support` opens Мандала поддержки, and `creative` opens Мандала творчества.
- The `⭐ Поддержать проект` `?start=support` flow remains unchanged and verified.

## 0.4.0-alpha.48.2

- Added `tgWebAppStartParam` as an additional source for the requested Mandala slug.
- Preserved the existing `mandala`, `startapp` and Telegram `initDataUnsafe.start_param` routing paths.
- Did not change the Telegram bot, Stars payment flow or Mandala backend.

## 0.4.0-alpha.48.1

- Changed the group `🪷 Открыть DigiDala` button to the stable Main Mini App deep link `?startapp`.
- Moved `⭐ Поддержать проект` from the group callback flow to the private bot deep link `?start=support`.
- Added private `/start support` handling that opens the existing Stars amount selector.
- Kept the private `🪷 Открыть DigiDala` button as a true `web_app` button.
- Kept the existing Stars payment backend and invoice flow unchanged.

## 0.4.0-alpha.47

- Added the Creative Mandala as the first visual-mode Mandala with 10×10 / 100 cells.
- Added the Creative palette and server-side validation/persistence for the whitelisted visual colors.
- Preserved message-mode validation for Sandbox and Support Mandalas.
- Added Creative catalog, visual-mode, color-validation, persistence and reset coverage.
- Updated the Creative Mandala description to the approved wording later carried into alpha.48.
- Automated verification passed: 54/54.
- Released as `v0.4.0-alpha.47` and deployed successfully from the exact tag.
- Manual Telegram QA passed for Creative Mandala rendering, occupation and reset behavior.

## 0.4.0-alpha.48

- Updated the Creative Mandala description to the approved final text.
- Added group-friendly `/start`, `/app` and `/help` bot navigation.
- Added `?startapp=sandbox`, `?startapp=support` and `?startapp=creative` group links for the three Mandalas.
- Preserved the existing Stars project-support flow.

## 0.4.0-alpha.46.6

- Removed the legacy free-cell presentation from the Mini App renderer: old `✦`, cell number, `Пока свободно` and `Тестовый режим` markup is no longer generated.
- Unified free cells on the existing minimal `cell-free-marker` SVG presentation for Sandbox and Support.
- Removed the obsolete `.cell-placeholder`, `.cell-number`, `.cell-cta` and `.cell-price` CSS, including the corresponding mobile-only rules.
- Preserved occupied-cell rendering, Mandala lifecycle, server-authoritative synchronization, backend/API behavior, payment flow and stable Mandala identities.
- Automated verification passed locally and during deployment: Structure OK, JavaScript syntax OK, Unit 10/10, Integration 25/25, API 13/13 (48/48 total).
- Released as `v0.4.0-alpha.46.6` from commit `2a37d7fcbf765e62bc8cf17adfdd71b2e6ae9c12`.
- Deployed successfully from the exact tag to `/opt/pixdala/releases/v0.4.0-alpha.46.6`; `current` was switched and `pixdala-test-web`, `pixdala-test-api` and `pixdala-bot` were restarted successfully.
- Manual Telegram QA passed for repeated Sandbox/Support switching; the previous `Пока свободно` transition flash was no longer observed.
- Alpha.46.5 follow-up UX finding is closed; the next UX task remains the separate readable participant/message information layer.

## 0.4.0-alpha.46.5

- Fixed the observer-side remote destruction reset race: if the server resets a Mandala before the observer finishes the local particle animation, the observer now remembers the reset and applies it only after the visual animation completes.
- Prevented the remote observer view from remaining permanently invisible after destruction by restoring the shared Mandala container visibility and interaction state during reset.
- Prevented interaction with the Mandala container while the remote destruction view is intentionally invisible, eliminating clicks on invisible cells.
- Preserved the server-authoritative lifecycle: only the final participant/destroyer performs the server-side reset; other clients animate the destruction locally.
- Preserved independent Sandbox and Support Mandala state; destruction of one Mandala does not reset the other.
- Alpha.46.5 is the verified endpoint of the cache-busting and client-model reconstruction fixes delivered in alpha.46.3 and alpha.46.4.
- Automated verification passed: structure OK, JavaScript syntax OK, Unit 10/10, Integration 25/25, API 13/13 (48/48 total).
- Released as `v0.4.0-alpha.46.5` from commit `06afd97f70df3feeba82af1cbd4be33778ee133a`.
- Deployed successfully from the exact tag to `/opt/pixdala/releases/v0.4.0-alpha.46.5`; `current` was switched and `pixdala-test-web`, `pixdala-test-api` and `pixdala-bot` were restarted successfully.
- Manual Telegram QA passed for observer destruction animation, remote reset, and independence of Sandbox and Support Mandalas.
- Follow-up UX finding: switching between Mandalas can briefly show the previous free-cell presentation containing `Пока свободно` before the new Mandala-specific rendering appears. This is carried forward as a separate client-side rendering transition fix.

## 0.4.0-alpha.45

- Added a second permanent Mandala with stable identity `support` and public name **Мандала поддержки**; it is separate from Sandbox.
- Added a dedicated 10×10 / 100-cell support Mandala configuration for capacity and UX testing.
- Added stable Mandala catalog/routing by slug, including direct `?mandala=support` entry.
- Added explicit left/right Mandala navigation and swipe-based switching while preserving Sandbox as the default Mandala.
- Added the support Mandala visual asset `assets/mandala-support.png` without a drawn grid in the source artwork.
- Added migration coverage that creates stable Sandbox/support identities and their cells on a clean database, while preserving existing Sandbox data on upgraded databases.
- Added backend/integration/API coverage for support Mandala identity, routing and independent cell occupation.
- Automated verification passed locally and again during deployment: structure OK, JavaScript syntax OK, Unit 10/10, Integration 25/25, API 13/13 (48/48 total).
- Released as `v0.4.0-alpha.45` from commit `0c2376288dcfc46885ca56dff64a11607f0f98a4`.
- Deployed successfully from the exact tag to `/opt/pixdala/releases/v0.4.0-alpha.45`; `current` was switched and web/API/bot services were restarted successfully.
- Manual Telegram QA passed the core occupation/destruction lifecycle and showed that 10×10 is visually usable for cell selection.
- Manual QA finding: the current permanent in-cell name/message text is no longer readable at 10×10 even though cell targeting remains easy. This is an explicit UX follow-up, not a release-blocking backend defect.
- Manual QA also observed a small Desktop synchronization delay consistent with the existing polling-based shared-state synchronization. No realtime transport change is introduced by alpha.45.
- Agreed next UX direction: free cells should show only a small state marker rather than `Пока свободно`; participant name/message should move out of the permanent cell rendering into a separate readable information layer. The post-destruction historical message layer must also be designed independently from cell-size text rendering.

## 0.4.0-alpha.44

- Added permanent `⭐ Поддержать проект` support flow to the Telegram bot.
- Added selectable support amounts: 1, 5, 10, 25, 50 and 100 Telegram Stars.
- Added Telegram Stars payment handling with currency `XTR`, server-side pre-checkout validation, successful-payment finalization and durable SQLite payment records.
- Kept Stars funding separate from the future internal `pix` economy; supporting the project does not grant access to the internal economy.
- Added idempotent payment finalization and Telegram-user association, including storage of `telegram_payment_charge_id`.
- Restricted internal payment endpoints to localhost requests.
- Added payment schema, repository, API and integration coverage.
- Local automated verification passed: structure, JavaScript syntax, 10 unit tests, 21 integration tests and 10 API tests (41/41).
- Released and deployed as `v0.4.0-alpha.44` from commit `6387d2df260752ef51f7b79564038dffb5d8f38c`.
- Active release: `/opt/pixdala/releases/v0.4.0-alpha.44`.
- Manual Telegram QA passed the support flow with a real 1-Star payment. The payment was confirmed in the active Alpha.44 SQLite database and linked to the Telegram user and charge ID.
- Known limitation carried forward: a separately handled cancellation/closing of a Telegram invoice does not currently produce a dedicated cancellation event in the payment ledger; abandoned intents remain pending.

## 0.4.0-alpha.43

- Renamed the public project/product name from PixDala to **DigiDala**.
- Updated user-facing Mini App and Telegram bot texts to DigiDala.
- Preserved the Telegram bot name `@PixDala_bot` and all technical identifiers, services, scripts and `/opt/pixdala/...` paths.
- Released and deployed as `v0.4.0-alpha.43`.
- Automated verification passed: structure, JavaScript syntax, 10 unit tests, 17 integration tests and 8 API tests (35/35).
- Manual Telegram QA passed after deployment.

## 0.4.0-alpha.42

- Promoted the Telegram bot from the former test-bot naming to the main PixDala naming.
- Renamed the Git-managed bot source to `bot/bot.cjs`.
- Renamed the systemd unit to `infra/systemd/pixdala-bot.service`.
- Kept the stable Mini App entry URL `https://im-test.bktis.ru/apps/miniapp/`; the main bot now opens the current test Mini App.
- Hardened `scripts/deploy-test.sh` rollback so pre-migration releases can restore the legacy `pixdala-test-bot` unit safely.
- Disabled the legacy `pixdala-test-bot.service` after successful migration; it must not run alongside `pixdala-bot.service` because both use the same bot token.
- Preserved the Telegram bot token outside Git in `/opt/pixdala/.env`.
- Automated verification passed: structure, JavaScript syntax, 10 unit tests, 17 integration tests and 8 API tests (35/35).
- Released and deployed as `v0.4.0-alpha.42` to `/opt/pixdala/releases/v0.4.0-alpha.42`.
- Manual Telegram QA passed on `@PixDala_bot`: `/start`, Menu Button, `/help`, Mini App/API synchronization and cell occupation.
- During migration, the API required an explicit restart after the main bot token was placed in `/opt/pixdala/.env`; after restart the bot and API used the same token and the Mini App worked normally.
- No Telegram Stars or pix-economy implementation was introduced in alpha.42.

## 0.4.0-alpha.41

- Corrected the actual final-participant `celebrate` completion card to use the approved exact copy:
  `Мандала завершена!` / `Пора отпустить созданное...`.
- Preserved the existing `Развеять мандалу` button.
- Made no intentional changes to server lifecycle, revision polling, remote destruction, reset behavior, or occupation audio.
- Automated verification passed: structure, JavaScript syntax, 10 unit tests, 17 integration tests and 8 API tests (35/35).
- Released as `v0.4.0-alpha.41` and deployed to `/opt/pixdala/releases/v0.4.0-alpha.41`.
- Manual Telegram verification passed on Mobile and Desktop.

## 0.4.0-alpha.40 — superseded

- Added repository-root `AI_HANDOFF.md` and synchronized the project journals.
- Deployed successfully, but manual acceptance exposed that the changed text targeted `stageOverlay` while the visible final completion card uses the separate `celebrate` overlay.
- Superseded by alpha.41 without rewriting or retagging the alpha.40 release.

## 0.4.0-alpha.39

- Fixed the remote-viewer destruction path so rebuilding the client Mandala model no longer advances it to `destroying` before the visual controller starts; already-open non-destroyer viewers can now start the particle ritual when server state changes to `destroying`.
- Made the completion overlay a sibling of the Mandala visual layer with its own higher stacking layer, preventing Desktop participant name/message plates from covering the completion information.
- Added a dedicated completion message for non-destroyer viewers while preserving the final participant's existing completion text and `развеять мандалу` button behavior.
- Preserved the 2-second revision polling transport, server-authoritative destruction lifecycle and destroyer-only server reset.
- Preserved the accepted cross-viewer occupation-sound behavior.
- Updated Mini App cache-busting and package/client version to `0.4.0-alpha.39`.
- Automated verification passed: structure, JavaScript syntax, 10 unit tests, 17 integration tests and 8 API tests (35/35).
- Released as `v0.4.0-alpha.39` and deployed to `/opt/pixdala/releases/v0.4.0-alpha.39`; manual Telegram verification passed on Mobile and Desktop with multiple users.

## 0.4.0-alpha.38

- Fixed the `участников` counter to count unique Telegram users rather than occupied cells.
- Fixed cell-acquisition audio so the Web Audio context is initialized from the user's cell interaction and the occupation note plays on every filling stage, not only during Trembling.
- Raised the completion information overlay above cell content so it cannot be visually covered by participant text.
- Extended client synchronization so an already open viewer starts the destruction particle animation when the server enters `destroying`; the animation remains client-side.
- Remote viewers do not call the server destruction-finish endpoint; only the destroyer client completes the server-side reset.
- Remote destruction uses the server `destroying_at` timestamp to compensate for polling delay when starting the local animation.
- Added backend/API coverage for unique participant counting.

## 0.4.0-alpha.37

- Added server-side monotonic `mandalas.revision` for shared-state synchronization.
- Incremented revision on cell occupation, destruction start, destruction/reset completion and test reset.
- Added a lightweight 2-second Mini App polling loop plus visibility-triggered refresh.
- Background synchronization updates the shared Mandala state without rewriting the user's message form.
- Added a live modal notice when another participant occupies the cell currently being edited.
- Rebuilt the client Mandala model from the latest server snapshot so resets cannot leave stale occupied cells in the client domain model.
- Kept the existing stable Telegram Mini App entry URL; only static assets continue to use release cache-busting.
- Added integration coverage for monotonic shared Mandala revisions.

# Changelog

## 0.4.0-alpha.36.1

- Fixed the Git-managed Telegram test bot module format by using `bot/test-bot.cjs` under the ESM repository.
- Updated the bot systemd unit and release checks accordingly.
- Hardened rollback for the first bot migration by restoring the preserved legacy unit when the previous release has no Git-managed bot unit.


## 0.4.0-alpha.36 (candidate)

- Moves the Telegram test bot into the Git release tree under `bot/`.
- Uses the stable Mini App entry URL `https://im-test.bktis.ru/apps/miniapp/` instead of embedding the release version in the bot URL.
- Adds a Git-tracked systemd unit so the test bot runs from `/opt/pixdala/current/bot/test-bot.js`.
- Extends `scripts/deploy-test.sh` to validate, install and restart the bot together with web and API, with rollback support.
- Fixes the deployment HTTP smoke-test success flag.
- Configures the test bot Menu Button to open the same stable Mini App URL.
- Local alpha.36 source preparation retains the verified alpha.35 client behavior; no mandala synchronization feature is included yet.
- This is an implementation candidate; no `v0.4.0-alpha.36` tag has been created yet.

## 0.4.0-alpha.35

- Refined occupied-cell details for long names/messages: compact in-cell presentation with a full-details popup.
- Long messages are truncated in the cell and can be opened in the popup; full user name and message remain available there.
- Local verification passed: structure check, JavaScript syntax check, 10 unit tests, 14 integration tests and 6 API tests.
- Commit: `1efc2a5 feat: refine occupied cell details for alpha.35`.
- Tag: `v0.4.0-alpha.35`.
- Deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.35`.
- Test bot was temporarily updated to the versioned alpha.35 Mini App entry URL for Telegram verification.
- Real Telegram verification confirmed the planned occupied-cell details behavior on Mobile and Desktop.

## 0.4.0-alpha.34

- Release candidate built from the verified alpha.33 lifecycle.
- Refined occupied-cell presentation only: user/message icons are sized to the
  surrounding text, remain on the same row as their corresponding text, and the
  metadata block is centered within the cell.
- The refinement prevents vertical jumping when names/messages wrap to different
  numbers of lines and constrains the metadata block to the cell width.
- No server lifecycle behavior was changed from alpha.33.
- Local verification passed: structure check, JavaScript syntax check, 10 unit
  tests, 14 integration tests and 6 API tests.
- This is a release candidate; no Git tag or VPS deployment has been created yet.

## 0.4.0-alpha.33

- Added a server-authoritative destruction lifecycle for the Mandala Sandbox.
- The server validates the final acquirer before allowing destruction and the sandbox can recover stale `destroying` state.
- Removed the obsolete “Остаться на минуту” completion action from the intended UI.
- Real Telegram verification after the correct versioned Mini App entry URL worked on both Mobile and Desktop: occupation, destruction and automatic reset.
- Test bot entry URL was versioned to `https://im-test.bktis.ru/apps/miniapp/index.html?v=0.4.0-alpha.33` to avoid stale Mini App entry caching.
- Local verification passed: structure check, JavaScript syntax check, 10 unit tests, 14 integration tests and 6 API tests.
- Commit: `2834794 feat: harden Mandala Sandbox lifecycle for alpha.33`.
- Tag: `v0.4.0-alpha.33`.
- Deployed successfully to `/opt/pixdala/releases/v0.4.0-alpha.33`.
- Desktop occupied-cell presentation differs from Mobile and is the only current alpha.34 UI refinement target.



- Released the first Mandala Sandbox alpha.
- Disabled payment in the test Mini App; cells can be occupied freely in any order for functional testing.
- Removed the main-page `Start new` control and the old history/new-mandala test UI from the Mini App.
- Telegram identity is now server-authoritative for cell occupation: the participant name comes from validated Telegram `initData`, while Telegram user ID is displayed as a non-editable value.
- Cell API responses expose `owner_telegram_user_id` alongside the internal `owner_user_id`.
- The last participant is determined by actual acquisition time, not by cell position.
- After all 12 cells are occupied, only the participant who acquired the final cell receives the destruction action.
- After the destruction ritual finishes, the Mandala Sandbox automatically resets to an empty active Mandala.
- Added unit coverage for acquisition-order-based last-owner selection and integration coverage for Telegram identity ownership.
- Local verification passed: structure check, JavaScript syntax check, 10 unit tests, 11 integration tests and 5 API tests.
- Commit: `b327a26 feat: complete Mandala Sandbox alpha.32`.
- Tag: `v0.4.0-alpha.32`.
- The tag and `main` were pushed to GitHub.
- `v0.4.0-alpha.32` was deployed successfully to the test VPS with `scripts/deploy-test.sh`; the release check, service restart/status checks and HTTPS smoke test passed.
- Active release after deployment: `/opt/pixdala/releases/v0.4.0-alpha.32`.
- Manual verification in Telegram Desktop after deployment is currently correct.

## Development workflow checkpoint — 2026-09-03

- Established the local development workflow: VSCode/Windows → Git → GitHub → tagged VPS deployment.
- Fixed Windows portability of the API integration test by using `fileURLToPath()` for the project root.
- Verified locally: 9 unit tests, 11 integration tests and 5 API tests passed; structure and JavaScript checks passed.
- Commit: `8e94695 fix: make API integration test cross-platform`.
- Created technical verification tag `v0.4.0-alpha.28-winfix`; this is not a new product baseline and the package version remains `0.4.0-alpha.28`.
- Verified deployment from the Git tag through `scripts/deploy-test.sh`; release `v0.4.0-alpha.28-winfix` became active and HTTPS smoke test passed.
- Cleaned obsolete `/opt/pixdala/app` and historical `/opt/pixdala/deploy-*` staging directories from the VPS.
- Created and integrity-checked a standalone SQLite backup in `/opt/pixdala/backups/`.

## 0.4.0-alpha.28

- Returned the verified client-side domain model from the experimental alpha.24 baseline into `main`.
- Removed the leftover confirmation-flow diagnostic helper `setDiag` and its temporary status messages.
- Kept server-authoritative cell occupation, bootstrap synchronization, GET retry/timeout, POST timeout, duplicate-confirmation protection and server-state reconciliation.
- Kept Telegram WebApp SDK loading in `<head>`.
- Versioned the Mini App `app.js` URL as `0.4.0-alpha.28`.
- Updated the structure checker to accept versioned `app.js` module URLs.
- Verified with 9 unit tests, 11 integration tests and 5 API tests.
- Verified manually on Desktop and Android; Android occupation succeeded on the unrestricted/full-VPN network path.

## 0.2.0-alpha

- Added framework-independent domain core: User, Cell, Mandala.
- Added lifecycle state machine: draft → active → trembling → complete → destroying → archived.
- Connected current Mini App cell acquisition to the Mandala domain model without changing the visible UI.
- Added unit tests for core lifecycle and cell rules.

## 0.1.3-baseline

- Исправлена безопасная обработка частот при проигрывании нот.
- Выбор клетки стал защищён от некорректного индекса.
- Убраны разрозненные массивы нот для отдельных клеток.
- Добавлен временный PixDala favicon.svg.


## 0.2.1-alpha

- Сетка мандалы расширена с 4 до 12 клеток (4 × 3).
- Порог Trembling перенесён на 11 из 12 занятых клеток.
- Экран получил название «Мандала #001» вместо «Золотой лес».
- Описание заменено на общий призыв к участию без привязки к числу участников.
- Устранены дублирующие подписи «пока свободно» внутри клетки.
- Исправлена адаптивность мандалы на узких экранах телефона.
- Обновлена геометрия фона и разрушения под сетку 4 × 3.
- Добавлен unit-тест 12-клеточной конфигурации.

## 0.2.1-alpha.1

- Вступительный текст: «развеяна по ветру».
- Trembling включается примерно при 10% неоплаченных участков.
- Порог Trembling рассчитывается динамически от общего числа участков.

## 0.3.0-alpha

- Added persistent SQLite backend.
- Added SQL migration 001.
- Added Mandala/Cell/User repositories.
- Added Telegram Mini App initData validation.
- Added complaint/moderation schema foundation.
- Added backend integration tests.

## 0.3.0-alpha.2

- Backend now applies SQL migrations before initializing repositories.
- Added HTTP API integration tests for health, Telegram auth, cell occupation and complaints.

## 0.4.0-alpha.1

- Added read-only synchronization with the persistent Mandala API.
- Added API connection status indicator.
- Documented the staged frontend/API migration.
- Cell occupation remains local in this alpha.

## 0.4.0-alpha.2

- Fixed Mini App server-state cell mapping during read synchronization.
- API mandala endpoint now returns the 12 cells together with progress.
- Added read-path regression coverage in documentation.

## 0.4.0-alpha.3

- Moved main cell occupation from local state to authenticated API.
- Added Telegram initData header to occupation requests.
- Added 409 handling for cells claimed by another user.
- Added server-state refresh after successful occupation.
- Added backend-authoritative occupation ADR and documentation.

---

## 0.4.0-alpha.37 — verification

- Local release verification passed: structure check, JavaScript syntax check,
  10 unit tests, 15 integration tests and 7 API tests (32/32 total).
- Tagged as `v0.4.0-alpha.37` at commit
  `f3b046af268f4afeecc9374bc97215ba14a32b4f`.
- Deployed successfully with `scripts/deploy-test.sh`.
- Active test release after deployment:
  `/opt/pixdala/releases/v0.4.0-alpha.37`.
- Test web and API services were restarted successfully.
- The Git-managed Telegram test bot restarted successfully and connected as
  `@PixDalaTestBot`.
- Manual Telegram verification passed on both Mobile and Desktop, including
  multi-user Mandala synchronization.
