<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/feed.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Zander Polk — Writing</title>
    <link>https://zanderpolk.com/writing/</link>
    <atom:link href="https://zanderpolk.com/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Notes on machine learning, space systems, and building software.</description>
    <language>en</language>
    <item>
      <title>From two orbits to one number</title>
      <link>https://zanderpolk.com/writing/from-two-orbits-to-one-number/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/from-two-orbits-to-one-number/</guid>
      <pubDate>Sun, 09 Aug 2026 10:00:00 +0000</pubDate>
      <description>A conjunction lasts about a second, which is what licenses collapsing two orbits in three dimensions into a flat integral. The encounter plane, why along-track uncertainty dominates, and why the crossing angle decides how much of it counts.</description>
    </item>
    <item>
      <title>A geocode is not a location</title>
      <link>https://zanderpolk.com/writing/a-geocode-is-not-a-location/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/a-geocode-is-not-a-location/</guid>
      <pubDate>Sun, 09 Aug 2026 09:00:00 +0000</pubDate>
      <description>A geocoder returns coordinates and a match type, and only one of them survives the pipeline. What the four tiers actually are, why parcel centroids carry bias and street interpolation carries variance, and why point-in-polygon is the operation that will not tolerate either.</description>
    </item>
    <item>
      <title>Your validation set is next door</title>
      <link>https://zanderpolk.com/writing/your-validation-set-is-next-door/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/your-validation-set-is-next-door/</guid>
      <pubDate>Sat, 08 Aug 2026 09:00:00 +0000</pubDate>
      <description>Spatial data breaks the assumption cross-validation rests on. A random split puts held-out points a few hundred metres from training points, so the score describes interpolation rather than prediction. Blocking, how big the blocks should be, and the good objection to all of it.</description>
    </item>
    <item>
      <title>A force that does nothing</title>
      <link>https://zanderpolk.com/writing/a-force-that-does-nothing/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/a-force-that-does-nothing/</guid>
      <pubDate>Wed, 05 Aug 2026 09:00:00 +0000</pubDate>
      <description>I went looking for why my game dropped from 200 fps to 40 near a boat. I found a rigid body that falls asleep with a force still on it, and stops receiving that force entirely. Two wrong theories died on the way, with interactive figures for the frame budget and the sleep timer.</description>
    </item>
    <item>
      <title>Observation, estimate, inference</title>
      <link>https://zanderpolk.com/writing/observation-estimate-inference/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/observation-estimate-inference/</guid>
      <pubDate>Sun, 02 Aug 2026 09:00:00 +0000</pubDate>
      <description>Satellite conjunction triage and commercial property intelligence are the same problem: remote observations turned into a number someone acts on. Why every value needs its evidence tier attached.</description>
    </item>
    <item>
      <title>JSON in Polytoria, from tutorial to engine source</title>
      <link>https://zanderpolk.com/writing/json-in-polytoria/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/json-in-polytoria/</guid>
      <pubDate>Sun, 02 Aug 2026 09:00:00 +0000</pubDate>
      <description>GetAsync returns a string, not a table. Start with the two lines that fix that, then read the engine's own JSON library to find out why null is not nil and why every number passes through a decimal.</description>
    </item>
    <item>
      <title>How I made boats float</title>
      <link>https://zanderpolk.com/writing/how-buoyancy-works/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/how-buoyancy-works/</guid>
      <pubDate>Sat, 01 Aug 2026 09:00:00 +0000</pubDate>
      <description>The buoyancy system behind Whatever Floats Your Boat, starting from the smallest version that floats. Then why it bounces forever, why it cannot capsize, and what sampling points actually approximates. With six interactive figures you can push, load, destabilise and capsize.</description>
    </item>
    <item>
      <title>How to build a fan game without taking anything</title>
      <link>https://zanderpolk.com/writing/building-a-fan-game-without-taking-anything/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/building-a-fan-game-without-taking-anything/</guid>
      <pubDate>Sat, 01 Aug 2026 09:00:00 +0000</pubDate>
      <description>Whatever Floats Your Boat is a fan remake. What that obligates: separating inspiration from assets, crediting per file with the licence named, and not claiming buoyancy as an invention.</description>
    </item>
    <item>
      <title>Instanced rendering, and the bugs it creates</title>
      <link>https://zanderpolk.com/writing/instanced-rendering-and-its-bugs/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/instanced-rendering-and-its-bugs/</guid>
      <pubDate>Fri, 31 Jul 2026 09:00:00 +0000</pubDate>
      <description>Draw calls dominate cost, so engines batch. The buffer that makes batching fast is a copy of scene state, which turns correctness into an invalidation problem — and invalidation fails silently.</description>
    </item>
    <item>
      <title>Shipping on a platform and fixing it at the same time</title>
      <link>https://zanderpolk.com/writing/shipping-on-a-platform-and-fixing-it/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/shipping-on-a-platform-and-fixing-it/</guid>
      <pubDate>Thu, 30 Jul 2026 09:00:00 +0000</pubDate>
      <description>Two open pull requests to the Polytoria engine: a transform-inheritance bug you can only find by building something real, and Luau IntelliSense for module requires. What contributing upstream actually costs.</description>
    </item>
    <item>
      <title>A transform bug in a scene graph</title>
      <link>https://zanderpolk.com/writing/a-transform-bug-in-a-scene-graph/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/a-transform-bug-in-a-scene-graph/</guid>
      <pubDate>Wed, 29 Jul 2026 09:00:00 +0000</pubDate>
      <description>Parts inside a folder stopped following their model. The cause was an organisational node missing from the spatial hierarchy, hidden by three independently correct optimisations.</description>
    </item>
    <item>
      <title>What actually crosses the wire</title>
      <link>https://zanderpolk.com/writing/what-actually-crosses-the-wire/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/what-actually-crosses-the-wire/</guid>
      <pubDate>Tue, 28 Jul 2026 09:00:00 +0000</pubDate>
      <description>Server authority, a 50ms batch interval, reliable versus unreliable channels, and a per-call interpolation flag. How Polytoria replicates state, and the trade-offs every multiplayer engine makes.</description>
    </item>
    <item>
      <title>What a script is allowed to reach</title>
      <link>https://zanderpolk.com/writing/what-a-script-is-allowed-to-reach/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/what-a-script-is-allowed-to-reach/</guid>
      <pubDate>Mon, 27 Jul 2026 09:00:00 +0000</pubDate>
      <description>Letting users make HTTP requests from your server hands strangers a machine inside your network. Reading Polytoria's URL gate, and why resolve-then-connect is hard for everyone.</description>
    </item>
    <item>
      <title>You cannot test a timeout by waiting for it</title>
      <link>https://zanderpolk.com/writing/you-cannot-test-a-timeout-by-waiting/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/you-cannot-test-a-timeout-by-waiting/</guid>
      <pubDate>Sun, 26 Jul 2026 09:00:00 +0000</pubDate>
      <description>Structured concurrency in Luau: cooperative cancellation, cleanup scopes, and a virtual-time scheduler that turns flaky async integration tests into deterministic unit tests.</description>
    </item>
    <item>
      <title>How a C# object becomes a Luau value</title>
      <link>https://zanderpolk.com/writing/how-a-csharp-object-becomes-a-luau-value/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/how-a-csharp-object-becomes-a-luau-value/</guid>
      <pubDate>Sat, 25 Jul 2026 09:00:00 +0000</pubDate>
      <description>Luau knows eight types and none of them is Part. The marshalling layer that closes the gap uses userdata, metatable hooks and a weak identity cache — and explains why you should cache property lookups.</description>
    </item>
    <item>
      <title>Where early prediction fails</title>
      <link>https://zanderpolk.com/writing/where-early-prediction-fails/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/where-early-prediction-fails/</guid>
      <pubDate>Fri, 24 Jul 2026 09:00:00 +0000</pubDate>
      <description>BEACON reaches 0.806 PR-AUC one day out and 0.233 at the earliest available observation. Why the collapse is partly measurement, mostly missing information, and what still survives.</description>
    </item>
    <item>
      <title>Rare events are a measurement problem, not a modelling problem</title>
      <link>https://zanderpolk.com/writing/rare-events-are-a-measurement-problem/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/rare-events-are-a-measurement-problem/</guid>
      <pubDate>Thu, 23 Jul 2026 09:00:00 +0000</pubDate>
      <description>With twelve positives in a test split, the gap between two models is smaller than the noise from reshuffling the split. Why the binding constraint is the split, the baseline, the metric, and the number of repeats.</description>
    </item>
    <item>
      <title>Accuracy is the wrong question for rare events</title>
      <link>https://zanderpolk.com/writing/accuracy-is-the-wrong-question-for-rare-events/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/accuracy-is-the-wrong-question-for-rare-events/</guid>
      <pubDate>Mon, 20 Jul 2026 09:00:00 +0000</pubDate>
      <description>A model that flags nothing is 99.4% accurate on satellite conjunction data and completely useless. What I measured instead while building BEACON: PR-AUC, calibration, and ensemble uncertainty as a human-review signal.</description>
    </item>
    <item>
      <title>The Laplace approximation, and where it stops working</title>
      <link>https://zanderpolk.com/writing/laplace-approximation-and-where-it-breaks/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/laplace-approximation-and-where-it-breaks/</guid>
      <pubDate>Fri, 17 Jul 2026 09:00:00 +0000</pubDate>
      <description>A posterior over logistic regression weights for the price of one matrix inverse. The derivation, why confidently classified points contribute nothing to parameter uncertainty, and the five ways it fails.</description>
    </item>
    <item>
      <title>A research interface should show its own seams</title>
      <link>https://zanderpolk.com/writing/a-research-interface-should-show-its-seams/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/a-research-interface-should-show-its-seams/</guid>
      <pubDate>Wed, 15 Jul 2026 09:00:00 +0000</pubDate>
      <description>BEACON's 3D viewer renders uncertainty it cannot physically justify, so it labels the mapping a proxy in the interface, displays which geometry fallback is active, and watermarks its own screenshots.</description>
    </item>
    <item>
      <title>Bayesian-inspired is not Bayesian, and the difference matters</title>
      <link>https://zanderpolk.com/writing/bayesian-inspired-is-not-bayesian/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/bayesian-inspired-is-not-bayesian/</guid>
      <pubDate>Sat, 11 Jul 2026 09:00:00 +0000</pubDate>
      <description>BEACON contains a real posterior and a bootstrap ensemble, and calls them different things. Which sentences each one entitles you to write, and why the cheaper method was enough.</description>
    </item>
    <item>
      <title>Your split is leaking and your metrics are lying</title>
      <link>https://zanderpolk.com/writing/your-split-is-leaking/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/your-split-is-leaking/</guid>
      <pubDate>Tue, 07 Jul 2026 09:00:00 +0000</pubDate>
      <description>Splitting grouped data by row instead of by group inflates every metric you report. How event-level splitting works, why label metadata is the same mistake in disguise, and why one split is never a result.</description>
    </item>
    <item>
      <title>Determinism is not free</title>
      <link>https://zanderpolk.com/writing/determinism-is-not-free/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/determinism-is-not-free/</guid>
      <pubDate>Tue, 16 Jun 2026 09:00:00 +0000</pubDate>
      <description>Send inputs instead of state and thousands of units fit down a modem. The catch is that identical code on two machines does not produce identical floating-point results unless you make it.</description>
    </item>
    <item>
      <title>Why large worlds shake</title>
      <link>https://zanderpolk.com/writing/why-large-worlds-shake/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/why-large-worlds-shake/</guid>
      <pubDate>Tue, 26 May 2026 09:00:00 +0000</pubDate>
      <description>At ten thousand kilometres from the origin, consecutive float positions are a metre apart. Sub-metre motion is not slow, it is unrepresentable — and almost every fix is a better choice of origin.</description>
    </item>
    <item>
      <title>Measuring in the wrong coordinate system</title>
      <link>https://zanderpolk.com/writing/measuring-in-the-wrong-coordinate-system/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/measuring-in-the-wrong-coordinate-system/</guid>
      <pubDate>Tue, 05 May 2026 09:00:00 +0000</pubDate>
      <description>Compute an area in Web Mercator and you get square metres that are not square metres. Why the projection trade-off is a theorem, and why buffering in degrees quietly produces the wrong answer.</description>
    </item>
    <item>
      <title>What a GNSS fix actually costs</title>
      <link>https://zanderpolk.com/writing/what-a-gnss-fix-actually-costs/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/what-a-gnss-fix-actually-costs/</guid>
      <pubDate>Tue, 14 Apr 2026 09:00:00 +0000</pubDate>
      <description>A position to a few metres, from satellites 20,000 km away, resting on nanosecond timing. The correction stack between the measurement and the dot on the map, and where each layer fails.</description>
    </item>
    <item>
      <title>When knowing less looks safer</title>
      <link>https://zanderpolk.com/writing/when-knowing-less-looks-safer/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/when-knowing-less-looks-safer/</guid>
      <pubDate>Tue, 24 Mar 2026 09:00:00 +0000</pubDate>
      <description>Widening the covariance on a satellite conjunction can lower its computed collision probability. Probability dilution, the non-monotonic curve behind it, and why a summary statistic can invert exactly when it matters.</description>
    </item>
    <item>
      <title>The Kessler syndrome is misquoted</title>
      <link>https://zanderpolk.com/writing/kessler-syndrome-is-misquoted/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/kessler-syndrome-is-misquoted/</guid>
      <pubDate>Tue, 03 Mar 2026 09:00:00 +0000</pubDate>
      <description>The 1978 paper describes a rate equation over decades, not a chain reaction over days. What gets lost in the retelling is the timescale, the altitude dependence, and what it implies for triage.</description>
    </item>
    <item>
      <title>The paper reported 0.59. I got 0.90.</title>
      <link>https://zanderpolk.com/writing/reproducing-a-house-price-paper/</link>
      <guid isPermaLink="true">https://zanderpolk.com/writing/reproducing-a-house-price-paper/</guid>
      <pubDate>Tue, 10 Feb 2026 09:00:00 +0000</pubDate>
      <description>Reproducing Maloku &amp; Maloku (2024) on the same dataset moved linear regression’s test R² by 0.31. The cause was one preprocessing step, and cross-validation then reversed my own conclusion.</description>
    </item>
  </channel>
</rss>
