B-19 — post-PR-#159 RCA · 2026-05-14 07:48 UTC
TL;DR: PR #159 корректно заменил `Authorization: Bearer` → `Project-Access-Token`. Однако `writer-env-fix.yml` всё ещё падает, потому что GraphQL запрос `{ project(id: $projectId) { environments { ... } } }` под PAT-токеном возвращает `{data:{project: null}}`. PAT привязан к проекту имплицитно; явный `id` поле в `project(id)` не разрешается.
```
2026-05-14T07:48:41.97Z ##[group]resolve IGLA env
2026-05-14T07:48:42.02Z jq: error (at :1): Cannot iterate over null (null)
2026-05-14T07:48:42.02Z ##[error]Process completed with exit code 5.
```
`jq` парсит `.data.project.environments.edges[]` ⇒ null = `project` поле было null ⇒ PAT не отдаёт project по explicit id.
Pattern фикса (доказано рабочее)
`refresh-acc47.yml` (last good run 25754312720 @ 2026-05-12 18:31Z) не делает resolve_env вообще. Он читает hardcoded `(ACC, PROJ_ID, ENV_ID, SVC_ID, SVC_NAME)` пятёрки из `.github/wave-a/acc47-services.csv` и идёт сразу в `variableUpsert`/`serviceInstanceDeployV2` mutation. Mutation принимает `(projectId, environmentId, serviceId)` от PAT даже когда query `project(id)` возвращает null.
Patch (B-19 fix)
Заменить в `.github/workflows/writer-env-fix.yml`:
- Удалить helpers `resolve_env`, `fetch_services`, `resolve_id`.
- Захардкодить env_ids:
- `IGLA_ENV_ID = f3517e98-c11a-49d8-b5fd-4cbb82d04384` (production, из `leaderboard-snapshot v1.2` Constants block).
- `ACC2_ENV_ID = <неизвестен из публичных артефактов>` — операторская инжекция.
- Заменить `SVC_ID="${ID_PREFIX%%-0000-0000-0000-000000000000}"` (восьмисимвольный prefix как полный UUID — это работает только когда mutation accepts prefix, что мы не подтверждали) на полные UUID из CSV (как `refresh-acc47` делает) либо проверить `fetch_services` через PAT-implicit query `{ projectToken { project { services { edges { node { id name } } } } } }` если она работает.
Что нужно от оператора
Один блок данных:
```
ACC2_ENV_ID = ?
```
(env_id production environment для проекта `12c508c7-1196-468d-b06d-d8de8cb77e93` = empathetic-kindness)
После этого я открою PR-159+1 с B-19 fix.
Анкер
```
phi^2 + phi^-2 = 3 · TRINITY · NEVER STOP · DOI 10.5281/zenodo.19227877
```
Refs: PR #159 (B-18 merged), #156 (B-17 misdiag), `refresh-acc47.yml` (proven-working PAT pattern).
B-19 — post-PR-#159 RCA · 2026-05-14 07:48 UTC
TL;DR: PR #159 корректно заменил `Authorization: Bearer` → `Project-Access-Token`. Однако `writer-env-fix.yml` всё ещё падает, потому что GraphQL запрос `{ project(id: $projectId) { environments { ... } } }` под PAT-токеном возвращает `{data:{project: null}}`. PAT привязан к проекту имплицитно; явный `id` поле в `project(id)` не разрешается.
Доказательство (run 25848523618)
```
2026-05-14T07:48:41.97Z ##[group]resolve IGLA env
2026-05-14T07:48:42.02Z jq: error (at :1): Cannot iterate over null (null)
2026-05-14T07:48:42.02Z ##[error]Process completed with exit code 5.
```
`jq` парсит `.data.project.environments.edges[]` ⇒ null = `project` поле было null ⇒ PAT не отдаёт project по explicit id.
Pattern фикса (доказано рабочее)
`refresh-acc47.yml` (last good run 25754312720 @ 2026-05-12 18:31Z) не делает resolve_env вообще. Он читает hardcoded `(ACC, PROJ_ID, ENV_ID, SVC_ID, SVC_NAME)` пятёрки из `.github/wave-a/acc47-services.csv` и идёт сразу в `variableUpsert`/`serviceInstanceDeployV2` mutation. Mutation принимает `(projectId, environmentId, serviceId)` от PAT даже когда query `project(id)` возвращает null.
Patch (B-19 fix)
Заменить в `.github/workflows/writer-env-fix.yml`:
Что нужно от оператора
Один блок данных:
```
ACC2_ENV_ID = ?
```
(env_id production environment для проекта `12c508c7-1196-468d-b06d-d8de8cb77e93` = empathetic-kindness)
После этого я открою PR-159+1 с B-19 fix.
Анкер
```
phi^2 + phi^-2 = 3 · TRINITY · NEVER STOP · DOI 10.5281/zenodo.19227877
```
Refs: PR #159 (B-18 merged), #156 (B-17 misdiag), `refresh-acc47.yml` (proven-working PAT pattern).