Stack - credits, sourcing and what differs from the original ============================================================ THE ORIGINAL ------------ Stack was published by Ketchapp (Ketchapp SARL, Paris, founded 2014 by Antoine and Michel Morcos) and first released on the iOS App Store on 17 February 2016, bundle id com.ketchapp.stack, track id 1080487957. Ketchapp was acquired by Ubisoft on 27 September 2016. This page is an INDEPENDENT REIMPLEMENTATION. It was written from scratch and contains no code, no art and no assets from the original. It is not affiliated with, authorised by or endorsed by Ketchapp or Ubisoft. "Stack" is used here as the name of the game being reimplemented. HOW WELL SOURCED IS THIS? NOT VERY, AND HERE IS THE HONEST TALLY ---------------------------------------------------------------- Ketchapp published no specification for Stack: no design document, no post-mortem, no rules page. There is no Wikipedia article - "Stack (video game)" is a redlink, confirmed through the MediaWiki API, and the Ketchapp article does not mention the game. Searching for a third-party rules description turned up nothing authoritative. So the register in js/spec.js reads: DOCUMENTED 4 ALL of them store metadata. NONE of them mechanical. MEASURED 12 pixel measurements of the publisher's own App Store screenshots DERIVED 5 arithmetic on those measurements, with the assumptions stated CALIBRATED 4 chosen so the model reproduces something observable RECONSTRUCTED 8 invented, with a reason --------------------------------------------------------------------------------- qualified 12 of the documented-and-measured entries - see below Not one documented line says anything about how the game plays. The four are: the publisher, the release date, the bundle id, and the complete store description, which reads in full "Stack up the blocks as high as you can! / Simple & Beautiful graphics designed / Compete for the best score in the world". That is the entire documented mechanical record. All twelve MEASURED entries are marked QUALIFIED. They are pixel measurements of primary artefacts published by the rights holder - the App Store screenshots for track 1080487957 - but the screenshots on that listing today belong to version 4.0.7 (August 2026), not to the February 2016 release. They are the publisher's own images of the publisher's own game; they are not the 2016 build. Folding them in with the documented lines would flatter the tally, so they are counted separately and labelled in the app itself. tools-measure.py re-derives every one of them from a local copy of the screenshots, so the numbers can be checked rather than believed. WHAT WAS MEASURED, AND WHAT IT BOUGHT ------------------------------------- * The projection is orthographic at azimuth 45 degrees and elevation 45 degrees. Eight top-face edge slopes across two screenshots average 0.7046 with sd 0.0061, against sin 45 deg = 0.70711. The renderer's camera uses exactly 45/45. * The camera does not zoom: one block layer is 75 px at score 12 and 75 px at score 36. * A block that began square measures 279.1 x 169.5 px at score 36 - a 1.65:1 top face with 0.48% closure error. That is the direct evidence that the two horizontal extents are cut on alternating drops and never mix, which is the structure the whole analysis rests on. * The palette's hue advances 7.65 to 13.72 degrees per layer and the two rates differ by 1.8x in the same game, so the hue step is not constant. Ours is a cosine gradient calibrated to that band, not a fit to the original palette - static images cannot recover one. WHAT IS RECONSTRUCTED --------------------- The slice-and-stack rule itself; the perfect tolerance (1/32 of a block); the combo threshold (8 consecutive perfects); the width restored per perfect (1/16); the slide range; the speed and its ramp; and - the one that matters most - the CAP that stops a perfect run growing the block past its starting width. THE CAP IS LOAD-BEARING, SO THE APP LETS YOU TAKE IT OFF -------------------------------------------------------- Whether Stack is survivable at all turns on two reconstructed parameters, not on one: * If width restored by a perfect run is CAPPED at the starting width (what this app ships), the width is bounded, and a long enough unlucky stretch always kills. * If it is UNCAPPED, the width's drift changes sign at a critical aiming error. For this app's constants that error is 0.03958 of a block - 1.267 times the perfect tolerance, a player who is perfect 79.0% of the time. Above that accuracy the tower can grow for ever. * And because the speed stops rising at VMAX, a player whose timing jitter never exceeds PERFECT/VMAX = 9.77 ms cannot produce an offset outside the tolerance at all, and so cannot lose width under EITHER rule. That is a hard threshold, not an asymptote. The Help panel states all three, and the uncapped rule is available from it as a labelled experiment so the claim is checkable inside the app rather than only in a report. WHAT DIFFERS FROM THE ORIGINAL ------------------------------ * Every rule constant is a reconstruction (above). Scores here are not comparable with scores there. * No accounts, no coins, no seasons, no offline earnings, no advertising, no analytics, no leaderboard and no network requests of any kind. The best score is kept in this browser's local storage and nowhere else. * The original is a native app; this is a single HTML page with a hand-written WebGL2 renderer and no third-party libraries. * The look is our own except for the four measured things above. * An experiment the original does not have: the uncapped-restoration switch. VERIFICATION ------------ tools-harness.js 503 assertions over the engine, including an exact Markov solve of the width distribution (tools-oracle.py, written independently in Python) checked against a 40,000-game Monte-Carlo of the engine itself, and a second, exact-rational solve of the same chain that agrees with the numeric one to 2.4e-15. 14 of 14 deliberately broken engines are caught; 6 of 6 equivalent rewrites stay silent. tools-normals.js every mesh audited for closure, outward normals, CCW winding and signed volume, with 5 of 5 deliberately inverted controls rejected. tools-harness-page.js assets, wiring, CSP hygiene, and every number printed in the UI checked against the constant it claims to quote. tools-smoke.js headless Chrome, locally and against the live host. THIRD-PARTY CODE ---------------- None. There are no vendored libraries, no CDN references and no external fonts, images or stylesheets. Everything the page needs ships with it. LICENCE ------- The code of this reimplementation is released under the MIT licence; see LICENSE.txt. That licence covers this implementation only and makes no claim over the original game, its name, its design or Ketchapp's or Ubisoft's trademarks.