What to build
Process a known georeferenced point cloud/surface into a stockpile boundary, base surface and volume report for mining or construction.
Acceptance criteria
- Specify CRS, vertical datum, units, boresight/time calibration, ground classification and georeferencing error. Versioned declarations preserve unknown status and report identities; physical qualification remains below.
- Implement an auditable TIN/grid or equivalent integration method with user-defined base assumptions and independent analytic fixtures. Bounded indexed TIN and constant-cell grids integrate against an explicit affine plane base.
- Report coverage gaps, uncertainty, cut/fill, export formats and comparison against a surveyed reference. Processing and declared-reference comparison are implemented; an independently measured physical survey campaign is still required.
- Keep LiDAR acquisition, photogrammetric reconstruction and volume computation separately identifiable.
Implemented known-surface processing
Commit e71b1df adds:
- Strict metre-based east/north/elevation-up reference, vertical datum and epoch contracts; source hashes and acquisition/meshing, calibration, classification and error provenance. No implicit NED, degree, foot, CRS or geoid conversion.
- Actual square corner-origin north-first AAIGrid and indexed triangular ASCII PLY imports with exact-byte SHA256 sidecars, plus typed numerical JSON. Unsupported raw points, binary/extra semantic properties, center-origin point grids and invalid topology are rejected.
- Concave boundary and hole clipping, affine TIN or constant-cell integration against an explicit plane base, zero-line splitting for simultaneous cut/fill, compensated sums, source-piece audit and large-coordinate handling.
- Coverage gaps and nodata stay missing. Covered-domain results never scale to a full boundary total. Unknown uncertainty stays null; conditional vertical bounds do not imply overall physical accuracy.
- Independent-reference contract matching CRS/datum/epoch, domain and base convention. Separate above/below/signed differences and declared-bound comparison retain synthetic versus operator-declared evidence.
- Native Stacks
volumes:demo,volumes:process,volumes:import, standalone CLI support, and stx/volumeswith actual numeric surface geometry, explicit assumptions/provenance, missing coverage and paginated contributions. - Private exclusive datasets with numeric ASC/PLY, matching sidecars, retained request/report, contribution CSV and hashed manifest. Mapping imagery and volumes share the completion-manifest writer.
The reusable local artifact publication helper is also implemented in Stacks storage at 20b7887836, including byte snapshots, bounds, directory-case collision prevalidation and fsync barriers. App adoption of that package API follows a normal published dependency update; no sibling checkout import is used.
Read processing semantics and limits, ADR 19 and numeric examples.
Validation evidence
- Final local suite: 450 Bun tests, 25,937 assertions, zero failures; 13 Python bridge tests; lint and app/runtime/view typechecks; roadmap and parity integrity checks. Full upstream parity remains explicitly incomplete.
- Independently specified 16 m³ pyramid, clipped affine wedges, simultaneous 0.5 m³ cut and fill, grid nodata/partial cells, holes, large coordinate shifts, tilted bases, conditional bounds and reference mismatch tests. An additional independent review probe checked 1,000 affine surfaces; this is mathematical evidence, not a survey campaign.
- Native CLI imports, private exports, hash verification, reprocessing and PLY reimport pass. The compiled CLI runs outside the checkout and confirms 16 m³ pyramid, 10 m³ literal grid and 86 m³ partial grid results. Malformed private input stays out of CLI diagnostics.
- Real browser: scenario/clear reset, cut/fill, partial coverage, unknown bounds, synthetic comparison, grid nodata and page navigation pass. No console errors or horizontal overflow at 320/375 px. Desktop and phone layouts visually inspected.
- Both independent review axes passed after fixing JSON diagnostic privacy and portable directory aliases. Stacks local validation: 564 application tests pass, six skip; 521 full storage tests, including 17 boundary tests / 79 assertions; full framework typecheck, storage package build/subpath execution and native skill references pass. Lint exits zero with six existing unrelated marketing class-order warnings.
- Exact-head Drone CI passed, including Linux native command/standalone volume imports and both neutral-only Pico 2 cross-builds. Stacks CI failed on two pre-existing mobile types-subpath assertions. The correction is published in 009e5b715b: build the mobile entrypoint, ship explicit JavaScript/declaration exports and resolve it from source in every TypeScript config. Its 55 integrated boundary/types tests, isolated installed-package runtime/typing consumer, actual package build, full framework typecheck and both independent review axes pass. Follow-up Stacks CI passed, including the quality checks, scaffold smoke and deployment.
Remaining work
Keep this issue open for full acceptance:
- Acquire qualified LiDAR or reconstructed photogrammetric surfaces with measured boresight/time, classification, surveyed georeferencing and independent reference evidence. No physical accuracy validation has been performed.
- Execute retained real-data external-reader campaigns and independently surveyed volume comparisons with matching boundary/base definitions and measured uncertainty. Analytic fixtures and operator declarations do not satisfy this campaign.
- Add qualified LAS/LAZ, numeric GeoTIFF and raw-point meshing adapters, richer basal surface overlays, larger dataset/streaming processing and explicit interpolation/representation error policies.
- Complete hardware/acquisition, HIL/vehicle and storage power-loss campaigns as applicable. Current file sync/hard-link protocol is not a measured storage hardware durability guarantee.
Blocked by
- #18 Aerial mapping: fly a camera-triggered survey with georeferenced imagery
- #8 Hardware adapters: command and verify the first camera or payload
Scope and evidence
This release computes known surfaces; it does not acquire LiDAR or reconstruct images. Every included example is synthetic. Physical outputs remain inhibited. Preserve explicit operator authority and report simulator, bench, HIL and vehicle evidence separately. The owned implementation remains independent of optional ArduPilot/PX4 drivers.
Declared GeoTIFF elevation-grid import published
Published 50c840aa to origin/main as Chris, with no coauthor trailer and a normal fast-forward push.
- Added a pure bounded importer for an explicitly declared classic little-endian, single-IFD/single-strip Float32 UTM area-grid profile. Exact original TIFF SHA, closed metadata, layout/range checks and exact nodata handling precede the existing volume measurement path. This is a deliberately limited supported profile, not a general TIFF/GIS decoder or reconstruction engine.
- Added the bounded regular-file server reader and native
volumes:import --format geotiff --metadata ... --measurement ...path. Existing ASC/PLY commands and full outputs remain compatible. - Retained the first independent primary capture and fixed layout/numeric variants before saved-only semantic oracles. Ten admitted variants, ten wrong-digest companions and three semantic negatives passed their fixed independent checks; focused coverage passed 174 tests/882 expectations.
- Qualified the standalone copied binary outside the checkout, source/dependency/Bun read denial and complete legacy/new command streams. One primary pure-barrel case also passed in real Chrome. These are software qualification boundaries, not hardware or measured-survey claims.
- Full local native suite: 1,336 pass, 24 skip, 0 fail, 486,472 expectations, 1,360 tests across 168 files. Feature CI 39552148401 passed all five jobs, including 1,321 pass/39 skip/0 fail in the separate remote environment, native browser checks, namespace checks and firmware build.
Original issue criteria remain open. Physical accuracy, broader raster profiles, photogrammetric reconstruction and any remaining stockpile workflow acceptance are not established by this import slice. The automatic main-push CI is separate follow-up evidence.
Automatic main CI follow-up
The automatic main CI run 39558731363 for 50c840aa505059437fe41063786d8e2d105fdde2 passed all five jobs: check, firmware, purge-namespace, workspace-browser and execution-browser. The standard suite recorded 1,321 passing tests, 39 skipped and 0 failures across 1,360 tests in 168 files. Separate browser jobs passed 4 and 2 tests, and the namespace suite passed 22. Raw terminal logs were collected once and retained locally. This confirms the published software checks; remaining hardware, surveyed accuracy and field-qualification gates remain open.
Bounded LAS processing ready for exact-head CI
PR #107, commit 7e63082aac412f00eb975f133fabbe64ac0b9c23, adds a pure browser-compatible LAS 1.2 formats 0-3 importer, explicit class/return/synthetic selection, bounded mean-cell gridding with count/spread gaps, source/declaration ownership and the native volumes:import --format las command. The manifest retains original LAS and declaration bytes plus regenerated gridding, ASC, request, volume report and replay material.
Both independent review axes are clean after genuine failing/passing fixes for embedded feet/depth vertical CRS admission and private CLI filesystem diagnostics. Local qualification passes 227 focused tests, 13 actual copied-binary commands, four complete legacy output byte comparisons, actual browser/WebCrypto admission, lint, app/runtime types, roadmap/parity checks, CLI build and native docs build. The docs audit checks 100 pages, 7,961 local links and 408 search destinations without missing local targets or anchors.
The reviewed LAS increment and workspace render correction are integrated in ed3ec1cd88fe3a3ad0f684f3e11a3281d75f0597. Both final integration reviews are clean; 230 focused tests and lint/app/runtime/view types pass. Exact-head CI 40107577579 remains in progress; the older 7e63082 run was superseded. The combined source is pushed to its review branch, not yet published to main. Existing issue acceptance checkboxes remain open.
The profile admits explicitly declared WGS84 UTM metre coordinates and a closed metre/up embedded vertical CRS set. It performs no coordinate/datum transformation or datum verification. Mean-cell areas are modeled; point-footprint coverage, classification quality and physical accuracy remain unverified. Broader LAS/LAZ/VLR support, photogrammetric acquisition, triangulation, surveyed reference campaigns, representation uncertainty and storage/hardware qualification remain separate work.
Bounded LAS processing published to main
PR #107 is merged. Main cdc79ddb55e280b703c0fa227240f5cec4a7421e includes the reviewed LAS importer and maintained dependency source releases. Exact final CI 40125407306 passed all five jobs, including both firmware builds and both browser jobs. The full standard suite passed 2,174 tests with 41 skipped, 0 failures and 522,994 assertions across 248 files. Original terminal logs and selected standalone host-slot, maintenance and LAS evidence archives are retained with byte/hash indexes.
The final Linux executable passed 18 candidate operations without a predecessor supplied in CI. The separate local campaign passed 20 operations with the actual retained format-1-only predecessor executable. Nine local real process interruption cuts and the source-release boundary tests also passed. These are software and process checks; physical outputs remain inhibited. The earlier bounded coordinate/profile limits and outstanding surveyed accuracy, acquisition, storage and hardware gates still apply. Existing broad acceptance checkboxes remain open.