Include Loyalty/Communication/Sports Center backends and registry updates alongside production nginx and compose wiring. Co-authored-by: Cursor <cursoragent@cursor.com>
4.0 KiB
4.0 KiB
Phase Handover — Loyalty 7.1 Membership Engine
Metadata
| Field | Value |
|---|---|
| Phase ID | loyalty-7.1 |
| Title | Membership Engine |
| Status | Complete |
| Service(s) | loyalty (loyalty-service, port 8004) |
| Version | 0.7.1.0 |
| Date | 2026-07-25 |
| ADR(s) | ADR-001, ADR-003, ADR-006, ADR-011 |
Reusable Components
| Component | Location | Reuse notes |
|---|---|---|
| Lifecycle validators | app/validators/membership.py |
Transition matrix + expiry helpers |
| MembershipEngineService | app/services/membership_engine.py |
Lifecycle orchestration |
| MembershipLifecycleEvent | app/models/foundation.py |
Append-only history pattern |
Public APIs
| Method | Path | Auth / Permission | Notes |
|---|---|---|---|
| POST | /api/v1/members/{id}/activate |
loyalty.members.activate |
Sets term/expiry |
| POST | /api/v1/members/{id}/renew |
loyalty.members.renew |
Extends from current expiry |
| POST | /api/v1/members/{id}/freeze |
loyalty.members.freeze |
Reason required |
| POST | /api/v1/members/{id}/resume |
loyalty.members.resume |
From frozen/suspended |
| POST | /api/v1/members/{id}/cancel |
loyalty.members.cancel |
Reason required |
| POST | /api/v1/members/{id}/expire |
loyalty.members.expire |
Manual expire |
| POST | /api/v1/members/{id}/transfer |
loyalty.members.transfer |
Creates target member |
| GET | /api/v1/members/{id}/lifecycle |
loyalty.members.lifecycle.view |
History |
Events
| Event type | Domain / Integration | Payload summary | Version |
|---|---|---|---|
loyalty.member.activated |
Domain | membership_number, status, expires | 1 |
loyalty.member.renewed |
Domain | membership_number, expires | 1 |
loyalty.member.frozen |
Domain | membership_number, reason | 1 |
loyalty.member.resumed |
Domain | membership_number | 1 |
loyalty.member.cancelled |
Domain | membership_number, reason | 1 |
loyalty.member.expired |
Domain | membership_number | 1 |
loyalty.member.transferred |
Domain | source + target ids | 1 |
Extension Points
| Extension point | How to extend | Forbidden uses |
|---|---|---|
| Transition matrix | Extend ALLOWED_TRANSITIONS + tests |
Bypass validators in APIs |
| Program cascade | Adjust ACTIVE_MEMBER_STATUSES policy intentionally |
Soft-cascade without docs |
| Provider contracts | Unchanged from 7.0 | Implement providers inside Loyalty |
Known Limitations
- No scheduled auto-expire worker
- Transfer does not migrate point accounts (deferred to 7.2+)
- Outbox flush still platform-bus maturity item
Migration Notes
| Item | Detail |
|---|---|
| Alembic revision(s) | 0002_phase_71_membership |
| Upgrade steps | alembic upgrade head in loyalty service |
| Downgrade support | Yes (drops columns/table) |
| Data backfill | None |
| Breaking changes | None (additive) |
Dependencies
| Dependency | Type | Required for |
|---|---|---|
| loyalty-7.0 | Phase | Foundation aggregates |
| Core entitlement | Platform | Deferred feature-key wiring |
| shared-lib | Library | Events, security, exceptions |
Next Phase Entry
- This handover + loyalty-phase-7-1.md
- Updated module registry / manifests
- Build immutable point ledger; do not store balance on PointAccount
- Suggested next:
loyalty-7.2Point Engine
| Field | Value |
|---|---|
| Recommended next phase | loyalty-7.2 |
| Blockers for next phase | None |
| Entry checklist | Read 7.1 handover; keep lifecycle statuses stable |
Completion Sign-Off
- Quality gates passed
- Tests green (59)
- Documentation updated
- Progress / next-steps / registries updated
- No TODO for claimed deliverables
- Self audit completed