Skip to content

feat(backend,web): Initiative 生命周期三件套:cancelled + close/cancel guard + window_ends_at worker(#628) - #652

Merged
sundevilyang merged 2 commits into
developfrom
feat/628-initiative-lifecycle
Sep 16, 2026
Merged

sundevilyang merged 2 commits into
developfrom
feat/628-initiative-lifecycle

Conversation

@sundevilyang

Copy link
Copy Markdown
Contributor

#628 Initiative 生命周期三件套(按裁决顺序)

  1. 状态机加 cancelled(独立 :cancel action,照 Event :cancel 范式):cancel 允许 draft + open 进;close 仍只从 open 进;
  2. close/cancel guard:堵住"close 后挂载场仍可 open / 公开页仍显示 / 规则传播仍写"三条不一致(与 Initiative 锁死规则传播走裸 SQL:缺信号(报名截止执法漂移)/ 缺校验 / 改历史场 / 审计不记值 #587status IN ('draft','open') 同源,不产生第二个真源);
  3. window_ends_at 自动关闭 worker:复用 event_lifecycle_worker幂等 CAS 模式,防公开页挂僵尸活动。

关键裁决落实

  • close 不级联,cancel 级联:级联范围 = 挂载的非终态场(draft/open);closed/cancelled 场一律不动(不回溯改写已收官事实、不触碰终态不可逆的 forfeited);
  • 退款复用 Event 侧既有链路event.cancel → ended → 订阅方),未新写批量走查
  • 只下线场次栅格/initiatives 索引页行为不变(slug 是投放契约);
  • 零回填:存量 closed Initiative 下仍 open 的挂载场不做一次性 cancel(会产生批量不可逆关闭 + 意外退款),只让可见性门对存量行立即生效;
  • 新增稳定 code initiative_not_open + 四清单(用户可动作:先打开或取消该 Initiative),MCP/GraphQL 两面文案一致。

验证

三条 guard 各一条负向用例;worker 幂等(重复触发不重复副作用);公开页 cancelled vs closed 文案分叉(三端含 en);迁移可逆(克隆库 migraterollback --step 1 → 再 migrate);mix precommitpnpm test 全绿。

@sundevilyang
sundevilyang force-pushed the feat/628-initiative-lifecycle branch 4 times, most recently from 817b046 to 8887e9c Compare September 16, 2026 15:10
@sundevilyang
sundevilyang force-pushed the feat/628-initiative-lifecycle branch from 8887e9c to 45434af Compare September 16, 2026 15:10
@sundevilyang
sundevilyang merged commit fda57eb into develop Sep 16, 2026
7 checks passed
@sundevilyang
sundevilyang deleted the feat/628-initiative-lifecycle branch September 16, 2026 15:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant