@odla-ai/chapter 0.49.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1631,8 +1631,18 @@ These bite silently — a smoke test won't catch them:
1631
1631
  Full renewal/refund/seat lifecycle wiring and live provider journey proof
1632
1632
  remain prerequisites for enabling this adapter in a host.
1633
1633
 
1634
- `drainMembershipEffects` recovers pending provider work and expires unpaid or
1635
- unaccepted seats within one exact configured runtime. Pair its
1634
+ `drainMembershipEffects` recovers pending provider work and cancels unpaid
1635
+ seats within one exact configured runtime. It never refunds an unaccepted
1636
+ seat: a purchased seat waits for its recipient for the whole paid term, and a
1637
+ refund is a super admin's decision on request. Refunding the recipient's own
1638
+ application (`POST /api/admin/applications/:id/refund`) requires a super
1639
+ admin when it carries a gifted seat. On a chapter,
1640
+ `GET /api/admin/applications/:id/named-seat` shows a purchaser's seat and
1641
+ `POST …/named-seat/refund` returns its payment through the signed edge; on the
1642
+ network owner, `membershipAuthorityOperator: { makeDb }` mounts
1643
+ `GET /api/admin/membership-seats` and `POST …/membership-seats/:seatId/refund`
1644
+ over the authority storage. Both refuse anyone but a super admin, and the
1645
+ recipient's own `…/refund` route does the same for a gifted seat. Pair its
1636
1646
  `deliverChapterEffect` callback with `deliverMembershipChapterEffect` and a
1637
1647
  chapter `createMembershipChapterEffectRoute({ sender, secretName, origin,
1638
1648
  readEffect: adapter.readEffect })`. The receiver reloads current network state
@@ -1655,6 +1665,30 @@ These bite silently — a smoke test won't catch them:
1655
1665
  it never sends mail. Confirmed non-delivery permits only the original workflow
1656
1666
  to retry its frozen payload. Non-production recipient redirection still applies.
1657
1667
 
1668
+ An offering may omit `seatPurchaseWindowCalendarMonths`: then a seat may be
1669
+ bought for as long as the primary membership is paid and active, renewals
1670
+ included, and the offer reports `purchaseWindowed: false`. Memberships frozen
1671
+ under an earlier windowed offering keep their window until the network owner
1672
+ lifts it once per chapter with `POST /api/admin/membership-seats/lift-purchase-window`
1673
+ (super admin; only ever widens).
1674
+
1675
+ The public join config asks the authority, per paid tier, what a founding
1676
+ applicant pays today (`offer-preview`, read-only: nothing is reserved) and
1677
+ exposes it as `tiers[].founding` ({ cohortLabel, dueTodayCents, discountCents,
1678
+ renewalCents, discountDuration }). The placeholder chooser and membership
1679
+ cards show that rate with the list price struck; a site's `renderTiers` should
1680
+ read the same field instead of hard-coding a founding price. The issued offer
1681
+ at checkout remains the only promise.
1682
+
1683
+ On a chapter, a person record with no linked application — someone invited or
1684
+ a candidate — is managed by the chapter's own admins the way the network
1685
+ owner manages it: the record's Invitation tab sets or revokes the local
1686
+ admission decision (`/api/admin/admission-grants`), and its Stage tab moves the
1687
+ person only through the CRM's pre-application stages. Declare those stages
1688
+ ahead of the application statuses in the person pipeline (for example
1689
+ `candidate` and `invited`); an application status is never set by hand, on
1690
+ the chapter or through the leader's delegated lane.
1691
+
1658
1692
  ### Install + scope notes
1659
1693
 
1660
1694
  - **Bootstrap the first admin according to the selected auth source.** Prefer