Act 5 Gate Spec: Province to Crown
Context
This doc authors the gate predicate that authorizes the
ActState.CurrentAct: 5 -> 6 transition (the Act 5 Province act
finishing and Act 6 Crown beginning) per
../lore/adr/ad-0010-act-progression-actstate-scope.md.
The transition is driven by the ActProgression system, which reads
this predicate against committed scopes and fires OnActCompleted(5)
followed by OnActStarted(6) when the predicate becomes true.
The source act doc is ./gd-act-5-province.md. The "Boundary Into Act 6" section at lines 42-49 names the act's end state: provincial administration is stable enough to scale upward, and military and policy questions cross Province borders.
This transition is also the Realm.PolityRank promotion from
Province to Crown. Per
../lore/adr/ad-0009-realm-scope-and-polity-rank-orthogonality.md
lines 85-87, the Crown promotion requires that at least two
Provinces under the Realm have ProvinceCapitals.
Gate Predicate
Act 5 is complete when at least two Provinces under the Realm carry ProvinceCapitals, and Province-scale administration is stable enough that strategic questions cross Province borders. Expressed as named state on committed scopes:
ActState.CurrentAct == 5
&& Realm.PolityRank == PolityRank.Province
&& Realm.Provinces.Count(p => p.HasProvinceCapital == true) >= 2
&& Realm.Provinces.All(p => p.Plan.PlanState == Committed || p.Plan == null) // optional plans don't block
&& Realm.Provinces.Count(p => p.Plan != null && p.Plan.PlanState == Committed) >= Config.Act5.MinCommittedProvincePlans
&& Realm.StandingForces.Count(f => f.ReadinessState == OperationalReadiness) >= Config.Act5.MinStandingForceCount
Named-state sources:
ActState.CurrentActper ad-0010 line 53.Realm.PolityRankper ad-0009 lines 56-71.Realm.Provincesis the Realm-scoped Province collection; the Province scope is the geographic Province committed in gd-act-5-province.md and distinguished in ad-0009 lines 194-196 from the PolityRank.Province value.Province.HasProvinceCapitalderives from the underlying Settlement designationProvinceCapitaland the Province's designated capital binding.Province.Planis the ProvinceDefensePlan per ../systems/gd-defense-zones.md;Plan.PlanState == Committedcorresponds to gd-act-5-province.md line 23 ("Standing Forces and DefenseZones matter more than ad-hoc local response").Realm.StandingForcesis the Realm-scoped standing-Force collection;Force.ReadinessState == OperationalReadinessis the Province-scale standing-Force commitment per gd-act-5-province.md line 23 and ../systems/gd-forces.md.Config.Act5.MinCommittedProvincePlansandConfig.Act5.MinStandingForceCountare UI-exposed Config fields with world-size-parameterized defaults.
Triggered Events
When the predicate transitions to true, the ActProgression system
fires (in order):
OnActCompleted(ActProgressionArgs { PreviousAct = 5, NewAct = 6, TransitionDay = <current day> }).PolityRankAdvanced(RealmId, PolityRank.Province, PolityRank.Crown)per ad-0009 lines 169-173 (working name).OnActStarted(ActProgressionArgs { PreviousAct = 5, NewAct = 6, TransitionDay = <current day> }).
Both Act-progression events carry trigger on_action per ad-0010
lines 81-84.
Capability Unlocks
The Act 6 unlock surface is the Crown polity rank and the Front authoring surface, per gd-act-6-crown.md lines 6-26 and ad-0009 lines 85-87, 92:
Realm.PolityRankis nowCrown.- Fronts become available: Crown-scale grouping of multiple ProvinceDefensePlans, Forces, Territories, Routes, Sites, and Threats under named Campaign Goals per ../systems/gd-fronts.md.
- National policy and diplomacy become first-class surfaces.
- The FrontCandidate scope's elevation path to a Front becomes legitimately available per ad-0008's Crown-binding rule.
Reclamation Operations at large scale remain Act 7 scope; Act 6 is the formal Crown-scale ruling-and-projection act, not the reclamation push.
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. PolityRank promotion is driven bylegacy/v1/examples/valenar/Host/Systems/RealmRankSystem.cs. The second-Province-with-Capital predicate corresponds to the ad-0009 line 171 known-gap ("the exact second-Province predicate for Province -> Crown"), now bound here. - Source/generated owner: predicate body in
Content/acts/systems.secs; PolityRank promotion predicate body inContent/realm/systems.secs. Front declarations inContent/fronts/scopes.secs(proposed). - Read-model/UI owner: the React client gains a Crown-scale strategic map and Front roster surface; ad-0009 lines 162-165 names the Realm.PolityRank display.
- Tests:
<deferred-to-wave-5a>runtime-backing wave. - Illegal fallback behavior: throws
IllegalTransitionExceptionif any input cannot resolve. No fallback that promotes PolityRank to Crown without two explicit ProvinceCapital designations. No calendar-elapsed or province-age fallback. - Next closure wave: Wave 5a runtime-backing wave.
Cross-References
- ../lore/adr/ad-0010-act-progression-actstate-scope.md
- ../lore/adr/ad-0009-realm-scope-and-polity-rank-orthogonality.md
- ./gd-act-5-province.md
- ./gd-act-6-crown.md ../systems/gd-act-progression.md
- ../systems/gd-realm-ranks-and-polity.md
- ../systems/gd-defense-zones.md
- ../systems/gd-fronts.md
- ../systems/gd-state-machines-and-transitions.md