Log Code Reference
Every diagnostic Scribe emits carries a stable, machine-readable Code that stays the same across versions, so you can route, filter, and alert on exactly the events you care about. This page lists all of them.
Each log entry is { At, Level, Category, Code, Message, Context }, where Level is one of Debug, Info, Warn, Error, or Fatal. Error and Fatal entries also fire Scribe.OnIssue. Codes marked (Studio only) never fire on a live server; they come from the Scribe Studio plugin's simulation tools, so you can safely ignore them in production alerting.
Consuming codes
-- Forward exactly what you want to your own backend
Scribe.AddLogSink(function(entry)
-- entry = { At, Level, Category, Code, Message, Context }
if entry.Level == "Error" or entry.Level == "Fatal" then
MyBackend:Report(entry) -- everything serious
elseif entry.Code == "PROFILE_SIZE" or entry.Code == "WIPE_GUARD_TRIPPED" then
MyBackend:Report(entry) -- specific codes to watch
end
end)
-- Or pull recent entries on demand, filtered by code / level / category
Scribe.GetRecentLogs({ Code = "PROFILE_LOAD_FAIL", Limit = 50 })
Scribe.GetRecentLogs({ Level = "Error", Limit = 100 }) -- Level filters by minimum severity
-- Every Error / Fatal also arrives here
Scribe.OnIssue:Connect(function(entry) alert(entry) end)
Code, Level, and Category are typed string unions in Scribe's API, so your editor autocompletes valid values as you type them, both in a GetRecentLogs filter and on entry inside a sink. Typing Code = "PRO suggests every code beginning with PRO.
The Context table carries structured fields that vary by code (the player, a data path, byte counts, store names, and so on). The built-in sink already forwards every entry to Roblox's structured LogService output keyed by Code, so Creator Analytics aggregates by code out of the box; you only add a sink to reach your own pipeline.
Persistence
| Code |
Level |
Meaning |
DATASTORE_CRITICAL |
Error |
ProfileStore's OnCriticalToggle reported the DataStore backend entered a critical (sustained failure) state, so loads and saves are likely failing platform-wide. |
MIGRATION_FAIL |
Error |
A data-migration step threw while upgrading a stored profile to the current version, so the profile is left unmigrated and the session is aborted rather than persisting half-migrated data. |
PROFILE_LOAD_FAIL |
Error |
A profile could not be loaded: either StartSessionAsync failed after a retry attempt, or a ViewedUserId (view-mode) profile was not found. The player is kicked, or the view is torn down. |
PROFILE_VERSION_AHEAD |
Error / Warn |
The stored profile's version is newer than this server's code knows about; it fires as Error and fails closed (kicks) under VersionAheadPolicy=Kick, or Warn and proceeds under Allow, indicating a mixed/staged deploy hazard. |
EXPORT_ENCODE_FAIL |
Warn |
A GDPR/data Export could not JSON-encode a player's profile data, so Export returns nil instead of a serialized payload. |
OFFLINE_READ_FAIL |
Warn |
An offline GetAsync read of a non-active user's profile errored (a retryable read failure, distinct from a genuinely missing profile), so GetOffline returns nil. |
PROFILE_ERASED |
Warn |
A player's profile was permanently removed via the GDPR Erase path; the log records the audit context and whether the associated leaderboard keys were also cleared. |
PROFILE_RESET |
Warn |
A profile's data was wiped back to template defaults because the ResetData option was enabled, expected in testing but alarming if seen in production. |
PROFILE_RESTORED |
Warn |
A profile was rolled back to an earlier entry from version history via RestoreVersion; the log records the restored version and audit context. |
PROFILE_SIZE |
Warn |
A saved profile exceeded the size-warning threshold and is approaching the ~4 MB DataStore per-key ceiling, risking future save failures if it keeps growing (fires once until it drops back below). |
PROFILE_STORE_ERROR |
Warn |
ProfileStore.OnError reported a DataStore error against this bundle's store; if it corresponds to an in-flight save, that save is marked failed for the affected player. Also fires OnSave. |
PROFILE_STORE_SIGNAL_MISSING |
Warn |
ProfileStore's OnError or OnCriticalToggle signal could not be connected, so save-failure/critical-state observability for this bundle is disabled. |
SAVE_INTERVAL_CLAMPED |
Warn |
The requested SaveInterval was below the minimum floor (DataStore write throttling) and was clamped up to that floor instead of the requested value. |
SAVE_INTERVAL_FAIL |
Warn |
Applying the configured SaveInterval to ProfileStore's AUTO_SAVE_PERIOD failed (SetConstant threw), so the autosave cadence was not changed. |
SIM_LOAD_FAILURE |
Warn |
(Studio only.) The Scribe Studio debug plugin armed or triggered a simulated profile-load failure to exercise the load-failure/retry path; it can only occur in Studio, never on a live server. |
SIM_SESSION_STEAL |
Warn |
(Studio only.) The Scribe Studio debug plugin simulated a session steal by force-ending an active profile session to exercise the session-lock/steal path; Studio-only, never on a live server. |
STATUS_CHANGED |
Warn / Info |
The Health status machine transitioned between Healthy/Degraded/Outage (Info when returning to Healthy, Warn when degrading), reflecting the recent DataStore failure/success trend. Also fires OnStatusChanged. |
UNKNOWN_ROOT_KEYS |
Warn |
In DevMode, a loaded profile contained top-level keys not present in the template, signaling schema drift that a migration should remove (never fires outside DevMode). |
VERSION_QUERY_FAIL |
Warn |
Enumerating a profile's DataStore version history via VersionQuery failed, so ListVersions returns whatever partial results it gathered before the error. |
VERSION_READ_FAIL |
Warn |
Reading a specific historical profile version via GetAsync errored (a retryable read failure, not a missing version), so GetVersion returns nil. |
DATASTORE_RECOVERED |
Info |
ProfileStore's OnCriticalToggle reported the DataStore backend left its critical state, meaning the earlier outage has cleared and normal saves/loads resumed. |
MIGRATED |
Info |
A stored profile was successfully upgraded through one or more migration steps to the current version and the migrated data was committed. |
PROFILE_LOADED |
Info |
A player's profile session finished loading and reached the Ready state, so their data tree is live and usable, a routine per-session confirmation. |
SAVE_INTERVAL_SET |
Info |
The configured SaveInterval was successfully applied to ProfileStore's global AUTO_SAVE_PERIOD, confirming the requested autosave cadence is in effect. |
SHUTDOWN_DONE |
Info |
The BindToClose shutdown drain finished; it reports how many sessions remained un-drained when the budget expired (ideally zero). |
SHUTDOWN_FLUSH |
Info |
Server shutdown began: new sessions are refused and the profile-save and leaderboard queues are being drained within the BindToClose budget. |
Integrity
| Code |
Level |
Meaning |
WIPE_GUARD_TRIPPED |
Error |
Fires just before a save when the wipe-guard detects an implausible data collapse (e.g., the serialized profile shrank dramatically), indicating likely data loss or corruption that would otherwise be persisted. Also fires OnAnomaly. |
ANOMALY |
Warn |
Fires when an implausible or suspicious write to player data is detected at a specific path (validation flagged the value), often indicating an exploit attempt or a logic bug in game code. Also fires OnAnomaly. |
TIMED_SWEEP_FAIL |
Warn |
Fires when the periodic timed sweep errors while resetting a lapsed timed field back to its default value, so that field may be left in a stale or inconsistent state. |
WIPE_GUARD_BLOCKED |
Warn |
Fires when the wipe-guard tripped and WipeGuardPolicy is 'Block', so the pending save is held and the last known-good snapshot is persisted instead of the suspicious live data. |
WIPE_GUARD_FORCED |
Warn |
Fires when a save the wipe-guard had blocked is forcibly flushed through (e.g., Data.Flush with Force=true), pushing live data to storage and overriding the guard's protection. |
WIPE_GUARD_CLEARED |
Info |
Fires when a profile that the wipe-guard had previously blocked passes the check again, so its live data resumes saving normally; this is a routine recovery confirmation. |
ANALYTICS_FAIL |
Debug |
Fires when AnalyticsService:LogEconomyEvent (or a custom-field Resolve) throws while recording an economy transaction, meaning economy events are silently failing to reach the analytics dashboards; an isolated failure is noise, but a sustained stream signals a broken analytics pipeline. |
ECONOMY_FIELD_UNDECLARED |
Warn |
In DevMode, a tagged Increment/Decrement passed a per-call custom Fields name that the currency did not declare in its Economy config, so it is not recorded; usually a typo in the field name. |
ECONOMY_FIELDS_OVERFLOW |
Warn |
In DevMode, a currency's Economy config declares more than the three custom-field slots Roblox allows, so the fields past the third are dropped; trim the declared list to three. |
Replication
| Code |
Level |
Meaning |
SERIALIZE_FAIL |
Error |
Fires when encoding a replication frame throws (while flushing a player's diff queue, flushing the shared diff queue, or building a client's initial snapshot). Some queued value could not be serialized to the wire; the message carries the encode error, and the affected ops are not sent as-is. |
SNAPSHOT_ROOT_DROPPED |
Error |
Fires during initial-snapshot encoding when a specific top-level data root cannot be serialized, so it is omitted from the Init frame and the client receives everything except that root; indicates an unserializable value at that root path. Also fires OnAnomaly. |
CLIENT_HANDSHAKE_TIMEOUT |
Warn |
Fires on the server when a client never sends its Hello frame within the handshake timeout after joining, so replication never starts for that player. Most often the Scribe bundle was never required on the client (a LocalScript must require it to begin the handshake); it can also mean a broken or missing custom client transport adapter. |
OP_BEFORE_INIT |
Warn |
Fires on the client when a Diff frame arrives before the initial snapshot has been applied (a protocol ordering error), after which the client re-sends Hello to request a fresh Init. |
PROTOCOL_MISMATCH |
Warn |
Fires on the server during the handshake when the client's wire protocol version byte differs from the server's, meaning the binary layout itself is incompatible; the handshake fails closed (no Init is sent and the client never syncs), unlike a schema-hash mismatch which is decode-safe. |
SCHEMA_MISMATCH |
Warn |
Fires on the server during the handshake when the client's reported schema hash differs from the server's compiled schema hash, indicating client and server were built from divergent data templates (template drift); replication proceeds but the mismatch should be investigated. |
INIT_APPLIED |
Debug |
Fires on the client right after it decodes the server's initial full snapshot and applies it over a freshly reset default mirror; a routine confirmation that the client's state is now populated (and, on the first apply, that the client is marked loaded). |
INIT_SENT |
Debug |
Fires on the server after it has encoded and transmitted the initial full-state snapshot to a joining client during the handshake; a routine confirmation that replication for that player has begun. |
Transport
| Code |
Level |
Meaning |
INBOUND_OVERSIZE |
Warn |
An inbound frame received from a client exceeded the configured maxInbound byte limit and was dropped without being processed, typically signaling a misbehaving client, a misconfigured size limit, or an attempted exploit. |
MALFORMED_FRAME |
Warn |
A network frame could not be decoded or dispatched: on the server, an inbound client frame failed to parse (per-player MalformedCount is incremented and OnAnomaly fires); on the client, a server frame failed to handle. This indicates a protocol/version mismatch, corruption, or a malicious client. |
SEND_FAIL |
Warn |
The transport adapter threw while sending an outbound buffer: a diff to a single client (SendToClient) or all clients (SendToAllClients), or the client's own Hello handshake (SendToServer). That frame was not delivered, usually pointing to a transport/adapter fault, a player who just disconnected, or a Sandboxed Scribe (a sandboxed thread cannot fire a non-sandboxed RemoteEvent). |
Commands
| Code |
Level |
Meaning |
COMMAND_ERROR |
Error |
A registered command handler threw an error during execution (caught by xpcall); the caller gets a generic "error" reply and this points to a bug in your command handler code. |
COMMAND_BAD_ARGS |
Warn |
An incoming command's argument at a given position failed the command's registered argument-type schema, so the request was rejected with "bad-args", indicating a malformed client call, version skew, or an exploit. |
COMMAND_RATE_LIMITED |
Warn |
A player sent commands faster than the configured per-second token-bucket limit, so the request was rejected with "rate-limited", indicating command spam or a possible exploit. |
COMMAND_REPLY_ENCODE_FAIL |
Warn |
A command handler returned a value that can't be serialized for the network reply (e.g. an Instance or function), so Scribe substitutes a "reply-encode-failed" response, indicating the handler returned an unsupported type. |
COMMAND_UNKNOWN |
Warn |
A client invoked a command name that isn't present in the server's command registry, so it was rejected with "unknown-command", indicating a client/server mismatch or an exploit probing for commands. |
SIM_COMMAND |
Info |
(Studio only.) A developer invoked a command through the Scribe Studio debug plugin's simulation button rather than a real client; a routine Studio-only diagnostic, not a live-server event. |
Monetization
| Code |
Level |
Meaning |
GRANT_FAIL |
Error |
A product's Grant callback threw during purchase processing, so the grant was aborted fail-closed and the receipt returns NotProcessedYet for Roblox to retry; the Grant function has a bug to fix. |
RECEIPT_UNKNOWN_PRODUCT |
Error |
A purchase receipt arrived for a product ID that is not registered in Products, so it cannot be granted and is deferred; the product must be added to the Products registry. |
OWNERSHIP_CHECK_FAIL |
Warn |
A MarketplaceService UserOwnsGamePassAsync call errored, so the game-pass ownership check could not be resolved and is treated as not-owned; frequent occurrences indicate a Roblox API/network problem. |
RECEIPT_OFFLINE_RETRY |
Warn |
An offline receipt could not read the buyer's saved profile, so the purchase is deferred (NotProcessedYet) for Roblox to retry later; repeated hits suggest DataStore read problems. |
RECEIPT_RETRY |
Warn |
A grant was applied in memory but the auto-flush save did not confirm within the timeout, so the receipt returns NotProcessedYet and lets Roblox retry (safe via idempotency); persistent hits point to save/DataStore latency. |
SIM_RECEIPT |
Warn |
(Studio only.) The Scribe Studio plugin injected a mock receipt for testing (UseMock only), which routes through HandleReceipt; it can never fire on a live server. |
UNDECLARED_CATEGORY |
Warn |
In DevMode, a purchase-log entry used a category string that is not in the declared categories set, signaling a likely typo or a missing category declaration. |
UNDECLARED_PERK |
Warn |
In DevMode, a perk key was granted or referenced that is not present in the Perks registry, indicating a likely typo or an unregistered perk. |
PERK_GRANTED |
Info |
A perk flag was successfully set on a Ready player via GrantPerk, a routine confirmation that the perk is now owned. |
PERK_REVOKED |
Info |
A perk flag was cleared on a Ready player via RevokePerk, a routine confirmation that the perk was removed. |
RECEIPT_DUPLICATE |
Info |
A receipt whose PurchaseId was already processed was re-acknowledged idempotently, returning PurchaseGranted without granting a second time, normal Roblox retry behavior. |
RECEIPT_GRANTED |
Info |
A purchase was successfully applied and durably saved (either an online grant or an offline perk grant committed to the buyer's profile), the expected success path. |
RECEIPT_HANDLER_BOUND |
Info |
Scribe bound MarketplaceService.ProcessReceipt and now handles developer-product receipts for this game. It only binds when Products are configured; set OwnReceipts = false if your game runs its own receipt handler. |
Gifting
| Code |
Level |
Meaning |
GIFT_INTENT_WRITE_FAIL |
Error |
The durable save of a pending gift intent failed right before prompting the purchase, so the gift prompt is refused and no Robux is charged; indicates a DataStore/save-flush problem worth investigating. |
GIFT_UNKNOWN_PRODUCT |
Error |
A cross-server ProfileStore gift message referenced a product name that is not registered on this server (a config/deploy mismatch); the message is kept so a later deploy can process it, but delivery is stalled until then. |
GIFT_CREDIT_ISSUED |
Warn |
A giftable perk was purchased with no gift intent while the buyer already owns it (NoGiftIntentPolicy=GrantOrCredit), so instead of a no-op grant an unassigned re-aimable gift credit was written to the buyer. Also fires OnGiftCredit. |
GIFT_DELIVERY_RETRY |
Warn |
Cross-server/offline gift delivery via ProfileStore MessageAsync failed, so the receipt returns NotProcessedYet and Roblox will retry; repeated occurrences point to a DataStore/messaging problem. |
GIFT_INTENT_EXPIRED |
Warn |
A stored gift intent was older than the intent TTL (an abandoned gift prompt), so it is cleared and any incoming receipt falls through to the no-intent policy; normal cleanup, not a failure. |
GIFT_NO_INTENT |
Warn |
A giftable perk product was purchased with no matching gift intent and the buyer does not already own it, so the perk is granted directly to the buyer instead of a recipient; an expected fallback path. |
GIFT_RECIPIENT_ALREADY_OWNS |
Warn |
Between the gift prompt and the receipt the intended recipient already acquired the perk (and it was not already delivered by us), so the purchase is converted into a re-aimable gift credit for the buyer to avoid burning Robux on a no-op grant. Also fires OnGiftCredit. |
RECEIPT_DECLINED_PENDING_CREDIT |
Warn |
A no-intent perk purchase arrived while the buyer already owns the perk AND still holds an unused gift credit, so the purchase is declined (NotProcessedYet, Roblox refunds) to prevent stacking a wasteful duplicate credit. |
RECEIPT_HELD |
Warn |
A no-intent perk purchase arrived while the buyer already owns the perk and NoGiftIntentPolicy is Hold, so the receipt is held as NotProcessedYet for retry instead of auto-crediting; a policy-driven hold, not an error. |
GIFT_CREDIT_UNKNOWN_PRODUCT |
Warn |
On load, a player holds gift credits keyed by a product name that is no longer in the Products config (the product was renamed or removed); the paid credits are unspendable until the product entry returns or a migration renames the credit key. Never deleted automatically. |
GIFT_CREDIT_USED |
Info |
A buyer redeemed one of their existing unassigned gift credits to deliver a gift, so no new purchase was charged; a normal informational confirmation of a credit-funded gift. |
GIFT_RECEIPT_GRANTED |
Info |
A gift purchase receipt was successfully and durably delivered to the intended recipient and logged as GiftSent; a routine success confirmation of gift delivery. |
Leaderboards
| Code |
Level |
Meaning |
LB_ERASE_FAIL |
Error |
A leaderboard OrderedDataStore RemoveAsync failed during GDPR user erasure, so the player's score may still remain on at least one board and the erase must be retried. |
LB_QUEUE_OVERFLOW |
Warn |
The leaderboard write queue hit its capacity cap so the oldest pending score write was dropped, indicating score updates are being enqueued faster than the pacer can persist them. |
LB_READ_FAIL |
Warn |
An OrderedDataStore GetSortedAsync call failed while refreshing a leaderboard, so that board's rankings could not be updated this refresh cycle. |
LB_WRITE_DROPPED |
Warn |
A single leaderboard score write was permanently abandoned after failing three retry attempts with no newer value superseding it, so that player's score update was lost. |
LB_WRITE_FAIL |
Warn |
A single OrderedDataStore SetAsync attempt failed while persisting a player's leaderboard score; the write may still be retried up to the retry limit. |
LB_SHUTDOWN_FLUSH |
Info |
Emitted once during server shutdown after FlushAllBlocking drains the leaderboard write queue within its budget, reporting how many writes were flushed and how many remained unwritten. |
SIM_LB_FLUSH |
Info |
(Studio only.) Fired when a developer uses the Scribe Studio debug plugin to manually drain the leaderboard write queue; a Studio-only simulation action that never occurs on a live server. |
Lifecycle
| Code |
Level |
Meaning |
LISTENER_ERROR |
Error |
A developer-supplied listener/callback (e.g. an OnChanged/economy listener wired into the change runner) threw while processing a data change, and Scribe caught and reported it, meaning there is a bug in the game's own listener code. |
ON_PLAYER_INIT_ERROR |
Error |
The developer-provided options.OnPlayerInit callback threw while initializing a newly loaded player's profile data, indicating a bug in that init hook. |
DYNAMIC_DEFAULT_FAILED |
Error |
A Scribe.Dynamic factory threw while seeding a field on a brand-new profile, so that field keeps its declaration-time baseline instead. Indicates a bug in the factory function. |
SUBSYSTEM_HOOK_ERROR |
Error |
An internal subsystem load hook (Timed, Monetization, Leaderboards, or Replication) errored when a player's entry became ready, pointing to a Scribe-internal fault or corrupt saved data for that subsystem. |
API_NAME_COLLISION |
Warn |
A template root field or node name collides with a reserved Data-API accessor/method name, so that field is unreachable through the typed API and should be renamed. |
DEBUG_HOOK_DUPLICATE |
Warn |
(Studio only.) A second Scribe debug hook (server or client) tried to attach while one already exists, so only the first bundle is inspectable in the Studio plugin. |
DEBUG_HOOK_ERROR |
Warn |
(Studio only.) The Studio debug bridge failed to encode/stream a diagnostic chunk or record an intercepted op and dropped it, affecting only the inspector view and not live gameplay data. |
DEBUG_HOOK_FAIL |
Warn |
(Studio only.) Attaching the Scribe Studio debug hook itself errored inside its pcall, so the game runs normally but is not inspectable by the Studio plugin this session. |
DEBUG_HOOK_WRITES |
Warn |
(Studio only.) The Studio plugin toggled its ability to write to live data on or off via SetWritesEnabled; warned because enabling lets the inspector mutate real player data. |
DEV_WARNING |
Warn |
A non-fatal developer-facing warning surfaced from the change runner's LogWarn callback (e.g. API misuse detected while processing a write), meant for the developer to heed. |
SANDBOXED |
Warn |
The Scribe package has Roblox's Sandboxed property set to true, so it cannot fire its replication RemoteEvents (a sandboxed thread may only fire sandboxed events) and nothing will sync. Set Sandboxed = false on the Scribe package (and ProfileStore); usually caused by inserting Scribe from a model/toolbox instead of syncing from source. |
SIM_STATUS |
Warn |
(Studio only.) The Studio plugin forced the service health status (Healthy/Degraded/Outage) for testing, which broadcasts the new status; a deliberate Studio-only simulation, not a real outage. Also fires OnStatusChanged. |
UNKNOWN_OPTION |
Warn |
An option key passed to Scribe was not recognized (likely a typo) and would be silently ignored, caught at startup so the developer can fix the spelling. |
DEBUG_HOOK_ATTACHED |
Info |
(Studio only.) The Scribe Studio companion plugin completed its server-side handshake and the debug bridge attached successfully; a routine Studio-only confirmation. |
DEBUG_HOOK_ATTRIBUTION |
Info |
(Studio only.) The Studio plugin turned write-source attribution capture on or off via SetAttribution; informational Studio-only state change. |
SERVER_STARTED |
Info |
The Scribe server finished initializing (schema compiled and transport resolved); a normal one-time startup confirmation with field count and transport name. |