433 Commits

Author SHA1 Message Date
Alex Ant 3d52d816a4 chore(release): publish
Build bootstrap container / build (push) Successful in 3m22s
Release / typecheck (push) Successful in 23m58s
Release / release (push) Failing after 2m27s
Release / publish-packages (push) Has been skipped
Release / publish-docs (push) Has been skipped
Release / trigger-coopenomics-docs (push) Has been skipped
2026-05-24 23:29:42 +05:00
Alex Ant 655a73e828 chore(release): publish
Build bootstrap container / build (push) Failing after 7m45s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m3s
Publish Docs / gate (push) Successful in 2m4s
Publish Packages / build-and-publish (push) Failing after 9m24s
Release / release (push) Failing after 4m33s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 3s
Publish Docs / build-and-publish-docs (push) Failing after 1h29m50s
2026-05-23 00:55:52 +05:00
Alex Ant 3d4f75bff0 chore(release): publish
Build bootstrap container / build (push) Failing after 7m29s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m4s
Publish Docs / gate (push) Successful in 2m4s
Publish Packages / build-and-publish (push) Failing after 6m39s
Release / release (push) Failing after 4m27s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 2s
Publish Docs / build-and-publish-docs (push) Failing after 8m22s
2026-05-23 00:52:06 +05:00
Alex Ant 7b9828ae87 chore(release): publish
Build bootstrap container / build (push) Failing after 7m34s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m17s
Publish Docs / gate (push) Successful in 2m5s
Publish Packages / build-and-publish (push) Failing after 9m49s
Release / release (push) Failing after 4m29s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 5s
Publish Docs / build-and-publish-docs (push) Failing after 8m30s
2026-05-23 00:50:01 +05:00
Alex Ant 2b529d5a15 chore(release): publish
Trigger Contracts Docs Deploy / gate (push) Successful in 2m12s
Build bootstrap container / build (push) Failing after 7m29s
Publish Docs / gate (push) Successful in 2m29s
Publish Packages / build-and-publish (push) Has been skipped
Release / release (push) Failing after 4m45s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Has been skipped
Publish Docs / build-and-publish-docs (push) Has been skipped
2026-05-23 00:38:30 +05:00
Alex Ant 23605d2b81 chore(release): publish
Build bootstrap container / build (push) Failing after 7m29s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m5s
Publish Docs / gate (push) Successful in 2m6s
Publish Packages / build-and-publish (push) Has been skipped
Release / release (push) Failing after 4m51s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Has been skipped
Publish Docs / build-and-publish-docs (push) Has been skipped
2026-05-22 17:34:24 +05:00
Alex Ant 0504c46fbd chore(release): publish
Build bootstrap container / build (push) Failing after 4m15s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m4s
Publish Docs / gate (push) Successful in 2m3s
Publish Packages / build-and-publish (push) Failing after 8m4s
Release / release (push) Failing after 4m31s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 2s
Publish Docs / build-and-publish-docs (push) Failing after 8m16s
2026-05-22 14:44:59 +05:00
Alex Ant 6270ae14bf chore(release): publish
Build bootstrap container / build (push) Failing after 2m27s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m15s
Publish Packages / build-and-publish (push) Has been skipped
Publish Docs / gate (push) Successful in 7m15s
Release / release (push) Failing after 9m33s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Has been skipped
Publish Docs / build-and-publish-docs (push) Has been skipped
2026-05-22 14:43:43 +05:00
Alex Ant 1c7a3afc81 chore(release): publish
Publish Docs / gate (push) Successful in 2m4s
Trigger Contracts Docs Deploy / gate (push) Successful in 2m5s
Publish Packages / build-and-publish (push) Failing after 8m48s
Release / release (push) Failing after 7m22s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 6s
Publish Docs / build-and-publish-docs (push) Failing after 8m57s
2026-05-21 13:05:02 +05:00
Alex Ant c0627b53e3 chore(release): publish
Trigger Contracts Docs Deploy / gate (push) Successful in 2m6s
Publish Docs / gate (push) Successful in 2m9s
Publish Packages / build-and-publish (push) Has been skipped
Release / release (push) Failing after 4m28s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Has been skipped
Publish Docs / build-and-publish-docs (push) Has been skipped
2026-05-21 13:01:24 +05:00
Alex Ant b973baef03 chore(release): publish
Build bootstrap container / build (push) Failing after 2m59s
2026-05-19 15:59:48 +05:00
Alex Ant e10e049bdd chore(release): publish
Build bootstrap container / build (push) Failing after 2m54s
2026-05-19 14:41:11 +05:00
Alex Ant bef5df8a06 migration complete 2026-05-19 14:40:02 +05:00
Alex Ant d35ec2680a chore(release): publish
Build bootstrap container / build (push) Failing after 2m51s
2026-05-15 22:28:10 +05:00
Alex Ant 74e3e88853 chore(release): publish
Build bootstrap container / build (push) Failing after 3m5s
2026-05-15 22:23:44 +05:00
Alex Ant 00860b3b18 fix commit process
Build bootstrap container / build (push) Failing after 2m52s
2026-05-15 22:21:35 +05:00
Alex Ant 8fe9509e97 fix(capital/time-tracking): личные доли estimate + revert при decline (#387)
* chore(release): publish

* chore(release): publish

* ci: атомарный release.yaml, убрать workflow_run-связку (#366)

build-contracts + build-containers через workflow_run упёрлись в:
(а) default-branch caveat (новая логика не активна, пока не в main),
(б) `${{ github.event.workflow_run.head_sha }}` иногда пуст в YAML-
выражениях — описание см. в шаге Resolve tag, инцидент v2026.5.14
не дёрнул PRODUCTION_WEBHOOK_URL.

Замена — один `release.yaml` на push тэга `v*`: резолвит ветку через
`git branch --contains`, собирает контракты → пушит
`dicoop/contracts:<branch>`, собирает базу + сервисные образы →
пушит `dicoop/<svc>:<tag>`, шлёт webhook. Гонок нет by construction.

`build-contracts.yaml` остаётся только на push веток для CI-
обновления `dicoop/contracts:dev|testnet|main` без релизного тэга.
Триггер `tags: ['*']` и логика резолва ветки через --contains
оттуда удалены — это теперь забота release.yaml.

Co-authored-by: coopops <coopos@coopenomics.world>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* chore(release): publish

* chore(release): publish

* ci: tag-only триггеры для build-contracts и docs (#367)

build-contracts.yaml — только workflow_dispatch (ручная пересборка
`dicoop/contracts:<branch>` для отладки на dev-ноде). Тэги обрабатывает
release.yaml атомарно (контракты + контейнеры + webhook), отдельная
сборка по push'у в ветку только давала вторую параллельную сборку.

publish-docs.yaml и build-contracts-docs.yaml — на push:tags v* с
gate-job'ом, пропускающим только продакшн-тэги (без -alpha/-beta/-rc/
-test) на main. Раньше docs пересобирались на каждый push в
main/testnet/dev/reports/marketplace2 — впустую.

Co-authored-by: coopops <coopos@coopenomics.world>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* fix(capital/time-tracking): личные доли estimate, partial-split, revert при decline

Три бага в распределении билетов времени, вскрытые на прод-инциденте voskhod
(проект CC7-1 «Концепция», estimate=15 ч, 3 creators):

БАГ #1 — recalcDoneEstimatesForContributorProject раздавал «общий остаток пула»
(estimate − committed_total) / N всем creators поровну. Закоммитивший свою долю
получал её ещё раз, остальные — урезанную (15/3=5 → после committed 5 у одного
становилось 10/3=3.33 у каждого, включая того кто уже закоммитил).

Фикс: личная доля = estimate/N − собственный committed estimate. Введён общий
helper redistributeIssueEstimateEntries, который используют и applyExplicit-
EstimateToTimeEntries (force=true), и recalcDoneEstimates (force=false с
no-op оптимизацией если раскладка уже совпадает с планом).

БАГ #2 — commitTime при partial split (entry.hours > requested) создавал новую
committed-запись без entry_type и estimate_snapshot. По default'у БД сохраняла
её как entry_type='hourly', что ломало последующий recalc (он фильтрует только
entry_type='estimate'). Фикс: явно копировать entry_type и estimate_snapshot
из оригинального entry.

БАГ #3 — declineCommit / handleDeclineCommit меняли только commit.status в БД,
но не возвращали time-entries в is_committed=false. После отказа мастера часы
оставались в total_committed_hours и не возвращались в available_hours. Фикс:
новый метод revertEntriesForDeclinedCommit в TimeTrackingInteractor + методы
findCommittedByCommitHash / revertCommittedEntriesByCommitHash в TimeEntry-
Repository. После revert делается force=true redistribute для затронутых DONE
задач, чтобы доли вернулись в норму.

Покрытие тестами: 17 unit-тестов в time-tracking.interactor.spec.ts с
регрессионными сценариями под каждый из трёх багов плюс integration-сценарий
полного lifecycle CC7-1 (estimate → коммит → decline → revert).

---------

Co-authored-by: coopops <coopos@coopenomics.world>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 22:02:36 +05:00
Alex Ant 938c3ff042 chore(release): publish 2026-05-13 21:44:14 +05:00
Alex Ant 908349ac67 chore(release): publish 2026-05-13 21:36:49 +05:00
Alex Ant 4a6aa8c447 Merge branch 'dev' of github.com:coopenomics/mono into dev 2026-05-13 20:45:03 +05:00
coopops b92abb80a8 fix(ledger2/voskhod): мин.паевые → w.sov.mnused; правка accounts2 (51/08)
migrate_voskhod_facts:
- accounts2[51]: 176 800 → 145 000 (минус 31 800 минП, теперь только деньги)
- accounts2[08]: 543 400 → 575 200 (плюс 31 800 минП — инвестировано в активы)
- accounts2[04/80/86] без изменений; Σ Dr = Σ Cr = 63 073 511 ✓

Новый COOPERATIVE-кошелёк w.sov.mnused для аналитики "использованные
минимальные паевые взносы" (Cr 80 source, перешедшие в 08). Для voskhod
31 800 размещается там вместо w.reg.minshr — обязательство перед пайщиками
на счёте 80 сохранено, но wallet-аналитика отражает что средства уже
ушли в долгосрочные активы.

migrator-048 (Phase 1 L3 → w.reg.minshr): skip voskhod явным if в TS +
жёсткий guard в migrate3 (eosio::check отвергает запись L3(voskhod,
w.reg.minshr) в prod). В testnet-сборке guard выключен — voskhod проходит
стандартный арифметический путь для видимости invariant-фейлов.

Реестр LEDGER2_WALLET_REGISTRY 13 → 14; namespace w.sov.* расширён до
"совет-level фондов" (целевое финансирование + использованные паевые).
TS-зеркало (wallets.generated.ts) регенерировано через pnpm gen:from-cpp;
snapshot-тест cooptypes обновлён.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 15:20:35 +00:00
Alex Ant dcd3c9293a chore(release): publish
Build bootstrap container / build (push) Failing after 2m52s
Trigger Contracts Docs Deploy / trigger-coopenomics (push) Failing after 5s
Build contracts container / build (push) Failing after 2m48s
Publish Docs / build-and-publish-docs (push) Failing after 15m54s
2026-05-13 19:22:44 +05:00
coopops a1bee6f630 merge: align worktree base with onboarding branch 2026-05-12 16:18:17 +00:00
Alex Ant de0f6c7956 chore(release): publish 2026-05-12 09:54:19 +05:00
Alex Ant e270b95996 chore(release): publish 2026-05-11 23:26:00 +05:00
Alex Ant bb1d8558e7 Merge branch 'dev' of github.com:coopenomics/mono into dev 2026-05-11 23:11:03 +05:00
coopops e5151758fb fix(migrator/049): blocked может быть undefined (binary_extension) — подменять нулём
soviet::progwallets имеет blocked и membership_contribution как
binary_extension. На старых записях (например voskhod/enzqwnqsdqar/1)
eosjs возвращает undefined — pushAsset падает с
"Expected string containing asset". Защищаемся ?? zeroAssetLike(pw.available).
Для membership ?? уже был.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 18:10:42 +00:00
Alex Ant a575da57f8 Merge branch 'dev' of github.com:coopenomics/mono into dev 2026-05-11 23:08:28 +05:00
coopops 9352c77cd7 feat(migrate3): подписывать миграционные actions самим контрактом, не coopname
У нас нет приватных ключей от кооперативов, которых мы мигрируем.
Поэтому ledger2::migrate3 и wallet::migrate3 теперь принимают auth от
get_self() (т.е. ledger2@active / wallet@active), и они же платят за RAM.
Mig-скрипты 047/048/049 пушат actions с актором = имя контракта.

Также правки в ledger2::migrate (Эпик 1) с прошлой сессии: default-case
для неизвестных legacy account IDs (862-867) — `break;` вместо
eosio_assert (ignore non-canonical), плюс IS_TESTNET-блок с clamp'ом
грязных legacy-данных.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 18:07:17 +00:00
Alex Ant add7646720 chore(release): publish 2026-05-11 15:38:44 +05:00
Alex Ant 0d8006d981 chore(release): publish 2026-05-11 12:02:00 +05:00
Alex Ant a55005a212 chore(release): publish 2026-05-11 11:28:06 +05:00
Alex Ant 5ae6f4963d Merge branch 'dev' of github.com:coopenomics/mono into dev 2026-05-11 11:27:49 +05:00
coopops 33f44dc823 [@ant] fix(migrator/047): мигрировать program-соглашения с пустым статусом
Фильтр `status === 'confirmed'` пропускал всё: после Эпика 2 для program_id > 0
sndagreement пишет ""_n, а confirmagree больше не вызывается (воркфлоу ушёл
в wallet::signagree). Заменено на `status !== 'declined'`; wallet::migrate3
идемпотентен.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 05:46:45 +00:00
Alex Ant dd88047d76 chore(release): publish 2026-05-11 09:57:46 +05:00
coopops 876d06046b Merge remote-tracking branch 'origin/dev' into reports
# Conflicts:
#	components/contracts/cpp/soviet/src/wallet/addbal.cpp
2026-05-11 04:51:43 +00:00
Alex Ant 996012399e chore(release): publish 2026-05-10 14:39:10 +05:00
Alex Ant c4ffdae7ef chore(release): publish 2026-05-10 14:36:47 +05:00
Alex Ant bfe5592ae9 chore(release): publish 2026-05-10 12:01:35 +05:00
Alex Ant 9e94510981 chore(release): publish 2026-05-10 12:01:08 +05:00
coopops a745e798a4 [@ant] fix(controller+capital): event-driven regshare + delete-row aware реестр кошельков
- controller: listener delta::ledger2::userwallets[w.cap.blago] синхронизирует regshare без ожидания scheduler-тика 1440 мин
- typeorm-ledger2-state.repository: getWallets/getAccounts берут самую свежую row на ключ и при present=false обнуляют суммы (не выкидывают), чтобы удалённый L2-кошелёк остался раскрываемым в реестре с историей
- capital: inline regshare после apprvappndx + whitelist auth в regshare
- programs.hpp: is_participant_of_cpp_by_program_id через wallet::users.programs[], get_program_wallet → has_program_wallet
- cooptypes/operations: human_name «Коммит РИД по программе Генератор», убрано «(перенос между кошельками)»
2026-05-09 12:12:10 +00:00
coopops c8616deb76 [@ant] feat: regcontrib через wallet::users, optimistic-overlay кошелька, sync статуса пайщика
Контракты:
- wallet::signagree: auth = coopname OR contracts_whitelist; payer = подавший
  auth (RAM-аккаунтинг). Снимает auth-блок при inline-вызове из capital.
- capital::regcontrib: gate Благорост-соглашения через wallet::users.programs[]
  (ADR-008) вместо legacy progwallets; inline signagree от _capital@active —
  атомарная связка payload → wallet::users → реестр.
- ledger2::migrate: compute_min_total_by_type через participant.minimum_amount
  (фактический зафиксированный взнос пайщика), а не coop.minimum (мог быть
  повышен после вступления — приводило к Σ L3 > L2 на w.reg.minshr). Убрано
  неявное clamping → явный eosio::check + понятная ошибка.
- wallet::createwthd/declinewthd, capital::createpinv/createinvest/capauthwthd3:
  Ledger2::apply на USER_SHARED-кошельках (REQUEST_WITHDRAW, DECLINE_WITHDRAW,
  INVEST, WITHDRAW_FROM_CAPITAL).
- operations.hpp/processes.hpp: новые записи реестра.

cooptypes: зеркало новых operations/processes (o.cap.wthcap, o.wal.wthreq,
o.wal.wthdec, p.cap.wthcap).

Migrator: 048 пишет L3 по participant.minimum_amount; gate на
ledger2::meta.migrated до запуска (без миграции migrate3 разъезжается с L2).

Controller:
- ParticipantStatusSyncService: action::soviet::addpartcpnt → users.status='active'.
  Без него ActiveUserStatusGuard блокирует свежепринятых пайщиков на
  createDepositPayment и других мутациях — статус так и оставался '4_Registered'.
- migrations/V2.2.0: backfill users.status='active' по soviet::participants
  из chain (через BLOCKCHAIN_RPC).
- registration-programs: «Программа Капитализация» → «Программа Благорост».

Desktop:
- useWalletStore: универсальный optimistic-overlay (applyOptimisticPatch /
  TTL / clearOnLoad). program_wallets — теперь computed поверх raw-стейта;
  серверный refetch перетирает overlay.
- CreateProgramInvest: оптимистично списывает ЦК и зачисляет blocked
  Благороста до подтверждения цепочкой, ревертит при ошибке.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 13:29:11 +00:00
Alex Ant f35a13a382 chore(release): publish 2026-05-08 10:56:03 +05:00
Alex Ant aced4966c8 chore(release): publish 2026-05-08 10:37:35 +05:00
Alex Ant b41a42ad0a chore(release): publish 2026-05-07 22:09:20 +05:00
Alex Ant 16ee154424 chore(release): publish 2026-05-07 22:09:01 +05:00
coopops 0497cded09 [@ant] feat(cooptypes): codegen реестра кошельков из C++ wallets.hpp
`LEDGER2_WALLET_REGISTRY` и `LEDGER2_USER_SHARED_PROGRAM_MAPPING` теперь
вытягиваются из `contracts/cpp/lib/core/ledger2/wallets.hpp` Node-парсером
(`scripts/gen-from-cpp.ts`) и пишутся в `src/ledger2/wallets.generated.ts`.
Источник истины — C++; TS — копия. Парсер строгий: на любую неясность кидает
ошибку. На страже — snapshot-тест в `test/wallets-registry.snapshot.test.ts`.

Запуск: `pnpm --filter cooptypes gen:from-cpp` (или автоматически через
`prebuild` хук перед `pnpm --filter cooptypes build`).

Удалены локальные копии маппинга:
- `controller/src/domain/wallet/utils/program-wallet-mapping.ts` (был дубликат)
- inline `PROGRAM_TO_WALLET` в `migrator/migrations/049_*.ts`

Потребители теперь импортируют `Ledger2.walletNamesForProgram`,
`Ledger2.programIdForWallet`, `Ledger2.MEMBERSHIP_WALLET_NAME`,
`Ledger2.ALL_PROGRAM_WALLET_NAMES` из cooptypes.
2026-05-06 08:37:45 +00:00
coopops 1110b85224 [@ant] fix(migrator): сохранять membership_contribution при миграции progwallets → userwallets
В первоначальной версии 049 для program_id=1 (ЦК) писался только
w.wal.share с available/blocked, а membership_contribution молча терялась
(на текущем prod она 0, но тест-стенды и будущие данные содержат
ненулевые значения).

Теперь для ЦК эмитим ДВА migrate3-вызова: w.wal.share (available/blocked)
и w.wal.member (membership_contribution). Если membership=0 —
ledger2::migrate3 (0,0) делает безопасный no-op.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 12:16:17 +00:00
coopops 9fb53901aa [@ant] feat(migrator): per-coop self-service миграции agreements + L3 (story 2.5/3.6/3.7)
Три миграции через ledger3-релиз rollout:

- 047_migrate_agreements_to_wallet.ts — Эпик 2 / story 2.5
  agreements3.program_id>0 (status=confirmed) → wallet::migrate3.
  Идемпотентно, без удаления исходных записей (Эпик 4 финального
  deploy soviet).

- 048_migrate_phase1_minshare.ts — Эпик 3 / story 3.6 (ADR-008)
  participants[status=accepted] → ledger2::migrate3 на w.reg.minshr.
  amount = coop.org_minimum для type=organization, иначе coop.minimum.
  w.reg.entry не затрагивается — он COOPERATIVE без L3-разбивки.

- 049_migrate_phase2_progwallets.ts — Эпик 3 / story 3.7
  progwallets → ledger2::migrate3 с маппингом program_id → wallet_name:
    1 (ЦК)        → w.wal.share (membership_contribution=0 на prod)
    3 (Генератор) → w.cap.gen
    4 (Благорост) → w.cap.blago
  Pre-flight gate (NFR18) выполняется внешним скриптом сравнения
  Σ progwallets vs Σ userwallets перед production rollout.

src/utils:
- listCoops — обход registrator::coops с фильтром is_cooperative+active
- fetchAllRows — пагинированное чтение get_table_rows с lower_bound

Все три миграции per-coop self-service, batched по 50 actions/tx,
идемпотентные (migrate3 — overwrite, не +=).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 10:26:35 +00:00
Alex Ant 8539b1e6fd chore(release): publish 2026-04-30 22:09:52 +05:00