pog-mcp 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pog-mcp",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "type": "module",
5
5
  "description": "MCP server that lets an AI agent play Proof of Goal — wallet, sign-in, squad building, and matches as typed tools.",
6
6
  "license": "MIT",
@@ -644,6 +644,1062 @@ secondary edge on top. An agent that only differentiates its roles and never
644
644
  touches the keeper beats a naive squad 44.0% of the time and loses 9.7% — better
645
645
  than four wins to one loss, with the rest drawn.
646
646
 
647
+ ## Which engine constant is a detectable lever? (`constant-sweep.mts`)
648
+
649
+ Every other section here sweeps a SQUAD and holds the rules fixed. This one does
650
+ the opposite. It pins a basket of published archetypes and moves the hardcoded
651
+ numbers in `packages/engine/src/engine.ts`, one at a time, because that is the
652
+ shape a "weekly rule" would ship: one global constant moved for everybody.
653
+
654
+ The statistic is not "did the game change" — that is easy — but **"did the
655
+ ordering of squads change"**. A rule that makes every match higher-scoring
656
+ without moving anyone's best answer is a texture knob, not a lever.
657
+
658
+ **How the sweep reaches a `const`.** `engine.ts` is read, one exact string is
659
+ replaced (the match count is asserted, so an engine edit fails the probe loudly
660
+ instead of silently sweeping nothing), its two relative imports are rewritten to
661
+ absolute paths, and the result is written to a `mkdtemp` directory and imported.
662
+ Nothing is written inside the repository. `fair` needs no patch: production never
663
+ sets it — there is no `fair:` outside the engine's own tests, and every engine
664
+ input is built from an explicit field list — so it is a global constant in
665
+ practice, and setting it on both squads IS the rule change.
666
+
667
+ **Not swept: the zone-press coefficient.** Its selector is broken — every
668
+ candidate weight is `0.0`, so `weightedPick` falls back to "the first non-GK
669
+ slot" — and a coefficient in front of an undefined selection measures nothing.
670
+ Forbidden until the selector is decided.
671
+
672
+ ### The statistic, and why not the obvious one
673
+
674
+ Rows below are in **win-equivalent share**: a win is 1, a draw is 0.5, a loss is
675
+ 0, and every match counts. The obvious alternative — win rate among DECIDED
676
+ matches — conditions on something the swept constants themselves move. Free-kick
677
+ occurrence takes the regulation draw rate from 57.9% to 38.1% across its range,
678
+ so a decided-only percentage mixes "who wins more" with "which matches got
679
+ decided at all". It also inflates the number the activation gate is read
680
+ against: an 11/80/9 record reads 55% decided, clearing a +5pp gate, while the
681
+ squad's actual advantage over all matches is one point. The gate's own
682
+ justification is stated in weekly LEAGUE POINTS, so the statistic it is compared
683
+ to has to include the draws that earn them.
684
+
685
+ Deltas are **paired**. Every condition replays one seed column, so the default
686
+ cell and the swept cell are matched match for match, and the test differences
687
+ the columns rather than treating them as independent samples. An unpaired
688
+ denominator would only be safe if the residual covariance stayed positive, and a
689
+ rule that REVERSES a fixture is exactly where it need not — which would make the
690
+ unpaired test anti-conservative on the cells this probe most wants to be sure
691
+ about. (Both of these were review findings on the first version of this section,
692
+ which used decided-only percentages and an unpaired z.)
693
+
694
+ The same seed column is shared across the two MODES as well, and `gameFlg` is
695
+ read only after minute 90 — so a match decided in regulation keeps that result
696
+ in knockout mode, and the two modes' estimates are positively correlated. The
697
+ exposure-weighted test therefore does not add their errors in quadrature; it
698
+ takes the Cauchy-Schwarz upper bound, which is looser than the truth and cannot
699
+ be anti-conservative. That is the only direction an acceptance gate may err in.
700
+
701
+ ### Controls
702
+
703
+ | Control | Result |
704
+ | --- | --- |
705
+ | Mirror, `gameFlg 0` (one squad against itself; true z = 0) | z **+0.31** |
706
+ | Mirror, `gameFlg 1` | z **+0.28** |
707
+ | Patch identity — the temp-dir pipeline at the SHIPPED values vs the stock engine | 1,000 matches identical |
708
+ | `fair` identity — `fair: 5` written out vs `fair` omitted | 1,000 matches identical |
709
+ | Paired alignment — a re-patched shipped-value engine vs the default COLUMN | 200,000 matches, largest per-match difference **0** |
710
+ | Counter trigger, swept 0% to 100% of eligible turnovers, in both baskets | must be REJECTED, and is — the run ABORTS if it is not |
711
+
712
+ **Every control in that table aborts the run; none of them warns.** A mirror
713
+ that fails is the condition that makes every table unreadable, and a negative
714
+ control that PASSES is an acceptance bar that has failed its own calibration.
715
+ Printing "bar too loose" and exiting 0 was itself a defect — an invalid run
716
+ could be consumed as a successful one.
717
+
718
+ One more number is counted every run, and it is a MEASUREMENT rather than a
719
+ control — nothing aborts on it, because a knockout draw is a legitimate outcome
720
+ to count rather than a failure:
721
+
722
+ | Measured every run | Result |
723
+ | --- | --- |
724
+ | Knockout draws, across both baskets | **0 in 5,440,000** knockout matches |
725
+
726
+ That draw count is a claim this section originally got wrong in the other
727
+ direction. It said knockout mode "has no draws by construction". It nearly does:
728
+ `runExtraTimeLoop` breaks a tie on INEQUALITY, so extra time either produces a
729
+ golden goal or falls through to a sudden-death shootout. But an earlier version
730
+ of that check read "a score changed", and one attack CAN score for both sides —
731
+ a post-play layoff gives a second shot, and a `gk_catch` can launch a counter
732
+ that scores — which ended extra time level and skipped the shootout. The
733
+ constants swept here move goal production, which is exactly what that path keyed
734
+ on, so the column is counted every run instead of declared.
735
+
736
+ The patch-identity control is the one this section could not do without: without
737
+ it, "the constant did it" and "the import rewrite did it" are the same
738
+ observation. The alignment control is the one the PAIRED test could not do
739
+ without — a paired test cannot detect misaligned columns from its own output, so
740
+ a freshly patched shipped-value engine is required to reproduce the default
741
+ column match for match, in order.
742
+
743
+ 3,400,000 matches in the narrow basket (5 archetypes, 10 fixtures, 10,000
744
+ matches each, 17 conditions, both modes) plus 7,480,000 in the wide one.
745
+ **Bonferroni over m = 8,320 pre-registered comparisons, two-sided: |z| >= 4.53.**
746
+ That m prices the SEARCHES, not just the tests. A gate cell does not spend one
747
+ hypothesis, and BOTH of its sides are data-chosen. The baseline side picks a
748
+ leader out of K and builds a band around it — noisy standings could have named
749
+ any of the K, so it could have surfaced any pair, K(K−1)/2, not just the K−1 the
750
+ leader it happened to pick needed. The swept side then reads a head-to-head
751
+ against that band, another K(K−1)/2. So K(K−1): **20 hypotheses per narrow gate
752
+ cell and 110 per wide one**, not 5 and 11. Every gate is also derived at all three
753
+ exposure weights, and all three are charged. On top of that sit the two fixture
754
+ families: the narrow basket's 10 fixtures and the wide basket's 55, at every
755
+ swept value — without the second, an axis could be called INERT while
756
+ significantly moving fixtures among the six archetypes the wide basket exists to
757
+ cover.
758
+
759
+ **The bar is a z and does not move with the sample size; the effect it
760
+ corresponds to does.** There are two test families here and they have different
761
+ answers — the fixture deltas are a PAIRED test between two conditions, the
762
+ activation gate is a ONE-SAMPLE test of a head-to-head share, and their standard
763
+ errors are unrelated. For the fixture deltas, per basket (they run at different
764
+ N, so averaging would let the better-powered one speak for the other):
765
+
766
+ Two numbers, because they are two different things. `bar x SE` is the effect
767
+ whose EXPECTED z equals the cutoff — a significance threshold at about 50%
768
+ power, not a minimum detectable effect. The 80%-power figure adds z(0.80):
769
+
770
+ | median / worst | significance threshold | 80%-power effect |
771
+ | --- | --- | --- |
772
+ | narrow, regulation | 1.0 / 2.2pp | 1.2 / 2.6pp |
773
+ | narrow, knockouts | 1.8 / 3.0pp | 2.1 / 3.6pp |
774
+ | wide, regulation | 1.8 / 3.8pp | 2.1 / 4.5pp |
775
+ | wide, knockouts | 2.9 / 4.8pp | 3.4 / **5.7pp** |
776
+
777
+ Read the worst column, not the median, since "every test is powered enough" is a
778
+ claim about the tail — and read it honestly: **the worst wide-knockout fixture
779
+ cell is not powered to catch a 5pp effect at 80%.** Every other cell is. That
780
+ qualification applies to the MARGINS classification, which is what the fixture
781
+ deltas decide; the gate is a different test, and its own answer is below.
782
+
783
+ For the gate itself the answer is different and sharper: **no pair was ever
784
+ formed.** At every swept value, in both baskets, the new optimum was already
785
+ inside the default band, so there was nothing to test.
786
+
787
+ So the gate has no power line to print in THIS run. It has one for a rerun that
788
+ does form a pair, and it reports the same two quantities as the table above plus
789
+ a warning when the 80%-power effect exceeds the 5pp gate itself — because a pair
790
+ that just misses under an SE that wide is underpowered, not refuted. Forcing a
791
+ band of one makes both branches fire, which is how they were checked: the wide
792
+ basket lands at a 7.1pp threshold and an 8.5pp 80%-power effect, i.e. above the
793
+ gate, and says so.
794
+
795
+ That only settles anything if the band is SHARP — noisy standings widen it, and
796
+ a wide enough band absorbs every new leader, which would be a power limitation
797
+ wearing the costume of a result. So the probe reports the band's own
798
+ discrimination: it holds **2 of the 5** narrow squads and **3 of the 11** wide
799
+ ones, with its edge **1.45pp** and **1.60pp** from the leader. A band that tight
800
+ is not swallowing the basket. That is the number a smaller rerun moves, and the
801
+ one to check before reusing this conclusion.
802
+
803
+ ### The table
804
+
805
+ Basket: `role-433`, `def-433`, `def-532`, `shootonly-433`, `flat-433` — five
806
+ outfield templates, the shared `squad-lib.mts` builders, so a row here and a row
807
+ in the round-robin above are the same squads.
808
+
809
+ - **`sig`** — fixture deltas clearing the corrected bar, out of 40 in the narrow
810
+ basket (10 fixtures x 4 swept values) and out of 220 in the wide one (55 x 4).
811
+ Both are printed, because an axis can be classified on the wide basket's
812
+ evidence alone and a table that hid it would publish a verdict whose decisive
813
+ measurement is invisible.
814
+ - **`rev`** — of those, how many crossed 50%: the fixture's ANSWER flipped, not
815
+ just its margin.
816
+ - **`gate`** — the new optimum against the whole stale band, under the new rule:
817
+ the SMALLER of the two baskets' gains, and only if both are significant. In
818
+ WIN-RATE advantage points, the unit the plan writes its 5pp threshold in. Track 3.1 activates on this at +5pp, but **on an
819
+ exposure-weighted mix of the two modes, not per mode** — see below.
820
+
821
+ | Axis (shipped) | Mode | sig (narrow) | sig (wide) | rev | Largest narrow delta | gate | What that row leaves FREE |
822
+ | --- | --- | --- | --- | --- | --- | --- | --- |
823
+ | **FK occurrence** `rand(10)<1` | reg | 21/40 | 102/220 | 0 | **+11.8pp** `role-433` vs `flat-433` @x4 | none | the FK taker: every basket squad kicks from slot 9, so this is "more free kicks", never "more free kicks AND a better taker" |
824
+ | | ko | 18/40 | 100/220 | 0 | +8.8pp `def-532` vs `flat-433` @x4 | none — +7.5pp against `role-433` alone, 0.0pp against the band it belongs to | shootout exposure — it is a property of the PAIRING, and the basket fixes both halves |
825
+ | **Post play** `rand(10)<1.5` | reg | 18/40 | 50/220 | 0 | −4.8pp `role-433` vs `flat-433` @x4 | none | the PP2 shooter is drawn by `getPlayer`, so the row confounds "more post plays" with "who the draw lands on" |
826
+ | | ko | 5/40 | 40/220 | 0 | −3.4pp `role-433` vs `shootonly-433` @x4 | none | same, plus FW count: 433 and 532 field three and two forwards, and `fwIdx.length` gates the branch |
827
+ | **Counter** `THRESHOLD=5` | reg | 3/40 | 5/220 | 0 | −2.0pp `shootonly-433` vs `flat-433` @0% | none | the four sampled thresholds span 0% to 100%, but changing this constant reroutes RNG consumption, so outcomes need not interpolate between them |
828
+ | | ko | **0/40** | 7/220 | 0 | −1.2pp (below bar) | none | as above. This is the control: it never produced a gate in either basket, which is the only behaviour that matters here |
829
+ | **`fair`** default 5 | reg | 13/40 | 37/220 | **1** | **+10.9pp** `shootonly-433` vs `flat-433` @22 | none | `fair` is uniform across all 22 players here; per-player or per-position `fair` is a different (and unmeasured) axis |
830
+ | | ko | 7/40 | 23/220 | 0 | +10.9pp `shootonly-433` vs `flat-433` @22 | none | keeper `defense`, which every extra penalty routes through — held fixed inside each template |
831
+
832
+ **Nothing here becomes a candidate.** All eight rows move margins somewhere — the
833
+ control included, once the wide basket is counted — and
834
+ the one pairing that re-prices anything does so against a squad that was already
835
+ tied for best. The pass set at the plan's own activation gate is empty over both
836
+ baskets, and the answer took a day rather than a release.
837
+
838
+ **Empty for these four axes, which is not the same as empty for the pool.** The
839
+ plan's weekly-rule pool also names set-piece `dBonus`, penalty attack noise, and
840
+ base `dBonus`; none of them is swept here, and this run says nothing about them.
841
+ The axes measured are the ones the issue behind this section listed — the two
842
+ hardcoded rates, `fair`, and the counter control. Anyone reading this as
843
+ "schedule nothing" should read it as "schedule none of these four, and go
844
+ measure the other three before concluding anything about the pool."
845
+
846
+ The verdict is deliberately absent from the rows above: it belongs to the AXIS,
847
+ not to a mode. The next section is where it is issued.
848
+
849
+ ### Activation is per AXIS, not per mode
850
+
851
+ The gate is specified on an exposure-weighted mode mix, and the two modes are
852
+ nowhere near equally exposed: the ladder has no cap beyond a five-minute
853
+ cooldown, while the cup runs once a day. **Cup entry is the top 48 of the whole
854
+ ladder, ACROSS divisions** — division decides weekly matchmaking, not cup
855
+ access, so what actually zeroes a manager's knockout exposure is never
856
+ QUALIFYING, at any division. A rule that clears 5pp in knockouts alone has not
857
+ cleared the gate, and reading the verdict per mode would say it had. The weight
858
+ below is a regular qualifier's day: **1.33 / (1.33 + 12 + 3) = 0.081** — 1.33
859
+ knockout matches against 12 ladder matches AND the cup's own three group-stage
860
+ matches, which are played in regulation mode and so belong in the denominator
861
+ too. Leaving them out gives 0.100 and overweights the knockout evidence.
862
+ `KO_EXPOSURE` is an argument, and the sensitivity below is why the choice does
863
+ not matter here.
864
+
865
+ **One value per row: the one that got FURTHEST through the ordered gates.** That is the same thing as "the best schedulable value" only when nothing blocks it, and here everything is blocked. A weekly rule ships one
866
+ global number, so pairing regulation's best value with knockout's best would
867
+ price a rule nobody can schedule — and could clear 5pp when no real value does.
868
+ For the same reason the row is not simply the biggest number: a value blocked on
869
+ one gate must not hide a smaller value that passes them all.
870
+
871
+ **And one SQUAD per row.** A manager fields one build across a schedule that is
872
+ mostly ladder and partly cup; the same eleven cover both. So the mix is applied
873
+ to each squad's season first, and the optimum and the stale band are read off
874
+ that one weighted table — averaging two separate per-mode contrasts would price
875
+ an improvement no single squad achieves.
876
+
877
+ **The wide basket vetoes; it does not compete.** Its eleven archetypes CONTAIN
878
+ the narrow five (the probe refuses to run if they ever stop containing them), so
879
+ a stale response that survives there is a build the manager could actually have
880
+ fielded, and it disproves a re-pricing the smaller set claimed. Taking whichever
881
+ basket happened to pass would let a subset's claim stand against its own
882
+ superset's counter-example, so the gate takes the smaller of the two gains — and
883
+ requires BOTH to be significant, rather than inheriting significance from
884
+ whichever had the smaller point estimate.
885
+
886
+ Track 3.1 has four activation gates, not one — a gain threshold, evidence, "no
887
+ dominant build", and draw-rate and goals-per-match bands. All four are applied
888
+ here, and the third is applied in TWO pieces because only one of them is
889
+ decidable.
890
+
891
+ The plan states that gate twice: absolutely ("no dominant build") and as a
892
+ change ("dominance must not increase"). The absolute form is testable and is
893
+ tested — `domAbs`, one squad significantly beating every other in the wide
894
+ basket, refused at the corrected bar. The change form is not. `dom` is a
895
+ difference of two standardised pairwise z-scores, which carries SD ~1.4 at ANY
896
+ sample size, so a literal "> 0" would refuse half of all rules that changed
897
+ nothing, and no amount of simulation shrinks that. Nor can the difference be
898
+ paired away: the leader and its weakest opponent are argmax and argmin picks
899
+ that can change IDENTITY between the two conditions, so there is no fixed pair
900
+ to difference. What this probe does instead is a 2-sigma DIRECTION screen at
901
+ +3.0. It refuses far more than a corrected test would — that would sit near 6.4
902
+ — which is the safe direction for a gate whose job is to refuse. It is a
903
+ heuristic, it says so in the probe's own legend, and it is not the plan's
904
+ sentence. The plan does not put numbers on the feel bands, so the ones
905
+ used are the probe's declared defaults (|draw| <= 5pp, |goals| <= 20%,
906
+ overridable) and every row prints its measured movement so a different band can
907
+ be applied to the same table by eye.
908
+
909
+ **The gate is measured against the whole stale optimum, not one member of it.**
910
+ Where the default standings do not resolve a single best build — and in knockout
911
+ mode they do not, `role-433` and `gkheavy-433` are not separated — the manager
912
+ who never re-solves could already have been on any squad in that band. Crediting
913
+ a rule for a switch that was free at the shipped rule would be measuring the
914
+ tie, not the rule. So the gain is the WORST margin against the whole band, and a
915
+ new leader drawn FROM the band scores zero by construction.
916
+
917
+ | Axis | Best value | Gate (ko weight 0.081) | dom | domAbs | draw | goals | Blocked by |
918
+ | --- | --- | --- | --- | --- | --- | --- | --- |
919
+ | FK occurrence | x0.25 | **0.00pp** | +0.4 | 0.4 | **+5.1pp** | −16% | gain — and it would also fail the draw band |
920
+ | Post play | x0.25 | **0.00pp** | −0.1 | 0.0 | −1.0pp | +3% | gain |
921
+ | Counter (control) | 0% | **0.00pp** | +0.7 | 0.9 | +1.4pp | −6% | gain |
922
+ | `fair` | 1 | **0.00pp** | +0.5 | 0.6 | +3.6pp | −12% | gain |
923
+
924
+ `dom` is the CHANGE in the leader's weakest margin; `domAbs` is that margin
925
+ itself, in the eleven-archetype basket. Both block, and the two are not
926
+ interchangeable: a rule that leaves an already-dominant squad exactly where it
927
+ stood scores a `dom` near zero while failing the requirement outright, which is
928
+ why the absolute column exists at all. `domAbs` is the one carrying the plan's
929
+ sentence — at or past the corrected bar, the same |z| the rest of this section
930
+ uses, 4.53 at these sample sizes, one squad significantly beats every other,
931
+ which is what a dominant build is. `dom` is the direction screen described
932
+ above, at a threshold this probe declares rather than quotes.
933
+
934
+ Both are computed on the exposure-WEIGHTED season, from weighted head-to-heads
935
+ at the activation weight. Taking the larger of the two pure modes does not cover
936
+ the mix: a squad's margins against different opponents are each linear in the
937
+ weight, so the minimum of them can peak at an interior crossing even when the
938
+ squad dominates at neither endpoint.
939
+
940
+ **Every gate is zero, and the reason is sharper than "the effects are small".**
941
+ The one cell that re-prices anything — FK x0.25 in knockouts — promotes
942
+ `gkheavy-433`, which was already tied for best at the shipped rule. A manager
943
+ sitting on it gains nothing from the rule; a manager sitting on `role-433` could
944
+ have switched for free before the rule existed. Nothing here beats what was
945
+ already available.
946
+
947
+ And the exposure weight — the one judgement call in this section — does not
948
+ carry it. The probe re-derives the GAIN at both extremes rather than asserting
949
+ the choice does not matter. (Only the gain; dominance, feel and fixture movement
950
+ are worst-of-both-modes by design and are not re-evaluated per weight, so this
951
+ table is not four verdicts.)
952
+
953
+ | Axis | Ladder-only (w=0) | Mixed (w=0.081) | Knockout-only (w=1) |
954
+ | --- | --- | --- | --- |
955
+ | FK occurrence | 0.00pp | 0.00pp | 0.00pp |
956
+ | Post play | 0.00pp | 0.00pp | 0.00pp |
957
+ | Counter (control) | 0.00pp | 0.00pp | 0.00pp |
958
+ | `fair` | 0.00pp | 0.00pp | 0.00pp |
959
+
960
+ Those three points do not settle the interior on their own: each squad's
961
+ weighted score is linear in the weight, the leader is their upper envelope, and
962
+ an envelope can hand the lead to a THIRD squad only somewhere in the middle. Nor
963
+ does a grid settle it — an interval can be narrower than the step.
964
+
965
+ So the interior is **solved**. Everything the gate reads is linear in the
966
+ weight, which makes all three of its boundaries enumerable:
967
+
968
+ - where two squads' win-equivalent shares cross — the leader changes;
969
+ - where a leader's lower edge meets a candidate's upper edge — the stale band
970
+ changes;
971
+ - where two head-to-head margins in one row cross — the gate takes a MINIMUM
972
+ over the band, so the controlling member switches there, and a minimum of
973
+ lines attains its maximum at exactly such a kink.
974
+
975
+ The boundaries of BOTH baskets go into one set, because the activation rule
976
+ reads both at the same weight and takes the smaller gain — solving each basket
977
+ on its own grid answers a different question. Evaluating every boundary, and
978
+ inside every resulting interval its midpoint plus both ONE-SIDED limits (the
979
+ gain jumps where the leader changes, so a shared endpoint reports the wrong
980
+ squad), plus the weights where the two baskets' gain lines cross — that is where
981
+ `min(narrow, wide)` peaks when their slopes oppose — comes to 9,816 probe
982
+ weights across every value:
983
+
984
+ > **The largest gain reachable at ANY exposure weight is 0.00pp**, against a 5pp
985
+ > threshold. At all 9,816 probe weights the swept optimum was already inside the
986
+ > default band in at least one basket.
987
+
988
+ That statement deliberately carries no significance claim, and does not need
989
+ one: a gain that never reaches the threshold cannot clear the gate at any bar.
990
+ Which also keeps the search honest — those thousands of data-derived weights are
991
+ not in the Bonferroni count, so a "significant" result selected from among them
992
+ would be a hypothesis nobody paid for. Reporting the maximum instead needs no
993
+ correction at all. (If a rerun ever pushes that maximum ABOVE the threshold, the
994
+ probe says so and stops claiming it: the satisfying set of the full predicate
995
+ can be a narrow off-centre segment, and finding it would need its own boundaries
996
+ solved and charged.)
997
+
998
+ The boundaries are solved rather than sampled because sampling got this wrong
999
+ twice on the way here. A 0.02 grid reported 0.00pp; solving only some of the
1000
+ boundary families reported 2.70pp; solving all of them but maximising per basket
1001
+ reported 2.87pp — and applying the veto at a common weight, which is what the
1002
+ gate actually does, brings it back to 0.00pp. Each of those was a different
1003
+ question, and only the last one is the gate's.
1004
+
1005
+ `dom`, `draw` and `goals` are the WORST of the two baskets, deliberately — not
1006
+ the basket that supplied the gain. The gate asks "did anything get re-priced";
1007
+ those columns ask "at what cost to the field", and the second question is not
1008
+ scoped to the first one's basket.
1009
+
1010
+ **A pass here would still not mean "schedule it."** The probe's best outcome is
1011
+ `CANDIDATE`, not `REPRICES`: track 3.1's gauntlet additionally requires a result
1012
+ to hold at growth buff 0 AND max, and to split the ACTUAL top-N live squads into
1013
+ two or more distinct best responses. Every squad here is tenure 0 and
1014
+ hand-built, so this probe structurally cannot run either check — it names them
1015
+ on every run instead of implying it did.
1016
+
1017
+ **And the near miss is not a near miss.** FK x0.25 fails the gain gate outright —
1018
+ 0.00pp, because the build it promotes was already inside the default band — and
1019
+ it would fail the draw band too, at +5.1pp against a +/-5pp limit. Its dominance
1020
+ is fine on the weighted season (+0.4 change, 0.4 absolute), which is worth
1021
+ stating precisely: an earlier version of this section read dominance off the two
1022
+ pure modes and reported +4.4, and that was an artefact of not weighting. The
1023
+ candidate that looked closest to shippable still fails, but on the gain and the
1024
+ feel band, not on concentration.
1025
+
1026
+ ### What the control calibrates
1027
+
1028
+ The counter trigger is in this sweep to check that the bar rejects things, and
1029
+ under a paired test it is **not** inert: 3 of 40 narrow fixture deltas clear the
1030
+ bar, and 12 of 440 across the wide basket's two modes. They are small — and no
1031
+ value of it ever produced a gate, in either basket, at any exposure weight. That
1032
+ is the useful result:
1033
+
1034
+ > **MARGINS means "detectable", not "worth shipping".** A knob that gates 3.9%
1035
+ > of goals reaches MARGINS at this sample size. The class that separates a lever
1036
+ > from a texture knob is the gate, not significance.
1037
+
1038
+ It also supplies a floor. In the NARROW basket — same N, same ten fixtures on
1039
+ both sides, the only comparison here that is apples to apples — the largest
1040
+ movement this known non-lever produces is **2.0pp**. Anything a candidate does
1041
+ that is not comfortably above that is not distinguishable from what a knob
1042
+ nobody would ship already does:
1043
+
1044
+ | Axis | Mode | Largest fixture move | vs the control's 2.0pp |
1045
+ | --- | --- | --- | --- |
1046
+ | FK occurrence | reg | 11.8pp | **6.0x** |
1047
+ | FK occurrence | ko | 8.8pp | **4.4x** |
1048
+ | `fair` | reg | 10.9pp | **5.5x** |
1049
+ | `fair` | ko | 10.9pp | **5.5x** |
1050
+ | Post play | reg | 4.8pp | 2.4x |
1051
+ | Post play | ko | 3.4pp | **1.7x** — the closest any candidate comes to the floor |
1052
+
1053
+ The probe flags a row as indistinguishable from the control below **1.5x**, so
1054
+ post play in knockouts clears that line — but only just, and by less than any
1055
+ other candidate-mode pair in the table.
1056
+
1057
+ The control is swept in BOTH baskets — that is what the gate needs — but this
1058
+ ratio is deliberately narrow-only on both sides. It compares a MAXIMUM over a
1059
+ family of cells, and the two baskets run at different N over different
1060
+ membership, so a cross-basket maximum grows with whichever family has more cells
1061
+ and less power rather than with whichever axis moves more. Mixing them swung
1062
+ these ratios by a factor of two between runs that changed no measurement.
1063
+
1064
+ ### Per axis, what actually moved
1065
+
1066
+ **FK occurrence is the strongest axis, and what it does is CONCENTRATE.** From
1067
+ 2.5% to 40% the regulation draw rate runs 57.9% -> 52.8% (shipped) -> 38.1% and
1068
+ goals per match 0.653 -> 0.779 -> 1.288. Every large delta at x4 has the same
1069
+ shape: the differentiated squads pull away from `flat-433` (`role-433` vs
1070
+ `flat-433` 68.4% -> 80.2% of the win-equivalent share). Turning it DOWN
1071
+ compresses the field instead — `flat-433`'s points per match rises 0.769 ->
1072
+ 0.842 while every other squad's falls. So the axis is a skill-expression dial:
1073
+ more free kicks means more of the match decided by who invested, less means more
1074
+ of it decided by nothing. Turning it down therefore costs on both feel gates at
1075
+ once — more draws AND fewer goals — and in knockouts alone it also raises the
1076
+ leader's weakest margin from z 6.3 to 8.9, which points at concentration rather
1077
+ than rotation. Read that as the knockout-only reading it is: on the
1078
+ exposure-weighted season the same change is +0.4, well inside the direction
1079
+ screen, and the activation table above reports the weighted number.
1080
+
1081
+ **`fair` is the only axis that ROTATES demand rather than amplifying it.**
1082
+ Raising it from 4.5% to 100% moves `shootonly-433` from 1.127 to 1.302 points
1083
+ per match in regulation and 1.370 to 1.518 in knockouts, while `role-433` and
1084
+ `def-433` stand still — more fouls means more free kicks and penalties, and
1085
+ those are converted by `shoot`. It carries the run's single reversal: `role-433`
1086
+ vs `def-433` goes from **47.5%** at the shipped default to **50.8%** at
1087
+ `fair 22`. Read that precisely — the DELTA is significant, the new level is a
1088
+ coin flip. The rule turned "the defensive lean is better" into "there is no
1089
+ difference", which is a re-pricing; it did not turn it into "the attacking lean
1090
+ is better".
1091
+
1092
+ `fair` is also the only axis whose regulation dominance column does not move
1093
+ (+0.0). At the midpoint (`fair 11`, 50%) it still moves four fixtures
1094
+ significantly while taking the draw rate DOWN, 52.8% -> 48.6%, and goals up,
1095
+ 0.779 -> 0.899 — the one cell in the whole sweep whose feel side-effects point
1096
+ in a direction anyone would ask for.
1097
+
1098
+ **Post play is the weakest candidate.** Its largest move is 2.4x the control's
1099
+ in regulation and 1.7x in knockouts — the closest any candidate comes to a knob
1100
+ that gates 3.9% of goals. It needs x4 (60% of box entries) to reach even that,
1101
+ the feel barely registers (draw rate +4.3pp, goals −0.095), and across all eight
1102
+ of its wide-basket cells — four swept values in each mode — the top of the
1103
+ eleven-archetype table never changes.
1104
+
1105
+ **The counter trigger never gates.** Swept from "counters never happen" to
1106
+ "every eligible turnover becomes one", goals per match moved 0.036, the basket's
1107
+ top never changed in either mode or either basket, and no cell produced a gate.
1108
+ **What rejects it is the compound activation gate, not the significance bar** —
1109
+ the bar finds its 3 narrow and 12 wide fixture movements perfectly real. That is
1110
+ the calibration: fixture-level significance is not evidence of a useful lever,
1111
+ and a gate worth believing when it accepts something has to reject this.
1112
+
1113
+ ### Does the answer move once the manager may re-optimise?
1114
+
1115
+ The narrow basket's biggest weakness is that five archetypes may simply not
1116
+ contain the alternative a rule rewards. So EVERY swept value of every axis — the
1117
+ control included, so it is checked on the same surface as the candidates — is
1118
+ re-asked over the ELEVEN archetypes the round-robin publishes, 55 fixtures,
1119
+ 4,000 matches each. That is 34 cells; the probe prints them all, and the shape
1120
+ is simple enough to state:
1121
+
1122
+ Standings here are the **win-equivalent share** — the same 1 / 0.5 / 0 statistic
1123
+ the gate measures, so the leader they name is the squad the gate is then
1124
+ evaluated on. Ranking by league points instead is not a monotonic
1125
+ transformation of it when draw rates differ, and these constants move draw rates
1126
+ by fifteen points.
1127
+
1128
+ | Mode | Shipped rule's top four | Last | Cells whose top changed |
1129
+ | --- | --- | --- | --- |
1130
+ | reg | `gkmin-433` .603, `def-433` .586, `def-532` .585, `role-433` .564 | `flat-433` .365 | **none of 16** |
1131
+ | ko | `role-433` .615, `gkheavy-433` .599, `def-433` .591, `def-532` .573 | `flat-433` .259 | **2 of 16**, both FK down |
1132
+
1133
+ In regulation, `gkmin-433` leads every single cell — nothing moves the answer at
1134
+ any value of any axis. The two knockout exceptions are FK x0.25 and FK x0.5,
1135
+ which both promote `gkheavy-433` (+7.5pp z 4.7 and +6.0pp z 3.8 against
1136
+ `role-433`; 0.0pp against the tied band it belongs to). `flat-433` is last in 32
1137
+ of the 34 cells; the two it is not are FK x0.25 and x0.5 in regulation, where
1138
+ `stars-433` drops below it — that build wins and loses far more than it draws,
1139
+ so a metric that counts draws at half costs it more than a points table does.
1140
+
1141
+ **That one axis-and-direction is the most interesting number in this section.**
1142
+ Read as a pair in both rules:
1143
+
1144
+ > `gkheavy-433` vs `role-433`, knockout: **49.8% (z −0.3) at the shipped FK rate
1145
+ > -> 53.7% (z +4.7) at FK x0.25.** A coin flip becomes a significant win. Those
1146
+ > are shares; the +7.5pp above is the same reading as a win-rate advantage, which
1147
+ > is exactly twice the share advantage over 50%.
1148
+
1149
+ Mechanically that is coherent: fewer free kicks means fewer set-piece goals,
1150
+ more matches level at full time, more shootouts, and the 29-point keeper the
1151
+ round-robin ranks sixth becomes the best build in the basket. It is a real
1152
+ re-pricing of the keeper budget by a rule.
1153
+
1154
+ Read the "changed the answer" claim with the qualification the probe prints
1155
+ beside it: **the shipped knockout leader is not separated from `gkheavy-433`**
1156
+ either. So the honest description is not "the rule dethroned the leader" but
1157
+ "the rule turned a pair that was tied into a pair that is not" — which is still
1158
+ a re-pricing, and still the only one in the sweep.
1159
+
1160
+ **It changes no advice in `SKILL.md`, and that is a decision rather than an
1161
+ oversight.** That file already refuses to settle the keeper total and says the
1162
+ knockout answer turns on shootout exposure. This sweep reaches the same place
1163
+ from the opposite direction — it moves a RULE instead of a squad, and the one
1164
+ thing that moved was the keeper budget in the mode where shootouts live. A
1165
+ second construction agreeing is a reason to trust the sentence that is there,
1166
+ not a reason to write a new one; nothing here is a fact an agent could act on,
1167
+ since none of these constants is scheduled.
1168
+
1169
+ And it is worth **0.0pp at the activation gate** — in the mode with the LEAST
1170
+ exposure, since knockouts are cup-only and the cup runs once a day for the
1171
+ ladder's top 48. Two things reduce it from +7.5pp to nothing, and both are in
1172
+ the activation section above. `gkheavy-433` is inside the shipped rule's
1173
+ unresolved top band, so a manager could already have been on it for free. And
1174
+ the same cell moves the draw rate +5.1pp, outside the +/-5pp band a rule change
1175
+ is allowed to move it, so even a real gain there would have been refused.
1176
+
1177
+ Incidentally, the shipped rows above are an 11-archetype round-robin at 4,000
1178
+ matches per fixture — roughly seven times the 300 seeds behind the published
1179
+ table — and they agree with it where that table says it is decidable:
1180
+ `gkmin-433` clear at the top of regulation, `role-433` at the top of knockouts,
1181
+ `flat-433` at the bottom of all but two. The middle band still reorders between
1182
+ the two runs, as that section says it must — and note that the bottom is where
1183
+ the metric matters: on a points table `stars-433` is above `flat-433`, and on
1184
+ the win-equivalent share the two swap in a couple of cells. The shipped `role-433` vs `def-433`
1185
+ fixture also independently reproduces the Skill's "solidity beats aggression"
1186
+ pair at 10,000 matches: the attacking lean takes 47.5% of the win-equivalent
1187
+ share in regulation and 53.1% in knockouts.
1188
+
1189
+ **Do not read that 47.5% against the Skill's 56.5%** — they are different
1190
+ statistics on the same fact. The Skill quotes DECIDED matches, this section
1191
+ quotes the win-equivalent share, and half of all regulation matches are draws,
1192
+ so the share is compressed toward 50 exactly as the round-robin correction above
1193
+ warns. The knockout figures (53.1% here, 53.6% there) are directly comparable,
1194
+ because knockout draws are vanishingly rare — zero in the 5,440,000 knockout matches
1195
+ this run played, though not structurally impossible.
1196
+
1197
+ ### Degrees of freedom this sweep LEFT free
1198
+
1199
+ Counting the degrees of freedom that were controlled is not enough; the keeper
1200
+ section above was wrong three times in one day and the cause was a different
1201
+ uncontrolled degree of freedom each time. So, explicitly:
1202
+
1203
+ - **Manager response.** The basket is fixed; nobody re-solves a squad against
1204
+ the swept rule. The wide-basket section shrinks this hole from five archetypes
1205
+ to eleven but does not close it — eleven hand-built squads are a sample of the
1206
+ legal space, not an argmax over it. Every verdict above is "…across these
1207
+ baskets", and an axis that only rewards a build outside them reads as flat.
1208
+ - **Growth buffs.** Every squad is tenure 0. Production applies
1209
+ `applyMatchGrowth`, which raises effective `total` and therefore `teamPow`,
1210
+ and the zone press, the team-contribution terms and possession all read it.
1211
+ - **Set-piece slots.** `squad-lib` pins the FK taker to slot 9 and the penalty
1212
+ taker to slot 10 for every candidate. The FK rows are the RATE axis only.
1213
+ - **Slot order.** Identical across the basket, which pins the broken zone-press
1214
+ fallback to the same position in all of them. Held constant, not measured.
1215
+ - **Interactions.** One axis moves at a time. Nothing here says what FK x4 does
1216
+ while `fair` is 22, and a pool built from two axes at once is untested.
1217
+ - **`cond`.** Fixed at 5 everywhere, as production does today. A form system
1218
+ would invalidate every row.
1219
+ - **Opponent population.** Archetypes, not the live ladder — and production bots
1220
+ are a single build, which is neither.
1221
+
1222
+ Re-run after any engine change:
1223
+
1224
+ ```bash
1225
+ npx tsx packages/mcp/skill/reference/probes/constant-sweep.mts
1226
+ N=2000 WIDE_N=1000 npx tsx … # faster; the bar is fixed, the detectable EFFECT moves
1227
+ ```
1228
+
1229
+ ---
1230
+
1231
+ ## Is a per-player scene weight a decision? (`appr-role.mts`)
1232
+
1233
+ The section above swept engine constants and found nothing that re-prices a
1234
+ squad choice — not because the effects were small, but structurally: every
1235
+ constant it can reach sits in front of BOTH `ofPoint` and `dfPoint`, so it moves
1236
+ the two squads together. Per-player selection weights are the one remaining
1237
+ candidate that creates a **difference between two squads** rather than moving
1238
+ both sides, and they are the axis the tactical-sheet track would ship.
1239
+
1240
+ **The lever measured here does not exist in the engine.** `*_APPR` is a table
1241
+ per POSITION, so two forwards in the same squad are drawn with the same weight
1242
+ and a manager cannot tell them apart. The probe patches `getPlayer` to multiply
1243
+ each candidate's weight by a per-player, per-scene number carried on the player,
1244
+ defaulting to 1 — nothing else — and sweeps that number. So the answer is about
1245
+ the axis, not about one proposed interface.
1246
+
1247
+ ### The statistic, and the controls
1248
+
1249
+ Rows are in **win-equivalent share**: a win is 1, a draw is 0.5, every match
1250
+ counts. Deltas are **paired** — every sheet replays one seed column, so the
1251
+ default cell and the swept cell are matched match for match — and the seed
1252
+ depends on the squads and the side and never on the sheet.
1253
+
1254
+ **Bonferroni over m = 13,314 pre-registered comparisons, two-sided: |z| >= 4.62.**
1255
+ That m prices the SEARCHES as well as the tests. A ladder read against the
1256
+ FIXED shipped default costs only its rungs, because an argmax over the ladder
1257
+ could only ever have surfaced one of the contrasts already counted. A comparison
1258
+ whose BOTH sides are data-chosen — "is the optimum interior", which pits a
1259
+ selected rung against a selected neighbour, and "which sheet is the best
1260
+ response", which pits two selected sheets — is charged K(K−1)/2, the number of
1261
+ pairs the search could have surfaced.
1262
+
1263
+ The noise floor is the whole run's, not one section's: **the largest standard
1264
+ error anywhere in this run is 0.59 points of share**, which puts the
1265
+ significance threshold at **2.74 points** and the 80%-power effect at **3.24**.
1266
+ A paired standard error depends on the outcome variance and on the covariance
1267
+ between the two conditions, so it is not constant across sections merely because
1268
+ `N` is — quoting the concentration ladders' own worst cell and extending it to
1269
+ every later null was a review finding on this section. So every effect called
1270
+ large below is an order of magnitude above the run's own floor, and every "no
1271
+ effect" is a claim about a band 2.74 points wide.
1272
+
1273
+ | Control | Result |
1274
+ | --- | --- |
1275
+ | Mirror, both modes (one squad against itself; true z = 0) | z **+0.4** / **−0.5** |
1276
+ | POLICY mirror, both modes (same squad AND same sheet on both sides; true z = 0) | z **+1.0** / **+0.8** |
1277
+ | Patch identity — the patched engine with no sheet vs the stock engine | 1,000 matches identical, **whole `MatchResult`** |
1278
+ | Permutation null — the same ×32 on either of `role-433`'s two byte-identical midfielders | 1,000 matches identical, scoreline and winner |
1279
+ | Dead-scene null — ×1024 and ×0 on the offence table's ZP/PP1/FK1/FK2 columns | 1,000 matches identical, **whole `MatchResult`** |
1280
+ | Zero-weight null — ×1024 on the keeper, whose offence weight is 0 everywhere | 1,000 matches identical, **whole `MatchResult`** |
1281
+ | Paired alignment — the default column, replayed | 10,000 matches, largest per-match difference **0** |
1282
+ | Anti-focus calibration — funnelling `stars-433`'s 12-point defender must LOSE | **−11.6pp** (z −28.9) / **−14.0pp** (z −26.6) |
1283
+
1284
+ <!-- not a payoff table -->
1285
+
1286
+ **Every one of those aborts the run.** The comparison DEPTH in the right-hand
1287
+ column is part of the control rather than an implementation detail: where the
1288
+ claim is that nothing happened at all, the whole `MatchResult` is compared —
1289
+ every event in order, every player stat, every shootout round — because a
1290
+ rewrite that changed which player was drawn while landing on the same score
1291
+ would pass a scoreline check and leave every table below measuring the rewrite.
1292
+ The permutation null is the one exception and deliberately so: there the two
1293
+ players ARE interchanged, so the event names and per-player stats move by
1294
+ construction and only the outcome can be asserted.
1295
+
1296
+ Three are worth naming for what they separate. The **permutation null**
1297
+ separates "the weight moved the ball to a better player" from "the weight
1298
+ perturbed the RNG": moving the same multiplier between two players who are
1299
+ identical to the byte must change nothing, and it does not. The **anti-focus
1300
+ calibration** is the directional negative control —
1301
+ a harness that reported a gain from concentrating on the squad's worst player
1302
+ would be measuring the act of concentrating rather than who is concentrated on,
1303
+ and every row below would be that artefact. The **dead-scene null** doubles as a
1304
+ re-derivation: the probe enumerates the offensive `getPlayer` call sites FROM
1305
+ THE SOURCE, finds `A0 A1 A2 CA1 CA2 PP2` and nothing else, and confirms that a
1306
+ multiplier on the four remaining offence columns is inert — the dead table the
1307
+ plan describes, checked rather than quoted.
1308
+
1309
+ ### The concentration curve
1310
+
1311
+ `stars-433` is the focal squad because it is the only published archetype whose
1312
+ players differ inside a position group — three forwards at 28-29 points and four
1313
+ defenders at 12. `role-433` rides along as the other half of the question: its
1314
+ three forwards are identical to the byte, so any movement there is cross-GROUP
1315
+ reallocation with the within-group term pinned at exactly zero.
1316
+
1317
+ | Focal slot (`stars-433`) | ×0 | ×1 | ×1024 | League | Knockout |
1318
+ | --- | --- | --- | --- | --- | --- |
1319
+ | slot 8 — FW, 29 pts, pass 6 shoot 9 | 33.1 | 36.7 | **68.0** | **+31.3pp** | **+35.8pp** |
1320
+ | slot 10 — FW, 28 pts, pass 4 shoot 10 | 33.1 | 36.7 | 64.8 | +28.1pp | +32.3pp |
1321
+ | slot 7 — OMF, 26 pts, alone in his group | 37.5 | 36.7 | 29.2 | −7.5pp | −8.8pp |
1322
+ | slot 1 — DF, 12 pts (anti-focus control) | 38.0 | 36.7 | 25.1 | −11.6pp | −14.0pp |
1323
+ | `role-433` slot 8 — FW, identical to its two peers | 46.9 | 48.1 | 58.9 | +10.8pp | +13.2pp |
1324
+
1325
+ > **Measured on** — `stars-433` (4-3-3, `STARS` slot weights, `ATTACKING` mix
1326
+ > from `squad-lib.mts`: keeper 19, four defenders at 12, midfield 17/16/26,
1327
+ > forwards 29/29/28) against `def-433` (4-3-3, `EVEN` weights, `DEFENSIVE` mix),
1328
+ > which plays the shipped weights in every cell. The two squads never change:
1329
+ > all 212 points, both formations, both sets of kicker flags and the whole
1330
+ > defensive table are byte-identical across every row. The only thing that moves
1331
+ > is one number in front of one player's offensive selection weight, in all six
1332
+ > reachable scenes at once. The last row swaps the focal squad for `role-433`
1333
+ > (`EVEN` weights, `ATTACKING` mix), whose forwards are identical to each other.
1334
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds; 20,668,000
1335
+ > matches in the run, about four minutes.
1336
+ > **Mode** — both, one column each. League is draws-allowed (`gameFlg 0`),
1337
+ > Knockout is winner-guaranteed. The League and Knockout columns are the paired
1338
+ > delta from the ×1 cell; the ×0/×1/×1024 columns are League shares.
1339
+ > **Effect** — 31.3 percentage points of win-equivalent share in League and 35.8
1340
+ > in Knockout, between two squads that are the same eleven players. That is
1341
+ > nearly three times the largest thing the engine-constant sweep could move
1342
+ > (11.8pp) and larger than any squad-construction axis measured anywhere in this
1343
+ > file. Concentrating on the WRONG player is worth −11.6pp, so the axis is
1344
+ > double-edged rather than free. Even with the within-group term removed by
1345
+ > construction — `role-433`'s identical forwards — pure cross-group
1346
+ > reallocation is still worth 10.8pp.
1347
+ > **Source** — `appr-role.mts`, section (1).
1348
+
1349
+ **The best focal player is not the best finisher.** Slot 8 beats slot 10 by
1350
+ 3.2pp in League and 3.5pp in Knockout, and slot 10 is the one with `shoot` 10.
1351
+ That much is measured. **Why is not** — and it cannot be, on a fixed points
1352
+ budget. The two forwards differ in five things at once: `pass` 6 against 4,
1353
+ `dribble` 9 against 10, `shoot` 9 against 10, `defense` 5 against 4, and one
1354
+ point of total; slot 10 also carries the penalty-kicker flag. Moving a single
1355
+ attribute in isolation is impossible when every point spent has to come from
1356
+ another attribute of the same player, so no cell in this probe separates them.
1357
+
1358
+ The candidate mechanism, offered as a hypothesis rather than a result, is the
1359
+ `style = attrs.pass` branch: `playArea2` and `playArea1` both decide
1360
+ pass-versus-dribble-versus-long-shot from `pass` alone, so a low-pass carrier
1361
+ ends possessions with long shots instead of advancing them. What supports it
1362
+ without a cross-player comparison is the scene table below — the same player's
1363
+ multiplier reverses sign between the midfield scene and the box scenes — and
1364
+ what would settle it is an engine change, not another squad.
1365
+
1366
+ ### Does the anti-concentration term bite?
1367
+
1368
+ `atkAttrSum` is the selected player's POSITION GROUP total minus his own, so the
1369
+ better the player selected, the less team-aggregate support stands behind him —
1370
+ and `atkRate` varies by scene, so the size of that penalty does too. The
1371
+ question the plan asks is whether that produces a non-flat optimum.
1372
+
1373
+ It is real, and it is not enough. One point of a selected player's total is
1374
+ worth **+1/3** on `ofPoint` directly and costs at most **rate × 0.1 ×
1375
+ teamPow/100** of group support. The largest `O_*_RATE` anywhere in the shipped
1376
+ tables is 1.00, so the loss coefficient never exceeds 0.100 against a gain
1377
+ coefficient of 0.333. The probe prints that arithmetic from the source tables
1378
+ and then measures it against a COUNTERFACTUAL engine with the subtraction
1379
+ deleted:
1380
+
1381
+ | `stars-433` slot 8, all scenes | ×1 | ×8 | ×1024 |
1382
+ | --- | --- | --- | --- |
1383
+ | shipped, League | 36.7 | 49.2 | 68.0 |
1384
+ | subtraction deleted, League | 36.9 | 52.3 | 73.4 |
1385
+ | shipped, Knockout | 34.6 | 49.6 | 70.4 |
1386
+ | subtraction deleted, Knockout | 35.2 | 52.9 | 75.7 |
1387
+
1388
+ > **Measured on** — the `stars-433` vs `def-433` fixture above, played twice:
1389
+ > once on the shipped engine and once on an engine identical except that all
1390
+ > five `atkAttrSum = <group> - <player>.total` sites — including the home-team
1391
+ > DMF path that reads the ball carrier rather than the selected player — are
1392
+ > replaced by `atkAttrSum = <group>`. Nothing else differs; the ×1 row is the
1393
+ > same squads with no sheet at all, so the gap between the two ×1 cells is what
1394
+ > the term is worth to a game nobody has concentrated.
1395
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds.
1396
+ > **Mode** — both, two rows each.
1397
+ > **Effect** — 5.4 points of share in League (z 13.4) and 5.3 in Knockout
1398
+ > (z 11.2) is what the term is worth AT MAXIMUM CONCENTRATION; at the shipped ×1
1399
+ > it is worth 0.2 (z 0.5) and 0.7 (z 1.4), both inside the sample's own error.
1400
+ > So it takes 5.2 points off a concentration payoff that would otherwise reach
1401
+ > 36.5 — about a seventh — and changes nothing at all about who you should
1402
+ > concentrate on. **0 of the 50 ladders in the one-opponent sections have a
1403
+ > significant interior optimum: 48 put their argmax at a ladder END and the
1404
+ > other 2 peak on an interior rung the sample cannot separate from its
1405
+ > neighbours,** which is undecided rather than monotone and is counted
1406
+ > separately for that reason. Monotonicity is a different question from where
1407
+ > the argmax is — a ladder can dip significantly in the middle and still peak at
1408
+ > the top — so every adjacent rung is tested too: **134 of the 134 ladders swept
1409
+ > anywhere in this run have no significant step against their own direction.**
1410
+ > The curve is steeper without the term and the same shape.
1411
+ > **Source** — `appr-role.mts`, section (2).
1412
+
1413
+ The place where the term is not small is the **lone player in his group**. A
1414
+ 4-3-3's single OMF gets `omfAttr − his own total` = exactly zero support, while
1415
+ a forward in a three-man group carries 4.56 points of it into every A1
1416
+ selection. That is most of why slot 7 loses in the table above despite holding
1417
+ 26 points: funnelling the attack through him costs the whole group term. It is
1418
+ also a fact about FORMATION rather than about roles — the same player in a 4-4-2
1419
+ would have a partner to be supported by.
1420
+
1421
+ ### Scene-dependence: the same player, opposite instructions
1422
+
1423
+ | `stars-433` sheet on slot 7 (the 26-point OMF) | League | Knockout |
1424
+ | --- | --- | --- |
1425
+ | default — no sheet | 36.7 | 34.6 |
1426
+ | ×32 in A2 only | 39.0 (+2.3pp) | 37.5 (+2.9pp) |
1427
+ | ×0 in A0 and A1 only | 38.4 (+1.7pp) | 36.5 (+2.0pp) |
1428
+ | **both — ×32 in A2, ×0 in A0/A1** | **41.4 (+4.7pp)** | **40.1 (+5.5pp)** |
1429
+ | the same ×32 in EVERY scene | 30.7 (−6.0pp) | 27.6 (−7.0pp) |
1430
+
1431
+ > **Measured on** — the `stars-433` vs `def-433` fixture above, with every sheet
1432
+ > applied to ONE slot: the 26-point attacking midfielder, pass 8 dribble 8 shoot
1433
+ > 7, the only OMF in the formation. Every other slot on both squads is
1434
+ > untouched, and the opponent plays the shipped weights throughout.
1435
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds.
1436
+ > **Mode** — both, one column each; every row clears the corrected bar (|z| 5.8
1437
+ > to 14.4).
1438
+ > **Effect** — 10.7 percentage points of share in League and 12.5 in Knockout
1439
+ > separate the best and worst way of spending the SAME multiplier on the SAME
1440
+ > player: +4.7pp when its sign follows the scene and −6.0pp when it does not.
1441
+ > A per-player slider would have produced the losing row. The scene signs are
1442
+ > stable across modes: A2 positive, A0/A1/CA1/PP2 negative, CA2 inside the noise.
1443
+ > **Source** — `appr-role.mts`, section (3).
1444
+
1445
+ This is the strongest evidence for the `style = attrs.pass` hypothesis above,
1446
+ and it is stronger for being WITHIN one player: the OMF is the squad's best
1447
+ passer, and his multiplier pays in midfield (A2) and costs in the box (A0/A1),
1448
+ where the forwards' `shoot` and their group support both beat him. No squad
1449
+ attribute changes between those rows — only which scene the weight applies to —
1450
+ so the confound that blocks the cross-player comparison is absent here. It is
1451
+ still not proof: A0/A1 differ from A2 in what they reward as well as in who
1452
+ carries, and separating those needs an engine change. **No scene of the
1453
+ forward's own ladder points the other way**, so
1454
+ scene-dependence is a property of the player rather than of the axis: slot 8
1455
+ gives one distinct argmax in both modes, six positive signs in League and five
1456
+ plus one below the bar in Knockout, and not a single negative one.
1457
+
1458
+ ### Opponent-dependence, and the round robin that decides it
1459
+
1460
+ | Sheet, `stars-433` | vs `role` | vs `def-433` | vs `def-532` | vs `shootonly` | vs `passonly` | vs `flat` |
1461
+ | --- | --- | --- | --- | --- | --- | --- |
1462
+ | default | 37.2 | 36.7 | 34.5 | 42.5 | 36.1 | 47.4 |
1463
+ | **carrier** — slot 8 ×32, all scenes | **60.7** | **60.6** | **52.7** | **71.4** | **62.6** | **75.6** |
1464
+ | finisher — slot 10 ×32, all scenes | 58.6 | 58.4 | 52.3 | 68.1 | 59.1 | 72.3 |
1465
+ | playmaker — slot 7 ×32 A2, ×0 A0/A1 | 42.8 | 41.4 | 37.1 | 50.9 | 44.1 | 55.6 |
1466
+ | sheet — playmaker plus slot 10 ×32 in A0/A1 | 54.6 | 51.3 | 44.0 | 67.6 | 57.7 | 71.8 |
1467
+ | tier — slots 7-10 ×8, all scenes | 50.7 | 49.3 | 43.8 | 62.2 | 52.7 | 68.2 |
1468
+ | spread — the four 12-point defenders ×4 | 28.6 | 30.3 | 30.3 | 30.4 | 26.4 | 33.9 |
1469
+
1470
+ > **Measured on** — `stars-433` against six published archetypes built by
1471
+ > `squad-lib.mts` — `role-433`, `def-433`, `def-532`, `shootonly-433`,
1472
+ > `passonly-433`, `flat-433` — every one of them playing the shipped weights.
1473
+ > The focal squad's 212 points never change across the whole grid; only its
1474
+ > sheet does. `tier` is the coordinated policy: four players lifted together at
1475
+ > a smaller multiplier rather than one player at a large one.
1476
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds; 84 cells
1477
+ > across the two modes.
1478
+ > **Mode** — League shown; the Knockout grid is in the probe output, where
1479
+ > `carrier` runs 54.0 to 78.6 and every margin over `default` is wider. Its
1480
+ > ranking matches this one in five of its six rows — the sixth is the `def-532`
1481
+ > swap in Effect below.
1482
+ > **Effect** — 41.7 percentage points of share separate the best sheet from the
1483
+ > worst against the same opponent (`flat-433`: 75.6 vs 33.9), and the ordering
1484
+ > of the seven sheets is identical in eleven of the twelve opponent-by-mode
1485
+ > cells. The twelfth is `def-532` in Knockout, where `carrier` and `finisher`
1486
+ > swap by 0.1 points of share — inside the sample's own error, which is why the
1487
+ > band there names both. `carrier` sits in every cell's leader band; `def-532`,
1488
+ > the deepest defensive shape in the grid, is the only opponent that pulls
1489
+ > anything level with it. The distinct raw argmax count is **2**, and one of the
1490
+ > two is never beaten anywhere.
1491
+ > **Source** — `appr-role.mts`, section (4).
1492
+
1493
+ That grid holds the opponent's sheet at the default. The next one lets the
1494
+ opponent choose too, on the SAME squad, so the sheet is the only difference:
1495
+
1496
+ | Round robin, `stars-433` both sides | beats significantly (League / KO) | in the unbeaten band |
1497
+ | --- | --- | --- |
1498
+ | carrier | 5 of 6 / 5 of 6 | yes |
1499
+ | sheet | 4 of 6 / 3 of 6 | yes |
1500
+ | finisher | 3 of 6 / 3 of 6 | no |
1501
+ | tier | 3 of 6 / 3 of 6 | no |
1502
+ | playmaker | 2 of 6 / 2 of 6 | no |
1503
+ | default | 1 of 6 / 1 of 6 | no |
1504
+ | spread | 0 of 6 / 0 of 6 | no |
1505
+
1506
+ > **Measured on** — `stars-433` against `stars-433`: the same eleven players,
1507
+ > the same 212 points and the same kicker flags on both sides of every fixture,
1508
+ > with the sheet as the only difference. Twenty-one fixtures per mode.
1509
+ > **Sample** — 10,000 matches per fixture, home and away, SHA-256 seeds.
1510
+ > **Mode** — both; the two modes agree row for row.
1511
+ > **Effect** — 76.0% of the share for `carrier` against `default` in League and
1512
+ > 78.3% in Knockout — a 52-to-57 point win-rate advantage from the weights
1513
+ > alone. **Significant 3-cycles: 0 in both modes.** The unbeaten set — the
1514
+ > sheets nothing significantly beats — holds `carrier` and `sheet`, 1.4 points
1515
+ > of share apart in League and 1.5 in Knockout, under the corrected bar. Read
1516
+ > that as a PARTIAL order and not a total one: 3 of the 21 pairs in League and 4
1517
+ > in Knockout are inside the bar, so "no cycles and a two-member unbeaten set"
1518
+ > leaves some pairs unresolved rather than ranking all seven. What it does
1519
+ > settle is the direction: nothing here beats `carrier`, and no sheet outside
1520
+ > the unbeaten pair is unbeaten.
1521
+ > **Source** — `appr-role.mts`, section (5).
1522
+
1523
+ ### Crossing the two — the grid the verdict actually rests on
1524
+
1525
+ The two grids above are one-dimensional slices: one varies the opponent's SQUAD
1526
+ with its sheet pinned to the default, the other varies its SHEET with its squad
1527
+ pinned. A best response can be conditional on the product while both slices
1528
+ share a leader, so neither settles the roadmap question on its own. Multiplying
1529
+ them does:
1530
+
1531
+ Each cell is my best-response BAND against that opponent squad playing that
1532
+ sheet, and — after the bar — the argmax rung of the full concentration ladder
1533
+ swept inside the same cell, so "more is better up to the corner" is checked
1534
+ where the best response is rather than only against one fixed opponent.
1535
+
1536
+ | My best response \| ladder argmax | vs `default` | vs `carrier` | vs `finisher` | vs `playmaker` | vs `sheet` | vs `tier` | vs `spread` |
1537
+ | --- | --- | --- | --- | --- | --- | --- | --- |
1538
+ | `role-433` | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 |
1539
+ | `def-433` | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C/F \| ×1024 | C \| ×1024 | C \| ×1024 |
1540
+ | **`def-532`** | **C/F** \| ×1024 | **C/F** \| ×1024 | **C/F** \| ×1024 | **C/F** \| ×1024 | **C/F** \| ×1024 | **C/F** \| ×1024 | **C/F** \| ×1024 |
1541
+ | `shootonly-433` | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 |
1542
+ | `passonly-433` | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 |
1543
+ | `flat-433` | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 | C \| ×1024 |
1544
+
1545
+ > **Measured on** — `stars-433` against all six opponent squads, each of them
1546
+ > playing each of the seven sheets, with all seven of my own sheets AND the full
1547
+ > nine-rung concentration ladder tried against every combination. C is
1548
+ > `carrier`, F is `finisher`; a cell names every sheet the sample cannot
1549
+ > separate from that cell's leader. A second focal squad runs the same grid:
1550
+ > `role-433`, the hard case, since its three forwards are identical to the byte
1551
+ > and only cross-group reallocation is left — against the other five squads over
1552
+ > a reduced sheet set (`default`, `carrier`, `spread`), 30 further cells.
1553
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds: 114
1554
+ > squad-by-sheet-by-mode cells, 14,700,000 matches in this section alone.
1555
+ > **Mode** — League shown. The Knockout grid differs in three `def-433` cells
1556
+ > and nowhere else: it ties `carrier` with `finisher` against `carrier`,
1557
+ > `finisher` and `tier`, where League resolves, and resolves against `sheet`,
1558
+ > where League ties. `def-532` is C/F in all fourteen of its cells in both modes.
1559
+ > **Effect** — 0 cells out of 114 exclude `carrier` from the best-response band,
1560
+ > and the ladder's argmax is the TOP rung in all 84 cells where it was swept: 84
1561
+ > ends, 0 interior optima, 0 unresolved, and 84 with no significant step
1562
+ > downward at any rung along the way. The distinct raw best-response count is
1563
+ > 2, and the three cells where `finisher` edges ahead on the raw number are all
1564
+ > `def-532` in Knockout, by 0.1 to 0.2 points of share against a 2.74-point
1565
+ > threshold. Every cell of the second focal squad's grid reads C/F, which is the
1566
+ > permutation control showing through rather than a conditional answer:
1567
+ > `role-433`'s slot 8 and slot 10 are the same player twice, differing only in
1568
+ > the penalty-kicker flag. So one sheet is a best response against every
1569
+ > squad-and-sheet combination measured, and concentrating harder is better in
1570
+ > every one of them.
1571
+ > **Source** — `appr-role.mts`, section (6).
1572
+
1573
+ ### The other half of the table — defensive selection weights
1574
+
1575
+ `D_*_APPR` picks who contests each scene, and the same multiplier applies there.
1576
+ It is a comparably large lever and it points somewhere surprising.
1577
+
1578
+ | Defensive focal slot | ×1 | ×1024 | League | Knockout |
1579
+ | --- | --- | --- | --- | --- |
1580
+ | `stars-433` slot 8 — FW, defense 5, **29 pts** | 37.2 | **52.0** | **+14.8pp** | **+18.7pp** |
1581
+ | `stars-433` slot 1 — DF, defense 5, 12 pts | 37.2 | 37.8 | +0.6pp | +0.9pp |
1582
+ | `def-433` slot 2 — DF, **defense 9**, 20 pts | 52.4 | 57.1 | +4.7pp | +5.3pp |
1583
+ | `def-433` slot 8 — FW, defense 2, 19 pts | 52.4 | 17.7 | −34.7pp | −35.5pp |
1584
+
1585
+ > **Measured on** — `stars-433` and `def-433`, each against `role-433` playing
1586
+ > the shipped weights. The multiplier is applied to the DEFENSIVE table in every
1587
+ > scene; the keeper's A0 weight is the one entry left alone, and the offensive
1588
+ > table is untouched in all four rows. Both focal squads keep their 212 points
1589
+ > and their formations across every cell.
1590
+ > **Sample** — 10,000 matches per cell, home and away, SHA-256 seeds.
1591
+ > **Mode** — both, one column each. As in the concentration table, the ×1 and
1592
+ > ×1024 columns are League shares and the League/Knockout columns are the paired
1593
+ > delta from that mode's own ×1 cell.
1594
+ > **Effect** — 14.8 percentage points of share in League and 18.7 in Knockout
1595
+ > for funnelling defensive duty onto `stars-433`'s biggest FORWARD, against
1596
+ > +0.6pp for its nominal defender. Every defensive point is
1597
+ > `defense + cond/2 + total/3`, so a 29-point forward with defense 5 outscores a
1598
+ > 12-point defender with defense 5 by more than five points before any group
1599
+ > term. On `def-433`, whose totals are flat, the answer reverts to the defender
1600
+ > with the highest `defense` (+4.7pp) and the forward becomes catastrophic
1601
+ > (−34.7pp). **0 of the 8 defensive ladders have a significant interior
1602
+ > optimum; 7 peak at an end and 1 peaks inside without separating from a
1603
+ > neighbour.**
1604
+ > **Source** — `appr-role.mts`, section (7).
1605
+
1606
+ ### Degrees of freedom this probe LEFT free
1607
+
1608
+ The keeper section below was wrong three times in one day and the cause was a
1609
+ different uncontrolled degree of freedom each time. So, explicitly, and knowing
1610
+ that the verdict under this list is a NEGATIVE one — the things left free are
1611
+ the ways it could be wrong:
1612
+
1613
+ - **`cond`.** Fixed at 5 for all 22 players in every cell, as production does
1614
+ today. **This is the load-bearing one.** Concentration here has no cost
1615
+ because involvement has no cost; an involvement-driven form system is exactly
1616
+ the change that would put a price on the ×1024 column, and it would invalidate
1617
+ every row above rather than shift it.
1618
+ - **Growth buffs.** Every squad is tenure 0, so `teamPow` is exactly 100.
1619
+ Production raises effective `total`, which scales BOTH the individual `total/3`
1620
+ and the group term the anti-concentration section measures — so the 5.4pp that
1621
+ section reports is a tenure-0 figure.
1622
+ - **Manager response.** The opponent grid is fixed and nobody re-solves a squad
1623
+ against a sheet. A squad built KNOWING it will funnel one player is a
1624
+ different 212-point problem, and it is not measured here: the co-optimisation
1625
+ of points and weights would only make the effect larger, which is not the
1626
+ direction that would rescue the axis.
1627
+ - **The sheet space.** Seven hand-built sheets and one nine-rung ladder per
1628
+ slot. That is a sample of a space with eleven slots × six scenes of free
1629
+ parameters, not an argmax over it. "No cycle among these seven" and "one best
1630
+ response over the crossed grid" are both claims about these seven — a
1631
+ conditional best response living outside them would read as an answer here.
1632
+ - **The focal squads.** Two, and only one of them (`stars-433`) has players who
1633
+ differ inside a position group at all, so the within-group half of this axis
1634
+ is measured on one roster. The crossed grid runs `role-433` as a second focal
1635
+ squad, but over a reduced opponent-sheet set and with a formation and a set of
1636
+ kicker flags it shares with the first. **Which** player to funnel is already
1637
+ known to be squad-conditional — the defensive table above reverses its answer
1638
+ between `stars-433` and `def-433` — and nothing here says the best focal SLOT
1639
+ is the same on a roster neither squad resembles. What the grid does support is
1640
+ narrower and is what the verdict uses: whether to concentrate at all does not
1641
+ depend on the opponent.
1642
+ - **Set-piece slots.** `squad-lib` pins the FK taker to slot 9 and the penalty
1643
+ taker to slot 10. Slot 10 appears above as a focal player, so its rows carry
1644
+ kicker duty as well as its weight — slot 8, the headline row, carries neither.
1645
+ - **Formation.** Every focal squad is a 4-3-3. The lone-OMF result is a fact
1646
+ about a group of one, and a 4-4-2 would not reproduce it.
1647
+ - **Interactions.** One sheet at a time against the default. Nothing here says
1648
+ what a role sheet does while an engine constant is also moved.
1649
+ - **The defensive keeper slot.** Section (7) leaves the keeper's A0 weight at
1650
+ 100 in every cell. Whether a manager should be able to keep his keeper OUT of
1651
+ the 1v1 is a question this probe does not ask.
1652
+
1653
+ ### The verdict, and what it means for tactical sheets
1654
+
1655
+ **Detectable: overwhelmingly.** Up to 35.8 points of win-equivalent share on one
1656
+ squad whose 212 points never change, and 76.0% head to head against the same
1657
+ eleven players on the default sheet. Every other section of this file measures a
1658
+ lever by changing the players; this one changes nothing except which of them the
1659
+ ball reaches, and moves more than any of them. The engine-constant sweep — the
1660
+ only other section that holds a squad fixed — moved 11.8pp at its widest and
1661
+ re-priced nothing.
1662
+
1663
+ **A decision: no.** Every diagnostic points the same way. 0 of 50 ladders in the
1664
+ one-opponent sections have a significant interior optimum — 48 peak at an end,
1665
+ the remaining 2 peak inside without separating from a neighbour — 84 of 84
1666
+ ladders swept INSIDE a crossed cell peak at the top rung with nothing
1667
+ unresolved, and all 134 ladders in the run are free of any significant step
1668
+ against their own direction. The anti-concentration term is real but worth about a seventh of the
1669
+ payoff, and it changes the slope without changing the answer. The round robin
1670
+ finds zero 3-cycles in either mode and an unbeaten set of two sheets 1.4 points
1671
+ of share apart. And the crossed grid — every opponent squad against every
1672
+ opponent sheet, on two focal squads, 114 cells — never once excludes `carrier`
1673
+ from the best-response band. **Concentration is monotone: more is better, up to
1674
+ the corner, against every squad and every sheet measured.**
1675
+
1676
+ So the axis is not a decision *yet*, and the word doing the work is `cond`. The
1677
+ reason concentration is free is that involvement costs nothing — the eleventh
1678
+ selection of a player is exactly as good as his first, because `cond` is a
1679
+ constant. That is what a form system changes, and it is the one change that
1680
+ could put an interior optimum on these ladders. **Roles before form would ship
1681
+ the largest monotone answer in the game.**
1682
+
1683
+ Two things in the tables above survive that verdict and are worth keeping:
1684
+
1685
+ - **Scene shape is where the interesting half lives.** The same multiplier on
1686
+ the same player is worth +4.7pp or −6.0pp depending only on which scenes it
1687
+ applies to, and the best focal player is the best PASSER rather than the best
1688
+ finisher. Whatever a sheet eventually exposes, a single "involvement" slider
1689
+ would throw both away.
1690
+ - **The defensive table is a second lever of the same size and nobody has looked
1691
+ at it.** On a squad with uneven totals the best defender to funnel duty to is
1692
+ the biggest FORWARD, because `total/3` is in every defensive point. That is
1693
+ either a feature to expose or a formula to reconsider, and it is decided by
1694
+ the same track.
1695
+
1696
+ Re-run after any engine change:
1697
+
1698
+ ```bash
1699
+ npx tsx packages/mcp/skill/reference/probes/appr-role.mts # ~21M matches, ~4 min
1700
+ N=2000 npx tsx … # ~50s; the bar is fixed, the detectable EFFECT moves
1701
+ ```
1702
+
647
1703
  ---
648
1704
 
649
1705
  ## Note for the maintainers