pog-mcp 0.9.6 → 0.9.7

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.6",
3
+ "version": "0.9.7",
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",
@@ -2549,12 +2549,41 @@ that was an artefact of an unattainable +4 buff and is withdrawn.
2549
2549
  **This section does NOT close C-2.** An earlier version said it did; that was wrong. `τ` was
2550
2550
  never measured — the probe's 24h default was simply used — and the neutral point was left
2551
2551
  unchosen between its two branches. An F-1 implementer following that decision would have made
2552
- a probe default the production recovery rate. And `τ` cannot be measured from this data: F-1
2553
- does not exist, so production has no fatigue and there is no observed recovery curve to fit.
2554
- What measurement CAN do is price the choices, which is what the τ sweep does. A third product
2555
- choice sits beside τ and the neutral point: F-1 has not selected predicate C versus D. The
2556
- published values are conditional on C; switching to D moves τ=24h median/p95 `L` by
2557
- −5.3%/−10.4%. That measures the price of the choice, not which workload meaning the product wants.
2552
+ a probe default the production recovery rate. And `τ` cannot be measured from this data: at the
2553
+ time of this measurement F-1 did not exist, so production had no fatigue and there was no observed
2554
+ recovery curve to fit. What measurement CAN do is price the choices, which is what the τ sweep
2555
+ does. Predicate C versus D was the third product choice at publication; it was subsequently
2556
+ resolved as **D** on 2026-09-04. The published values remain conditional on C; switching to D
2557
+ moves τ=24h median/p95 `L` by −5.3%/−10.4%. That measures the price of the choice, and selecting D
2558
+ does not retroactively relabel C-conditioned calibration as D-conditioned evidence.
2559
+
2560
+ ### F-1 implementation status — predicate D is now durable
2561
+
2562
+ F-1 persists version `f1-d-growth-neutral-v1`: actor plus responder selections minus only the
2563
+ actor/responder selections produced by a zero-weight `weightedPick` fallback. Legitimate direct
2564
+ defender selections, fixed set-piece/post-play actors, and penalty keepers remain counted. This
2565
+ keeps the measured defensive participation while preventing the known all-zero ZP table from
2566
+ turning the first non-GK slot into a fatigue lever.
2567
+
2568
+ The engine instrumentation is opt-in and consumes no RNG. The existing growth-buffed simulation
2569
+ still decides the real result; one separate engine instance projects `total` back to the public
2570
+ attribute sum and emits only unsigned slot counters. Scheduled processing claims the complete due
2571
+ batch before either real or shadow simulation, freezes one external batch epoch into
2572
+ `MatchInputSnapshot v3.capturedAt`, and reuses it on retries. A first locked transaction commits the
2573
+ snapshot and durable per-player reservation; a second commits the real result, replay events,
2574
+ `match_workloads` root, 11/22 `player_workload_events`, and reservation release. Interactive ladder
2575
+ play holds the same player locks from snapshot through both simulations and the durable write.
2576
+
2577
+ Cup classification is structural (`tournament_id IS NOT NULL`) and credits both sides. Ladder
2578
+ credits home, plus away only when the shared `isAI || isSystemOwnedWallet` rule identifies a bot;
2579
+ human away produces no workload rows. Durable players retain `playerId`; daily cup fill-bots use a
2580
+ separate salt over cup date, team and slot. Listing, fixed purchase, auction settlement, custody
2581
+ activation/delivery finalization, and shared ownership transfer all participate in the same lock
2582
+ and reservation fence. Recovery discovers exactly
2583
+ `(tournament_id IS NOT NULL OR match_type='playoff') AND status='complete' AND completed_at > cursor`,
2584
+ never filters on kickoff, and records explicit legacy exemptions. Friendly, paid trial and sandbox
2585
+ write no workload and pin both route-local engine copies to `cond=5`. EWMA decay, neutral point and
2586
+ actual condition derivation remain F-2; F-1 alone changes no competitive input.
2558
2587
 
2559
2588
  ### Growth-leak gate: use a zero-growth shadow, not the real action trace
2560
2589
 
@@ -2578,7 +2607,7 @@ stored seed and `gameFlg`. F-1 consumes unsigned engagement counters only from t
2578
2607
  The real result still uses the growth-buffed input; the shadow cannot change its score, events,
2579
2608
  ratings or growth. It is therefore a **zero-growth counterfactual workload**, never the action
2580
2609
  record of the match that happened. Runtime cost is one extra pure simulation per competitive match;
2581
- F-1 still has to persist its counters atomically with completion. The workload timestamp must be
2610
+ F-1 persists its counters atomically with the computed result. The workload timestamp must be
2582
2611
  growth-invariant too: fix every due match's first-condition-snapshot (claim-start) time before ANY
2583
2612
  real or shadow engine in that scheduler batch runs, then use that match's one stored value for both.
2584
2613
  A sequential loop that timestamps match B only after simulating match A would carry A's
@@ -2604,8 +2633,8 @@ projection to the synthetic variations above and got byte-identical candidate-F-
2604
2633
  **1,201/1,201 matches and all 2,402 sides**. Unit tests pin erasure, preservation, non-mutation and
2605
2634
  idempotence; `match-growth.test.ts` pins that the real `applyMatchGrowth` producer projects exactly
2606
2635
  back to its innate team, and the existing squad-hash test independently pins that `total` is outside
2607
- the hash. This closes only the §3-5 prerequisite, not F-1/F-3/G-1/F-4's own implementation and
2608
- exposure contracts.
2636
+ the hash. That closed the §3-5 prerequisite; F-1 now uses it and G-1 is complete, while F-3 and F-4
2637
+ retain their own implementation and exposure contracts.
2609
2638
 
2610
2639
  **The gate is not a per-mode ceiling — it is defined on the exposure-weighted mix.**
2611
2640
  `band-worstcase.mts` holds the canonical statement (`01-engine-expansion.md:319-329` puts
@@ -2765,7 +2794,8 @@ counts; on expected rates it is 14%. Within-match noise had been read as between
2765
2794
  structure. The argument survives in a different form.
2766
2795
 
2767
2796
  The keeper still accrues almost nothing — it enters a contest only at the A0 one-on-one and
2768
- at penalties so no rule here makes one tired, and F-1 has to fill that blank deliberately.
2797
+ at penalties. F-1 deliberately accepted that limitation when it selected D rather than adding a
2798
+ separate goalkeeper source; whether it yields usable rotation belongs to F-2.
2769
2799
 
2770
2800
  Predicate D now subtracts fallbacks on BOTH sides of the contest: zone press picks its ACTOR
2771
2801
  through the fallback too, and an earlier version recorded only the responder's, so "C without
@@ -3007,8 +3037,9 @@ conversion.
3007
3037
 
3008
3038
  ### τ cannot be measured — only priced
3009
3039
 
3010
- `τ` is the recovery rate §6 C-2 asks for. F-1 does not exist, so production has no fatigue
3011
- and there is no observed curve to fit: `τ` is a DESIGN choice, not a measurement. What
3040
+ `τ` is the recovery rate §6 C-2 asks for. This measurement window predates F-1 and fatigue,
3041
+ so there is no observed curve to fit. The later F-1 ledger still does not derive condition;
3042
+ `τ` remains a DESIGN choice, not a measurement. What
3012
3043
  measurement can do is re-run everything at each candidate and report what follows. Each row
3013
3044
  below re-integrates the timeline, re-runs that τ's full cell set, and re-searches for the safe
3014
3045
  amplitude (one run, one snapshot).
@@ -3126,7 +3157,7 @@ it leaves open — does an opponent outside the basket exceed? — is asked sepa
3126
3157
  only **62 distinct XIs**. The old pool held 95 objects, of which only **47** were distinct
3127
3158
  lineups — 48 were duplicates. And **35 of the 95 teams fielded more than one XI** inside the
3128
3159
  window, every later one discarded. The new pool CONTAINS the old one and adds 15 lineups.
3129
- (Snapshot `cond` is 5 for everyone in this window — F-1 does not exist yet — so "fielded XI"
3160
+ (Snapshot `cond` is 5 for everyone in this historical window — it predates F-1 — so "fielded XI"
3130
3161
  is squad identity here, not condition.)
3131
3162
 
3132
3163
  **Taking only the top three was arbitrary — all 13 teams that played are measured.** Two
@@ -3537,8 +3568,8 @@ understated. Engine changes are input-dependent, so interspersed failures are a
3537
3568
  possibility rather than a clean release boundary.
3538
3569
 
3539
3570
  `LOAD_PRED` selects the integration predicate (default `C`). C is published, and the probe also
3540
- integrates at D at every τ and prints the difference F-1 has not chosen, so the calibration
3541
- has to carry which predicate it is conditional on.
3571
+ integrates at D at every τ and prints the difference. F-1 subsequently selected D, but the
3572
+ published figures remain C-conditioned: calibration must always carry the predicate it used.
3542
3573
 
3543
3574
  Without `TAU_SWEEP` only `TAU_H` runs. **Calling a single-τ run a "decision" makes a probe
3544
3575
  default the production recovery rate** — that is why the sweep exists.