Act 7 Gate Spec: Reclamation to Campaign End
Context
This doc authors the gate predicate that authorizes the
ActState.CurrentAct: 7 -> CampaignEnded transition (the Act 7
Reclamation act finishing and the campaign-end ceremony beginning)
per
../lore/adr/ad-0010-act-progression-actstate-scope.md
lines 101-104. The transition is driven by the ActProgression
system. Unlike earlier Act-N -> Act-(N+1) transitions, the Act 7
completion fires OnActCompleted(7) followed by a follow-on
CampaignEnded event rather than OnActStarted(8) (there is no
Act 8; the campaign concludes).
The source act doc is ./gd-act-7-reclamation.md. The "Required Outcomes" section at lines 30-37 names the act's end state: the player can sustain long reclamation campaigns; realm projects, armies, and settlement output are tied into the same late-game agenda; corruption and gate systems are being reversed or contained at large scale; and the campaign has reached its final strategic identity.
The exact resolution shape of the apex-demon outcome is a deferred
design call. Per
../lore/adr/ad-0011-true-harm-placeholder-convention.md
and per .claude/rules/lore-conventions.md § "Deferred terms" (the
[apex demon gate name] and [specific True Harm material] rows),
the campaign-end resolution cannot name specific apex-demon or True
Harm material content here. The predicate uses placeholder slots
where the resolution shape is itself a deferred design call.
Gate Predicate
Act 7 is complete when the player has sustained Crown-scale reclamation campaigns to the point that the campaign's final strategic objective resolves. Expressed as named state on committed scopes:
ActState.CurrentAct == 7
&& Realm.PolityRank == PolityRank.Crown
&& Realm.Fronts.Count(f => f.FrontStatus == FrontStatus.Concluded
&& f.CampaignGoalKind == CampaignGoalKind.ReclamationCluster)
>= Config.Act7.MinConcludedReclamationFrontCount
&& Realm.SealedGateScars.Count >= Config.Act7.MinSealedGateScarCount
&& Realm.ApexDemonOutcomeState == ApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId>
&& Realm.AfterwarReadinessState == AfterwarReadinessState.Ready
Named-state sources:
ActState.CurrentActper ad-0010 line 53.Realm.PolityRankper ad-0009 lines 56-71 (the rank remainsCrown).Realm.Fronts,Front.FrontStatus, andFront.CampaignGoalKindper gd-fronts.md lines 176-190 and the Campaign Goal binding at gd-act-7-reclamation.md lines 17-20 and gd-act-6-crown.md lines 22-26.CampaignGoalKind.ReclamationClustercorresponds to the "Reclaim Territory Cluster" goal at gd-act-7-reclamation.md line 75.Realm.SealedGateScarsis the Realm-scoped count of gate scars that have completed theSealGateScarOperation per ../systems/gd-operations.md and gd-act-7-reclamation.md line 17.Realm.ApexDemonOutcomeStateand theApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId>slot is the apex-demon resolution predicate. The specific resolution shape (whether through[apex demon gate name]sealing, through[specific True Harm material]presented at the Wardheart, or through a different apex-class outcome) is deferred per ad-0011; Wave M binds the concrete resolution state.Realm.AfterwarReadinessStateis the readiness flag for the Afterwar consequence surface per gd-act-7-reclamation.md line 75 and the Afterwar period state row via lh-game1-world-hooks.md.Config.Act7.MinConcludedReclamationFrontCountandConfig.Act7.MinSealedGateScarCountare UI-exposed Config fields with world-size-parameterized defaults.
Triggered Events
When the predicate transitions to true, the ActProgression system
fires:
OnActCompleted(ActProgressionArgs { PreviousAct = 7, NewAct = 8, TransitionDay = <current day> })per ad-0010 lines 62-66.NewAct = 8is the campaign-ended sentinel; its binding rule is authored in Wave 5a.CampaignEndedfollow-on event per ad-0010 lines 101-104; its handler binding is deferred to Wave 5a.
OnActStarted does NOT fire on this transition; there is no Act 8.
Capability Unlocks
The Act 7 -> CampaignEnded transition surfaces the campaign-end ceremony per ad-0010 line 102; it does not unlock new in-campaign capability. The Afterwar consequence surface activates and the cosmological reveal lane's resolution concludes per gd-act-7-reclamation.md lines 53-57. The CampaignEnded event handler in Wave 5a surfaces the end-of-campaign UI surface; the exact ceremony shape is itself deferred Wave-5a content per ad-0010 lines 103-104.
Runtime Backing Status
Status at this doc's acceptance time: contract-only.
- Host/runtime owner:
legacy/v1/examples/valenar/Host/Systems/ActProgressionSystem.csreads the predicate and fires theCampaignEndedfollow-on. - Source/generated owner: predicate body in
Content/acts/systems.secs; CampaignEnded event declaration inContent/acts/events.secs. TheApexDemonOutcomeState.<TBD:ApexDemonResolutionStateId>slot binds in Wave M when the apex-demon resolution shape lands. - Read-model/UI owner: the React client gains a campaign-end view per the CampaignEnded handler; ad-0010 lines 169-172 names the saga-position display surface that this view supersedes.
- Tests:
<deferred-to-wave-5a>runtime-backing wave and<deferred-to-wave-M>for the apex-demon resolution binding. - Illegal fallback behavior: throws
IllegalTransitionExceptionif any input cannot resolve. No fallback that admits a[apex demon gate name]placeholder as already-resolved; the predicate explicitly fails until the deferred slot is bound. No calendar-elapsed, no time-in-Act-7 fallback. - Next closure wave: Wave 5a runtime-backing wave for
CampaignEndedwiring; Wave M for apex-demon resolution binding.
Cross-References
- ../lore/adr/ad-0010-act-progression-actstate-scope.md
- ../lore/adr/ad-0011-true-harm-placeholder-convention.md
- ../lore/adr/ad-0009-realm-scope-and-polity-rank-orthogonality.md
- ./gd-act-7-reclamation.md
- ./gd-act-6-crown.md ../systems/gd-act-progression.md
- ../systems/gd-fronts.md
- ../systems/gd-operations.md
- ../systems/gd-corruption-reclamation.md
- ../systems/gd-state-machines-and-transitions.md