Act 3 Gate Spec: Outpost to Settlement
Context
This doc authors the gate predicate that authorizes the
ActState.CurrentAct: 3 -> 4 transition (the Act 3 Settlement act
finishing and Act 4 Banner Network 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(3)
followed by OnActStarted(4) when the predicate becomes true.
The source act doc is ./gd-act-3-settlement.md. The "Boundary Into Act 4" section at lines 50-58 names the act's end state: the first settlement is stable enough to export people, goods, or authority, with new claimed land evaluable as future outposts or satellite footholds.
The Act 3 -> Act 4 transition is also the moment that the
Realm.PolityRank promotion from Outpost to BannerNetwork takes
effect. Per
../lore/adr/ad-0009-realm-scope-and-polity-rank-orthogonality.md
lines 75-80, the BannerNetwork promotion requires that the Realm
covers at least two Settlements connected via Route coverage; the
exact Route-coverage predicate is authored here per the ad-0009 line
80 inline invite to author it in Wave 3a.
Gate Predicate
Act 3 is complete when the first settlement supports outward expansion without collapsing its own core obligations, and the Realm covers at least two Route-connected Settlements eligible for BannerNetwork promotion. Expressed as named state on committed scopes:
ActState.CurrentAct == 3
&& Realm.PolityRank == PolityRank.Outpost
&& Realm.CoveredSettlements.Count >= 2
&& Realm.CoveredSettlements.Any(s => s.IsFirstOutpost && s.GrowthState == StableSettlement)
&& RealmRouteCoverage(Realm) == Connected
&& Realm.CoveredSettlements.Sum(s => s.ProductionState.ExportCapacity) >= Config.Act3.MinRealmExportCapacity
Where the RealmRouteCoverage predicate (the Route-coverage
predicate invited by ad-0009 line 80) is defined as:
RealmRouteCoverage(Realm) == Connected
iff every pair (a, b) in Realm.CoveredSettlements
has a Route path through Realm.OwnedRoutes
such that every Route segment has RouteState >= Secured
and no Route segment in the path has TaintState == Severed
Named-state sources:
ActState.CurrentActper ad-0010 line 53.Realm.PolityRankandRealm.CoveredSettlementsper ad-0009 lines 56-71.Settlement.GrowthStatederives from the Settlement scope's growth lifecycle (per gd-act-3-settlement.md lines 36-44 — the required outcomes name a functioning settlement loop scaled beyond the MC's personal chores).Settlement.ProductionState.ExportCapacityis the "export people, goods, or authority" capacity at gd-act-3-settlement.md line 53.Realm.OwnedRoutesis the Realm-scoped Route collection; the Route entity is committed in gd-settlements-and-outposts.md lines 35-37 and gd-act-4-banner-network.md.Route.RouteStateandRoute.TaintStateare per-Route channels carrying corridor security and corruption state (corridor security is a gd-act-4-banner-network.md line 18-22 concern).Config.Act3.MinRealmExportCapacityis a UI-exposed Config field with world-size-parameterized defaults.
Triggered Events
When the predicate transitions to true, the ActProgression system
fires (in order):
OnActCompleted(ActProgressionArgs { PreviousAct = 3, NewAct = 4, TransitionDay = <current day> }).PolityRankAdvanced(RealmId, PolityRank.Outpost, PolityRank.BannerNetwork)per ad-0009 lines 169-173 (working name; promotion to committed metadata is the Wave 5a runtime-backing wave).OnActStarted(ActProgressionArgs { PreviousAct = 3, NewAct = 4, TransitionDay = <current day> }).
Both Act-progression events carry trigger on_action per ad-0010
lines 81-84.
Capability Unlocks
The Act 4 unlock surface is the Banner Network polity rank and the inter-Territory defense / patrol / route surface, per gd-act-4-banner-network.md lines 6-30 and ad-0009 lines 75-80:
Realm.PolityRankis nowBannerNetwork.- Forces become the canonical mobile actor for inter-Territory defense, escort, and patrol per gd-act-4-banner-network.md lines 24-27.
- Operations such as
PatrolTerritory,SecureRoute, andEscortCaravanbecome standard tools per ../systems/gd-operations.md. - Different holdings can specialize within one banner network.
DefenseZones remain locked until Realm.PolityRank >= Province per
ad-0009 line 91. Fronts remain locked until Crown per ad-0009 line
92.
Runtime Backing Status
Status at this doc's acceptance time: contract-only.
- Host/runtime owner:
legacy/v1/examples/valenar/Host/Systems/ActProgressionSystem.cs(proposed) reads the predicate. The PolityRank promotion is driven bylegacy/v1/examples/valenar/Host/Systems/RealmRankSystem.cs(proposed) per ad-0009 lines 151-156. Both authored in Wave 5a. - Source/generated owner: predicate body in
Content/acts/systems.secs; PolityRank ladder predicate body inContent/realm/systems.secs. Matching Generated stand-ins. - Read-model/UI owner: the Crown-scale strategic map gains a PolityRank display per ad-0009 lines 162-165. The Banner Network view is unlocked on transition.
- Tests:
<deferred-to-wave-5a>runtime-backing wave. - Illegal fallback behavior: throws
IllegalTransitionExceptionif any input cannot resolve. No "if there are two Settlements with any RouteState" relaxation; the full Route-connected predicate is binding. No calendar-elapsed 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-3-settlement.md
- ./gd-act-4-banner-network.md ../systems/gd-act-progression.md
- ../systems/gd-realm-ranks-and-polity.md
- ../systems/gd-settlements-and-outposts.md
- ../systems/gd-state-machines-and-transitions.md