pog-mcp 0.9.1 → 0.9.2
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 +1 -1
- package/skill/reference/measurements.md +582 -0
package/package.json
CHANGED
|
@@ -644,6 +644,588 @@ 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
|
+
|
|
647
1229
|
---
|
|
648
1230
|
|
|
649
1231
|
## Note for the maintainers
|