{"id":"@lssm-tech/lib.gamification-runtime","slug":"lib.gamification-runtime","name":"@lssm-tech/lib.gamification-runtime","version":"2.1.4","path":"packages/domains/gamification/runtime","manifestPath":"packages/domains/gamification/runtime/package.json","manifestBlobSha":"8ac9351099f36d2d1b2fe2c1b02abc335dce218d","layer":"domains","physicalArea":"gamification","primaryArea":"personal-and-learning","classification":{"privateDeclared":null,"catalogFamily":"runtime","catalogKind":"library","catalogStatus":"active","adoptionMode":"adoptable","stability":"experimental"},"description":"Deterministic storage-neutral gamification evaluation and replay runtime.","descriptionOrigin":"package.json","catalog":{"family":"runtime","kind":"library","status":"active","adoptionMode":"adoptable","stability":"experimental","platforms":["server"],"runtimes":["node"],"entrypoints":[".","./cadence","./campaign","./conditions","./economy","./leaderboard","./matchmaking","./slot-outcome","./social","./streak","./types","./xp"],"documentation":[{"title":"Lib Gamification Runtime documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Flib.gamification-runtime","kind":"readme"}],"examples":[],"replacements":[],"capabilities":[{"id":"package.lssm.tech.lib.gamification.runtime","title":"Lib Gamification Runtime","description":"Deterministic storage-neutral gamification evaluation and replay runtime.","status":"active","useCases":["Adopt deterministic storage-neutral gamification evaluation and replay runtime"],"aliases":["lib","gamification","runtime"],"pythonEquivalents":[],"canonicalImports":[{"from":"@lssm-tech/lib.gamification-runtime","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/cadence","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/campaign","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/conditions","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/economy","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/leaderboard","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/matchmaking","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/slot-outcome","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/social","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/streak","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/types","symbols":[]},{"from":"@lssm-tech/lib.gamification-runtime/xp","symbols":[]}],"constraints":{"platforms":["server"],"runtimes":["node"],"avoidWhen":["The @lssm-tech/lib.gamification-runtime package constraints do not match the target runtime or platform."],"requires":["TypeScript"]},"alternatives":[],"relationships":[],"resolutionPriority":50}]},"canonicalImports":[{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/cadence","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/campaign","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/conditions","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/economy","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/leaderboard","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/matchmaking","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/slot-outcome","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/social","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/streak","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/types","symbols":[]},{"capabilityId":"package.lssm.tech.lib.gamification.runtime","from":"@lssm-tech/lib.gamification-runtime/xp","symbols":[]}],"scripts":{"build":"contractspec-bun-build build","build:bundle":"contractspec-bun-build transpile","build:types":"contractspec-bun-build types","clean":"rimraf dist .turbo","dev":"contractspec-bun-build dev","lint":"bun lint:fix","lint:check":"node ../../../../scripts/biome.cjs check .","lint:fix":"node ../../../../scripts/biome.cjs check --write .","prebuild":"contractspec-bun-build prebuild","publish:pkg":"bun publish --tolerate-republish --ignore-scripts --verbose","test":"bun test","typecheck":"tsgo --noEmit"},"scriptStatus":"complete pinned manifest","dependencies":{"@lssm-tech/lib.gamification-spec":"workspace:^"},"devDependencies":{"@lssm-tech/tool.bun":"workspace:*","@lssm-tech/tool.typescript":"workspace:*","typescript":"catalog:"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":{".":"./src/index.ts","./cadence":"./src/cadence.ts","./campaign":"./src/campaign.ts","./conditions":"./src/conditions.ts","./economy":"./src/economy.ts","./leaderboard":"./src/leaderboard.ts","./matchmaking":"./src/matchmaking.ts","./posting-streak":"./src/posting-streak.ts","./slot-outcome":"./src/slot-outcome.ts","./social":"./src/social.ts","./streak":"./src/streak.ts","./types":"./src/types.ts","./xp":"./src/xp.ts"},"publishExports":{".":{"types":"./dist/index.d.ts","browser":"./dist/browser/index.js","bun":"./dist/index.js","node":"./dist/node/index.js","default":"./dist/index.js"},"./cadence":{"types":"./dist/cadence.d.ts","browser":"./dist/browser/cadence.js","bun":"./dist/cadence.js","node":"./dist/node/cadence.js","default":"./dist/cadence.js"},"./campaign":{"types":"./dist/campaign.d.ts","browser":"./dist/browser/campaign.js","bun":"./dist/campaign.js","node":"./dist/node/campaign.js","default":"./dist/campaign.js"},"./conditions":{"types":"./dist/conditions.d.ts","browser":"./dist/browser/conditions.js","bun":"./dist/conditions.js","node":"./dist/node/conditions.js","default":"./dist/conditions.js"},"./economy":{"types":"./dist/economy.d.ts","browser":"./dist/browser/economy.js","bun":"./dist/economy.js","node":"./dist/node/economy.js","default":"./dist/economy.js"},"./leaderboard":{"types":"./dist/leaderboard.d.ts","browser":"./dist/browser/leaderboard.js","bun":"./dist/leaderboard.js","node":"./dist/node/leaderboard.js","default":"./dist/leaderboard.js"},"./matchmaking":{"types":"./dist/matchmaking.d.ts","browser":"./dist/browser/matchmaking.js","bun":"./dist/matchmaking.js","node":"./dist/node/matchmaking.js","default":"./dist/matchmaking.js"},"./posting-streak":{"types":"./dist/posting-streak.d.ts","browser":"./dist/browser/posting-streak.js","bun":"./dist/posting-streak.js","node":"./dist/node/posting-streak.js","default":"./dist/posting-streak.js"},"./slot-outcome":{"types":"./dist/slot-outcome.d.ts","browser":"./dist/browser/slot-outcome.js","bun":"./dist/slot-outcome.js","node":"./dist/node/slot-outcome.js","default":"./dist/slot-outcome.js"},"./social":{"types":"./dist/social.d.ts","browser":"./dist/browser/social.js","bun":"./dist/social.js","node":"./dist/node/social.js","default":"./dist/social.js"},"./streak":{"types":"./dist/streak.d.ts","browser":"./dist/browser/streak.js","bun":"./dist/streak.js","node":"./dist/node/streak.js","default":"./dist/streak.js"},"./types":{"types":"./dist/types.d.ts","browser":"./dist/browser/types.js","bun":"./dist/types.js","node":"./dist/node/types.js","default":"./dist/types.js"},"./xp":{"types":"./dist/xp.d.ts","browser":"./dist/browser/xp.js","bun":"./dist/xp.js","node":"./dist/node/xp.js","default":"./dist/xp.js"}},"types":"./dist/index.d.ts","files":["dist","README.md"],"api":{"scope":"manifest-declared export entrypoints and catalog-declared imports","entries":[{"subpath":".","importPath":"@lssm-tech/lib.gamification-runtime","target":"./src/index.ts","targets":[{"conditions":[],"target":"./src/index.ts","sourcePath":"packages/domains/gamification/runtime/src/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/index.ts","sourceStatus":"verified source file"}]},{"subpath":"./cadence","importPath":"@lssm-tech/lib.gamification-runtime/cadence","target":"./src/cadence.ts","targets":[{"conditions":[],"target":"./src/cadence.ts","sourcePath":"packages/domains/gamification/runtime/src/cadence.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/cadence.ts","sourceStatus":"verified source file"}]},{"subpath":"./campaign","importPath":"@lssm-tech/lib.gamification-runtime/campaign","target":"./src/campaign.ts","targets":[{"conditions":[],"target":"./src/campaign.ts","sourcePath":"packages/domains/gamification/runtime/src/campaign.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/campaign.ts","sourceStatus":"verified source file"}]},{"subpath":"./conditions","importPath":"@lssm-tech/lib.gamification-runtime/conditions","target":"./src/conditions.ts","targets":[{"conditions":[],"target":"./src/conditions.ts","sourcePath":"packages/domains/gamification/runtime/src/conditions.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/conditions.ts","sourceStatus":"verified source file"}]},{"subpath":"./economy","importPath":"@lssm-tech/lib.gamification-runtime/economy","target":"./src/economy.ts","targets":[{"conditions":[],"target":"./src/economy.ts","sourcePath":"packages/domains/gamification/runtime/src/economy.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/economy.ts","sourceStatus":"verified source file"}]},{"subpath":"./leaderboard","importPath":"@lssm-tech/lib.gamification-runtime/leaderboard","target":"./src/leaderboard.ts","targets":[{"conditions":[],"target":"./src/leaderboard.ts","sourcePath":"packages/domains/gamification/runtime/src/leaderboard.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/leaderboard.ts","sourceStatus":"verified source file"}]},{"subpath":"./matchmaking","importPath":"@lssm-tech/lib.gamification-runtime/matchmaking","target":"./src/matchmaking.ts","targets":[{"conditions":[],"target":"./src/matchmaking.ts","sourcePath":"packages/domains/gamification/runtime/src/matchmaking.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/matchmaking.ts","sourceStatus":"verified source file"}]},{"subpath":"./posting-streak","importPath":"@lssm-tech/lib.gamification-runtime/posting-streak","target":"./src/posting-streak.ts","targets":[{"conditions":[],"target":"./src/posting-streak.ts","sourcePath":"packages/domains/gamification/runtime/src/posting-streak.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/posting-streak.ts","sourceStatus":"verified source file"}]},{"subpath":"./slot-outcome","importPath":"@lssm-tech/lib.gamification-runtime/slot-outcome","target":"./src/slot-outcome.ts","targets":[{"conditions":[],"target":"./src/slot-outcome.ts","sourcePath":"packages/domains/gamification/runtime/src/slot-outcome.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/slot-outcome.ts","sourceStatus":"verified source file"}]},{"subpath":"./social","importPath":"@lssm-tech/lib.gamification-runtime/social","target":"./src/social.ts","targets":[{"conditions":[],"target":"./src/social.ts","sourcePath":"packages/domains/gamification/runtime/src/social.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/social.ts","sourceStatus":"verified source file"}]},{"subpath":"./streak","importPath":"@lssm-tech/lib.gamification-runtime/streak","target":"./src/streak.ts","targets":[{"conditions":[],"target":"./src/streak.ts","sourcePath":"packages/domains/gamification/runtime/src/streak.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/streak.ts","sourceStatus":"verified source file"}]},{"subpath":"./types","importPath":"@lssm-tech/lib.gamification-runtime/types","target":"./src/types.ts","targets":[{"conditions":[],"target":"./src/types.ts","sourcePath":"packages/domains/gamification/runtime/src/types.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/types.ts","sourceStatus":"verified source file"}]},{"subpath":"./xp","importPath":"@lssm-tech/lib.gamification-runtime/xp","target":"./src/xp.ts","targets":[{"conditions":[],"target":"./src/xp.ts","sourcePath":"packages/domains/gamification/runtime/src/xp.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/src/xp.ts","sourceStatus":"verified source file"}]}],"entryCount":13,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[{"title":"Lib Gamification Runtime documentation","url":"https://www.npmjs.com/package/%40lssm-tech%2Flib.gamification-runtime","kind":"readme","pinnedUrl":null,"sourceStatus":"declared link; destination not verified"}],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/lib.gamification-runtime.txt"},"readme":{"status":"available","body":"# `@lssm-tech/lib.gamification-runtime`\n\nDeterministic, immutable evaluation and replay for campaigns declared with\n`@lssm-tech/lib.gamification-spec`.\n\nThe runtime expands cadence slots, evaluates conditions, streaks and capped XP,\nscores leaderboards, groups leagues, applies wallet actions, reduces activities,\nand canonically replays event streams. It performs no I/O and uses only explicit\ntimestamps, seeds, entropy receipts, and host-authorized participant references.\n\n## Determinism and receipts\n\n- `reduceCampaignEvent` rejects duplicate and out-of-order activities without\n  mutating the input snapshot; it also rejects campaign-version mismatches,\n  unknown mission slots, activity outside a slot window, and finalization before\n  a slot closes. `replayCampaign` sorts by `(occurredAt, eventId)`.\n- Mission XP is awarded only when an event newly completes that mission in the\n  active slot. Explicit `xpRuleId` activity remains available for host-declared\n  awards, and a decision exposes every receipt when one event completes several\n  missions or unlocks rewards.\n- XP is evaluated as base, bonuses, priority-ordered basis-point modifiers,\n  rule cap, then event/source/slot/day/period/campaign caps. All rounding is\n  integer half-up and each receipt reports the rule ID plus raw, applied,\n  rule-capped, and later-scope-rejected XP.\n- XP usage is keyed by the caller's explicit source, slot, day, period, campaign,\n  and rule identifiers. Boost inventory is consumed only for a positive applied\n  delta after caps.\n- Slot expiry resolves completion, scheduled protection, approved excuse,\n  available shield, then miss. Only completion increments a streak.\n- State snapshots contain append-only XP receipts and canonical\n  `gamification.*` decision events suitable for host persistence and audit.\n- Recurring event/count quests evaluate against their current slot or period,\n  so activity from an earlier recurrence cannot unlock a later one.\n\nThe package also exports transparent leaderboard scoring and built-in stable\ntie-breakers, promotion/demotion, host/seeded/entropy-recorded matchmaking,\ngroup streak and cooperative quest helpers, nudge cooldown decisions, and\natomic wallet grants, consumption, and transfers.\nParticipant IDs may identify individuals or host-authorized teams, so the same\ntransparent scoring function supports personal and team leaderboards.\n\n\nThe optional `posting-streak` surface projects unique calendar posting days with an\nexplicit IANA timezone and clock. Yesterday retains the active streak until the current\nday ends; future posts do not count. The projection is read-only and awards no XP or\ncompensation. It includes a Sunday–Saturday strip with active-streak day numbering.\n\n\nPosting timestamps and the clock require explicit ISO offsets; offset-free values are\nnot interpreted using the server's ambient timezone. Native Hirly compatibility can be\nrechecked with `scripts/check-creator-streak-compatibility.ts --source-root <checkout>`.\nThe comparison excludes future/offset-free inputs, which deliberately receive stricter\nhandling in the shared projection.\n","sourcePath":"packages/domains/gamification/runtime/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/domains/gamification/runtime/README.md","blobSha":"4050e1e88f9457e8523a1b08be1a5fbb5c6ccfa4","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","origin":"README recovered byte-for-byte from pinned aggregate guide","integrity":"exact Git blob match","executionStatus":"not executed"},"provenance":{"repository":"lssm-tech/contractspec","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","manifestOrigin":"pinned GitHub manifest fetch","manifestComplete":true,"publicationPolicyApplied":false},"areaSlug":"personal-and-learning","areaTitle":"Personal workflows, learning and progress","displayName":"lib.gamification-runtime","runtimes":["node"],"platforms":["server"],"kind":"library","scope":"Package manifest","canonicalRoute":"/docs/packages/lib.gamification-runtime/","contextUrl":"/docs/packages/lib.gamification-runtime.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}