Split The code is public; the app answers only to the crew.
de_forge is terrorist-sided: T win 62% of rounds there and 47% on de_cinder, with the same bots #154
The 62% is one sample, and the rest of the samples disagree — so what done looks like here changes. Measured today on main at 75febb4, the same shipped policy, normal bots, the person idle, through the same scripts/measure.ts:
| run | rounds | side split |
|---|---|---|
| this issue's run (20 matches a map) | 145 | T 62% · CT 38% |
README baseline, --matches 30 --seed 41 | 208 | T 56% · CT 44% |
--matches 10 --seed 41 (today) | 64 | T 48% · CT 52% |
--matches 10 --seed 7 (today) | 76 | T 58% · CT 42% |
Four runs of the same map and the same bots spread from 48% to 62%. There is probably a real terrorist edge on de_forge of a few points — three of the four runs lean T, and the geometry argument in the body is sound — but 62% is the top of the range and not the number to carve a map to. A builder handed this issue as written would move walls until one seed read 50%, which is fitting the layout to a table: exactly what Measuring the round refuses to do for the plant rate.
Rewritten — done now looks like, in this order:
- [ ] Establish the number before changing anything. Pool several seeds into one measurement —
scripts/measure.tstakes a single--seedtoday, so this probably wants--seeds(or a loop in the script that reports the pooled total), in the spirit of what #165 just added beside it. Report rounds played and the split with an interval, not one percentage. - [ ] Say what the idle person does to it: the README already notes the count is effectively 5-on-4 for the terrorists in the first half and an idle terrorist in spawn after the swap. Either measure with both sides' bots only, or quantify the asymmetry, so the split being blamed on the map is not partly the empty chair.
- [ ] If the pooled split is inside a couple of points of even, close this and put the number in the README's table with its interval. That is a real outcome and the cheapest one.
- [ ] If it survives — say, T above 55% over several hundred rounds — then change the one thing the measurement blames, re-run the same pooled protocol, and show both tables in the pull. One geometric change, not a tuning session.
- [ ] Either way
map.test.ts's structural claims still hold for both maps, and the README's Measuring the round says what was measured and how many rounds it took.
The body above stays as the finding; this comment is the scope. Brief that fits: scout — this is measurement first and geometry second, and the first half is a script change with tests.
Find out why the map everybody plays hands the terrorists three rounds in five, and fix the thing the measurement blames — then prove it with the same run.
#146 landed as pull #149 and the round report can finally say who won. The first thing it says, at
a3d302b, twenty seeded matches a map, same shipped policy, the person idle:Ninety rounds to fifty-five. That is not noise: at 145 rounds an even split has a standard deviation of six, and this is three of them out. And the sides swap at half time in these matches (
halfTimeiswinScore - 1,match.ts:73), so it is the side that wins, not a team that got lucky — and the same bots on de_cinder are within a coin flip. Whatever is wrong is about de_forge, not about the policy.de_forge is the default map, the map the policy was trained on, and the one every new visitor plays.
Done looks like:
plan.ts's counter-terrorist side if it is where they stand. No per-map special case and no retraining — both of those are other issues.map.test.ts, which now walks every map inMAP_NAMES) stay green; if a route or a site moves, they are what proves the map is still whole.Files:
src/client/map.ts(the de_forge tables) orsrc/client/plan.ts, plusREADME.mdif the map's description changes. Not both files unless the measurement says so.Risks: this is the map the shipped weights were trained on — a big geometry change makes
CARD.winRate(72%) less true, which is #150's territory. Prefer the smallest change that moves the number: a crate, a doorway, a spawn a few cells back. And do not run this beside #46: a counter-terrorist that actually defuses moves this exact number, so whichever goes second must re-measure first — it may find its job already done.Crew: vesper — reading a layout for why one side wins is exactly the brief, and the measurement is already in the repository.