KPI Lab · Concept · Component ② Tactical Simulator

A tool that evaluates the plan

The final goal is to watch the same match together, talk about it, and have that conversation feed the manager's decisions. Working towards it I ran four preliminary measurements, and on their results fixed the currently buildable scope as plan evaluation rather than prediction. Below: the measurement data, the verdicts, the design decisions that follow, and what remains out of reach.

Hyuckjin Han Sept 2026 Status Concept · 4 preliminary measurements Implementation None
Measurement data
48 matches
FC Seoul (K League 1, 25R) · Hwaseong FC (K League 2, 23R)
Events analysed
34,518
445 substitutions · 519 player-matches
Outcome
2 / 4
2 hypotheses unsupported · 2 measurement errors corrected
Scope fixed
Plan evaluation
Prediction excluded at this stage

Scope of this write-up

There is no implementation. This is the design document for component ②, the tactical simulator, promised at the end of the HOVI write-up. Its purpose is to establish, through literature review and my own measurements, what is and is not possible. Figures from the literature are cited; measurements are my own; the interface in §06 is a mockup.

01The problem — substitutions

Permitted substitutions went from three to five. Actual usage is 4.4 per team per match at FC Seoul and 4.9 at Hwaseong FC, or 8.84 per match across both sides. It is the largest single variable a manager controls directly during a match.

Substitutions per match (both teams)
8.84
FC Seoul, 25 matches · 221 total
Median timing
66.2'
IQR 58.2 – 77.7
Second-half share
97%
Hwaseong FC, 23 matches · 218 of 224

Ten cards per match

FC Seoul, 25 K League 1 matches, 2026 · timing of all 221 substitutions, both teams

0'45' 70'90' 97% of substitutions fall here Median 66.2' · IQR 58–78' Distribution Us Them Us — 5 Them — 5 Up to ten cards are played inside 30 minutes — yet the first is usually chosen without accounting for the other nine
The aim is not the effect of the first substitution but preparing the second and third on the branches the first creates. If ten cards interact, that initiative is worth taking.

02State of the field

As of September 2026, generating match continuations from event data is already published and in some cases open-sourced. The table lists what the review turned up.

SystemWhat it doesData requiredSubstitutionsOpponent response
TacticAI → Palmeiras
June 2026
Drag a player and both teams rearrange. Extended from corners to open playBroadcast tracking✕positions ○
TacticGen
April 2026
Generates tactics, conditioned on rules or natural language3.3M events
+ 100M tracking frames
✕included in generation
LEM (Large Events Model)
2024–2025 · code released
Learns events as a language and continues a match from any point. Monte Carlo outcome distributions
A derivative fine-tunes per team to answer "this player in this squad"
Event data
1.72M events
✕
no player identity
✕
ScoutGPT
2026
From event data alone, swaps a player in and continues the matchEvent dataplayer swap ○
in-game ✕
✕ not addressed
Fuzzy-logic substitution priority
2025
Audits "who should come off now" by ruleEvents + minutesremovals ○✕
KU Leuven substitution analysis
2020/21–2021/22 · 6 leagues
Type and timing classification, 74% xGD-based predictionShot datapost-hoc ○✕

Both generative lines — LEM and ScoutGPT — swap players in the starting line-up. Neither covers in-game substitutions or the opponent's adjustment to them. No study in the reviewed literature treats substitutions as a sequence exchanged between the two sides.

The absence of prior work does not vouch for the direction. The possibility that no signal exists has to be ruled out first. §03 and §04 are that check.

03Measurement ① — interaction in substitution timing

Hypothesis — opponent substitutions respond to ours.
Data — Hwaseong FC, 2026 season, 23 matches, 224 substitutions across both sides. For each of our 114 substitutions, the share of opponent responses within N minutes.
Null model — the opponent's set of substitution times replaced with another match's, 3,000 times (each side's timing distribution preserved; only the fact of being the same match removed).

Opponent response rate after our substitution

● observed · ▬ 95% interval of the shuffled null (Hwaseong FC, 23 matches · 224 substitutions)

0%20%40% 60%80% 0–3 min 0–5 min 0–10 min ±1 min obs 24.6% · null 12.3–29.8 obs 33.3% · null 22.8–43.0 obs 58.8% · null 47.4–67.5 obs 18.4% · null 7.0–22.8 All four inside the null interval — no response signal
All four windows sit inside the null interval. No signal was detected that opponent substitutions respond to ours in time.

Verdict — unsupported. In all four windows the observed value sits inside the null 95% interval. The two sides' median timings are also close, at 71′ and 68.5′. Prediction of opponent substitution timing is removed from the design.

Limitation — one team, one season, one league. This is "no signal detected", not proof that no interaction exists.

04Measurement ② — substitution type

Hypothesis — the response is in type rather than timing; an attacking change is answered with a defensive one.
Data — FC Seoul, 25 K League 1 matches, 221 substitutions across both sides. Classified attacking / like-for-like / defensive by the difference in positional rank (GK 0 · DF 1 · MF 2 · FW 3).

Hwaseong FC data was excluded here: K League 2 has no league-wide player file, leaving 46% of incoming players without a confirmed position.

Secondary result — score state governs substitution type

Substitution type by score state

FC Seoul, 25 K League 1 matches, 2026 · 221 substitutions, both teams

LeadingLevelTrailing n=70n=68n=83 4.3% 10.3% 22.9% Attacking Like-for-like Defensive 4.3% → 10.3% → 22.9% — more than fivefold
Attacking substitutions rise monotonically: leading 4.3% → level 10.3% → trailing 22.9%. Score state alone shifts the prior on the opponent's substitution type substantially. This is the first value the simulator can compute about an opponent.

Primary result — no type-level response detected

Rank correlation between the actor's substitution type and the responder's, over pairs where a response occurred:

5-min window (n=97)
−0.011
p = 0.915
10-min window (n=136)
−0.017
p = 0.851
15-min window (n=158)
−0.017
p = 0.830

One subgroup showed direction. Where an attacking card was played while trailing, defensive responses ran at 21.1 / 26.3 / 36.8% against 4.7 / 6.2 / 10.9% otherwise — three to four times higher. However, the minimum p across 3 states × 3 windows = 9 tests is 0.014, which corrects to 0.126 and is not significant. The five responses concerned came from four matches. Retained as a hypothesis only.

Limits of the instrument

By positional rank, two-thirds of substitutions register as "no change"

FC Seoul, 25 matches · classification of 221 substitutions

Like-for-like — 147 · 66.5% Defensive 45 Attacking 29 What is inside that block MF → MF 76 FW → FW 45 DF → DF 25 Managers change matches with these 76 Holding midfielder off, box-to-box on Inverted full-back swapped for a classic one — all register as zero change
147 of 221 (66.5%) classify as like-for-like. The 76 midfielder-for-midfielder changes include both holding-for-box-to-box swaps and inverted-for-classic full-backs; both register as zero. A correlation of zero computed with an instrument blind to 66.5% of cases cannot be used as evidence of absence.

Verdict — type-level response prediction is held. Absence of signal cannot be separated from insufficient resolution in the instrument. What is required is not a positional label but a role label.

05Measurement ③ — the variance structure of usage

Question — does "using the same player differently" exist in the data?
Data — 519 player-matches drawn from 34,518 raw events across FC Seoul's 25 matches (20+ minutes played, 24+ events, goalkeepers excluded). Variance decomposed on the 261 player-matches from the 17 players with four or more appearances.
Variables — nine describing how a player was used rather than how well (2 positional · 5 action mix · 2 pass character).

Coordinate handling — raw event coordinates are not normalised to attacking direction; they flip with home/away × half. The rule was confirmed against goalkeeper mean X and corrected (after correction: GK 8–9 · DF 40 · MF 50–56 · FW 58–61). Existing FC Seoul analysis scripts already apply this correction, so published reports are unaffected.

Result ① — role is fixed, task varies

ICC 0.69 for advancement and 0.69 for width. About 70% of variance is explained by player identity. Regulars play in the same place.

Reading a low ICC as "instructions change from match to match" is an error. Variation has three sources — changed instruction, opponent and situation, and measurement error. To separate them, events within a single match were split into odd and even halves, measured separately and compared (split-half reliability, Spearman-Brown corrected). Within one match the task is constant, so any discrepancy between the two halves is measurement error.

What each variable's variance is made of

FC Seoul, 25 matches · 17 players with 4+ appearances · 261 player-matches · variance decomposition + within-match split-half reliability

Player-specific (role) Match-level variation (task) Noise Split-half Advancement (X) Width (|Y−50|) Pass share Forward-pass share 0.81 0.75 0.42 0.35 Below: not measurable with this instrument — values do not reproduce even within one match Long-pass share Defensive-action share Duel share Shot share Dribble share 0.25 0.24 0.04 0.02 0.00 The positional axis survives — 6–8% noise, 81% / 75% of the variation is real A match contains a handful of dribbles and one or two shots. Turned into a share, that is noise, not instruction
By ICC alone the lower variables look like "things that change match to match." But their values do not reproduce even within a single match. That is sampling noise from thin event counts, not variation driven by instruction.

Split-half reliability is 0.00 for dribble share, 0.04 for duels, 0.02 for shots and 0.24 for defensive actions. A match contains only a handful of these events, so the share is unstable. These four variables are unusable under the current measurement scheme.

Result ② — measured amplitude on the positional axis

81% of the match-to-match variation in advancement reproduces within the same match (75% for width). About 25% of total variance is real match-level variation.

Match-to-match amplitude
± 8.3 m
median SD 7.9 pp
Max − min range
27 m
median · maximum 45 m
Explained by home/away
3–9%
lower bound on context effects

Role is fixed across a season; within that role the position taken up moves by about 8 m per match and as much as 27 m across matches. That variation is what "task" refers to.

Result ③ — the link between task and output was not established

In a within-player cross-validation with player identity removed, usage explained individual attacking output at R² 0.117. Restricted to variables with confirmed reliability, this falls to R² 0.035.

The 0.117 was driven mainly by shot share and dribble share, while the output metric itself contains penalty-area shots and completed dribbles. The same events appear on both sides of the equation, and both variables are unusable by the reliability criterion above. The valid figure is 0.035. For context, a 2026 study reports that adding player and team embeddings does not significantly improve next-event prediction, while noting that those embeddings do carry meaningful patterns about role and team style.

Verdict — no evidence was obtained that a change of task changes outcomes. The choice of output metric may be responsible: the effect of an inverted winger appears not in that player's numbers but in the space the full-back gains. Re-measurement against team-phase output is required and is constructible from event data.

Result ④ — coming on as a substitute does not itself change usage

For the 11 players with at least three starts and two substitute appearances, compared on the reliable variables: advancement increased in 5 of 11 and width in 3, with mean changes of −0.28 pp and −0.77 pp. The act of being introduced does not determine how a player is used.

06Design decision ① — the task is declared by a person

§04 showed the absence of role labels; §05 showed that only the positional axis is measurable. Both converge on one design. Do not infer the role from data; have the user declare it.

What is declared is not the role but the task. Within a season a regular's role is fixed (ICC 0.69), and it is rare to declare a change of position at the moment of a substitution. What is actually instructed is a task inside the role — "cutting inside from the right" — and that corresponds to the ±8.3 m positional variation measured in §05.

The query changes shape, from P(outcome | player) to P(outcome | player, declared task, context). The same design is supported by a limitation stated in the prior literature.

Fine-tuned LEM (2024) — the authors' stated limitation

"The model cannot reason about the changes a player may bring to a team's play model. It reproduces the current playing style."

A generative model reproduces observed usage; newly instructed usage lies outside the training distribution. This design supplies that input from a person.

The opponent side follows the same principle. An opponent substitution is not an object of prediction but an observed event. The system looks up the incoming player after the fact and opens response branches, so it does not require the timing prediction removed in §03.

68 minutes, touchline

⚠️ Interface mockup — the figures on screen illustrate behaviour and are not measurements

68:12 1 − 1 · away Cards left Us Them Manager "Seven off, 22 on — cutting inside from the right." HOVI Task registered — inverted winger, half-space entry. This player, this task: 4 matches. Tier 1 — our own data. Three prepared branches A · No response Past rate here — 24% Right-side 1v1 holds Cards remaining Left width · third line B · Defensive card Past rate here — 62% Front of the box locks up Cards remaining Cut-back · second ball C · They attack too Past rate here — 14% Space in behind opens Cards remaining Sprinter · back three Expected effect — 3+ box entries within 15 minutes Falsifier — if the right-side cross share rises instead, the change missed its intent
Interface mockup for declaration, lookup and branch display. The system does not recommend who to bring on. The player and the way he will be used are specified by the user; the system returns the branches and evidence that correspond to that usage. Declaring a falsifier alongside the expected effect is what makes post-match scoring possible.

07Design decision ② — evaluation, not prediction

Matching the four measurement results against the two candidate feature sets:

Measurement resultPredictionEvaluation
Timing interaction not detected (§03)requirednot required
Type-level response not detected (§04)requirednot required
Task → outcome link unconfirmed (§05)requirednot required
Action-tendency axis unmeasurable (§05)requiredpartial — replaced by positional axis

Prediction depends on four unverified premises. Evaluation depends on zero or one. "What this substitution will produce" has no ground truth and cannot be validated, whereas "was the declared plan carried out" is an observation. Returning references is retrieval. Neither involves inference.

The loop

Declared midweek · measured in the match · scored afterwards · accumulated

Midweek — declare "The right winger cuts inside" Effect · falsifier in positional language Match — measure Adherence is computed from the declared rule Half-time: "It breaks down after 62′" After — score Falsifier auto-scored Three similar cases Our past · wiki · clips Opponent's past moves Accumulates ~100 / season Record of when plans actually worked The accumulated record becomes the reference for the next plan This loop rests on none of the four unverified findings above It does not need to know when the opponent will change, or with what card. It does not need proof that a task changes outcomes — it only counts whether the plan was carried out.
Declare midweek, compute adherence during the match, score and retrieve references afterwards, accumulate the record. This structure does not depend on any of the unverified items in §03–§05. It works without knowing when or how the opponent will respond, and without a proven link between task and outcome.

08Which instructions are measurable

The split-half reliabilities from §05 define the feature range directly.

AxisSplit-halfVerdictCorresponding instruction
Advancement (X)0.81○ measurable"Push further up" · "Drop in to receive"
Width (|Y−50|)0.75○ measurable"Cut inside" · "Stay wide"
Pass share0.42△ partial"Keep it short"
Forward-pass share0.35△ partial"Play it forward"
Long-pass share0.25✕ not measurable"Go long"
Defensive-action share0.24✕ not measurable"Press harder"
Duel share0.04✕ not measurable"Win the second ball"
Dribble share0.00✕ not measurable"Take him on"

A game plan written in the language of position and direction can be evaluated. A game plan written in the language of intensity and frequency cannot, at this stage.

One response therefore has to exist on the input side — "That instruction cannot be quantified under the current measurement scheme. Please state it in positional terms." It is the Tier discipline of §09 applied to input.

Match phase (build-up, transition, defending) is not detected automatically. Accuracy from events alone is insufficient, and the user already holds the information. It becomes a declared field.

09Tier discipline — stating the thickness of the evidence

Data support for a declared task is not uniform. Across the same 17 players as §05, those with three or more matches in each of two distinct usage modes number 41–59%, depending on how finely usage is partitioned. The remainder is extrapolation.

Answering without distinguishing support means returning unsupported values in the same format as supported ones. For a user deciding within thirty seconds, that is the critical failure mode.

Tier discipline — the thickness of the evidence travels with the answer

The same question must be answered differently depending on data support

Tier 1 This player in this task, observed 3+ matches "Answered from our own data — n = 5 matches" Tier 2 Not this player, but similar players in this task "This is a task-level prior, not his own record" Tier 3 Neither available — no support "I will not answer. Here is what you could look at instead" Stating the tier is part of the answer — outside its range the system fails safely
Making tier and support_n required fields in the response schema enforces the discipline at the design level. The answerable range narrows; within it, wrong answers do not occur.

10Data constraint — the opponent

Conditioning on an opponent's usage requires repeated observations of that player.

Observation depth: our players vs opponents

FC Seoul, 25 matches · 519 player-matches (same filter as §05)

Our players 18 players · 262 ~15 matches per player Conditionable Opponents 165 players · 257 1.6 matches per player Not conditionable All 17 players with 4+ observations are ours. Zero opponents. The fix is clear — league-wide event collection. The pipeline exists; what remains is time.
Opponents are met once or twice a season, so repeated observation does not accumulate. Conditioning on an opponent's substitute is not possible with current data; league-wide event collection is the precondition. The collection pipeline exists and what remains is time.

11Operating structure — compute midweek, retrieve in-match

There is no time in-match to run a counterfactual generative model through hundreds of Monte Carlo samples, and by the principle set out in the HOVI write-up the computation cannot be delegated to the LLM either. Moving computation into the training week removes the constraint.

Compute midweek, retrieve during the match

When the tool is used determines what it costs to run

Midweek · training ① Declare the plan for this opponent ② Compute the branches in advance ③ Store them During the match ① Trigger fires (observed) ② Stored branch retrieved Retrieval, not computation Side effect one — predefined branches form a closed response set, easing speech recognition in stadium noise. Side effect two — coverage is measured for free — how many prepared branches were used.
During the match the system retrieves rather than computes. Two side effects — predefined branches form a closed response set, which reduces speech-recognition risk, and the share of prepared branches actually used accumulates as a coverage metric without a separate experiment.

A declared task with its expected effect and falsifier is a labelled prediction, and can therefore be scored after the match. At roughly 100 per season, the role and task labels whose absence §04 identified accumulate without a separate collection effort.

Risk — declaring only the expected effect invites confirmation bias. The falsifier has to be declared alongside it for the record to carry verification value.

12The final goal and the current boundary

The final goal is to watch the same match together, exchange football conversation, and have that conversation used in the manager's decisions. This write-up does not reduce that goal. It fixes the point reachable now.

The staircase to the final goal

Scope at each stage, and what blocks the next

1 — now · here A tool that evaluates plans, returns references No new data · positional axis 2 — after collection Opponents included · Opponent response lookup · Substitution branch catalogue · Task-conditioned simulation Blocked by — League-wide, multi-season data Opponent observation: 1.6 matches 3 — final goal Watching the same match and talking about it conversation used in decisions Blocked by — · No off-ball data · Intensity words unmeasurable · No live feed to the bench · Stadium ASR unverified · Broadcast rights · Task→outcome link unproven Two of the six are mine to solve
Setting stage 3 as the target leaves four of six constraints outside my control, so the work stays unfinished for a long time. Setting stage 1 as the target completes with current data. The components are the same; only the target differs.

What blocks stage 3

ConstraintWhySolvable by me
No off-ball dataEvent data records only moments on the ball. Shape-change simulation stops hereafter broadcast tracking is validated
Intensity and frequency languagePressing, duels and dribbles have split-half reliability of 0.24 or belowrequires a different instrument
Live dataHolding training GPS and receiving telemetry at the bench during a match are different product tiersno — the club's domain
Stadium speech recognitionNo published error rates exist for sports environmentsmeasurable
Broadcast rightsNot a regulatory question but a rights questionno
Task → outcome proofR² 0.035 on individual output. Re-measurement against team-phase output requirednext task

Two of the six are solvable directly. The rest require access inside a club or progress elsewhere. The scope of this stage is therefore limited to stage 1.

Scope at this stage

A tool that takes a game plan declared midweek in the language of position and direction, reports where that plan held and where it broke down after the match, and returns the relevant references alongside.

The reference sources are my own accumulation — past match events for our team, clips segmented by Dual-View, and a wiki built by connecting tactical literature to my own framework (453 documents · 9.3 MB · 12,142 internal links).

Stage 1 is also a precondition for stage 3. Repeating declaration and scoring across a season accumulates the task labels whose absence §05 identified, and those labels become the training data for task-conditioned simulation. Stage 2 opens on top of stage 1's output.

13What has to be verified

Nothing is confirmed yet. In order of verification:

  1. The share of a manager's instructions expressible in positional language. §08 pinned the feature range to this. A full match of instructions has to be transcribed and the share expressible as a measurement formula counted. A low share halves the feature range — the first item to check, and it needs one match and one sheet of paper
  2. Whether declaration is sustained in practice. Writing a task, expected effect and falsifier for every substitution is a question of operating habit, not technology
  3. Whether team-phase output detects the task effect. Individual output gave R² 0.035. This is the route to the open question in §05
  4. Whether league-wide events can be collected across multiple seasons. The constraint in §10 is resolved here
  5. Whether Tier 3 discipline holds. "Do not answer" is a rule whose violation becomes more tempting as the tool becomes more useful. The criterion for detecting a violation has to be defined in advance
  6. Testing the trailing-and-attacking hypothesis. It currently rests on eight matches and needs multi-season expansion
  7. How §04's result changes under role labels. The figure was computed with an instrument blind to 66.5% of cases. A different instrument may change it — or may not

Three write-ups, one system

HOVI is the conversational layer; two organs sit beneath it

HOVI — conversational layer Translates questions into metrics and metrics back into words Component ① input organ Dual-View glasses Captures the manager's words with a timestamp 6 stages built · 1 verified (8 ms sync) Component ② compute organ Tactical simulator ← this write-up Evaluates plans and opens references No implementation · 4 measurements The measurements here established that what ① captures is the input ② needs
Fixing in §06 that plans are declared in speech made component ①'s function — capturing the manager's words with their timestamp — the input device for component ②. Two separately designed pieces turned out to be required at the same point.

The answer range of this tool ends at "was the plan carried out" and does not include "was the plan right". The latter is judgement, and sits on the other side of the line drawn in the HOVI write-up.