# Conflict — lesson

Gym heading: Knowing when not to trade. Written before the code (Sep 7 2026). The teach screen shows this text; the answer key implements the rule in it and nothing else. Distances are in M everywhere. Harness, confidence, persistence, and reveal format follow stop-vs-noise. The four reads are four other modules' rules, restated here in their words and implemented to their precision: structure (`gym/structure/lesson.md`), efficiency (`gym/efficiency/lesson.md`), session VWAP (`gym/session-vwap/lesson.md`) and value (`gym/value/lesson.md`), all Sep 7. When one of those rules changes, its lesson changes first, then this one. The bars come from point-at-the-bar's generator v2 by way of session-vwap (the opening, the volume on every bar, the VWAP from the anchor); the last 15 bars are legs between authored swings, the structure module's construction, and the sizes of those legs set the efficiency of the last 10, the efficiency module's bracket.

**Open item (Sep 7 2026 at 500 reps/family; re-measured Sep 8 2026 at 6,000 reps/family):** no single read's state is supposed to carry the case past a ~60% ceiling — see "No read decides alone" below — and several of them do. At 500 reps/family the worst was structure disagreeing, at 73%. The first full run the harness has ever been able to finish (300 sessions and 6,000 reps a family, once the gap fix below let a session build at every seed) puts the worst at **100% at `vwap:trendingAgainst`**, about 95 reps in every 3,000, with `vwap:fair` at 97–98%, `efficiency:legAgainst` at 100% on 11 reps, and `structure:against` at 66–68%. Rule-vs-intent mismatches are zero, null reps are zero, and case shares sit within 0.03 of a third, so this is a pattern-weight balance gap and not a correctness bug. It is not something the gap fix introduced: HEAD and the fixed file give the same state-by-case table bucket for bucket over 150 attempts a family — filling gaps changed how many reps get served, not which. Tuning is still paused; the next attempt should rebalance `PATTERN.one`/`PATTERN.three`'s structure weight and the VWAP targets against a fresh harness run, which now costs about four minutes rather than the better part of an hour.

**Gaps in a session (Sep 8 2026):** `buildSessionPlan` used to come back empty-handed at most seeds — 202 and 303, the harness's `fix2` seeds, among them — and `fix2` halted there. Measured over 120 attempts a family, **no tally constraint was ever the reason**: case-share drift was 0.067 drill and 0.033 holdout against a 0.10 tolerance, no case ever came up empty, the long share was exactly 0.50 every time, and every attempt whose twenty slots were all filled passed `tallyOk`. What could not hold was the absence of gaps. `makeRep` gives up on about one slot in five — 20.1% drill, 20.4% holdout, spread across every intent (clear 10%, mixed 22%, against 28%) and every efficiency target (churn 16% up to legWith 46%), not concentrated in one pattern — so 98–99% of attempts carried at least one null slot, and a plan with any null is rejected. Forty attempts at a ~1% chance each is a coin flip, which is the null rate that was observed. The fix is in `buildPlanAttempt`: a slot `makeRep` gave up on is drawn again, up to `GAP_PASSES` times, with the same intent and the same mirror and a fresh pattern. Nothing about a served rep changes — the intent and mirror mixes are what they were — and nothing in `tallyOk` was relaxed. Over 406 seeds a family (202, 303, 101 and 200 random): zero empty plans, zero tally failures. A session now costs ~0.3 s drill and ~0.65 s holdout to build, down from ~6.4 s and ~7.7 s.

Choices made where the order was silent:

- **The chart is the value module's session:** 40 bars of 15 minutes from the 18:00 New York anchor, frozen on the current bar, so the VWAP is anchored where the VWAP module anchors it and the profile counts the session the value module counts. The structure window is the last 15 bars, the efficiency bracket the last 10, the VWAP slope window the last 12, as in those modules. The windows are marked on the chart; nothing on the chart names a read's state.
- **What is drawn:** the swing triangles (every swing on the chart, the ones outside the structure window dimmer), the VWAP with its fair band (±0.25 M) and stretch lines (±0.5 M), the session's volume profile beside the bars with VAH, POC and VAL drawn, and the proposed side as an entry line at the last close labelled long or short. The clock is not drawn (the value module's choice).
- **The side is always the last close.** The trade proposed is a long or a short from the last close and nothing else about it: no stop, no target. Those are Stop vs noise and Runway. The chart is built for a long and half the reps are mirrored, which makes them shorts; the count is the same either way.
- **How each read votes.** A read backs a side or it backs neither:
  - Structure: UP backs long, DOWN backs short, NONE backs neither.
  - Efficiency: a leg (0.6 or more) backs the direction of its net move; churn (0.3 or less) and in-between back neither.
  - VWAP: trending backs the side price is on (above VWAP backs long); stretched backs the side toward VWAP (above a flat VWAP backs short: the read is reversion); at fair, the between-the-bands verdict included, backs neither.
  - Value: above value backs long (buyers paying up; a short there is fading them), below value backs short, inside value backs neither.
  A read disagrees with the proposed side when it does not back it. **No side is not your side.** A read on the fence is counted with the reads against you: four reads behind a trade is what clear means, and a fence-sitter isn't behind anything.
- **The count is the read.** Conflict is the number of the four reads that don't back the side. 0 or 1: CLEAR. 2: MIXED. 3 or 4: AGAINST. Three answers, a third each (config).
- **How a rep is built.** The case is drawn first, a third each. Then the count: a clear rep has one dissenter most of the time (config: drill 0.85, holdout 0.8) and none the rest; an against rep has three most of the time (the same shares) and four the rest. Then which reads dissent, from a weight table (config), and for each dissenter whether it has no side or the other side (a coin, config 0.5). Then the chart is built to that tuple and the four rules are run on the finished chart. The count they give is the answer key, and it must match the tuple or the rep is rebuilt.
- **No read decides alone.** Each read is a vote, so each read is legitimately correlated with the answer; the guard is that no read's state may make the answer guessable. The weight table is tuned so that, for every state of every read (structure up, none or down; efficiency a leg with the side, churn or in-between, a leg against; VWAP trending with, stretched toward, at fair, stretched away, trending against; value with, inside, against), the largest case share among the reps in that state is about 0.54 by design, and the harness requires it to stay under 0.6 over 6,000 reps, the session-vwap ceiling. Two consequences of the physics are accepted and recorded: a VWAP trending against the side never appears in a clear rep (value cannot be on the side's side while price trends away from it on the far side of VWAP), and a VWAP stretched toward the side appears with value inside or against, never with value on the side's side. Four combinations are never built on purpose, and the harness counts any that turn up: value on the side's side with the VWAP stretched toward it or trending against it; value against the side with the VWAP trending with it or stretched away from it.
- **A dissenter with no side looks like that module's no-side case, not like a blank:** structure NONE with three swings on each side in the window (never fewer, as the structure module builds it), efficiency in-between as well as churn, VWAP between the bands as well as at fair.
- **What the last 15 bars carry.** The last 15 bars are seven legs between six authored swings: every bar in a leg makes a higher high and a higher low than the bar before it (or lower and lower), so the swings are exactly the turns and there are three swing highs and three swing lows in the structure window whatever the case. The sizes of the legs set the structure (each swing against the one before it) and the efficiency of the last 10 bars (how much of the legs' travel stuck). The bars before the window are generator v2's opening (rotation, leg or mixed at the family's shares) with, when the tuple needs it, a leg or a spike away from the opening's balance and a base at the new level; those set where the VWAP and the value area sit against the last close. The last close lands where the final legs put it; no bar is rewritten after the fact.
- **Ranges carry no case.** Every bar in the window takes a rotation bar's range (0.5 to 1.5 M, most near 1), widened only when its body needs more, so M does not move with the tuple. The harness checks that M, the side, the opening's regime and the mirroring carry no case (within 3.5 standard errors of the pool).
- **Some reads sit a hair from their line on purpose** (config share, drill 0.2, holdout 0.3): a VWAP distance within a few hundredths of 0.5 M, an efficiency within a few hundredths of 0.6 or 0.3, a close within a few hundredths of M of VAH or VAL. The reveal shows the numbers either way.
- **The next 20 bars** are drawn with an outcome rate per case that is a config constant and is never shown. The reveal says what price did from the entry, in M: the most it moved for the side, the most against it, and where it closed. No percentages anywhere in a rep.
- **Soft clock 12 seconds:** four reads, one count.
- **M** is the median range of the last 20 bars, as everywhere.

Persistent header: **"Training your eye for when the tape has outvoted you."**

## Before you take the trade

- **Four reads** — Four reads vote on a side: structure (up/down/none), efficiency (leg/churn), VWAP (stretched/trending/fair), and value (inside/above/below). Each read backs a side or backs neither.
- **The votes** — Structure UP backs long, DOWN backs short, NONE backs neither. A leg backs its own direction; churn backs neither. Trending backs the side price is on; stretched backs the side toward VWAP; at fair backs neither. Above value backs long, below value backs short, inside value backs neither.
- **Conflict** — Conflict is how many disagree with the proposed side. A read that backs neither side disagrees with yours: no side is not your side.
- **Clear** — Zero or one: clear.
- **Mixed** — Two: mixed.
- **Against** — Three or four: against.
- **Why it matters at the trade** — Decision: clear is tradeable, mixed is a wait, against is a no — the read that made you want the trade is outvoted by the tape. The panel's "conflict" line is this count.
- **What it doesn't say** — Clear is not a forecast, and it is not a trade yet: the stop still has to survive the noise (Stop vs noise), the target still needs runway (Runway), and the entry still needs a bar to point at (Point at the bar). It says the tape isn't arguing with you. Against says nothing about the other side either: three reads against a long are not three reads for a short until you count them from that side.
- **M** — The median high-to-low range of the last 20 bars. Every distance here is in M. The number for the current chart is on the screen.
- **Confidence is a number** — Low means 40%, Medium 65%, High 90% that your call is right. Scored Brier-style: sure and wrong costs 0.81, unsure and wrong costs 0.16, sure and right costs 0.01. Being certain is as expensive as being wrong.

## The read

Four reads, one at a time, each against the proposed side: does it back this side, or not? Then the count: how many don't.

## The rep

40 bars with the structure triangles, the VWAP and its bands, and the value profile drawn; the proposed side stated at the last close; frozen. No read's state is printed. The question, in full: **"LONG (or SHORT) from the last close. Four reads vote on that side. Clear, mixed, or against?"** Clear, Mixed, or Against, with a confidence.

## The reveal

The banner; the answer; the four reads listed, each with its state, the side it backs, and whether it agrees or disagrees with the proposed side; the count; one takeaway line. Templates:

- CLEAR: **"{N} of 4 disagree. The tape agrees with you."**
- MIXED: **"2 of 4 disagree — {which}. Wait for one to flip."**
- AGAINST: **"{N} of 4 disagree — {which}. Your read is outvoted. No trade."**

{which} names the dissenting reads. Every rep ends on one of these three lines. Each is a decision: take it, wait, or no. Then the next 20 bars, with what price did from the entry in M. No percentages.

## Answer key

The four reads, each by its own module's rule on the finished chart, M the median range of the last 20 bars:

- **Structure** (the last 15 bars): a swing is a bar higher (lower) than one bar on each side, the last bar never a swing; take the last three swing highs and the last three swing lows in the window. UP: highs strictly rising and lows strictly rising. DOWN: both strictly falling. NONE: anything else.
- **Efficiency** (the last 10 bars): net = |last close − the close 10 bars back|; path = the 10 close-to-close moves added up; both at two decimals of M; efficiency = net ÷ path at two decimals. Leg at 0.6 or more, its direction the net's; churn at 0.3 or less; in-between otherwise.
- **VWAP** (from the 18:00 anchor): d = |close − VWAP| in M at two decimals; slope = (VWAP now − VWAP 12 bars ago) ÷ 12 in M per bar at three decimals, taken toward price's side. At fair: d ≤ 0.25; between the bands (0.25 < d ≤ 0.5) scores as at fair. Trending: d > 0.5 and the slope toward price 0.05 or more. Stretched: d > 0.5 otherwise.
- **Value** (the 40 bars): each bar's volume spread evenly over its range into rows of 0.1 M anchored at the middle of the session's range; POC the row with the most volume; the value area the 70% of the volume around the POC, built outward one row at a time, the heavier neighbour first; VAH the top of the highest value row, VAL the bottom of the lowest. Above: round2((close − VAH) ÷ M) > 0. Below: round2((VAL − close) ÷ M) > 0. Inside otherwise.

`backs(structure)`: UP → long, DOWN → short, NONE → none. `backs(efficiency)`: leg → the net's direction, churn or in-between → none. `backs(VWAP)`: trending → price's side of VWAP, stretched → the side toward VWAP, at fair → none. `backs(value)`: above → long, below → short, inside → none.

`conflict = the number of reads whose backs ≠ the proposed side`. **CLEAR**: conflict ≤ 1. **MIXED**: conflict = 2. **AGAINST**: conflict ≥ 3.

The three answers come up a third each (config). No single read's state makes the answer guessable: for every state of every read, the largest case share among the reps in that state stays under 0.6 (harness). Nothing but the four votes carries the case: not M, not the side, not the opening's regime, not the mirroring.
