feat(soviet): отрицательный консенсус — voteagainst отклоняет решение до срока #94

Merged
ant merged 3 commits from feat/soviet-negative-consensus into dev 2026-06-05 12:21:52 +00:00
Owner

Голосование «против» теперь не просто блокирует решение, а позволяет принять отрицательное решение: при достижении >50% состава совета против — решение отклоняется немедленно (не дожидаясь истечения срока) той же веткой decline-callback, что и просрочка.

Контракт (soviet)

  • Общая ветка отказа вынесена в decline_and_erase_decision (cancelexprd.cpp): decline-callback инициатору (если решение пришло из внешнего процесса) + удаление записи. DRY — переиспользована в cancelexprd (просрочка) и voteagainst (негативный консенсус).
  • voteagainst: после голоса считает негативный консенсус зеркально voteforvotes_against*100 > total_members*50, строгое «больше». При достижении — немедленное отклонение.
  • Forward-декларация helper'а в lib/core/soviet/soviet.hpp.
  • Сборка soviet в CDT — зелёная (soviet.wasm).

Стандарты

  • sov.authpkg / sov.decision: переход →rejected по voteagainst приведён к новой механике (немедленное отклонение до срока, decline в исходный процесс).
  • Убран cancelvote (в коде запрещён: eosio::check(false, «Отмена голоса запрещена»)).

🤖 Generated with Claude Code

Голосование «против» теперь не просто блокирует решение, а позволяет принять отрицательное решение: при достижении >50% состава совета против — решение отклоняется немедленно (не дожидаясь истечения срока) той же веткой decline-callback, что и просрочка. ## Контракт (soviet) - Общая ветка отказа вынесена в `decline_and_erase_decision` (cancelexprd.cpp): decline-callback инициатору (если решение пришло из внешнего процесса) + удаление записи. DRY — переиспользована в `cancelexprd` (просрочка) и `voteagainst` (негативный консенсус). - `voteagainst`: после голоса считает негативный консенсус зеркально `votefor` — `votes_against*100 > total_members*50`, строгое «больше». При достижении — немедленное отклонение. - Forward-декларация helper'а в `lib/core/soviet/soviet.hpp`. - Сборка `soviet` в CDT — зелёная (soviet.wasm). ## Стандарты - `sov.authpkg` / `sov.decision`: переход `→rejected` по `voteagainst` приведён к новой механике (немедленное отклонение до срока, decline в исходный процесс). - Убран `cancelvote` (в коде запрещён: `eosio::check(false, «Отмена голоса запрещена»)`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-05 08:49:00 +00:00
feat(soviet): отрицательный консенсус — voteagainst отклоняет решение до срока
Typecheck / desktop (pull_request) Successful in 12m50s
Typecheck / controller (pull_request) Successful in 12m35s
f72cf529a9
На контракте совета теперь возможно не только заблокировать решение
голосованием, но и принять отрицательное решение: как только против
проголосовало больше половины состава совета, решение отклоняется
немедленно (не дожидаясь истечения срока) — той же веткой отказа, что и
просрочка: decline-callback в исходный процесс + удаление решения.

- Общая ветка отказа вынесена в decline_and_erase_decision (cancelexprd.cpp),
  переиспользована в cancelexprd (просрочка) и voteagainst (негативный консенсус).
- Порог зеркален votefor: votes_against*100 > total_members*50, строгое «больше».
- Стандарты sov.authpkg / sov.decision приведены к новому поведению; заодно
  убран cancelvote (в коде запрещён: eosio::check(false)).

Контракт soviet собран в CDT — зелёный.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude added 1 commit 2026-06-05 11:44:15 +00:00
feat(soviet): развязка отказа решения — авто по сроку vs явный declinedec председателем
Typecheck / desktop (pull_request) Successful in 13m13s
Typecheck / controller (pull_request) Successful in 12m38s
aea114b01a
Голос «против» больше не затирает решение автоматически. Развязаны два пути
отказа:
- по истечению срока — авто (cancelexprd кроном chairman, ключом кооператива);
- по отрицательному консенсусу (большинство «против») — явным действием
  председателя declinedec, до истечения срока.

Контракт (soviet):
- voteagainst: только фиксирует голос, без авто decline_and_erase_decision.
- Новый action declinedec (в cancelexprd.cpp): require_auth(coopname), проверяет
  votes_against*100 > members*50 (зеркало votefor), переиспользует общую ветку
  decline_and_erase_decision. Собран в CDT, declinedec в ABI.
- Стандарты sov.authpkg / sov.decision приведены к развязке.

cooptypes: action Declinedec + интерфейс IDeclinedec.

Контроллер:
- SovietBlockchainPort/adapter: declineDecision + getBoards.
- Мутация declineDecision (resolver/service/interactor + DeclineDecisionInput),
  роль chairman.
- Повестка обогащается council_members_count (состав совета `soviet`, дёргается
  один раз) — фронту для порога принятия/отклонения.
- chairman: убран флаг cancelApprovedDecisions и кривая подпись; крон по сроку
  гасит ВСЕ истёкшие решения.

SDK: селектор council_members_count, мутация DeclineDecision; zeus regen (обе копии).

Desktop:
- BaseButton: сплошной вариант negative.
- VotingButtons: красный крестик при отрицательном консенсусе.
- QuestionCard: у председателя красная «Отклонить» (declinedec) вместо «Утвердить»
  когда решение отклонено советом; фича Decision/DeclineDecision.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude added 1 commit 2026-06-05 12:14:28 +00:00
docs(council): снятие вопроса с повестки — отказ председателем или по сроку
Typecheck / desktop (pull_request) Successful in 12m49s
Typecheck / controller (pull_request) Successful in 12m30s
3e2bf3dbc6
Дополнена страница «Повестка совета» бизнес-языком: если решение не принято
или истёк его срок, вопрос снимается с повестки — председателем вручную
(отрицательный консенсус) или автоматически по истечении срока. Обновлён
mermaid-граф (ветки «большинство против» и «срок истёк»), добавлен раздел
«Снятие вопроса с повестки», в блок голосования добавлено описание индикатора
отклонения. Без скриншотов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ant merged commit 5c13c4ac53 into dev 2026-06-05 12:21:52 +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#94