fix(soviet): возвращать созданный вопрос повестки из publish — мгновенный показ #99

Merged
ant merged 3 commits from fix/agenda-pending-new-question into dev 2026-06-05 14:22:34 +00:00
Owner

После публикации свободного решения совета повестка показывала «Нет вопросов на повестке» до следующего поллинга (10+ сек).

Корень. getAgenda собирается на бэкенде joinом таблицы decisions из блокчейна (доступна сразу) с проиндексированными парсером действием newsubmitted и документом-заявлением. Между публикацией и индексацией парсером — лаг в секунды, поэтому только что созданный вопрос появляется в getAgenda не мгновенно.

Решение. Мутация publishProjectOfFreeDecision теперь возвращает созданный пункт повестки. Бэкенд после публикации делает settle-паузу (на индексацию парсером) и извлекает готовый вопрос с повестки по хэшу документа-заявления; фронт вставляет его в таблицу немедленно. Поскольку бэкенд отдаёт пункт только когда он полностью собран (= уже идентичен выдаче getAgenda), голосовать/утверждать по нему можно сразу, без блокировки.

Backend

  • AgendaInteractor.getAgendaItemByHash / AgendaService.getAgendaItemByHash — сборка одного пункта повестки по хэшу заявления (null, пока парсер не проиндексировал).
  • FreeDecisionService.publishProjectOfFreeDecision — settle-пауза (1 c) + короткая страховочная петля; возвращает AgendaWithDocuments | null. Резолвер: тип возврата сменён Boolean → AgendaWithDocuments (nullable).
  • AgendaModule экспортирует AgendaService; DecisionModule импортирует AgendaModule.

SDK

  • publish-селектор → форма agenda-item (rawAgendaSelector); регенерация zeus-клиента (schema.gqlgenerate-clientsdk build).

Frontend

  • agendaStore: буфер оптимистично вставленных вопросов + computed-мердж с authoritative-списком (страховка от «мигания» при поллинге).
  • CreateProjectButton: вставляет вернувшийся вопрос через insertCreated — доступен к голосованию сразу.
  • process-decisions / страница повестки — без изменений в блокировке (её нет).

Бэкенд проверен на рантайме (живой /v1/graphql отдаёт новый тип возврата, nodemon перечитал без ошибок). SDK typecheck + frontend ESLint — зелёные.

🤖 Generated with Claude Code

После публикации свободного решения совета повестка показывала **«Нет вопросов на повестке»** до следующего поллинга (10+ сек). **Корень.** `getAgenda` собирается на бэкенде joinом таблицы `decisions` из блокчейна (доступна сразу) с **проиндексированными парсером** действием `newsubmitted` и документом-заявлением. Между публикацией и индексацией парсером — лаг в секунды, поэтому только что созданный вопрос появляется в `getAgenda` не мгновенно. **Решение.** Мутация `publishProjectOfFreeDecision` теперь **возвращает созданный пункт повестки**. Бэкенд после публикации делает settle-паузу (на индексацию парсером) и извлекает готовый вопрос с повестки по хэшу документа-заявления; фронт **вставляет его в таблицу немедленно**. Поскольку бэкенд отдаёт пункт только когда он полностью собран (= уже идентичен выдаче getAgenda), голосовать/утверждать по нему можно **сразу**, без блокировки. ### Backend - `AgendaInteractor.getAgendaItemByHash` / `AgendaService.getAgendaItemByHash` — сборка одного пункта повестки по хэшу заявления (`null`, пока парсер не проиндексировал). - `FreeDecisionService.publishProjectOfFreeDecision` — settle-пауза (1 c) + короткая страховочная петля; возвращает `AgendaWithDocuments | null`. Резолвер: тип возврата сменён `Boolean → AgendaWithDocuments` (nullable). - `AgendaModule` экспортирует `AgendaService`; `DecisionModule` импортирует `AgendaModule`. ### SDK - publish-селектор → форма agenda-item (`rawAgendaSelector`); регенерация zeus-клиента (`schema.gql` → `generate-client` → `sdk build`). ### Frontend - `agendaStore`: буфер оптимистично вставленных вопросов + `computed`-мердж с authoritative-списком (страховка от «мигания» при поллинге). - `CreateProjectButton`: вставляет вернувшийся вопрос через `insertCreated` — доступен к голосованию сразу. - `process-decisions` / страница повестки — без изменений в блокировке (её нет). Бэкенд проверен на рантайме (живой `/v1/graphql` отдаёт новый тип возврата, nodemon перечитал без ошибок). SDK typecheck + frontend ESLint — зелёные. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-05 13:07:49 +00:00
fix(soviet): возвращать созданный вопрос повестки из publish — мгновенный показ
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
c2c5aa1d84
После публикации свободного решения повестка показывала «Нет вопросов на
повестке» до следующего поллинга (10+ сек). getAgenda собирается join'ом таблицы
decisions из блокчейна с проиндексированными парсером действием newsubmitted и
документом-заявлением, поэтому только что созданный вопрос появляется не сразу.

Решение: мутация publishProjectOfFreeDecision теперь возвращает созданный пункт
повестки. Бэкенд после публикации делает settle-паузу (parser-индексация) и
извлекает готовый вопрос с повестки по хэшу документа; фронт вставляет его в
таблицу немедленно. Кнопки голосования/утверждения/правки на нём заблокированы,
пока ближайший getAgenda-поллинг не подтвердит вопрос authoritative-данными.

Backend:
- AgendaInteractor.getAgendaItemByHash / AgendaService.getAgendaItemByHash —
  сборка одного пункта повестки по хэшу заявления (null, пока не проиндексирован).
- FreeDecisionService.publishProjectOfFreeDecision — settle-пауза + страховочная
  петля, возвращает AgendaWithDocuments | null. Резолвер: тип возврата сменён с
  Boolean на AgendaWithDocuments (nullable).
- AgendaModule экспортирует AgendaService; DecisionModule импортирует AgendaModule.

SDK: publish-селектор → форма agenda-item (rawAgendaSelector); regen zeus-клиента.

Frontend:
- agendaStore: буфер оптимистично вставленных вопросов + computed-мердж с
  authoritative-списком (без «мигания»); pendingConfirmationIds для блокировки.
- CreateProjectButton: вставляет вернувшийся вопрос через insertCreated.
- process-decisions/страница: блокируют кнопки неподтверждённых вопросов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude force-pushed fix/agenda-pending-new-question from 31b75ce42e to c2c5aa1d84 2026-06-05 13:07:49 +00:00 Compare
claude changed title from fix(soviet): закрыть окно «нет вопросов» после предложения решения совета to fix(soviet): возвращать созданный вопрос повестки из publish — мгновенный показ 2026-06-05 13:08:12 +00:00
claude added 1 commit 2026-06-05 13:12:28 +00:00
fix(soviet): не блокировать кнопки у созданного вопроса — голос/утверждение сразу
Typecheck / desktop (pull_request) Failing after 8m56s
Typecheck / controller (pull_request) Successful in 13m10s
cd45697623
Бэкенд возвращает пункт повестки только когда он полностью собран (decision из
блокчейна + проиндексированные парсером действие и документ-заявление) — то есть
он уже идентичен тому, что отдаёт getAgenda. Значит блокировать голос/утверждение
до следующего поллинга незачем: пользователь может действовать немедленно.

Убрана блокировка: pendingConfirmationIds (store/process-decisions) и
disabledDecisions (страница). Буфер-мердж в agendaStore оставлен как страховка от
«мигания» (вставленный вопрос держится, пока поллинг не вернёт его authoritative).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude added 1 commit 2026-06-05 13:48:19 +00:00
fix(soviet): publish матчил вопрос по doc_hash вместо hash — ускорение + рабочий показ
Typecheck / desktop (pull_request) Failing after 8m22s
Typecheck / controller (pull_request) Successful in 12m41s
f7951a985e
getAgendaItemByHash сравнивал decision.hash с data.document.doc_hash (хэш только
содержимого), тогда как decision.hash в блокчейне == data.document.hash («общий
хэш» = doc_hash + meta_hash). Из-за этого матч НИКОГДА не срабатывал: publish
впустую опрашивал повестку весь таймаут (~4.5 c) и возвращал null — мгновенный
показ не работал ни разу, вопрос всегда дожидался поллинга страницы.

- Матч по data.document.hash (= decision.hash on-chain).
- Поллинг: проверка сразу (без слепой стартовой паузы), тик 400 мс — ловим
  индексацию парсером action'а (~2 c) минимальной задержкой; publish ~2.2 c.

По таймингам: decision на чейне мгновенно, aggregate ~0.4 c; доминирует лаг
индексации парсером (~2 c) — единственный способ убрать его — синтез action,
отвергнут (требует подделки ~12 explorer/SHiP-полей BlockchainActionDTO).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ant merged commit ca1dc4fa69 into dev 2026-06-05 14:22:34 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#99