# DigiDala — Alpha50.5 Changeset

## Goal

Introduce the first **Особая мандала** as the first technical `campaign`, together with a reusable short campaign lifecycle and immutable archive foundation.

## Scope

- Add the `campaigns` domain layer and immutable campaign archive storage.
- Add an isolated QA-clone workflow (`daughter-qa`) with `0 Pix` cell price so the full campaign lifecycle can be tested without spending Telegram Stars and without exposing the QA clone in the public `Особые мандалы` space.
- Add the first special campaign, `daughter`, as Mandala #5: 10×10, 100 cells, 370 Pix per cell.
- Use the supplied PNG as the hidden target artwork and the supplied cat SVG as the only free-cell marker for this campaign.
- Exclude campaign Mandalas from the regular Mandala catalog and expose a stable `Особые мандалы` entry point.
- Add campaign archive statistics, participant contributions and preserved non-empty user messages.
- After campaign destruction, finalize the archive instead of creating a new cycle; show the thank-you window and archive link.
- Add the bot entry button `Особые мандалы` pointing to the permanent campaigns space.
- Keep existing Sandbox, Support, Small Creative and Large Creative behavior unchanged.
- Update Mini App and package version to `0.4.0-alpha.50.5`.

## Daughter campaign

User-facing title: **Подарок для юной художницы**

Technical slug: `daughter`

Goal: **Графический планшет для дочки**

Campaign price: **370 Pix per cell**

Target: 100 cells / 37,000 Pix total.

The campaign description is frozen to the agreed copy:

> Моя дочка очень любит рисовать, и у неё это действительно хорошо получается. В этой мандале спрятан один из её любимых рисунков — персонаж из Brawl Stars.
>
> Мы предлагаем вместе открыть его, клетка за клеткой. Поддержите её талант, заняв клетку мандалы: все собранные средства пойдут на крутой графический планшет для неё, о котором она давно мечтала.
>
> А дальше будет особенно приятно: однажды она сможет рисовать уже и для DigiDala — в качестве моего художника. ❤️
>
> Поможем ей дорисовать мечту? 🎨

The post-destruction thank-you and no-active-campaign placeholder texts are candidate UI copy and still require manual Telegram review.

## Archive

The archive stores an immutable snapshot containing:

- campaign title and description;
- goal;
- start and finish timestamps;
- final artwork asset;
- total cells and occupied cells;
- participant count;
- total Pix contribution;
- per-participant cell count and contribution;
- non-empty user messages tied to their original cell positions.

Archived messages form the campaign version of the previously discussed “эфирный след”.

## Acceptance criteria

1. `GET /api/v1/campaigns/current` exposes the active daughter campaign and its 10×10 / 370 Pix Mandala.
2. The daughter Mandala is absent from the regular `/api/v1/mandalas` catalog.
3. Free cells show only the supplied daughter cat SVG; generic free-cell SVG is not used in campaign mode.
4. Occupied cells reveal the corresponding fragment of the supplied 2048×2048 PNG artwork.
5. The campaign uses a short lifecycle: after destruction it becomes archived and does not start a new cycle.
6. Archive data preserves participants, contribution totals and non-empty messages by cell position.
7. The post-destruction completion window provides a link to the archive.
8. The permanent Mini App route is the `campaigns` / **Особые мандалы** space rather than the daughter Mandala itself.
9. Existing cyclic Mandalas retain their current lifecycle and catalog behavior.
10. Full automated project checks remain green.
11. A disposable `daughter-qa` campaign can be created on the test VPS, opened through an explicit QA route, completed, archived, and then fully removed together with its archive without affecting the real `daughter` campaign.

## Verification status

Automated verification: passed — Structure OK, JavaScript syntax OK, Unit 10/10, Integration 40/40, API 16/16 (66/66 total)

Deployment: not performed

Manual Telegram QA: pending

QA lifecycle verification plan: create disposable `daughter-qa` with `0 Pix`, run the full lifecycle manually, then run the cleanup command. The real `daughter` campaign is not used for destructive QA.
