Skip to main content

Post-Story Activity Loop (The Ascendant's Path)

Post-Story Activity Loop (The Ascendant's Path)

Status: BUILT — all four pillars are live (2026-07-16). PS1 (post-story scaffold + hub + unlock) and PS2 (Ascension / New Game Plus) shipped 2026-07-01 (RVF report group 159

Last updated: October 27, 2026

Dark Tower — Post-Story Activity Loop (The Ascendant's Path)

Status: BUILT — all four pillars are live (2026-07-16). PS1 (post-story scaffold + hub

  • unlock) and PS2 (Ascension / New Game Plus) shipped 2026-07-01 (RVF report group 159 finding F2). PS3 (Hunter's Contracts) shipped complete: the up-to-3 ledger, escalating tiers, DELTA progress, gold + Contract-Points payout, the audited milestone token grant, and the collision-safe contracts NLU surface. PS1/PS2's deferred sub-parts (the audited Ascendant's Boon token grant + boot wiring assertion, the Title Shop Ascendant tier, the ascension leaderboard metric, and the best-ending high-water mark) are all built. PS4 (Trial of the Week) is built end-to-end: the week-seeded rotation, the completion-proof gate, and recordActivityCompletion + the themed bonus multiplier wired into six of the nine pool activities (Tower Waves, Invasions, Raids, Arena, Spin the Wheel, Orc War Chest); the three world-map dungeons (Lich Lair, Goblin Dungeon, Graveyard Dungeon) remain a small, explicitly scoped residual gap (see PS4 status below) because they are pure card content with no discrete "run completed" event distinct from "visited a card" — wiring them needs a follow-up to find or add a real dungeon-exit signal. Origin: queue ; greenlit human_idea 22100 / owner decision 2026-06-16 "Design full post-story loop now". Source: game-design audit gd-02 (process-reports report 3, finding 11) — the Dark Tower "play until you exhaust the interesting content, then stop" retention gap.

Parent: index.md. Sits ABOVE the daily: engine/daily-framework.md (E5) + daily.md (the shipped DT Bounty Board). Reuses: combat.md (counters, difficulty lever), progression.md (paragon, level cap, clue replay), economy.md (reward path, premium audit, soft-currency carve-out, Title Shop), narrative.md (Arc One ending router, clue-removal replay), exploration.md (the deep activities + the existing activeBounties system). Cross-game prestige precedent: engine/prestige.md. Voice standard: philosophy/player-experience.md.

Thesis

When a Dark Tower player finishes the main story — reaches the Arc One ending router (card 35877) — the game today effectively ends. Arc Two is still being written, so there is no further authored narrative, and the rich endgame activities (dungeons, waves, invasions, raids, arena, spin, auction, gods, title shop) exist but nothing structures them into a loop that keeps pulling the player back. That is exactly the audit's gd-02 gap.

The Ascendant's Path is the deep, beyond-the-daily endgame: a layered set of repeatable loops at different cadences that, together, always give a max-progressed player a fresh reason to open the skill and a long horizon to climb. It is built almost entirely on systems and counters Dark Tower already has, so it adds structure and goals, not net-new gameplay telemetry.

The cadence ladder (and how this COMPLEMENTS the daily — the hard boundary)

The daily Bounty Board (E5, SHIPPED — daily.md) is one small fresh thing per UTC day: a single shared bounty (defeat ten enemies / find three clues / win an encounter), gold + a 7-day-cap streak

  • a diamond milestone. It is the daily ritual and this doc does NOT re-spec it, re-skin it, or move its reward. The post-story loop sits a layer above the daily, at deeper cadences:
Cadence Loop What it is Owner
Daily Bounty Board One small shared bounty, resets at UTC midnight, gold + streak + diamond milestone E5 / daily.md — already shipped, referenced only
Weekly Trial of the Week A rotating spotlight on ONE deep activity with a themed bonus modifier THIS doc, Pillar C
Ongoing / career Hunter's Contracts A self-paced escalating ladder of per-enemy-type slay contracts feeding a prestige track THIS doc, Pillar B
Per-run / lifetime Ascension (New Game Plus) Replay the story at an escalating difficulty floor for prestige tiers, exclusive titles, a leaderboard standing, and a shot at a better ending THIS doc, Pillar A (the headline)

The four cadences are deliberately non-overlapping so they never duplicate each other:

  • The daily reads the total kill/clue counters for a small same-day target; it resets daily and pays a daily streak.
  • A contract (Pillar B) reads a single enemy type's count for a big cumulative target that spans many sessions; it never resets on a clock and pays a separate Contract-Points prestige track.
  • The Trial (Pillar C) is about the deep activities (dungeons/waves/raids/…), not kills/clues at all, and rotates on a weekly boundary.
  • Ascension (Pillar A) is a lifetime per-run counter that re-opens the whole authored story.

Same instinct as the daily framework ("one fresh small thing"), but spread across longer horizons so a post-story player has the daily and a week-scale goal and a career-scale climb at all times.

Unlock — what counts as "finished the main story"

The Ascendant's Path unlocks on first completion of the main Dark Tower storyline: reaching one of the cards that end it, DarkTowerBasicFeatures.STORY_ENDED_CARDS. Those are the three played endings of chapter 20 (cards 35733, 35745 and 35773), the credits card 36000 each leads to, and the retired Arc One ending router 35877, kept so nothing a player could earn is taken away. On that first arrival:

  • Grant a new clue CLUE_PATH_OF_ASCENSION_OPEN (reuses the clue system — no new boolean field) at the ending router. The clue is the gate for every Ascendant's Path surface and NLU entry below.
  • Speak a one-time unlock beat: "You have seen this story through to its end. The Ascendant's Path opens to you now. Say ascension to walk it." (voice-first; states what happened + the next action).

Fallback unlock (high-level players who never formally "ended"): also grant the clue at level 100 (the paragon-unlock threshold) on session load if not already present, so a deeply-leveled player who explored instead of finishing the story still reaches the endgame loop. Both grants are idempotent (hasClue short-circuits), exactly like ensureRaidBossClueUnlocked (exploration.md § Raid boss unlock).

The unlock keys on the main storyline (DARK_CITADEL) only. The other four storylines (Last Light, Zoo Keeper, Chess Maven, Ghost Stories) are independent stories (narrative.md); they keep their own progress and are reachable any time via story-switch. Ascension acts on whichever storyline the player chooses to ascend (default the main story), see Pillar A.


Where the regulars hear it

The loop is named where regulars already are, not only behind its own commands:

  • The Solo Menu. For a player holding CLUE_PATH_OF_ASCENSION_OPEN, the Solo Menu speaks this week's trial and the first open contract before its options ("This week's trial is Tower Waves, with double rewards. Your open contract: goblins, 48 of 100.") and offers trial, contracts and ascend among them. The line is DarkTowerBasicFeatures.namePostStoryLoop; the Solo Menu card's own text is content.
  • The capture grind. For a player without the clue, every 25th capture (, the CAPTURE count in actionUsage, which only a successful capture adds to; fishingStats also counts fish caught, so it is not read) speaks the step, the kill total (enemyKills) and where the story leads: "Another 25 creatures captured, and 340 enemies defeated. See the main story through to its end to open the Ascendant's Path." It never speaks a lifetime capture total: the CAPTURE count starts at zero for a player who captured before it existed, so a veteran with hundreds of captures would hear 25.

Pillar A — Ascension (New Game Plus): the headline replay + prestige hook

The core of the audit ask ("replay incentives, prestige/NG+-style hooks, replay with carried-over progression"). Ascension lets a finished player re-run the authored story they already own in a way that is fresh, harder, and rewarding — without one byte of new narrative content.

What ascending does

When the player says "ascend" at or after story completion and confirms:

  1. Re-open the story. Reset the active storyline's position to its chapter-1 start (DARK_CITADEL → card 30000) and clear that storyline's discovered clues so the clue-gated branching and the clue-count-gated ending (narrative.md § Arc One Ending System) are fully replayable. This reuses the existing per-chapter clue-removal replay mechanic (narrative.md: "When replaying a chapter, clues found in that chapter are REMOVED…") — Ascension does it for the whole storyline at once, atomically. CLUE_PATH_OF_ASCENSION_OPEN is NOT cleared (it is the permanent unlock).

  2. Carry the character over, intact. Level, XP, equipment, gems, paragon, companions, gods + devotion, gold/diamonds/resources, titles, permanent buffs, inventory — ALL preserved. This is exactly the carry-over story-switching already performs (narrative.md § Story Switching Mechanic: "Character carries over: level, equipment, inventory, gold unchanged"); Ascension is a story-switch that also resets clues and bumps the ascension counter.

  3. Raise the difficulty floor. Increment ascensionLevel and apply a per-run minimum encounter difficulty (the player may still choose HIGHER manually):

    ascensionLevel Difficulty floor on this run Why
    0 (pre-ascension) player choice (EASY default) unchanged base game
    1 HARD floor first ascension = the existing HARD reward tier (loot 150%, +25% HP enemies)
    2 NIGHTMARE floor loot 200%, the NIGHTMARE rarity table
    3+ HELLSCAPE floor loot 300%, the top rarity table

    This is the difficulty-as-reward-lever pillar (index.md Design Pillars #4): a higher floor means the existing difficulty reward table (combat.md / economy.md) already pays strictly better loot and money. The "reward" for ascending is better drops and a real challenge, delivered entirely through the existing difficulty system — no new loot tables.

What ascending grants (prestige + cosmetic, NEVER raw combat power)

Ascension's rewards are deliberately prestige, difficulty, and cosmetic — it must NOT hand out combat stats, because the combat-stat lane is paragon-only by deliberate design (economy.md § Permanent Non-Combat Buffs: "The combat-stat lane stays paragon-only"). Ascension respects that wall:

  • Exclusive Ascendant title tier. Each ascension milestone unlocks an Ascendant-tier title in the existing Title Shop rotation (economy.md § Title Shop) — e.g. Ascendant (A1), Twice-Ascended (A2), Thrice-Ascended (A3), The Eternal Climber (A5), with a Mythic capstone at A10. Gated by ascensionLevel, claimed with gold like every other title (milestone = eligibility, gold = tax). This reuses the title gate + voice-display plumbing wholesale; the build epic adds the gate predicate + catalog rows, no new system.
  • Ascension leaderboard standing. Highest ascensionLevel becomes a DARK_TOWER cross-game leaderboard metric, riding the existing weekly season infra (engine/prestige.md § 3 — DARK_TOWER already participates, opted out of payout). Social comparison ("who has ascended the most") is a strong return reason and needs no new scheduler — it snapshots into the weekly season like the existing level/gold metric.
  • Ascendant's Boon (optional, tunable, conservative default). OPTIONALLY, each ascension grants a small capped QoL reward — NOT a combat stat — to give a tangible permanent tick. The safe options, in preference order: (a) a small premium diamond grant at milestone ascensions only (every 3rd), via with a NEW PremiumCurrencySource.ASCENSION (audited purchase_transactions row in the same call, per economy.md § Premium Currency Mutation Discipline); or (b) a tiny capped find-bonus tick that shares the existing permanent-buff caps so it can never exceed them. Default: option (a), milestone diamonds only — it is the cleanest economy-safe, audited reward and keeps Ascension's primary draw the difficulty + prestige, not a power grind. The build epic picks (a)/(b)/none with balance sign-off; (a) is the recommended default.

The "better ending" pull

Because ascension clears the storyline's clues and the Arc One ending is entirely clue-count gated (narrative.md: 12+ = Total Victory, 8-11 = Pyrrhic, 4-7 = Tragic, 0-3 = Defeat), a player who got a Tragic or Pyrrhic ending the first time can ascend and chase Total Victory with a far stronger character — a concrete, narrative-anchored replay goal that exists for free in the current ending system. Track and surface each storyline's best ending achieved across all ascensions (a small per-storyline "best clue count" high-water mark) so the player sees their own target ("Your best run reached a Pyrrhic Victory with nine clues. Can you find all twelve this time?").

State (one justified new field)

  • ascensionLevel: int on (per character) — the NG+/prestige counter. Justified: no existing field records "how many times this character has completed and re-run the story"; it is the analogue of paragon's level counter and the Lineage dynasty-ascension counter (engine/prestige.md). Everything else (clue clear, carry-over, difficulty floor) reuses existing mechanics.
  • bestEndingClueCountByStoryline: Map<String,Integer> (small) — the best-ending high-water mark for the "better ending" pull. Optional; can be derived/stored minimally. The build epic decides persistence.

Pillar B — Hunter's Contracts: the self-paced escalating grind goal

Between ascensions a player needs a long, satisfying grind target that is NOT the daily. Hunter's Contracts is an escalating, per-enemy-type slay ladder built directly on the bounty system Dark Tower already has but underuses (exploration.md § Bounty System: activeBounties: Map<DarkTowerEnemyTypes, KeyValueLongLong> already tracks per-enemy-type kill targets + progress, and COLLECT_BOUNTY_COMPLETION_REWARD already exists).

How contracts work

  • The player holds up to 3 active contracts at once (reuses the activeBounties map; cap 3). Each contract is "Slay N {enemyType}."
  • Targets escalate by tier (career-scale, NOT a daily number): T1 = 25, T2 = 100, T3 = 250, T4 = 500, T5 = 1000 of a given enemy type. The next tier for an enemy type unlocks after the prior tier's contract is collected.
  • Progress reuses the existing enemyKills tracker ({enemyType}_{difficulty}, written by DarkTowerStatsUtility on every kill — the same counter the daily reads). A contract's progress is sum(enemyKills for that enemy type across all difficulties) − snapshotAtContractStart — a DELTA_SINCE_CONTRACT_START read, mirroring the daily framework's DELTA_SINCE_DAY_START trick (daily-framework.md § Objectives reuse existing trackers). No new per-kill event plumbing.
  • Enemy-type selection is a date+player-seeded pick from DarkTowerEnemyTypes (the deterministic seed pattern already proven by the Token Shop / Title Shop / daily), refreshed when a contract is completed or abandoned — so contracts feel varied without a cron or stored rotation cursor.

Contract rewards (Contract Points — a separate track from the daily streak)

Collecting a contract via COLLECT_BOUNTY_COMPLETION_REWARD pays:

  • Gold (soft), escalating with tier — T1 ≈ 5,000 up to T5 ≈ 250,000, difficulty-boosted and money-cap aware like every other DT gold reward, riding (soft-currency carve-out, no premium ledger — economy.md). Starting numbers; tune in the build.
  • Contract Points — a new prestige counter accumulated across all collected contracts. Contract Points are the Contracts track's "currency of pride" and feed milestone rewards: every 10 Contract Points, grant a small premium diamond reward via with the new PremiumCurrencySource.ASCENSION source (or a sibling POST_STORY source — the build epic names it; the audit row is mandatory per economy.md). Contract Points also feed the Ascendant's Path prestige standing (they can count toward the Ascension leaderboard's secondary metric).

NLU / surface (build-epic; collision-aware)

A Contracts ledger surface, reached by voice with contracts, my contracts, hunter contracts, bounty contracts, contract board, show my contracts. Collision note (mandatory): the daily already owns bounty board (→ the daily Bounty Board) and bare bounty (→ MESSAGE_BOARD_BOUNTY) — see daily.md § NLU surface. Contracts MUST therefore be named/keyed as "contracts", NOT "bounty board", and the build epic verifies no shadowing in both directions (a contracts phrase must not steal the daily's bounty board, and vice-versa) with scenario_tests, exactly as did for the daily daily/bounty board shadow.

State

Reuse activeBounties for the up-to-3 live contracts (existing field). Add a per-enemy-type highest tier cleared cursor (small map) + a contractPoints: long counter on . These are the minimal new fields; the build epic may instead persist the contract ledger in a claude.* table (mirror the daily's claude.daily_challenge decision) — decided at build time per .claude/rules/data-catalog.md. (repository root)


Pillar C — Trial of the Week: the rotating variety + deep-activity pull

Status (2026-07-16). BUILT end-to-end for six of the nine pool activities. The 2026-07-12 fix made the shipped rotation/NLU surface honest but non-payable: it added the activityCompletedThisWeek completion-proof gate and removed the false "pays double X" copy because nothing called recordActivityCompletion yet. This task closes that gap: TrialActivity now carries a stable key (not just a voice title) via / applyTrialBonus, and recordActivityCompletion plus the TRIAL_BONUS_MULTIPLIER are wired at the real completion point of Tower Waves (any wave cleared), Invasions (a won assault — gold-steal is zero-sum player-vs-player, so it is deliberately never multiplied), Raids (boss-kill gold + tokens, multiplied), Arena (ranked-battle win gold, multiplied), Spin the Wheel, and the Orc War Chest (both share DarkTowerSpinTheWheelBasics.spinGame(), disambiguated by a new trialActivityKey() per subclass; their reward is a rarity-table roll, not a scalar, so no multiplier is applied there). A "complete" option is now offered on the Trial hub only once the completion proof exists, so the claim is reachable by voice. Residual gap: the three world-map dungeons (Lich Lair, Goblin Dungeon, Graveyard Dungeon) are pure card content processed through the generic pipeline with no discrete "dungeon run completed" event distinct from "visited a card" — inventing one risks a false completion signal (an exploit), so they are left honestly unwired: those three spotlight weeks still show "not claimable yet" exactly as before this task. Wiring them needs a small follow-up to add or find a real dungeon-exit/completion signal (e.g. a save/restore-position hook).

Dark Tower has a deep but disconnected set of high-tier activities — Lich Lair / Goblin / Graveyard dungeons (NIGHTMARE loot, DANTRINE rarity), Tower Waves (WHITE rarity), Invasions (INDIGO), Raids (RED, boss at 600 raid points), Arena, Spin the Wheel, Orc War Chest (exploration.md, economy.md). After the story these are "the things to do," but nothing pulls a player through them. Trial of the Week is a weekly rotating spotlight that does.

  • Selection: SHARED, week-seeded — index = floorMod(floorDiv(epochDay, 7), pool.size) over a stable pool of the deep activities. Resets at the weekly boundary; no cron, no stored cursor — the same deterministic-rotation model the daily, Token Shop, and Title Shop all use. Weekly (not daily) cadence mirrors the existing weekly rhythm (engine/prestige.md).
  • The spotlight: each week one activity is "The Trial" with a themed bonus modifier applied to that activity's EXISTING reward path (economy-safe by construction — a temporary multiplier on payouts the game already grants, never a new faucet). Examples (tunable): "This week, the Lich Lair pays double special tokens." / "This week, Tower Waves drop a guaranteed WHITE-rarity item at wave 25." / "This week, raid kills grant 50 percent more raid points." / "This week, every Spin uses the HELLSCAPE rarity table."
  • Completion reward: finishing the week's Trial once grants a modest gold bonus + Contract Points (ties Pillar C into the same prestige track), and counts toward the Ascension leaderboard's activity metric. No new currency.
  • State: none for selection (pure function of the week, like the Token Shop). A small per-player "trial completed this week" boolean (week-keyed) guards the one-time completion bonus — reuse the claude.daily_challenge-style store keyed by week, decided at build.

Why weekly and not daily: the daily is the small same-day kill/clue bounty; the Trial is a bigger, deeper commitment (clear a 500-card dungeon, push a wave gauntlet) that wants a longer window and a fresher-feeling rotation. The two never overlap in content (kills/clues vs deep activities) or cadence (day vs week).


Reward-economy safety (summary — every grant rides an audited path)

Per economy.md and the daily framework's reward model:

Grant Currency Path Audit
Contract completion gold Gold (soft) Soft-currency carve-out (no premium ledger), money-cap + double-money aware
Trial completion gold Gold (soft) existing activity reward path Same
Trial bonus modifier — (multiplier on existing payouts) rides the activity's existing reward path Same; no new faucet
Contract-Points milestone tokens earned Special Tokens (DARK_TOWER_TOKEN, ledger dark_tower_tokens) → , source ASCENSION Mandatory game_log.purchase_transactions row in the same call. EARNED reward → tokens, not Diamonds (epic 24205)
Ascendant's Boon milestone tokens (option a) earned Special Tokens (DARK_TOWER_TOKEN) → , source ASCENSION Same mandatory audit row. EARNED reward → tokens, not Diamonds (epic 24205)
Ascension itself — (difficulty floor + Title Shop unlock + leaderboard) reuses difficulty system + Title Shop + season infra No currency write

Currency note (epic 24205, 2026-07-13): these post-story milestone rewards are EARNED, so they now pay the earned Special Token currency (DARK_TOWER_TOKEN, ledger dark_tower_tokens), NOT purchase-only Diamonds — no free faucet may credit Diamonds. Source stays ASCENSION.

Adding the new PremiumCurrencySource value AND its row in the economy source-taxonomy table is part of the build epic (mirrors how the daily framework added PremiumCurrencySource.DAILY_CHALLENGE). A boot-time wiring assertion (mirror ) should validate every premium grant path so a half-wired post-story reward can never ship.

Voice-first / never-dead-end (mandatory)

Every Ascendant's Path surface obeys philosophy/player-experience.md: state what happened, where they are, and a clear next action, with no parens/brackets/slashes/ abbreviations. Canonical shapes (starting copy, tune in build):

  • Ascension prompt: "You stand at the Ascendant's Path, ascension level two. Ascend again to begin the story anew at a Nightmare difficulty floor, keeping every level, item, and power you have earned. Your best run reached a Pyrrhic Victory with nine clues. Say ascend to climb, or say contracts to take a hunt instead."
  • Contracts readout: "You have two active contracts. Slay one hundred Cultists, you are at sixty two. Slay twenty five Dragonkin, you are at twenty five — say collect to claim it. Say new contract for a third hunt."
  • Trial readout: "This week's Trial is the Lich Lair, and it pays double special tokens. Say free explore to travel there, or say daily for today's Bounty Board."

A confirmation step gates ascension (it re-opens the story) — never ascend on a bare ambiguous word; require an explicit "ascend" + yes, per the confirmation-options standard.

Regression shape (hermetic — for the build epics)

Per .claude/rules/hermetic-scenario-tests.md and the daily's precedent — every test seeds its own precondition and asserts the date/RNG-independent surface only:

  • Ascension → JUnit + scenario_test: ascending from a completed story clears the storyline's clues, preserves level/gold/equipment, increments ascensionLevel, and raises the difficulty floor. Seed a completed-story character (set CLUE_PATH_OF_ASCENSION_OPEN + clues via the existing setStoryClues seeder, narrative.md FIX 2 note), assert the floor + carry-over; NEVER assert a rotating objective's text.
  • Contracts → scenario_test: the contracts readout names the stable "Contracts" surface and the "N of M" progress shape; collect on an incomplete contract is a graceful no-op; the per-enemy-type delta reads from the existing enemyKills snapshot. Author via add_scenario_test (raw INSERT prohibited).
  • Trial → JUnit: the week-seed selection is deterministic (same epoch-week → same Trial; floorMod wraps; stable pool order). Scenario_test asserts the stable "Trial of the Week" title + that the bonus is announced; NEVER the specific rotating activity.
  • Reward + premium → JUnit + scenario_test: pre < post and source=ASCENSION (or POST_STORY) on the premium audit row; double-claim/idempotent milestone is a no-op.
  • NLU → process_tests: every new phrase (ascend, ascension, my ascension, contracts, hunter contracts, trial of the week, weekly trial, collect/new contract), PLUS an explicit anti-shadow assertion that the daily bounty board / daily still resolve to the daily (the task-22369 lesson).

What this does NOT do (scope guards)

  • Does not re-spec, re-skin, or move the daily Bounty Board (E5). It references it.
  • Does not write new authored story/cards (Arc Two is a separate narrative-authoring effort). Ascension re-uses the existing story; the "new content" feeling comes from the clue reset + difficulty floor + better-ending chase, not new prose.
  • Does not grant raw combat stats (paragon's lane). Ascension pays difficulty + prestige + cosmetic.
  • Does not add a cron/scheduler for selection. Everything rotates on a deterministic date/week function (the proven model). The ONLY place a real scheduler could later earn its keep is an optional proactive "your weekly Trial resets soon" nudge — explicitly DEFERRED, and if built it only notifies, never selects, riding the existing pattern.
  • Does not introduce a parallel PvP marketplace — the player-driven auction revisit is its own roadmap (economy-2.0-roadmap.md); Contracts/Trials touch only the existing NPC-seller auction and the existing activity reward paths.

Build epics (all four pillars BUILT — -07-16)

Build status (2026-07-16). Closes out the epic flagged by / RVF report group 159 finding F2. PS1 + PS2 core shipped 2026-07-01 (below). This task built the remainder:

  • PS3 (Hunter's Contracts) — the full ledger, escalating tiers, enemyKills DELTA progress, gold + Contract-Points payout, the audited milestone token grant, and the collision-safe contracts NLU surface were already complete on develop when this task started (, , ) — verified against the design and left unchanged.
  • PS1/PS2 deferred sub-parts — also already complete on develop: the audited Ascendant's Boon Special-Token grant + validatePostStoryWiring() boot assertion (), the Title Shop Ascendant tier ( — TITLE_ASCENDANT/TWICE_ASCENDED/ THRICE_ASCENDED/THE_ETERNAL_CLIMBER/ASCENDANT_ETERNAL gated on ascensionLevel), the ascension leaderboard metric ( already orders DARK_TOWER by ascension_level DESC; writes it on every ascension), and the per-storyline best-ending high-water mark + "better ending" pull copy (/bestEnding, surfaced in the hub readout). This task backfilled the one true gap found in these: the ASCENSION PremiumCurrencySource had a real caller but no row in the economy.md / game-log.md source taxonomy — added in the same session per .claude/rules/data-catalog.md. (repository root)
  • PS4 (Trial of the Week) — this task's main engineering work. See the Pillar C status note above for the full detail: recordActivityCompletion + the themed bonus multiplier are now wired into six of the nine pool activities (Tower Waves, Invasions, Raids, Arena, Spin the Wheel, Orc War Chest); the three world-map dungeons remain a named, honest residual gap (no discrete completion event exists to wire safely). The Trial hub now offers a "complete" option once the completion proof exists, closing the last reachability gap in the shipped surface.

Tests added/updated this task: (isThisWeeksTrial/applyTrialBonus coverage), plus scenario_tests for the Contracts ledger, the anti-shadow NLU guard, and the Trial completion payout (see the scenario_tests list below). Build green; DARK_TOWER scenario suite green.

PS1 + PS2 core build (2026-07-01, / RVF report group 159 finding F2)

PS1 (post-story scaffold: CLUE_PATH_OF_ASCENSION_OPEN granted at card 35877 plus a level-100 session fallback, the ascensionLevel field, and the reachable Ascendant`s Path hub with its goal-ladder readout) and PS2 (Ascension / New Game Plus: the ascend command plus confirmation, the atomic storyline clue-clear plus chapter-1 reset through the story-navigation carry-over path, and the HARD to NIGHTMARE to HELLSCAPE per-ascension difficulty floor) were BUILT and shipped as the minimal goal-ladder remediation for the unstructured-grind finding. Code: , , DarkTowerBasicFeatures.grantAscensionUnlockIfStoryEnded, .addAlsoOptions (level-100 fallback plus hub option), DarkTowerClueTypes.CLUE_PATH_OF_ASCENSION_OPEN, .ascensionLevel. Tests: JUnit DarkTowerAscensionUtilitiesTest plus scenario_test 2524.

Original build-epic breakdown (flagged in the design task — PS1/PS2 now partly delivered above)

The owner decision is "design the loop now; build follows." This doc is the design. The build splits into a shared post-story scaffold epic + three pillar epics, each game-engine code carrying the per-commit game_test.scenario_tests obligation (.claude/rules/deploy-gating.md) and (repository root) a same-change update to this doc / the index:

# Epic Scope Status
PS1 Post-story scaffold + unlock CLUE_PATH_OF_ASCENSION_OPEN grant at card 35877 + the level-100 fallback (idempotent); ascensionLevel field on ; the PremiumCurrencySource.ASCENSION enum value + economy source-taxonomy row; boot-time wiring assertion for the premium grant path; the Ascendant's Path hub readout + NLU clue-gate. BUILT (taxonomy row backfilled )
PS2 Ascension (NG+) The ascend command + confirmation; atomic storyline clue-clear + chapter-1 reset reusing the story-switch carry-over path; per-ascension difficulty floor (HARD→NIGHTMARE→HELLSCAPE); the Ascendant title tier in the Title Shop (gate predicate + catalog rows); the highest-ascensionLevel leaderboard metric into the existing weekly season snapshot; the per-storyline best-ending high-water mark + the "better ending" pull copy; the default Ascendant's Boon (milestone tokens, audited). Scenario_tests: clue-clear + carry-over + floor + increment. BUILT
PS3 Hunter's Contracts The Contracts ledger on top of activeBounties (up-to-3, escalating per-enemy-type tiers via enemyKills DELTA snapshot); gold + Contract-Points payout on collect; Contract-Points milestone premium grant (audited); the contracts NLU surface with the mandatory anti-shadow guard vs the daily bounty board/bounty. Scenario_tests: progress read, collect no-op, anti-shadow NLU. BUILT
PS4 Trial of the Week Week-seeded rotation over the deep-activity pool (SHIPPED); the themed bonus modifier applied via applyTrialBonus; the completion-proof gate (SHIPPED 2026-07-12) plus recordActivityCompletion wired into 6 of 9 pool activities (Tower Waves, Invasions, Raids, Arena, Spin the Wheel, Orc War Chest); the trial of the week NLU surface plus a reachable "complete" option (SHIPPED). BUILT (6/9 activities); 3 world-map dungeons honestly deferred
PS5 (optional) Proactive Trial/contract reminder push DEFERRED. If retention data justifies it, an Alexa-reminder / pending-voice nudge that only notifies, riding the existing batch.batch_registry + Java scheduler pattern. Never selects. DEFERRED

Sequence: PS1 → PS2 (headline) → PS3 → PS4; PS5 only if data justifies. Each per-pillar epic updates this doc's status table for its pillar in the same change.

  • daily.md + engine/daily-framework.md — the daily Bounty Board this sits above (E5); add a "post-story loop" cross-link to daily.md when PS1 lands.
  • narrative.md — Arc One ending router (35877), clue-count endings, clue-removal replay, setStoryClues seeder, story-switch carry-over.
  • progression.md — paragon (the combat-stat lane Ascension must not invade), level cap, multi-character.
  • economy.md — reward path, premium audit discipline, soft-currency carve-out, Title Shop, permanent-buff caps, NPC auction vs PvP roadmap.
  • exploration.md — the deep activities Pillar C rotates over + the activeBounties system Pillar B reuses.
  • combat.md — enemyKills counter + the difficulty reward lever.
  • engine/prestige.md — cross-game prestige + the weekly the Ascension leaderboard rides.
  • philosophy/player-experience.md — voice-first, never-dead-end.
  • .claude/rules/hermetic-scenario-tests.md / .claude/rules/deploy-gating.md — the regression discipline (repository root) for the build epics.