SPEED CLIMBING An independent reimplementation of IFSC competition speed climbing on the standardised 15 m route. ================================================================================ CREDIT ================================================================================ Competition speed climbing is governed by the INTERNATIONAL FEDERATION OF SPORT CLIMBING (IFSC), founded 2007, which is also the author of both documents this app implements: - IFSC Speed Licence Rules - Speed Walls, version 1, 1 February 2022 (15 pp) the wall, the grid, and the 31-hold route plan - IFSC Rules 2024, version 1.1 (88 pp), article 9 (Speed) and Annex 4 the timing, the false-start rule, the format, the ladder, the ranking The standardised route dates from 2007. Records are recognised only on the 15 m wall, built by a certified manufacturer and homologated by the IFSC. THIS IS AN INDEPENDENT REIMPLEMENTATION. It is not made by, endorsed by, or affiliated with the IFSC. It contains no IFSC code, no IFSC artwork and no IFSC data file. The wall and the 31 hold positions are reproduced from the published WRITTEN specification - a competition standard in the same class as a velodrome's geometry or a dohyo's diameter, identical worldwide, and reproduced here so that a time in this app is comparable with a real one. Other sources: - Wikipedia, "Speed climbing wall" and "Speed climbing" (world-record tables) - Wikimedia Commons, "Voie officielle d'escalade de vitesse" by user Ghusse, CC BY-SA 4.0, used ONLY as an independent cross-check of the hold coordinates, never as their source ================================================================================ WHAT DIFFERS FROM THE REAL SPORT ================================================================================ Faithful: - 15 000 mm wall on a 200 mm socle, continuing 500 mm above the last panel - two 3 000 mm lanes, continuous 5 degree overhang - 1500 x 1500 mm panels, 10 high by 2 wide per lane, named sn and dx - an 11 x 10 grid at 125 mm pitch, 187.5 mm vertical edge inset, 125 mm horizontal edge inset - all 31 holds (20 big, 11 small) at their published grid references and orientations, transcribed row by row - the finishing pad's bottom edge at 14 800 mm above the ground - reaction below 0.100 s is a false start; if both competitors are under it the FASTER one is charged; equal reactions mean a re-run and no charge - times ranked to 1/1000 s, displayed rounded DOWN to 1/100 s - the Annex 4 ladder for fields of 4, 8 and 16; the quota table; the 50% qualification stagger; the full 9.17 ranking order Changed, and these are my decisions and not the specification's: - THE CLIMBING ORDER. The specification publishes 31 positions and no order at all. The order here is derived by a planner and uses all 31 holds across 45 limb moves, 19 of them hand moves. - THE STOP DEVICE'S POSITION AND SIZE. The route plan's 32nd row is "DX 10 | STOP DEVICE" with both position columns EMPTY. Only the height of its bottom edge is documented. It is placed between columns A and B of panel dx10 and given a 300 mm square face. - THE STARTING PAD's position on the floor, which the rules leave to the competitor. - THE HOLD SHAPE beyond "a ball and a long tail". - EVERY BODY PARAMETER. Nothing in either document says anything about a competitor's mass, reach or strength. - EIGHT PLAYABLE SECTIONS instead of 45 individual limb moves. A limb move every 0.15 s is not a human input rate. - A SLIP PENALTY of 0.12 s and a three-slip fall limit. The IFSC rulebook has no notion of a partial slip at all. - THE RIVAL climbs a scripted pace; only the player's ascent is solved. ================================================================================ THE HEADLINE, AND WHAT SETS IT ================================================================================ For a 70 kg climber with an 0.80 m arm and a 1.02 m leg, the model produces 6.844 s: 6.714 s of climbing plus a 0.130 s reaction. The centre of mass rises 12.288 m at a mean 1.830 m/s. The current world records are 4.54 s (Zhao Yicheng, 2026-05-10) and 5.99 s (Emma Hunt, 2026-07-04); the model's climber needs every capability scaled by x1.52 and x1.11 respectively to match them. Elasticities of the finish time, d(ln T)/d(ln p), measured by raising each capability 6% and re-solving: foot-hold adhesion (big) -0.343 <- largest capability lever foot friction -0.301 limb repositioning speed -0.255 arm isometric force -0.209 arm contraction velocity -0.129 transverse limb capacity -0.092 foot-hold adhesion (small) -0.088 LEG ISOMETRIC FORCE -0.008 <- essentially nothing LEG CONTRACTION VELOCITY +0.0005 <- exactly nothing HAND FRICTION 0.0000 <- exactly nothing HAND-HOLD ADHESION 0.0000 <- exactly nothing body mass +0.752 <- largest lever of all The structure is a cross: at the FEET the binding limit is the HOLD (friction and adhesion); at the HANDS it is the LIMB (force and contraction velocity). Leg strength never binds because the foothold gives way first; hand grip never binds because the arm saturates first. The time is set jointly by the foot contact budget and by how fast a limb can be thrown to the next hold - three mechanisms inside a 0.09 band, so no single one of them is "the" limiter. Reaction time is 1.90% of the total and cannot be the limiter: IFSC 9.12(A)(1) floors it at 0.100 s, leaving at most 0.030 s to win. ================================================================================ BUGS THE HARNESSES CAUGHT ================================================================================ BUG-1 The body frame was mixed-handed. Attachment points were rotated CLOCKWISE in the (lateral, up-slope) plane while the angular-velocity term used the counter-clockwise convention, so every limb's length rate came out with the WRONG SIGN. The symptom was an arm reported as shortening at 1.08 m/s while its length was visibly growing at 1.4 m/s. BUG-2 The limb-release queue blocked at its head. A limb whose target was not yet reachable deferred, and because releases were processed strictly in order it also blocked every later limb - including the leg that was being torn off its hold at that exact moment. The body jammed for two full seconds at a 40-degree tilt. Releases are now out-of-order. BUG-3 Modelling each move as a minimum-jerk reach that starts and ends at rest asked the limbs to arrest the whole body 45 times and reported a climb four times too slow. A speed climber's centre of mass does not stop at every stance; the acceleration that has to be paid for is the CENTRIPETAL term, not a start-stop profile. BUG-4 Laplacian smoothing of the path was used as if it were a refinement parameter. It is not: more passes simply move the path further from the stances and report a faster climb without ever converging (6.77, 5.92, 5.46, 5.09 s for 0, 1, 2, 4 passes). Replaced with a Catmull-Rom spline, where the SAMPLING is the discretisation and does converge. BUG-5 The pose solver did not converge in its own iteration count. Annealing over a fixed number of sweeps made the answer oscillate by six per cent between 60, 120, 240 and 480 iterations, because each count landed in a different local minimum: 6.10, 6.46, 6.31, 6.03 s. Replaced with a pattern search run to a fixed tolerance, which is now EXACTLY iteration-independent. This was caught only by tabulating it. BUG-6 THE TRANSVERSE LIMB CEILING WAS NEVER APPLIED. `transFrac` lived in the solver's options object, not in the body, so `B.transFrac` was undefined and `Math.abs(t) > undefined` is false - a limb could push sideways with unlimited force. Found because the harness's own independent capability model produced NaN for every sample, which made the feasibility oracle silently inert and its "no violations" result vacuous. Fixing it moved the headline from 6.415 s to 6.844 s (+6.7%) and introduced a new binding limit on one move. BUG-7 The drawn trajectory priced its time by the SOLVED segment lengths while following the SMOOTHED path. Where smoothing had lengthened a segment four-fold the body had to cover 0.195 m in the time allowed for 0.035 m, giving centre-of-mass accelerations of 1857 m/s2 - 190 g - that grew without bound as the sampling was refined. Caught by an oracle that reconstructs the climb from emitted positions alone. BUG-8 An inverted mesh (inward-facing triangles) is an easy mistake that nothing else would flag. This one ships correct only because tools-normals.js asserts the signed volume of every closed surface is positive AND proves the check can fail by running it against a deliberately reversed copy: 37 assertions, 12 of them controls. ================================================================================ VERIFICATION ================================================================================ engine harness 1585 / 1585 assertions normals 37 / 37 (12 of them reversed-mesh controls) page harness see tools-harness-page.js mutants 22 / 22 caught, each oracle first asserted to PASS the unmutated engine equivalent rewrites 505 run, 0 false flags oracle mutants 6 / 6 proved toothless known blind spot Oracle B's ENERGY budget is homogeneous of degree one in body mass, so it cannot detect a wrong mass on its own; only its FEASIBILITY half can, because a force ceiling is not mass-proportional. Asserted as a fact so it cannot quietly stop being true. Three oracles, each blind to something different: A geometry 31 hold positions re-derived from an independently drawn plan of the same route sharing no code and no arithmetic. All 31 agree to 0.0 mm. B reconstruction the climb rebuilt from emitted positions alone - contact timings, limb order, centre-of-mass trajectory - with no access to the solver, then checked against an energy and momentum budget and an independent capability model. C competition a second implementation of IFSC 9.5-9.19 and Annex 4, diffed over 4000 randomised false-start judgements, 4000 display roundings and 220 randomised competitions. ================================================================================ LICENCE ================================================================================ MIT - see LICENSE.txt.