diff --git a/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs b/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs
index 0dfaa9c..a1389f6 100644
--- a/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs
+++ b/SVSim.BattleNode/Lifecycle/ScriptedLifecycle.cs
@@ -6,13 +6,11 @@ using SVSim.BattleNode.Protocol.Bodies;
namespace SVSim.BattleNode.Lifecycle;
///
-/// v1 hand-rolled scripted opponent. Static frame builders for the five lifecycle uris
-/// (Matched / BattleStart / Deal / Swap response / Ready) plus a trivial opponent TurnStart
-/// the dispatch pushes after the player's TurnEnd. The values are templated from the TK2
-/// captures at data_dumps/captures/battle-traffic_tk2_regular.ndjson — anything
-/// hardcoded here came from a real prod frame, with names + provenance in
-/// . The player-half of Matched/BattleStart now reads from
-/// instead of .
+/// Server-authored battle frames pushed to the client during match setup and teardown
+/// (Matched / BattleStart / Deal / Swap response / Ready) plus the post-mulligan hand
+/// computation. Used by every battle mode's handshake/mulligan dispatch arms. Hardcoded
+/// values are templated from the TK2 prod captures (battle-traffic_tk2_*.ndjson); see
+/// for provenance.
///
public static class ScriptedLifecycle
{
@@ -127,66 +125,6 @@ public static class ScriptedLifecycle
IdxChangeSeed: ScriptedProfiles.ReadyIdxChangeSeed,
Spin: ScriptedProfiles.ReadySpin));
- // --- Client-shaped emissions (legacy scripted-bot scaffolding, pending removal) so the
- // session brokers the bot through the same handshake arms as a human. Bodies for the parameterless
- // handshake frames are ignored by the session (it reads from.Context / phase); only
- // Swap's idxList is consumed (empty = keep the dealt hand).
-
- public static MsgEnvelope BuildClientInitNetwork() => ClientFrame(NetworkBattleUri.InitNetwork, EmitCategory.General);
- public static MsgEnvelope BuildClientInitBattle() => ClientFrame(NetworkBattleUri.InitBattle, EmitCategory.General);
- public static MsgEnvelope BuildClientLoaded() => ClientFrame(NetworkBattleUri.Loaded, EmitCategory.General);
-
- public static MsgEnvelope BuildClientSwap() =>
- new(NetworkBattleUri.Swap,
- ViewerId: FakeOpponentViewerId,
- Uuid: WireConstants.ServerUuid,
- Bid: null,
- Try: 0,
- Cat: EmitCategory.Battle,
- PubSeq: null,
- PlaySeq: null,
- Body: new RawBody(new Dictionary { ["idxList"] = new List