Skip to content

Scribe v2.5.0 - The Refinement Update

Choose a tag to compare

@ericplane ericplane released this 24 Sep 19:07
· 17 commits to main since this release

Safer purchases and gifts, fewer leaderboard requests, client purchase prompts and countdowns, roblox-ts support, and an optional leaderstats add-on.

Behavior changes

  • New receipt reservations and client timer fields change the schema hash. Deploy your server and client together, and upgrade every server sharing the same profiles.
  • Unresolved gifts now block another paid gift or ordinary purchase prompt for the same product, including after rejoining or passing the old two-minute window. Paid gift receipts save their exact destination before delivery.
  • Completed receipt and gift IDs are retained for 30 days, with a configurable MaxReceiptHistoryBytes cap of 1 MiB by default. Recent IDs are no longer evicted to make room: new grants defer with RECEIPT_HISTORY_FULL. An unresolved receipt retried after its completed record expires can grant again.
  • Big numeric strings now reject inputs over 256 bytes, including whitespace, before parsing. Number inputs and stored Big values are unchanged.

Added

  • roblox-ts support, with inferred templates, typed server/client APIs, and npm packaging for Scribe and its optional React, Vide, Fusion, telemetry, and leaderstats add-ons.
  • Client Data.PromptPurchase(name) for declared products and passes. The server checks eligibility and opens the prompt; receipts and grants remain server-side. A request timeout can occur after the prompt opens, so requests are not retried automatically.
  • Client timer reads: timed fields expose their active state and remaining seconds through Active(). ExtendTimed replicates deadline changes by default. Value observers do not tick with the clock; cooldowns and server-only timers remain private.
  • ScribeLeaderstats, an optional add-on that maps player-list display names to data paths and manages updates and cleanup.
  • RetiredProducts keeps historical receipt and gift handlers available without offering new sales. Existing paid gift credits remain redeemable.
  • node.Child(key) accesses exact child keys, including names that collide with accessor methods. Big values also gain named arithmetic and comparison methods.
  • Leaderboard health reporting through server Data.GetLeaderboardStatus(name) and the cached Scribe.GetLeaderboardSnapshot(). Telemetry gains a Leaderboards route, degradation/recovery alerts, and richer summaries covering board backlogs, receipt-history refusals, log-sink failures, and join/leave timings.

Fixed

  • Exchange verdict IDs could exceed Roblox’s 50-character key limit, leaving trades stuck. New IDs are bounded, and intact legacy escrows can recover through compatible verdict keys. Preserve stuck escrow when upgrading.
  • Invalid recipient IDs in stored gift records now hold the receipt for repair with GIFT_INVALID_RECIPIENT before attempting delivery. Includes validation contributed in #16.
  • ServerStore was ignored by the public constructor and reported as an unknown option. Store templates now work and infer their field/accessor types, including typed template modules.
  • Receipts arriving while a buyer loads now wait for Ready within the loading timeout. External purchase channels no longer consume unrelated product-keyed gift intents.
  • Transient leaderboard write failures retain the pending score and retry with capped backoff instead of abandoning it after three failures.
  • Client.Stop() now discards queued product-info work, prevents further retries, and releases waiting info/price reads with nil. Late Marketplace responses are ignored.

Changed

  • Global leaderboards keep the latest pending score and skip unchanged encoded scores. Per-board WriteInterval defaults to 30 seconds; pending changed scores can still write on departure.
  • Background leaderboard reads and writes share budget pacing across bundles on the same server, leaving request headroom.
  • Log sinks filter before dispatch and use one worker with a bounded queue per registration. LogRingLevel defaults to Warn in production and Debug in Studio.
  • Slow joins and leaving callbacks report while still waiting, with loading phases and duration measurements.
  • RBXM, Wally, and npm builds omit long API documentation blocks while retaining concise comments, types, and directives. Source-line maps support debugging.
  • Updated Luau LSP to 1.70.0, with matching Roblox definitions and compatible type helpers.

Documentation

  • Added roblox-ts and leaderstats guides for installation, typed templates, and add-on setup.
  • Updated purchase and gifting guidance for receipt retention, retired products, external sales, recovery, and remaining purchase-correlation limitations.
  • Documented release packaging and how to map packaged error lines back to repository sources.

New Contributors

Full Changelog: v2.4.0...v2.5.0