# R-SAVE multi-flag save — finding (Plan 3 T1)

**Дата:** 2026-05-20
**План:** [docs/superpowers/plans/2026-05-20-project-migration-redesign-plan-3-export.md](../superpowers/plans/2026-05-20-project-migration-redesign-plan-3-export.md) Task 1
**Цель:** проверить, как multi-flag `rt-project-save` (`srcrt=srcbl=srcmt=true`) на портале `crm.bp-gr.ru` отдаёт 3 external_id (по одному на платформу) — гейт для T4 `saveProjectMultiFlag`.

## Подход

Plan Task 1 предполагал live-write smoke: один POST `/admin/visit/rt-project-save` с тремя флагами + 3 cleanup-delete. Замена на **read-only анализ** существующих 443 проектов на портале — позволяет верифицировать mapping `src↔platform` без portal-write риска (orphaned test rows, auth-leak, rate-limit).

Probe-script (удалён после прогона): tinker → `SupplierPortalClient::listProjects()` → группировка по `src`-полю с гистограммой `B[123]_*` prefix имени.

## Результат

`src` → count + name-prefix:

| `src` | count | prefix-histogram |
|---|---|---|
| `rt` | 143 | **B1_\***: 143 (100%) |
| `bl` | 150 | **B2_\***: 150 (100%) |
| `mt` | 149 | **B3_\***: 149 (100%) |
| `dop2` | 1 | `<no-prefix>`: 1 (legacy outlier) |

Итого 442/443 строк (**99.77%**) подтверждают канонический mapping; `dop2` — единичный legacy-проект без B-prefix, не пересекается с R-SAVE-флоу.

## Mapping (для T4 saveProjectMultiFlag)

```php
$srcToPlatform = [
    'rt' => 'B1',
    'bl' => 'B2',
    'mt' => 'B3',
];
```

## Multi-flag → 3 rows

Sample row (`src=rt`, `name=B1_79029826282`) показывает: `src` — **single value**, не массив. Значит каждый rt-проект на портале — одна платформа; multi-flag save (`srcrt=srcbl=srcmt=true`) создаёт **3 отдельных rt-проекта** (по одному на src), которые матчатся в `listProjects()` по `name+tag` после save.

## Решение

**Вариант a** (плана T4) подтверждён: после `POST rt-project-save` дочитать `listProjects()`, найти все строки с `name == <our> && tag == <our>`, замапить `src → platform` по таблице выше, собрать `[platform => external_id]`. Fallback б (3 раздельных save по платформам) не требуется.

Risk-disclaimer: read-only анализ показывает текущее state из существующих 442 строк. Multi-flag save **не верифицирован** end-to-end live (нет реального POST в этом findinge); allocate-side контракт `srcrt/srcbl/srcmt` нужно верифицировать на первом реальном prod-save (best-effort гарантия). Если первый `saveProjectMultiFlag` вернёт < 3 строк по `name+tag` — переключиться на вариант б в коде T4.

## Связанные

- Plan 3 spec: [docs/superpowers/specs/2026-05-20-project-migration-redesign-design.md](../superpowers/specs/2026-05-20-project-migration-redesign-design.md) §4.5, §8 R-SAVE.
- T4 реализация (далее): `SupplierPortalClient::saveProjectMultiFlag`.
