MitmonLabs-Frontend

FS3 361c681d horizontal scale correction — Task 2

FS3 is rebound to 361c681def79cbce5549edc32f93f88360365e85 for map-scene, scene-reveal, solar and ui. Package bytes came only from git archive in a scratch bare clone. The original M6 checkout remained d09cec002d711ae5d3479ceb0923699844c4649a. No shared source was edited. Contracts/geo remain b707a0cf2108bc66cd7ee3c41d17bf0fb16b39c2 / 0.1.4, wire 0.1.1, with one resolved copy. New upstream map-scene/ui manifests also declare 0.1.4; no client-side scale compensation is applied.

Independent measuring-checker self-test

The byte-identical A666 pair has SHA-256 158407addc19366aa682d1d5b3520476d326ee76d3a0b59b5646166d97a66cf4. Its two frozen EPSG:2953 points are independently 100.000000000499 m apart in WGS84 ground distance according to PROJ 9.8.1 / GeographicLib 2.2.0. The required threshold is 100.000 ± 0.01 m. Their native grid separation is 100.002865658221 m and is not substituted for ground distance.

The test feeds native points through the existing placement checker’s nativeToWgs84 projection, then through its localWgs84 XY measurement path. It also exercises Gate C’s existing geodesicDistance path. Results:

Numeric evidence records the independent truth, all values and the source SHA-256s of the checker projection, placement overlay, Gate C overlay, shared geo maths and test recorder. The checker uses X/Y horizontal points, never matrix.elements[10] or meterInMercatorCoordinateUnits() to measure horizontal metres. The FS3 fix supplies separate ellipsoidal east/north Jacobian coefficients; Z intentionally retains MapLibre’s spherical altitude convention. This is a local linear approximation, not a nonlinear projection or surveyed placement guarantee.

Eight former expected failures

Before changing markers, all eight reported Vitest “Expect test to fail”: their existing assertions passed with the new renderer. Only those eight markers were removed. The endpoint tolerance remains 0.05 m; the additional 100 m east-distance check uses 0.01 m. None still fail. The published Moncton control plus all seven M6 anchors are listed below.

Reference Rendered 100 ENU m east (ground m) Endpoint residual (m) Result
Published Moncton 941004 99.999999999 0.000814113 PASS
model-Moncton-292892 99.999999999 0.000813404 PASS
model-Moncton-2933 100.000000000 0.000813405 PASS
model-Moncton-293607 99.999999998 0.000813349 PASS
model-Moncton-6924 99.999999999 0.000813386 PASS
model-Moncton-7111 99.999999999 0.000813390 PASS
model-SaintJohn-619072 99.999999999 0.000790454 PASS
model-SaintJohn-619105 99.999999999 0.000790418 PASS

The frozen A666 pair through the fixed analytic renderer measures 99.999999995377 m on the placement path / 99.999999997198 m geodesically. Its expected value remains the supplied independent truth. Small endpoint residuals (maximum 0.000814113 m) come from the local linear approximation and are distinct from length scale.

Renderer and served-code identity

Installed map-scene src/index.ts SHA-256 is 3979e47708b0fabd30a76d560db2c45a1ed1823204bc07a8e0e5de2394bca520, exactly the A666 fixed pin; old source was cf64fd3f6c0eb14ee0ccc2ef82d5890445a409c94decb222ca7e67b462cdc809. Scene-reveal, solar and ui runtime source bytes remain unchanged; map-scene runtime and map-scene/ui public dependency metadata change as supplied upstream.

Package archive SHA-256
@mitmon/map-scene abe6f01b8e9e51e254ea20bf643d12c5d10684b10c19386844366e76e2864838
@mitmon/scene-reveal 582d48ed6fcfc74e47aa3b42603c33a7439baff978976c6ab54233f97f7b0e60
@mitmon/solar a704b6d8db9e6edeb52010785043971a1cef001d6f2cdad4bfb91b06dded9a45
@mitmon/ui be3e561b6dcd6d0a9d07fe043a896571ec6307ae7eca2df2edb390b69f747da4

Binding manifest lists every packaged file, full source commits and archive digests. The npm lock changes only map-scene/ui archive integrities and their contracts/geo metadata. Both immutable verifiers, scratch archive regeneration and clean offline scripts-disabled installation pass.

Browser-frame evidence records the same frozen pair and 100 ENU m east through actual completed FS3 scene camera matrices in overhead, tilted and pan/zoom views: ENU Z=0 → scene camera → CSS pixels → MapLibre unproject → checker horizontal/geodesic distance. These are analytic probes through a scene loaded from TEST-only HTTP/GLB fixtures, not live M6 models. The self-test must pass before the browser test judges the renderer. The record hashes each served development script and marks the module containing the fixed renderer; Vite development serves a module graph, not a production bundle.

Observed completed-frame east lengths are 99.999999989512 m (overhead), 100.000000051034 m (tilted), and 100.000000032356 m (pan/zoom). Frozen-pair ground measurements also pass ±0.01 m in all three views. The actually served dev renderer module /node_modules/.vite/deps/@mitmon_map-scene.js is 124,780 bytes, SHA-256 353af5f63d9c1176224de87e0bae8e4ea8b0ce09e28755471708b5006628b97f; the full 193-script response inventory and checker source hashes are in the browser receipt.

Release served-JS evidence separately records actual HTTP response SHA-256s for every built JS asset, matched byte-for-byte to disk, on the review preview at 5180. It is a NOT DEPLOYABLE HTTPS-placeholder build, not release-mode 3D/authentication or A459 evidence. The source pin, checker pins and served script hashes must be recaptured for the later real Gate C attempt.

Served review main bundle /assets/index-DlcYB-iO.js: 2,062,288 bytes, SHA-256 7db0ebeff1ac96bd965e8257b593accfdc24042f1a52142b303fb2ae02e422e8. All seven JS assets match their actual HTTP bytes. Browser verification passes 26 smoke cases and five release cases on 5180. The full unit suite passes 281 tests, zero expected failures; typecheck, lint, build, immutable verifiers, static audit and gallery exclusion also pass. Checksum inventory binds the evidence and checker files.

Scope and remaining gates

A666 horizontal self-test and the eight scale regressions pass. This closes the local numeric scale blocker for 361c681d. Absolute datum accuracy remains the supplied operation’s stated 1 m, basemap alignment remains separate, and unknown vertical datum/local ground is unchanged. These tiny numeric residuals are not survey accuracy claims.

The A666/A673 faceKinds base-triangle union adapter is deliberately not implemented here; worker 8 owns it. Existing placement fixtures remain tagged TEST geometry. Real-model footprint identification, live placement and Gate C attempt 3 remain pending integration and a granted window. FS1 Mac-target build/isolated lock/controller receipts and release acceptance also remain pending. No 5173/8787 service, export, push, PR, deployment or scp occurred.

Reproduce with pinned Node 24.20.0/npm 11.19.0:

node --import tsx scripts/record-scale-proof.mjs
npm test
VITE_DEV_PORT=5180 npm run test:smoke -- --workers=1
VITE_API_ORIGIN=https://api.review.invalid npm run build
npm run audit:artifact
npm run test:release