also looking at this
fix: resolve source links through native drone docs
#40
56 files
+179
-159
bun.lockmodified+4-1
| @@ -35,6 +35,9 @@ | ||
| 35 | 35 | "version": "0.75.221", |
| 36 | 36 | }, |
| 37 | 37 | }, |
| 38 | "overrides": { | |
| 39 | "@stacksjs/bunpress": "0.2.22", | |
| 40 | }, | |
| 38 | 41 | "packages": { |
| 39 | 42 | "@buddysh/buddy": ["@buddysh/buddy@0.11.13", "", { "dependencies": { "prompts": "^2.4.2", "ts-pantry": "^0.11.64" }, "peerDependencies": { "@anthropic-ai/sdk": ">=0.117.1 <0.123.0" }, "optionalPeers": ["@anthropic-ai/sdk"], "bin": { "buddy": "./dist/bin/cli.js" } }, "sha512-xES8SfgtsXeswuQmFLVj/YV0nOECA4LGl7Oe2ZBqh6otABQY7LT7hAcz9KD/ORvVWtVr+tUt2sA+Vgd5hsm+Eg=="], |
| 40 | 43 | |
| @@ -82,7 +85,7 @@ | ||
| 82 | 85 | |
| 83 | 86 | "@stacksjs/bun-router": ["@stacksjs/bun-router@0.1.24", "", { "dependencies": { "@stacksjs/clapp": "^0.2.0", "ts-rate-limiter": "^0.4.2" }, "peerDependencies": { "@stacksjs/stx": ">=0.2.227" }, "optionalPeers": ["@stacksjs/stx"], "bin": { "router": "./dist/cli.js", "bun-router": "./dist/cli.js" } }, "sha512-vXzpmYBe9o0NOVWAZ1kqZJv7VAKTd84rEs3e8e+oEeX3Q4zE078SHTxrYsNcr2n1tb8EwQawaC4YGmFFKrgrzA=="], |
| 84 | 87 | |
| 85 | "@stacksjs/bunpress": ["@stacksjs/bunpress@0.2.21", "", { "dependencies": { "@cwcss/crosswind": "^0.2.16", "@stacksjs/clapp": "^0.2.0", "@stacksjs/stx": "^0.2.550", "@stacksjs/ts-i18n": "^0.1.11", "bunfig": "^0.15.17", "ts-syntax-highlighter": "^0.2.14" }, "peerDependencies": { "@stacksjs/ts-cloud": "^0.7.51" }, "optionalPeers": ["@stacksjs/ts-cloud"], "bin": { "bunpress": "./dist/bin/cli.js" } }, "sha512-0A+1/igljrrOq3gVyuWBT20awIY/lnXxCPnmKL4gsW47ZX95xnyuDMVOCOVrRHQpXrP/ZcncKkxZWy9EEc6juA=="], | |
| 88 | "@stacksjs/bunpress": ["@stacksjs/bunpress@0.2.22", "", { "dependencies": { "@cwcss/crosswind": "^0.2.16", "@stacksjs/clapp": "^0.2.0", "@stacksjs/stx": "^0.2.550", "@stacksjs/ts-i18n": "^0.1.11", "bunfig": "^0.15.17", "ts-syntax-highlighter": "^0.2.14" }, "peerDependencies": { "@stacksjs/ts-cloud": "^0.7.51" }, "optionalPeers": ["@stacksjs/ts-cloud"], "bin": { "bunpress": "./dist/bin/cli.js" } }, "sha512-xxyLY7rU5v0VGDzv+7AzpFWPMEhMVQn6vZ6FrrAsmb2NShc5MfowO5yig1I3YYdzrSrHH/pDxETUtpC9f8X84A=="], | |
| 86 | 89 | |
| 87 | 90 | "@stacksjs/cache": ["@stacksjs/cache@0.75.221", "", { "dependencies": { "@stacksjs/ts-cache": "^0.1.7" } }, "sha512-D4B2tkif9FISL+5xaMff1Ceu2A1iSlMPLyLbgHGzWuqp2mR8KoB/8Ilpk5uq0Bd/xTf63U9opxkQvKlOr1jkTA=="], |
| 88 | 91 | |
| @@ -12,6 +12,7 @@ const config: BunPressOptions = { | ||
| 12 | 12 | docsDir: './docs', |
| 13 | 13 | basePath: '/docs', |
| 14 | 14 | outDir: './dist/docs', |
| 15 | head: [['link', { rel: 'icon', href: '/docs/favicon.svg', type: 'image/svg+xml' }]], | |
| 15 | 16 | |
| 16 | 17 | nav: [ |
| 17 | 18 | { text: 'Guide', link: '/' }, |
| @@ -22,6 +23,7 @@ const config: BunPressOptions = { | ||
| 22 | 23 | ], |
| 23 | 24 | |
| 24 | 25 | themeConfig: { |
| 26 | editLink: { pattern: 'https://github.com/stacksjs/drone/edit/main/docs/:path' }, | |
| 25 | 27 | socialLinks: [{ icon: 'github', link: 'https://github.com/stacksjs/drone' }], |
| 26 | 28 | }, |
| 27 | 29 | |
| @@ -39,6 +39,6 @@ visible. There is no adapter to command or flight `Telemetry`, no arming and no | ||
| 39 | 39 | |
| 40 | 40 | Tightly coupled error-state EKF, bias learning, heading observations, barometric datum alignment, |
| 41 | 41 | delay compensation, full-rate IMU propagation, VIO/optical flow/RTK and redundancy require the |
| 42 | reference campaigns and numerical work in the [estimator guide](https://github.com/stacksjs/drone/blob/main/docs/estimation.md). Porting a | |
| 42 | reference campaigns and numerical work in the [estimator guide](../estimation.md). Porting a | |
| 43 | 43 | validated algorithm into the allocation-free board scheduler is separate from this Pi-side replay |
| 44 | 44 | implementation and requires issue #2's measured runtime budgets. |
| @@ -36,7 +36,7 @@ The plant uses invented mass/inertia, first-order motor lag, linear drag/wind an | ||
| 36 | 36 | Newton/Euler equations. It has a simple vertical floor constraint, not a landing/contact dynamics |
| 37 | 37 | model. IMU loss latches zero simulated commands; the model can fall. Do not report that as landing. |
| 38 | 38 | |
| 39 | Keep the previous ideal kinematic simulator and external drivers unchanged. The [control guide](https://github.com/stacksjs/drone/blob/main/docs/controls.md) | |
| 39 | Keep the previous ideal kinematic simulator and external drivers unchanged. The [control guide](../controls.md) | |
| 40 | 40 | records scenarios, equations, gains, evidence and the continuation path to measured tuning, native |
| 41 | 41 | bench execution, autotune and other vehicle/control variants. Physical output waits for #6 authority |
| 42 | 42 | validation and the remaining #2/#3/#4 hardware and estimator work. |
| @@ -20,5 +20,5 @@ to our own runtime or mission engine. | ||
| 20 | 20 | |
| 21 | 21 | Keep serial/TCP, command-specific behavior, complete mission/parameter variants, key lifecycle, |
| 22 | 22 | FTP/log/event/time/RTCM services and payload/ROS/CAN gateways as explicit remaining sub-capabilities. |
| 23 | See [the driver contract and limits](https://github.com/stacksjs/drone/blob/main/docs/driver-protocols.md) and | |
| 23 | See [the driver contract and limits](../driver-protocols.md) and | |
| 24 | 24 | [retained conformance evidence](https://github.com/stacksjs/drone/blob/main/docs/driver-protocol-evidence.json). |
| @@ -38,7 +38,7 @@ first. The CLI records one policy decision without starting or restoring a vehic | ||
| 38 | 38 | |
| 39 | 39 | The first release does not claim physical execution, terrain following, hardware exactly-once |
| 40 | 40 | payload delivery or parity with external autopilot mission systems. The detailed contract, |
| 41 | evidence and remaining gates are in [the mission guide](https://github.com/stacksjs/drone/blob/main/docs/missions.md). | |
| 41 | evidence and remaining gates are in [the mission guide](../missions.md). | |
| 42 | 42 | |
| 43 | 43 | ## Version 2 portable decision artifacts |
| 44 | 44 | |
| @@ -33,4 +33,4 @@ initial north alignment and local surface pressure are declared assumptions. | ||
| 33 | 33 | Tether, leak, depth, DVL/pressure quality, emergency, host, IMU, sensor, operator |
| 34 | 34 | and kill losses inhibit outputs. A neutral board cannot guarantee vehicle safety |
| 35 | 35 | around entanglement or overhead structures. Hardware evidence remains a separate |
| 36 | acceptance gate described in [the profile guide](https://github.com/stacksjs/drone/blob/main/docs/vehicles-subsea.md). | |
| 36 | acceptance gate described in [the profile guide](../vehicles-subsea.md). | |
| @@ -29,4 +29,4 @@ evidence. No PWM, GPIO, serial, UDP, payload actuator or physical endpoint is ad | ||
| 29 | 29 | Physical acceptance still needs a surveyed mount, encoder calibration, independent braking/stop |
| 30 | 30 | authority, travel and cable tests, transport/clock qualification and timestamped measured pointing |
| 31 | 31 | and RF observations. Keep issue #16 open for those gates. Software tests do not satisfy the issue's |
| 32 | physical bench criterion. See [the implementation and bench contract](https://github.com/stacksjs/drone/blob/main/docs/antenna.md). | |
| 32 | physical bench criterion. See [the implementation and bench contract](../antenna.md). | |
| @@ -27,4 +27,4 @@ Synthetic/declared-bench provenance is explicit and never reports physical calib | ||
| 27 | 27 | The simulator uses qualified sensor prediction for capture pose, independently rendered image/depth, |
| 28 | 28 | explicit operator selection/pairing and the existing navigation/authority/control/watchdog pipeline. |
| 29 | 29 | The live Pi worker stays 2D. Physical calibration, heading, depth association, HIL and vehicle evidence |
| 30 | remain required as described in the [vision contract](https://github.com/stacksjs/drone/blob/main/docs/vision.md). | |
| 30 | remain required as described in the [vision contract](../vision.md). | |
| @@ -17,4 +17,4 @@ Only the synthetic measurement renderer sees plant truth. Accepted exposures ret | ||
| 17 | 17 | estimated capture poses, calibration and explicit correction/control-point availability. ODM input |
| 18 | 18 | files carry real encoded images and declared optical-center geotags, with a completion manifest. |
| 19 | 19 | Collection reports and mission replay cannot imply reconstruction, measured precision or physical |
| 20 | survey acceptance. See [mapping contract](https://github.com/stacksjs/drone/blob/main/docs/mapping.md) for evidence limits and remaining work. | |
| 20 | survey acceptance. See [mapping contract](../mapping.md) for evidence limits and remaining work. | |
| @@ -28,4 +28,4 @@ Source replay verifies consistency without authenticating a producer or claiming | ||
| 28 | 28 | Reuse the shared completed-artifact publication helper and async CLI output already contributed to |
| 29 | 29 | Stacks. Keep filesystem exports outside browser barrels. Physical hardware calibration, distribution, |
| 30 | 30 | isolation, weather/drift, local requirements, board transport and HIL acceptance stay explicit and open. |
| 31 | The detailed semantics and limits are in [the application guide](https://github.com/stacksjs/drone/blob/main/docs/application.md). | |
| 31 | The detailed semantics and limits are in [the application guide](../application.md). | |
| @@ -45,7 +45,7 @@ disarm/revoke. Verified history remains separate from continuously checked eligi | ||
| 45 | 45 | Only accepted arm plus engage retires the prior live window. Host absence freezes host |
| 46 | 46 | verification while source and independent board/body continue. Each contact-enabled |
| 47 | 47 | request additionally reserves the full 5 second window; the 180 second ceiling stays fixed. |
| 48 | See [the declared model and evidence](https://github.com/stacksjs/drone/blob/main/docs/patrol-contact.md). This is simulated contact, | |
| 48 | See [the declared model and evidence](../patrol-contact.md). This is simulated contact, | |
| 49 | 49 | without charge permission, energy credit or physical validation. |
| 50 | 50 | |
| 51 | 51 | An optional closed partial-charge profile now adds explicit one-use charge approval, |
| @@ -58,14 +58,14 @@ Electrical isolation remains distinct from contact/environment readiness and lat | ||
| 58 | 58 | recovery. A queued flight blocks charge, and queued or active charge blocks a new flight. |
| 59 | 59 | Normalize unknown input before reading current owned time, availability and reservations. |
| 60 | 60 | Keep prior completed episodes immutable when canceling a later queued approval. |
| 61 | See [the fixed model, causal order and evidence](https://github.com/stacksjs/drone/blob/main/docs/patrol-charge.md). | |
| 61 | See [the fixed model, causal order and evidence](../patrol-charge.md). | |
| 62 | 62 | |
| 63 | 63 | A finite native cron ledger now selects minute-zero and minute-one slots, records |
| 64 | 64 | explicit local reviews and emits a handoff description only on its one consuming call. |
| 65 | 65 | It has no runtime handle or scheduler process. Fixed clocks, missed/busy decisions and |
| 66 | 66 | global faults cannot recreate a prior review. The nominal integration test composes |
| 67 | 67 | two actual retained flights with separate charge approval. See [the bounded recurrence |
| 68 | contract](https://github.com/stacksjs/drone/blob/main/docs/patrol-recurrence.md). | |
| 68 | contract](../patrol-recurrence.md). | |
| 69 | 69 | Production scheduling must never grant actuator authority or silently retry a refused launch. |
| 70 | 70 | Native Stacks commands and application services belong outside the synchronous control |
| 71 | 71 | loop. Durable review/audit, weather interlocks, failed docking and recovery, HIL and |
| @@ -139,4 +139,4 @@ Keep #21 open for measured multispectral hardware/panels/irradiance, synchroniza | ||
| 139 | 139 | real field/dataset interchange, physical range/heading/pose accuracy, external known crop-map |
| 140 | 140 | comparisons, ground agronomic measurements, real explicitly reviewed livestock records, richer |
| 141 | 141 | parcel models, bench/HIL/vehicle campaigns and any physical operator/privacy requirements. The owned |
| 142 | software evidence does not complete those acceptance gates. See [ADR 21](https://github.com/stacksjs/drone/blob/main/docs/adr/0021-agriculture-sensing.md). | |
| 142 | software evidence does not complete those acceptance gates. See [ADR 21](adr/0021-agriculture-sensing.md). | |
| @@ -3,7 +3,7 @@ | ||
| 3 | 3 | The owned antenna planner computes bounded pan/tilt trajectories for one explicitly selected |
| 4 | 4 | telemetry target. It is simulation-only. There is no physical mount driver, actuator endpoint or |
| 5 | 5 | flight-authority path. Issue #16 remains open for measured mount accuracy and link correlation. |
| 6 | The decision is recorded in [ADR 16](https://github.com/stacksjs/drone/blob/main/docs/adr/0016-antenna-tracking.md). | |
| 6 | The decision is recorded in [ADR 16](adr/0016-antenna-tracking.md). | |
| 7 | 7 | |
| 8 | 8 | Run the native Stacks command: |
| 9 | 9 | |
| @@ -81,5 +81,5 @@ A lost, stale, unconfirmed or changed lock holds an otherwise valid velocity dec | ||
| 81 | 81 | retain precedence. The guard supplements an independently supplied position target. |
| 82 | 82 | |
| 83 | 83 | The authenticated `/api/camera/state` and `/api/camera/command` Actions own the shared camera session. |
| 84 | Read [the camera guide](https://github.com/stacksjs/drone/blob/main/docs/camera-tracking.md) for the command schema and process/clock contract. | |
| 85 | ArduPilot and PX4 factories are server-only imports from `drone/drivers`; see [drivers](https://github.com/stacksjs/drone/blob/main/docs/drivers.md). | |
| 84 | Read [the camera guide](camera-tracking.md) for the command schema and process/clock contract. | |
| 85 | ArduPilot and PX4 factories are server-only imports from `drone/drivers`; see [drivers](drivers.md). | |
| @@ -148,4 +148,4 @@ Engineering background includes [NC State calibration guidance](https://content. | ||
| 148 | 148 | [UGA spray factors](https://precisionagirrigation.extension.uga.edu/2022/06/spray-considerations-for-effective-pesticide-applications/) |
| 149 | 149 | and [Nebraska drift factors](https://extensionpubs.unl.edu/publication/g1773/2019/html/view). |
| 150 | 150 | These sources motivate separate delivery, distribution and weather evidence; they do not validate |
| 151 | our synthetic thresholds or establish local authorization. See [ADR 22](https://github.com/stacksjs/drone/blob/main/docs/adr/0022-prescribed-application.md). | |
| 151 | our synthetic thresholds or establish local authorization. See [ADR 22](adr/0022-prescribed-application.md). | |
| @@ -71,60 +71,60 @@ It uses the oldest heartbeat/position/battery receipt time for freshness. Physic | ||
| 71 | 71 | reports position health false and never transmits. SITL assumes the simulator's position estimator |
| 72 | 72 | is healthy; that assumption must never be carried into a physical adapter. |
| 73 | 73 | |
| 74 | The wire codec is an experimental subset. [Shared acknowledged microservices](https://github.com/stacksjs/drone/blob/main/docs/driver-protocols.md) add bounded command, parameter and waypoint transfers; serial/TCP and complete firmware coverage remain open. | |
| 75 | Both external stacks are optional drivers. The [owned-stack ADR](https://github.com/stacksjs/drone/blob/main/docs/adr/0001-owned-autonomy.md) and | |
| 76 | [feature roadmap](https://github.com/stacksjs/drone/blob/main/docs/roadmap/README.md) define the replacement path. A future physical adapter needs verified estimator status, source identity, sequence/replay handling, | |
| 74 | The wire codec is an experimental subset. [Shared acknowledged microservices](driver-protocols.md) add bounded command, parameter and waypoint transfers; serial/TCP and complete firmware coverage remain open. | |
| 75 | Both external stacks are optional drivers. The [owned-stack ADR](adr/0001-owned-autonomy.md) and | |
| 76 | [feature roadmap](roadmap/README.md) define the replacement path. A future physical adapter needs verified estimator status, source identity, sequence/replay handling, | |
| 77 | 77 | authenticated transport, link supervision, flight-controller configuration and hardware validation. |
| 78 | 78 | |
| 79 | 79 | ## Native runtime bench slice |
| 80 | 80 | |
| 81 | 81 | The owned kernel and Pico 2 HAL live in `firmware/runtime/`, with the explicit C++17 exception in |
| 82 | [ADR 2](https://github.com/stacksjs/drone/blob/main/docs/adr/0002-bench-runtime.md). Stacks owns the [CLI and protocol tools](https://github.com/stacksjs/drone/blob/main/docs/runtime.md) under | |
| 82 | [ADR 2](adr/0002-bench-runtime.md). Stacks owns the [CLI and protocol tools](runtime.md) under | |
| 83 | 83 | `resources/functions/drone/runtime/`. The first profile is synthetic-sensor and neutral-output |
| 84 | 84 | only. It has no physical flight command path and does not replace estimation or vehicle controls. |
| 85 | 85 | |
| 86 | 86 | |
| 87 | The optional [sensor bench profile](https://github.com/stacksjs/drone/blob/main/docs/sensors.md), recorded in [ADR 3](https://github.com/stacksjs/drone/blob/main/docs/adr/0003-sensor-bench.md), | |
| 87 | The optional [sensor bench profile](sensors.md), recorded in [ADR 3](adr/0003-sensor-bench.md), | |
| 88 | 88 | adds original SPI/I2C/UART acquisition and a receive-only DS stream. TypeScript applies units, |
| 89 | 89 | calibration, clock uncertainty and independent health checks. The same pipeline runs against |
| 90 | 90 | recordings on the simulator clock. Replay snapshots are diagnostic; estimator fusion is issue #4. |
| 91 | 91 | |
| 92 | The [owned estimator](https://github.com/stacksjs/drone/blob/main/docs/estimation.md), recorded in [ADR 4](https://github.com/stacksjs/drone/blob/main/docs/adr/0004-owned-estimator.md), consumes | |
| 92 | The [owned estimator](estimation.md), recorded in [ADR 4](adr/0004-owned-estimator.md), consumes | |
| 93 | 93 | qualified sensor events on their capture epochs. It exposes tilt/relative-yaw, GNSS local NED and |
| 94 | 94 | separate pressure height with health/reset counters. It is independent of both external autopilots |
| 95 | 95 | and remains separate from control telemetry until heading, fusion and hardware validation exist. |
| 96 | 96 | |
| 97 | The [owned control physics harness](https://github.com/stacksjs/drone/blob/main/docs/controls.md), recorded in [ADR 5](https://github.com/stacksjs/drone/blob/main/docs/adr/0005-simulated-multirotor-controls.md), | |
| 97 | The [owned control physics harness](controls.md), recorded in [ADR 5](adr/0005-simulated-multirotor-controls.md), | |
| 98 | 98 | feeds modeled raw sensor records through the existing sensor pipeline and estimator into bounded |
| 99 | 99 | quad-X control. It declares initial simulation heading alignment and has no physical transport. |
| 100 | 100 | Plant truth is retained only for sensor synthesis and independent response evaluation. |
| 101 | 101 | |
| 102 | The [owned authority supervisor](https://github.com/stacksjs/drone/blob/main/docs/authority.md), recorded in [ADR 6](https://github.com/stacksjs/drone/blob/main/docs/adr/0006-simulated-authority.md), | |
| 102 | The [owned authority supervisor](authority.md), recorded in [ADR 6](adr/0006-simulated-authority.md), | |
| 103 | 103 | adds explicit arm/engage, fault revocation and a separate modeled output watchdog above that same |
| 104 | 104 | control path. A host-loss run stops all host execution while the modeled board clock continues. |
| 105 | 105 | Physical firmware and external adapters remain separate from these simulation-only frames. |
| 106 | 106 | |
| 107 | [ADR 7](https://github.com/stacksjs/drone/blob/main/docs/adr/0007-driver-transactions.md) records shared external-driver transactions and the strict | |
| 107 | [ADR 7](adr/0007-driver-transactions.md) records shared external-driver transactions and the strict | |
| 108 | 108 | separation between scripted UDP conformance, firmware SITL and physical evidence. |
| 109 | 109 | |
| 110 | [ADR 8](https://github.com/stacksjs/drone/blob/main/docs/adr/0008-camera-payload-adapters.md) adds owned camera acquisition with bounded local IPC, | |
| 110 | [ADR 8](adr/0008-camera-payload-adapters.md) adds owned camera acquisition with bounded local IPC, | |
| 111 | 111 | per-command clock synchronization, no automatic shutter retry and capture-epoch pose association. |
| 112 | Native Stacks [payload commands](https://github.com/stacksjs/drone/blob/main/docs/payloads.md) expose replay and explicit Pi acquisition. Bus | |
| 112 | Native Stacks [payload commands](payloads.md) expose replay and explicit Pi acquisition. Bus | |
| 113 | 113 | contracts remain configuration only; payloads cannot bypass the flight authority supervisor. |
| 114 | 114 | |
| 115 | [ADR 9](https://github.com/stacksjs/drone/blob/main/docs/adr/0009-runtime-diagnostics.md) records bounded runtime-only journals with typed events, | |
| 115 | [ADR 9](adr/0009-runtime-diagnostics.md) records bounded runtime-only journals with typed events, | |
| 116 | 116 | provenance digests, loss accounting and crash-prefix recovery. Native Stacks commands and a local |
| 117 | [stx viewer](https://github.com/stacksjs/drone/blob/main/docs/diagnostics.md) share the pure verifier/replay projection. No replay path has a | |
| 117 | [stx viewer](diagnostics.md) share the pure verifier/replay projection. No replay path has a | |
| 118 | 118 | vehicle transport, update/flash capability or runtime authority. |
| 119 | 119 | |
| 120 | [ADR 10](https://github.com/stacksjs/drone/blob/main/docs/adr/0010-owned-missions.md) adds a versioned [owned mission engine](https://github.com/stacksjs/drone/blob/main/docs/missions.md) over | |
| 120 | [ADR 10](adr/0010-owned-missions.md) adds a versioned [owned mission engine](missions.md) over | |
| 121 | 121 | the estimator/control/authority physics pipeline. Validated graphs emit position targets, never |
| 122 | 122 | arm themselves, and recover recorded prefixes into a supervised paused state. Task events and |
| 123 | 123 | local-position traces stay separate from physical payload IO and runtime-only diagnostic journals. |
| 124 | 124 | |
| 125 | 125 | ## Shared owned vehicle execution |
| 126 | 126 | |
| 127 | The [vehicle runtime](https://github.com/stacksjs/drone/blob/main/docs/vehicles.md) extends owned raw sensor and estimator execution to aerodynamic | |
| 127 | The [vehicle runtime](vehicles.md) extends owned raw sensor and estimator execution to aerodynamic | |
| 128 | 128 | fixed-wing, differential ground and planar surface profiles. Explicit v2 missions share graph budgets, |
| 129 | 129 | replay, payload scope and authority lifecycle while each model owns its control and actuator units. |
| 130 | 130 | Fresh sessions isolate state. The common stx workspace inspects recorded estimated routes and |
| @@ -130,7 +130,7 @@ After feedback starts, lost health, changed boot/origin/reset counters, unmatche | ||
| 130 | 130 | values, stale/future targets and schedule/clock faults latch inhibition. `reset()` or an explicit |
| 131 | 131 | disabled step clears that session; fresh observations must qualify again. Startup can wait for |
| 132 | 132 | qualified estimates. A fault produces immediate zero simulated commands, bypassing normal slew; |
| 133 | it is not a landing or RC stick controller. The separate [authority harness](https://github.com/stacksjs/drone/blob/main/docs/authority.md) adds explicit lifecycle supervision. The physical firmware remains neutral-only. | |
| 133 | it is not a landing or RC stick controller. The separate [authority harness](authority.md) adds explicit lifecycle supervision. The physical firmware remains neutral-only. | |
| 134 | 134 | Every output retains `physicalFlightEnabled: false` and `boardOutputsInhibited: true`. |
| 135 | 135 | |
| 136 | 136 | ## Scenarios, evidence and continuation |
| @@ -27,7 +27,7 @@ The existing generic `guided` field means external-velocity authority, not a PX4 | ||
| 27 | 27 | |
| 28 | 28 | The new `driver.protocol` interface adds capability discovery, COMMAND_ACK/retries, message-rate |
| 29 | 29 | requests, parameter read/write with readback and bounded mission upload/download/resume. |
| 30 | Read the [protocol contract, native conformance CLI and limits](https://github.com/stacksjs/drone/blob/main/docs/driver-protocols.md). | |
| 30 | Read the [protocol contract, native conformance CLI and limits](driver-protocols.md). | |
| 31 | 31 | Only scripted loopback conformance has been executed; real firmware SITL and physical validation |
| 32 | 32 | remain open. Physical receivers cannot transmit through any of these methods. |
| 33 | 33 | |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | # Owned estimator |
| 2 | 2 | |
| 3 | 3 | Issue [#4](https://github.com/stacksjs/drone/issues/4) has a replayable first estimator built on the |
| 4 | owned [sensor stream](https://github.com/stacksjs/drone/blob/main/docs/sensors.md). This is a Pi/Bun TypeScript bench implementation, not a board-rate | |
| 4 | owned [sensor stream](sensors.md). This is a Pi/Bun TypeScript bench implementation, not a board-rate | |
| 5 | 5 | flight estimator. Issue #3 remains open for physical capture, calibration and timing evidence. |
| 6 | 6 | |
| 7 | 7 | ## Native Stacks CLI and library |
| @@ -59,7 +59,7 @@ There is no compass or other heading observation in the sensor profile. Absolute | ||
| 59 | 59 | covariance cannot be inferred from gravity or assumed from GNSS course. `absoluteHeading` and |
| 60 | 60 | `navigation` stay false. Relative yaw drifts with residual gyro bias; a 0.02 rad/s bias gives 0.08 rad |
| 61 | 61 | drift over four seconds in the test. Attitude covariance is null. An optional `gravityCorrection: 'initialization-only'` disables post-alignment gravity feedback |
| 62 | for the explicitly assumed-heading [control physics experiment](https://github.com/stacksjs/drone/blob/main/docs/controls.md). The default remains | |
| 62 | for the explicitly assumed-heading [control physics experiment](controls.md). The default remains | |
| 63 | 63 | `norm-gated`. This mode is gyro propagation, not a remedy for physical observability or bias drift. |
| 64 | 64 | No gyro bias learning, coning |
| 65 | 65 | correction, accelerometer dynamic rejection beyond the norm heuristic, Earth-rate or lever-arm |
| @@ -19,7 +19,7 @@ This is an engineering roadmap. Software tests do not establish an airworthy air | ||
| 19 | 19 | 8. Validate the implemented Pi AI Camera acquisition, explicit selection and geometric association on the Pi. |
| 20 | 20 | Camera loss requires reselection. Depth, obstacle sensing and metric fusion remain separate milestones. |
| 21 | 21 | |
| 22 | The owned runtime follows the dependency-linked [roadmap](https://github.com/stacksjs/drone/blob/main/docs/roadmap/README.md). The external drivers | |
| 22 | The owned runtime follows the dependency-linked [roadmap](roadmap/README.md). The external drivers | |
| 23 | 23 | support comparison and development while native board controls are implemented and validated. |
| 24 | 24 | |
| 25 | 25 | Until those milestones are complete, the code here should be used for simulation and bench development. |
| @@ -9,8 +9,8 @@ Do not buy a second Pi. These are off-the-shelf hardware parts assembled at home | ||
| 9 | 9 | |
| 10 | 10 | For your own runtime, start with the Pi accessories and AI Camera below, then this separate |
| 11 | 11 | Pico 2 bench kit. The firmware currently produces neutral diagnostic outputs. The |
| 12 | [runtime guide](https://github.com/stacksjs/drone/blob/main/docs/runtime.md) defines its wiring and measurements; add the | |
| 13 | [sensor profile](https://github.com/stacksjs/drone/blob/main/docs/sensors.md) as a later bench stage. No airframe or external autopilot firmware | |
| 12 | [runtime guide](runtime.md) defines its wiring and measurements; add the | |
| 13 | [sensor profile](sensors.md) as a later bench stage. No airframe or external autopilot firmware | |
| 14 | 14 | is needed to begin that work. |
| 15 | 15 | |
| 16 | 16 | Bench prices checked October 20, 2026. These are additional to the airframe table, before tax, |
| @@ -32,7 +32,7 @@ possible to preserve the aircraft budget. | ||
| 32 | 32 | |
| 33 | 33 | For the later sensor stage, the implemented profile requires an **ICM-42688-P SPI breakout**, |
| 34 | 34 | **BMP280 at I2C address 0x76**, and **u-blox M10-class UART NAV-PVT**. Match the exact part, |
| 35 | exposed signals and voltage to the [sensor bench guide](https://github.com/stacksjs/drone/blob/main/docs/sensors.md). The | |
| 35 | exposed signals and voltage to the [sensor bench guide](sensors.md). The | |
| 36 | 36 | [Adafruit BMP280, product 2651](https://www.adafruit.com/product/2651) lists at $9.95. |
| 37 | 37 | Use its [pinout guide](https://learn.adafruit.com/adafruit-bmp280-barometric-pressure-plus-temperature-sensor-breakout/pinouts) |
| 38 | 38 | for breakout connections. [Bosch's datasheet, section 5.2](https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bmp280-ds001.pdf#page=28) |
| @@ -57,7 +57,7 @@ local quadcopter SITL; physical telemetry is receive-only and physical flight co | ||
| 57 | 57 | Choose flight-controller firmware independently of the owned mission and camera logic. No firmware |
| 58 | 58 | flash or physical-flight qualification follows from this shopping list. |
| 59 | 59 | |
| 60 | The separate [owned board runtime](https://github.com/stacksjs/drone/blob/main/docs/runtime.md) uses a Pico 2 for bench development. Pixhawk 6C flight | |
| 60 | The separate [owned board runtime](runtime.md) uses a Pico 2 for bench development. Pixhawk 6C flight | |
| 61 | 61 | firmware, physical control and measured aircraft validation remain separate roadmap work. Keep the |
| 62 | 62 | Pi 5 for Stacks mission and camera logic. |
| 63 | 63 | |
| @@ -5,8 +5,8 @@ controls and mission engine. Drone is a Stacks application with TypeScript libra | ||
| 5 | 5 | functions in `resources/functions/drone/`, native Buddy commands and stx workspaces. |
| 6 | 6 | ArduPilot and PX4 are optional drivers. |
| 7 | 7 | |
| 8 | Use the sidebar to read guides here. Inline guide links open their GitHub source. | |
| 9 | Routing for relative Markdown links is tracked in [issue #39](https://github.com/stacksjs/drone/issues/39). | |
| 8 | Use the sidebar or inline links to read guides here. Markdown source links also work | |
| 9 | when browsing the repository on GitHub. | |
| 10 | 10 | |
| 11 | 11 | **Current status: experimental simulation and bench development. Physical telemetry |
| 12 | 12 | is receive-only and physical flight commands are disabled.** Modeled completion, |
| @@ -33,40 +33,40 @@ browser and has no aircraft connection. For a terminal demonstration: | ||
| 33 | 33 | ./buddy drone:simulate |
| 34 | 34 | ``` |
| 35 | 35 | |
| 36 | Read [architecture and failure behavior](https://github.com/stacksjs/drone/blob/main/docs/architecture.md) before extending control. | |
| 37 | For your Pi 5, start with the [hardware list](https://github.com/stacksjs/drone/blob/main/docs/hardware.md), | |
| 38 | [Pi bring-up](https://github.com/stacksjs/drone/blob/main/docs/raspberry-pi.md) and [Pi AI Camera tracking](https://github.com/stacksjs/drone/blob/main/docs/camera-tracking.md). | |
| 36 | Read [architecture and failure behavior](architecture.md) before extending control. | |
| 37 | For your Pi 5, start with the [hardware list](hardware.md), | |
| 38 | [Pi bring-up](raspberry-pi.md) and [Pi AI Camera tracking](camera-tracking.md). | |
| 39 | 39 | An image-space person lock does not establish identity or metric position. |
| 40 | 40 | |
| 41 | 41 | ## Build on our runtime |
| 42 | 42 | |
| 43 | The [native bench runtime](https://github.com/stacksjs/drone/blob/main/docs/runtime.md) has host and Pico 2 build paths. Its board | |
| 44 | profile remains neutral-only. The owned [sensor pipeline](https://github.com/stacksjs/drone/blob/main/docs/sensors.md), | |
| 45 | [estimator](https://github.com/stacksjs/drone/blob/main/docs/estimation.md), [multirotor controls](https://github.com/stacksjs/drone/blob/main/docs/controls.md), | |
| 46 | [authority supervisor](https://github.com/stacksjs/drone/blob/main/docs/authority.md), [mission engine](https://github.com/stacksjs/drone/blob/main/docs/missions.md) and | |
| 47 | [navigation](https://github.com/stacksjs/drone/blob/main/docs/navigation.md) have separate simulation and hardware acceptance gates. | |
| 43 | The [native bench runtime](runtime.md) has host and Pico 2 build paths. Its board | |
| 44 | profile remains neutral-only. The owned [sensor pipeline](sensors.md), | |
| 45 | [estimator](estimation.md), [multirotor controls](controls.md), | |
| 46 | [authority supervisor](authority.md), [mission engine](missions.md) and | |
| 47 | [navigation](navigation.md) have separate simulation and hardware acceptance gates. | |
| 48 | 48 | |
| 49 | [Diagnostics and replay](https://github.com/stacksjs/drone/blob/main/docs/diagnostics.md) retain explicit loss and provenance. | |
| 50 | The [library API](https://github.com/stacksjs/drone/blob/main/docs/api.md) describes behavior extensions. The | |
| 51 | [shared vehicle contract](https://github.com/stacksjs/drone/blob/main/docs/vehicles.md) covers quadcopter, fixed-wing, ground, | |
| 52 | surface and subsea profiles. [Optional external drivers](https://github.com/stacksjs/drone/blob/main/docs/drivers.md) have | |
| 53 | [acknowledged protocol services](https://github.com/stacksjs/drone/blob/main/docs/driver-protocols.md); scripted peers are distinct | |
| 54 | from [firmware SITL](https://github.com/stacksjs/drone/blob/main/docs/sitl.md) and physical testing. | |
| 49 | [Diagnostics and replay](diagnostics.md) retain explicit loss and provenance. | |
| 50 | The [library API](api.md) describes behavior extensions. The | |
| 51 | [shared vehicle contract](vehicles.md) covers quadcopter, fixed-wing, ground, | |
| 52 | surface and subsea profiles. [Optional external drivers](drivers.md) have | |
| 53 | [acknowledged protocol services](driver-protocols.md); scripted peers are distinct | |
| 54 | from [firmware SITL](sitl.md) and physical testing. | |
| 55 | 55 | |
| 56 | 56 | ## Explore a workflow |
| 57 | 57 | |
| 58 | 58 | | Workflow | Current development surface | Guide | |
| 59 | 59 | |---|---|---| |
| 60 | | Camera tracking and follow | Explicit target selection, image-space loss handling and synthetic calibrated fusion | [Tracking](https://github.com/stacksjs/drone/blob/main/docs/camera-tracking.md), [fusion](https://github.com/stacksjs/drone/blob/main/docs/vision.md) | | |
| 61 | | Aerial mapping | Survey planning, synthetic acknowledged capture and dataset export; reconstruction remains open | [Survey collection](https://github.com/stacksjs/drone/blob/main/docs/mapping.md) | | |
| 62 | | Stockpile volumes | Numeric grids/TINs, declared base surfaces, cut/fill and uncertainty; acquisition accuracy is separate | [Volume processing](https://github.com/stacksjs/drone/blob/main/docs/volumes.md) | | |
| 63 | | Infrastructure inspection | Asset-relative modeled capture, explicit observations and repeat-visit comparison | [Inspection](https://github.com/stacksjs/drone/blob/main/docs/inspection.md) | | |
| 64 | | Farming | Synthetic crop sensing and declared planning previews; agronomy and authenticated app integration remain separate | [Agriculture](https://github.com/stacksjs/drone/blob/main/docs/agriculture.md), [Open Farming](https://github.com/stacksjs/drone/blob/main/docs/open-farming.md) | | |
| 65 | | Prescribed application | Owned ground simulation for inert water or granules, with explicit implement authority | [Application](https://github.com/stacksjs/drone/blob/main/docs/application.md) | | |
| 66 | | Public safety | Synthetic incident collection, authenticated records, review and local dataset management | [Public safety](https://github.com/stacksjs/drone/blob/main/docs/public-safety.md) | | |
| 67 | | Patrol and docking | Retained modeled vehicle, explicit decisions, finite recurrence and charge opt-in | [Patrol CLI](https://github.com/stacksjs/drone/blob/main/docs/patrol-cli.md) | | |
| 68 | | Cargo and cinema | Bounded carried-load characterization and a simulated POI angular reframe | [Cargo](https://github.com/stacksjs/drone/blob/main/docs/cargo-load.md), [cinema](https://github.com/stacksjs/drone/blob/main/docs/cinema.md) | | |
| 69 | | Environmental sampling and antenna pointing | Synthetic sampling and a selected-vehicle mount model | [Environment](https://github.com/stacksjs/drone/blob/main/docs/environment.md), [antenna](https://github.com/stacksjs/drone/blob/main/docs/antenna.md) | | |
| 60 | | Camera tracking and follow | Explicit target selection, image-space loss handling and synthetic calibrated fusion | [Tracking](camera-tracking.md), [fusion](vision.md) | | |
| 61 | | Aerial mapping | Survey planning, synthetic acknowledged capture and dataset export; reconstruction remains open | [Survey collection](mapping.md) | | |
| 62 | | Stockpile volumes | Numeric grids/TINs, declared base surfaces, cut/fill and uncertainty; acquisition accuracy is separate | [Volume processing](volumes.md) | | |
| 63 | | Infrastructure inspection | Asset-relative modeled capture, explicit observations and repeat-visit comparison | [Inspection](inspection.md) | | |
| 64 | | Farming | Synthetic crop sensing and declared planning previews; agronomy and authenticated app integration remain separate | [Agriculture](agriculture.md), [Open Farming](open-farming.md) | | |
| 65 | | Prescribed application | Owned ground simulation for inert water or granules, with explicit implement authority | [Application](application.md) | | |
| 66 | | Public safety | Synthetic incident collection, authenticated records, review and local dataset management | [Public safety](public-safety.md) | | |
| 67 | | Patrol and docking | Retained modeled vehicle, explicit decisions, finite recurrence and charge opt-in | [Patrol CLI](patrol-cli.md) | | |
| 68 | | Cargo and cinema | Bounded carried-load characterization and a simulated POI angular reframe | [Cargo](cargo-load.md), [cinema](cinema.md) | | |
| 69 | | Environmental sampling and antenna pointing | Synthetic sampling and a selected-vehicle mount model | [Environment](environment.md), [antenna](antenna.md) | | |
| 70 | 70 | |
| 71 | 71 | Each guide distinguishes implemented behavior, recorded evidence and remaining |
| 72 | 72 | work. The sidebar links the detailed runtime, vehicle, payload and operational |
| @@ -74,14 +74,14 @@ record contracts. | ||
| 74 | 74 | |
| 75 | 75 | ## Follow implementation and evidence |
| 76 | 76 | |
| 77 | The [dependency roadmap](https://github.com/stacksjs/drone/blob/main/docs/roadmap/README.md) and | |
| 78 | [feature coverage matrix](https://github.com/stacksjs/drone/blob/main/docs/roadmap/feature-coverage.md) map the requested workflows | |
| 79 | to issues. The [behavior parity audit](https://github.com/stacksjs/drone/blob/main/docs/parity.md) records reviewed upstream scope | |
| 77 | The [dependency roadmap](roadmap/README.md) and | |
| 78 | [feature coverage matrix](roadmap/feature-coverage.md) map the requested workflows | |
| 79 | to issues. The [behavior parity audit](parity.md) records reviewed upstream scope | |
| 80 | 80 | and unresolved detail; inventory coverage is not full ArduPilot or PX4 parity. |
| 81 | The [validation record](https://github.com/stacksjs/drone/blob/main/docs/validation.md) describes individual tested slices and | |
| 81 | The [validation record](validation.md) describes individual tested slices and | |
| 82 | 82 | their limits. |
| 83 | 83 | |
| 84 | 84 | Physical integrations retain independent flight-controller and RC authority. |
| 85 | Read the [flight-development gates](https://github.com/stacksjs/drone/blob/main/docs/flight-development.md) before connecting | |
| 85 | Read the [flight-development gates](flight-development.md) before connecting | |
| 86 | 86 | hardware. Follow work in the [public repository](https://github.com/stacksjs/drone) |
| 87 | 87 | and [issue tracker](https://github.com/stacksjs/drone/issues). |
| @@ -120,4 +120,4 @@ Issue [#20](https://github.com/stacksjs/drone/issues/20) remains open for regist | ||
| 120 | 120 | measured range/pose/visible/thermal calibration, qualified camera/payload hardware, environmental |
| 121 | 121 | and dynamic-structure campaigns, human-reviewed real defect evidence, richer assets/occlusions, |
| 122 | 122 | HIL and vehicle acceptance. This workflow is owned physics simulation, not an external firmware |
| 123 | SITL run or a completed physical infrastructure inspection. See [ADR 20](https://github.com/stacksjs/drone/blob/main/docs/adr/0020-asset-inspection.md). | |
| 123 | SITL run or a completed physical infrastructure inspection. See [ADR 20](adr/0020-asset-inspection.md). | |
| @@ -210,7 +210,7 @@ compiler and frame/capability translation are still needed before a shared drive | ||
| 210 | 210 | Issue #10 remains open for durable correlated whole-runtime checkpoints, payload transaction/ACK |
| 211 | 211 | reconciliation, external driver translation, richer energy/terrain/rally planning and restart/HIL |
| 212 | 212 | failure evidence. Hardware acceptance, real landing detection, obstacle-aware return and physical |
| 213 | mission control remain separate gates. See [ADR 10](https://github.com/stacksjs/drone/blob/main/docs/adr/0010-owned-missions.md). | |
| 213 | mission control remain separate gates. See [ADR 10](adr/0010-owned-missions.md). | |
| 214 | 214 | |
| 215 | 215 | ## Native readiness policy, library v3 |
| 216 | 216 | |
| @@ -106,7 +106,7 @@ policies. Their ten source records retain exact file hashes and line/symbol cita | ||
| 106 | 106 | 59 cases and 26 support claims are unchanged. Both directories remain owned by payload issue #8; |
| 107 | 107 | their reviewed dimensions retain explicit deeper work and do not constitute exhaustive review. |
| 108 | 108 | |
| 109 | The [owned Cinema simulation](https://github.com/stacksjs/drone/blob/main/docs/cinema.md) implements a separate hover POI angular reframe with | |
| 109 | The [owned Cinema simulation](cinema.md) implements a separate hover POI angular reframe with | |
| 110 | 110 | modeled joints, encoders and still exposures. It does not implement those firmware modes, |
| 111 | 111 | manager ownership/discovery, normalized AUX/servo outputs, electrical behavior or device health |
| 112 | 112 | policies. Generic command/parameter transport also does not supply gimbal-specific semantics. |
| @@ -5,7 +5,7 @@ The private `createNavigationOccurrenceSession` in | ||
| 5 | 5 | `contact` is also selected. Profiles are `nominal`, `no-current`, `current-stuck`, |
| 6 | 6 | `stuck-relay`, `feedback-loss`, `feedback-replay` and `mains-loss`. Issue #24 remains open |
| 7 | 7 | for production scheduling, runtime recovery, a full weather system and physical qualification. |
| 8 | The separate [authenticated review ledger](https://github.com/stacksjs/drone/blob/main/docs/patrol-review.md) persists owner-only intent and | |
| 8 | The separate [authenticated review ledger](patrol-review.md) persists owner-only intent and | |
| 9 | 9 | review metadata without granting charge or launch authority. This experiment has no charger hardware transport. |
| 10 | 10 | |
| 11 | 11 | Only the charge-enabled adapter exposes `requestCharge()` and `stopCharge()`. A request is |
| @@ -96,5 +96,5 @@ orders, finite capacity and exact refusal behavior. Seven full legacy navigation | ||
| 96 | 96 | remain byte-identical. Physical charging, unattended operation, HIL and endurance evidence |
| 97 | 97 | are outside this modeled checkpoint. |
| 98 | 98 | |
| 99 | A separate [finite recurrence ledger](https://github.com/stacksjs/drone/blob/main/docs/patrol-recurrence.md) records due slots and explicit | |
| 99 | A separate [finite recurrence ledger](patrol-recurrence.md) records due slots and explicit | |
| 100 | 100 | local reviews. Neither due slots nor flight reviews supply charge approval. |
| @@ -18,8 +18,8 @@ charging at 47 seconds, then reviews the second flight at 60 seconds. The fixed | ||
| 18 | 18 | is 2026-01-01T00:00:00.000Z. These are unsigned synthetic decisions, without authenticated |
| 19 | 19 | operator identity. The nominal model completes flights at 44.120 and 102.120 seconds, |
| 20 | 20 | verifies their own selected-pad contact, and proves modeled charge isolation at 55.400 seconds. |
| 21 | See the [recurrence](https://github.com/stacksjs/drone/blob/main/docs/patrol-recurrence.md), [contact](https://github.com/stacksjs/drone/blob/main/docs/patrol-contact.md) and | |
| 22 | [partial-charge](https://github.com/stacksjs/drone/blob/main/docs/patrol-charge.md) contracts for their fixed models and limits. | |
| 21 | See the [recurrence](patrol-recurrence.md), [contact](patrol-contact.md) and | |
| 22 | [partial-charge](patrol-charge.md) contracts for their fixed models and limits. | |
| 23 | 23 | |
| 24 | 24 | ## Decisions and native options |
| 25 | 25 | |
| @@ -65,7 +65,7 @@ It includes each decision's fulfillment, its own historical mission/contact evid | ||
| 65 | 65 | verification and measured modeled isolation, separate true and credited energy, host freshness |
| 66 | 66 | and actual request/acceptance counters. Optional `--output <directory>` publishes the same |
| 67 | 67 | summary with normalized input and a completion manifest before printing it. The directory must |
| 68 | not already exist. See the [recording and replay contract](https://github.com/stacksjs/drone/blob/main/docs/patrol-recording.md) for bounds, | |
| 68 | not already exist. See the [recording and replay contract](patrol-recording.md) for bounds, | |
| 69 | 69 | fresh replay consent and publication failure behavior. The command does not dump traces. |
| 70 | 70 | |
| 71 | 71 | `neutral-preview`, `reviewed-denials` and `completed` exit successfully. Any unfulfilled explicit |
| @@ -74,7 +74,7 @@ flight must actually complete with its own verified contact; approved charging m | ||
| 74 | 74 | isolate its own episode. A queued request or final relay-off value alone cannot establish success. |
| 75 | 75 | The retained model continues to the horizon without a fabricated final stop or revoke. |
| 76 | 76 | |
| 77 | The separate [authenticated review ledger](https://github.com/stacksjs/drone/blob/main/docs/patrol-review.md) persists owner-only intent, | |
| 77 | The separate [authenticated review ledger](patrol-review.md) persists owner-only intent, | |
| 78 | 78 | decisions and consumption metadata without invoking this command or handing off to a runtime. |
| 79 | 79 | Issue #24 remains open for a patrol workspace, production scheduling, runtime recovery, broader |
| 80 | 80 | weather behavior and physical qualification. This command adds no physical transport, unattended |
| @@ -53,10 +53,10 @@ wrong-pad identity, genuine stale feedback at call versus arm, regressed origina | ||
| 53 | 53 | pending and verified host silence, exact switch edges, and a blocked contact-enabled flight. |
| 54 | 54 | Legacy seven-scenario result bytes remain unchanged. The contact-only experiment keeps an |
| 55 | 55 | unmeasured nominal hover-load proxy without recharge credit. A separate optional |
| 56 | [partial-charge model](https://github.com/stacksjs/drone/blob/main/docs/patrol-charge.md) adds explicit permission, instrument verification | |
| 57 | and isolation. The separate [authenticated review ledger](https://github.com/stacksjs/drone/blob/main/docs/patrol-review.md) persists | |
| 56 | [partial-charge model](patrol-charge.md) adds explicit permission, instrument verification | |
| 57 | and isolation. The separate [authenticated review ledger](patrol-review.md) persists | |
| 58 | 58 | owner-only intent and review metadata without launch or charging authority. Measured |
| 59 | 59 | hardware current, a full weather system, production scheduling, runtime handoff/recovery, |
| 60 | 60 | a patrol workspace and physical docking remain open. |
| 61 | The [finite patrol command](https://github.com/stacksjs/drone/blob/main/docs/patrol-cli.md) composes this modeled contact verifier with | |
| 61 | The [finite patrol command](patrol-cli.md) composes this modeled contact verifier with | |
| 62 | 62 | explicit unsigned decisions; it adds no physical contact evidence. |
| @@ -46,7 +46,7 @@ while first mission/contact history, reference, session and boot identities rema | ||
| 46 | 46 | Actual modeled stored gain is 0.0592 Wh, with conservative verified credit of |
| 47 | 47 | 0.05205362 Wh. Cumulative nominal powered load is 4.704 Wh; policy remaining energy is |
| 48 | 48 | 15.34805362 Wh. These are synthetic model results, without idle-load or endurance |
| 49 | measurement. See [contact](https://github.com/stacksjs/drone/blob/main/docs/patrol-contact.md) and [partial charging](https://github.com/stacksjs/drone/blob/main/docs/patrol-charge.md) | |
| 49 | measurement. See [contact](patrol-contact.md) and [partial charging](patrol-charge.md) | |
| 50 | 50 | for their fixed models and limits. |
| 51 | 51 | |
| 52 | 52 | The runtime's independent admission still requires its full 84 second route, 5 second |
| @@ -54,12 +54,12 @@ contact window and 2 second tail. The second start budget fits the unchanged hor | ||
| 54 | 54 | 60000 + 20 + 84000 + 5000 + 2000 = 151020 ms, below 180000 ms. A positive local review |
| 55 | 55 | followed by runtime refusal stays consumed, without a retry or restored approval. |
| 56 | 56 | |
| 57 | The separate [authenticated review ledger](https://github.com/stacksjs/drone/blob/main/docs/patrol-review.md) persists owner-only intent, | |
| 57 | The separate [authenticated review ledger](patrol-review.md) persists owner-only intent, | |
| 58 | 58 | decisions and consumption metadata through native Auth, Gates and SQLite. It does not |
| 59 | 59 | connect those records to this simulation or authorize launch. Issue #24 remains open for |
| 60 | 60 | production scheduling, runtime handoff/recovery, a patrol workspace, weather and physical |
| 61 | 61 | qualification. This finite recurrence model does not qualify unattended docking, charging or field operation. |
| 62 | 62 | |
| 63 | The [finite patrol command](https://github.com/stacksjs/drone/blob/main/docs/patrol-cli.md) now composes this ledger and retained model | |
| 63 | The [finite patrol command](patrol-cli.md) now composes this ledger and retained model | |
| 64 | 64 | with explicit unsigned decision files. Its neutral default never supplies a review or charge |
| 65 | 65 | approval. The command does not register a scheduler or add production launch permission. |
| @@ -2,7 +2,7 @@ | ||
| 2 | 2 | |
| 3 | 3 | The patrol review API records owner-scoped intent, review decisions and one consumption acknowledgment in native Stacks models. It does not start a simulation, launch a vehicle, grant charging authority or hand work to a runtime. Every successful response carries `actorIdentityAuthenticated: true`, `bindingIdentityAuthenticated: false`, `launchAuthorized: false`, `chargeAuthorized: false`, `physicalFlightEnabled: false`, `executionState: "not-requested"` and `handoff: null`. |
| 4 | 4 | |
| 5 | This API is separate from [finite patrol recording and replay](https://github.com/stacksjs/drone/blob/main/docs/patrol-recording.md). Recording replay checks an unsigned local summary. Authenticated review records a server-authenticated actor and durable history; it does not authenticate the caller's declared vehicle, pad or frame. | |
| 5 | This API is separate from [finite patrol recording and replay](./patrol-recording.md). Recording replay checks an unsigned local summary. Authenticated review records a server-authenticated actor and durable history; it does not authenticate the caller's declared vehicle, pad or frame. | |
| 6 | 6 | |
| 7 | 7 | ## Native access and routes |
| 8 | 8 | |
| @@ -35,7 +35,7 @@ This is local export, not durable flight logging or a cloud storage job. | ||
| 35 | 35 | |
| 36 | 36 | ## First physical adapter: Raspberry Pi 5 and IMX500 |
| 37 | 37 | |
| 38 | Use the Pi AI Camera and Pi 5 camera cable described in [camera setup](https://github.com/stacksjs/drone/blob/main/docs/camera-tracking.md). | |
| 38 | Use the Pi AI Camera and Pi 5 camera cable described in [camera setup](camera-tracking.md). | |
| 39 | 39 | Power the Pi down before connecting the CSI ribbon; verify connector orientation against the |
| 40 | 40 | [Raspberry Pi camera documentation](https://www.raspberrypi.com/documentation/accessories/ai-camera.html). |
| 41 | 41 | Use the supported 64-bit Raspberry Pi OS packages and camera discovery steps from that guide. |
| @@ -157,7 +157,7 @@ A live step first validates observation structure, monotonic integer clock, a ma | ||
| 157 | 157 | |
| 158 | 158 | Normal `retire` closes without using a goal or consuming an observation, even after an expired historical lease or large gap. A valid nondecreasing close records `session-retired`; an invalid close while waiting/active latches `gimbal-clock-discontinuity` at a null event time. Invalid close while inhibited is unchanged; a later valid close preserves the first fault; retired calls remain inert. Only live `step` enforces lease/gap before goal use. This deliberate-close distinction provides no independent watchdog. |
| 159 | 159 | |
| 160 | Snapshot JSON plus LF is capped at 8,192 bytes; decisions at 12,288, with finite counters and at most 16 transitions. These are representation bounds. [Managed Cinema](https://github.com/stacksjs/drone/blob/main/docs/cinema.md#owned-selected-gimbal-source) connects the admitted angle to the existing delayed-encoder PD and plant, and exercises source expiry at a real exposure/ACK tie. The public pure tests of manual/neutral commands establish only directive/latch behavior. No physical gimbal bus, source handoff, sticks, authenticated writer or host-death neutralization is implemented; the hardware inventory and original issue criteria remain open. | |
| 160 | Snapshot JSON plus LF is capped at 8,192 bytes; decisions at 12,288, with finite counters and at most 16 transitions. These are representation bounds. [Managed Cinema](cinema.md#owned-selected-gimbal-source) connects the admitted angle to the existing delayed-encoder PD and plant, and exercises source expiry at a real exposure/ACK tie. The public pure tests of manual/neutral commands establish only directive/latch behavior. No physical gimbal bus, source handoff, sticks, authenticated writer or host-death neutralization is implemented; the hardware inventory and original issue criteria remain open. | |
| 161 | 161 | |
| 162 | 162 | ## Acceptance still required on hardware |
| 163 | 163 | |
| @@ -57,7 +57,7 @@ a body-only CSRF token is unavailable because these routes defer body parsing un | ||
| 57 | 57 | |
| 58 | 58 | Creation installs exactly one coordinator. Membership changes cannot mint another coordinator, |
| 59 | 59 | remove or demote the current one, or perform handover. Use the separate two-phase |
| 60 | [incident coordination handover](https://github.com/stacksjs/drone/blob/main/docs/public-safety-handover.md). | |
| 60 | [incident coordination handover](public-safety-handover.md). | |
| 61 | 61 | An account needs both platform eligibility and active incident membership. |
| 62 | 62 | Client-supplied actor, grantor or principal fields grant nothing and are rejected by mutation schemas. |
| 63 | 63 | |
| @@ -105,8 +105,8 @@ or uncontrolled copies. A declared hold does not bypass expiry or prove a review | ||
| 105 | 105 | Content results are checked after actual transaction completion and again after awaited HTTP |
| 106 | 106 | middleware. If expiry withholds a mutation response after COMMIT, its committed change remains; |
| 107 | 107 | the response gate does not roll back that change or recall bytes already released to clients. |
| 108 | The [retention custody API](https://github.com/stacksjs/drone/blob/main/docs/public-safety-retention.md) adds explicit enrollment and hold review. | |
| 109 | [Accepted local purge](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) is a separate, default-disabled policy for active | |
| 108 | The [retention custody API](public-safety-retention.md) adds explicit enrollment and hold review. | |
| 109 | [Accepted local purge](public-safety-purge.md) is a separate, default-disabled policy for active | |
| 110 | 110 | incident DB payload and registered files. Enrollment alone never authorizes that removal. |
| 111 | 111 | |
| 112 | 112 | ## Generic data boundaries |
| @@ -131,14 +131,14 @@ cookie CSRF, unread unauthorized bodies and alternate generic model routes. They | ||
| 131 | 131 | Auth or the ORM, reset the application's database, or establish production identity-provider, |
| 132 | 132 | distributed revocation or vehicle evidence. |
| 133 | 133 | |
| 134 | The [source, observation and review functions](https://github.com/stacksjs/drone/blob/main/docs/public-safety-records.md) extend this access module | |
| 134 | The [source, observation and review functions](public-safety-records.md) extend this access module | |
| 135 | 135 | with immutable verified collection sources, explicit pixel declarations and append-only review. |
| 136 | The [retention custody functions](https://github.com/stacksjs/drone/blob/main/docs/public-safety-retention.md) add minimal status and explicit hold | |
| 136 | The [retention custody functions](public-safety-retention.md) add minimal status and explicit hold | |
| 137 | 137 | review after expiry, without reopening content access or deleting data. |
| 138 | The [separate purge module](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) records explicit accepted removal and minimal | |
| 139 | receipts, with declared exclusions. The [handover module](https://github.com/stacksjs/drone/blob/main/docs/public-safety-handover.md) transfers | |
| 138 | The [separate purge module](public-safety-purge.md) records explicit accepted removal and minimal | |
| 139 | receipts, with declared exclusions. The [handover module](public-safety-handover.md) transfers | |
| 140 | 140 | incident coordination after explicit recipient acknowledgement. The |
| 141 | [authorized workspace](https://github.com/stacksjs/drone/blob/main/docs/public-safety-workspace.md) connects these existing reads and commands | |
| 141 | [authorized workspace](public-safety-workspace.md) connects these existing reads and commands | |
| 142 | 142 | at `/incidents`. Issue #23 remains open for sector/team assignments and in-progress |
| 143 | 143 | collection, plus jurisdiction, hardware, |
| 144 | 144 | firmware interoperability and operational qualification. |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | # Synthetic incident execution |
| 2 | 2 | |
| 3 | 3 | The source Stacks application supports owned synthetic execution and deliberate |
| 4 | source admission. See [ADR26](https://github.com/stacksjs/drone/blob/main/docs/adr/0026-owner-bound-incident-execution.md) for its | |
| 4 | source admission. See [ADR26](adr/0026-owner-bound-incident-execution.md) for its | |
| 5 | 5 | authority and deployment contract. |
| 6 | 6 | |
| 7 | 7 | The `/incidents` workspace runs the existing owned public-safety simulator with |
| @@ -157,7 +157,7 @@ with the existing accepted purge-v1 audit group. The fixed inventory and | ||
| 157 | 157 | previously accepted plans are unchanged. No per-offer copy survives in custody or |
| 158 | 158 | purge receipt metadata. Native diagnostic exclusions and explicit field redaction |
| 159 | 159 | also cover the protocol. Existing downloaded, exported, backed-up or diagnostic |
| 160 | copies remain subject to the exclusions in [local purge](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md). | |
| 160 | copies remain subject to the exclusions in [local purge](public-safety-purge.md). | |
| 161 | 161 | |
| 162 | 162 | The library functions live in resources/functions/drone/public-safety/access/ |
| 163 | 163 | handover.ts; native Actions and Gates adapt the same interface to HTTP. The |
| @@ -12,7 +12,7 @@ creation are separate explicit actions. Neither authorizes deletion. Managed art | ||
| 12 | 12 | `purgeImplemented: false` and `contentDeletionPerformed: false`; legacy offline exports and |
| 13 | 13 | downloaded copies remain outside the managed registry. |
| 14 | 14 | |
| 15 | [Accepted local purge](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) is a separate policy with explicit inventory | |
| 15 | [Accepted local purge](public-safety-purge.md) is a separate policy with explicit inventory | |
| 16 | 16 | acceptance, durable progress and a minimized receipt. It freezes these content operations before |
| 17 | 17 | removing registered namespace entries and accepted DB payload. Existing enrollment and dataset |
| 18 | 18 | requests never grant that destructive authority. |
| @@ -119,6 +119,6 @@ connection closure. The library adds no garbage-collection workaround or replace | ||
| 119 | 119 | Local process-crash and filesystem checks do not establish hardware power-loss durability, |
| 120 | 120 | hostile-host protection, media erasure, uncontrolled-copy removal or purge acceptance. |
| 121 | 121 | |
| 122 | The [resource qualification](https://github.com/stacksjs/drone/blob/main/docs/public-safety-managed-budget.md) derives a tighter output | |
| 122 | The [resource qualification](public-safety-managed-budget.md) derives a tighter output | |
| 123 | 123 | bound for the pinned replay profile and codec. The manifest-inclusive 32 MiB guard |
| 124 | 124 | remains enforced before publication intent. |
| @@ -3,9 +3,9 @@ | ||
| 3 | 3 | The incident record functions retain verified owned collection sources, explicit operator pixel |
| 4 | 4 | declarations and append-only review history. Native Stacks accounts, tokens, permissions, Gates, |
| 5 | 5 | model-derived migrations and transactions provide the persistence and access checks described in |
| 6 | [incident access](https://github.com/stacksjs/drone/blob/main/docs/public-safety-access.md). The collection producer remains unsigned simulation. | |
| 6 | [incident access](public-safety-access.md). The collection producer remains unsigned simulation. | |
| 7 | 7 | |
| 8 | [Managed source datasets](https://github.com/stacksjs/drone/blob/main/docs/public-safety-managed.md) can explicitly publish private derivatives | |
| 8 | [Managed source datasets](public-safety-managed.md) can explicitly publish private derivatives | |
| 9 | 9 | from one admitted source after custody enrollment, without copying observation or review notes. |
| 10 | 10 | |
| 11 | 11 | ## Register a collection source |
| @@ -116,10 +116,10 @@ and noncanonical numeric identifiers are refused. Responses and errors remain pr | ||
| 116 | 116 | uncacheable. These models have no generated REST, search or generic dashboard exposure. |
| 117 | 117 | |
| 118 | 118 | The access deadline controls current reads and writes. It does not erase database pages, exported |
| 119 | files, backups or uncontrolled copies. [Retention custody](https://github.com/stacksjs/drone/blob/main/docs/public-safety-retention.md) provides explicit enrollment and hold review, | |
| 120 | without granting deletion authority. [Accepted local purge](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) separately | |
| 119 | files, backups or uncontrolled copies. [Retention custody](public-safety-retention.md) provides explicit enrollment and hold review, | |
| 120 | without granting deletion authority. [Accepted local purge](public-safety-purge.md) separately | |
| 121 | 121 | controls active DB payload and registered files; uncontrolled copies remain excluded. The |
| 122 | [incident handover module](https://github.com/stacksjs/drone/blob/main/docs/public-safety-handover.md) binds recipient acknowledgement to a | |
| 122 | [incident handover module](public-safety-handover.md) binds recipient acknowledgement to a | |
| 123 | 123 | selected-source briefing and its original uncertainty. Sector/team assignments, an authorized |
| 124 | 124 | operator workspace and live observations remain in issue #23, |
| 125 | 125 | alongside hardware, jurisdiction/operator, interoperability and field qualification. |
| @@ -98,12 +98,12 @@ advance the incident version without creating a retention event. | ||
| 98 | 98 | |
| 99 | 99 | ## Separate purge acceptance |
| 100 | 100 | |
| 101 | [Managed source datasets](https://github.com/stacksjs/drone/blob/main/docs/public-safety-managed.md) add explicitly requested private copies and | |
| 101 | [Managed source datasets](public-safety-managed.md) add explicitly requested private copies and | |
| 102 | 102 | read-only reconciliation. They do not reinterpret enrollment or a hold as purge acceptance. |
| 103 | 103 | |
| 104 | 104 | Retained custody projections keep their original `purgeImplemented: false` and |
| 105 | 105 | `contentDeletionPerformed: false` flags. They describe the existing enrollment contract. |
| 106 | Use the separate [accepted local purge API](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) for deletion progress and receipts. | |
| 106 | Use the separate [accepted local purge API](public-safety-purge.md) for deletion progress and receipts. | |
| 107 | 107 | Its `local-managed-purge-v1` policy requires a fresh explicit inventory-bound acceptance and |
| 108 | 108 | operator opt-in. No automatic sweep is registered. |
| 109 | 109 | |
| @@ -4,8 +4,8 @@ Open `/incidents` to connect an existing native personal credential and incident | ||
| 4 | 4 | key. This read and command tracer combines existing incident, source, observation, |
| 5 | 5 | review and coordination interfaces in one authorized screen. It does not yet |
| 6 | 6 | start a simulator or display a live vehicle feed. See |
| 7 | [ADR25](https://github.com/stacksjs/drone/blob/main/docs/adr/0025-authorized-incident-workspace.md) for the accepted design and | |
| 8 | [incident access](https://github.com/stacksjs/drone/blob/main/docs/public-safety-access.md) for account provisioning. | |
| 7 | [ADR25](adr/0025-authorized-incident-workspace.md) for the accepted design and | |
| 8 | [incident access](public-safety-access.md) for account provisioning. | |
| 9 | 9 | |
| 10 | 10 | ## Identity and current access |
| 11 | 11 | |
| @@ -91,8 +91,8 @@ cannot be recalled. A fresh SQL decision is not a distributed revocation fence. | ||
| 91 | 91 | Source selection remains explicit. Observation and review forms use the |
| 92 | 92 | displayed source and current incident version. Handover uses the independent |
| 93 | 93 | offer digest, assignment and briefing cutoff, with explicit acknowledgement of |
| 94 | the displayed uncertainty. See [record commands](https://github.com/stacksjs/drone/blob/main/docs/public-safety-records.md) and | |
| 95 | [coordination handover](https://github.com/stacksjs/drone/blob/main/docs/public-safety-handover.md) for authoritative schemas. | |
| 94 | the displayed uncertainty. See [record commands](public-safety-records.md) and | |
| 95 | [coordination handover](public-safety-handover.md) for authoritative schemas. | |
| 96 | 96 | |
| 97 | 97 | An identity or scope change clears old source selections, cursors, |
| 98 | 98 | acknowledgements, drafts and pending retries. Old asynchronous completions cannot |
| @@ -1,6 +1,6 @@ | ||
| 1 | 1 | # Owned public-safety collection |
| 2 | 2 | |
| 3 | Issue [#23](https://github.com/stacksjs/drone/issues/23) requires coordinated search, fire and disaster observation, incident annotations, operator review, team handover, enforced access/privacy/retention and runtime handling of communications, incident boundaries and resources. The collection and runtime foundation connects to authenticated source, observation, review and managed retention APIs. Separately accepted local purge is disabled by default. Recipient-confirmed incident coordination handover and the [authorized read and command workspace](https://github.com/stacksjs/drone/blob/main/docs/public-safety-workspace.md) connect persisted records to [live synthetic execution and deliberate source admission](https://github.com/stacksjs/drone/blob/main/docs/public-safety-execution.md). Sector/team assignments and operational qualification remain required work. | |
| 3 | Issue [#23](https://github.com/stacksjs/drone/issues/23) requires coordinated search, fire and disaster observation, incident annotations, operator review, team handover, enforced access/privacy/retention and runtime handling of communications, incident boundaries and resources. The collection and runtime foundation connects to authenticated source, observation, review and managed retention APIs. Separately accepted local purge is disabled by default. Recipient-confirmed incident coordination handover and the [authorized read and command workspace](public-safety-workspace.md) connect persisted records to [live synthetic execution and deliberate source admission](public-safety-execution.md). Sector/team assignments and operational qualification remain required work. | |
| 4 | 4 | |
| 5 | 5 | The four explicit observation purposes are search and rescue, fire observation, disaster assessment and lawful police observation. There is no identity recognition, automatic person pursuit, detention or enforcement action. Purpose authority and retention are explicit declarations, not established legal authority. All fixtures are synthetic and physical outputs remain inhibited. |
| 6 | 6 | |
| @@ -43,7 +43,7 @@ Replay re-executes the pinned `owned-public-safety-collection-v1` deterministic | ||
| 43 | 43 | |
| 44 | 44 | - Extend native authenticated incident membership/roles to managed exports and future team event paths. Declared offline actor strings are insufficient. |
| 45 | 45 | - Extend explicit enrollment and hold review to managed files, redacted views and removal of controlled evidence copies. Current API access denies expiry and revocation; offline files do not enforce deletion. |
| 46 | - [Recipient-confirmed incident coordination](https://github.com/stacksjs/drone/blob/main/docs/public-safety-handover.md) binds assignment, source and expiry to atomic acceptance and audit. Sector/team assignments remain later work. Incident responsibility and vehicle control remain separate. | |
| 46 | - [Recipient-confirmed incident coordination](public-safety-handover.md) binds assignment, source and expiry to atomic acceptance and audit. Sector/team assignments remain later work. Incident responsibility and vehicle control remain separate. | |
| 47 | 47 | - Qualify shared team collection and partial searched/unsearched support beyond the current single-owner synthetic execution. |
| 48 | 48 | - Measured visible/thermal calibration, timing/heading/georeferencing, communications, legal/jurisdiction/operator qualification, real team operations, external firmware integration and bench/HIL/vehicle campaigns. |
| 49 | 49 | |
| @@ -51,16 +51,16 @@ All three issue acceptance requirements remain open until their complete softwar | ||
| 51 | 51 | |
| 52 | 52 | ## Authenticated coordination |
| 53 | 53 | |
| 54 | The persisted [incident access API](https://github.com/stacksjs/drone/blob/main/docs/public-safety-access.md) uses native Stacks accounts, tokens, | |
| 54 | The persisted [incident access API](public-safety-access.md) uses native Stacks accounts, tokens, | |
| 55 | 55 | permissions, Gates and generated models for scoped incident membership, closure and paginated |
| 56 | audit. The [source and review module](https://github.com/stacksjs/drone/blob/main/docs/public-safety-records.md) retains complete verified collection | |
| 56 | audit. The [source and review module](public-safety-records.md) retains complete verified collection | |
| 57 | 57 | sources, explicit supported-pixel observations and append-only reviewer declarations under the same |
| 58 | native access rules. [Retention custody](https://github.com/stacksjs/drone/blob/main/docs/public-safety-retention.md) adds explicit inventory-bound | |
| 58 | native access rules. [Retention custody](public-safety-retention.md) adds explicit inventory-bound | |
| 59 | 59 | enrollment, minimal expired custody status and append-only hold decisions. Collection artifacts keep |
| 60 | 60 | their separate unsigned simulator evidence boundary. |
| 61 | [Accepted local purge](https://github.com/stacksjs/drone/blob/main/docs/public-safety-purge.md) removes only explicitly accepted active DB payload | |
| 61 | [Accepted local purge](public-safety-purge.md) removes only explicitly accepted active DB payload | |
| 62 | 62 | and registered private namespace entries, with a minimized custody receipt. It excludes offline |
| 63 | 63 | copies, historical diagnostics, backups and media residuals. The incident handover tracer |
| 64 | preserves source-bound uncertainty. The [authorized workspace](https://github.com/stacksjs/drone/blob/main/docs/public-safety-workspace.md) | |
| 64 | preserves source-bound uncertainty. The [authorized workspace](public-safety-workspace.md) | |
| 65 | 65 | combines persisted records, human commands and live synthetic execution. |
| 66 | 66 | Sector/team responsibility and full operational qualification remain in issue #23. |
| @@ -0,0 +1,12 @@ | ||
| 1 | <svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg"> | |
| 2 | <!-- Stacks app icon: the S mark in off-white on the brand's cobalt-to-navy plate. --> | |
| 3 | <defs> | |
| 4 | <linearGradient id="stacks-plate" x1="200" y1="0" x2="200" y2="400" gradientUnits="userSpaceOnUse"> | |
| 5 | <stop stop-color="#0A47B0"/> | |
| 6 | <stop offset="1" stop-color="#00296B"/> | |
| 7 | </linearGradient> | |
| 8 | </defs> | |
| 9 | <rect width="400" height="400" rx="88" fill="url(#stacks-plate)"/> | |
| 10 | <path d="M279.057 114.88L314.118 79.96C320.024 74.0775 315.852 64 307.532 64H204.085C204.085 64 148.635 64 112.145 107.943C110.903 109.443 109.684 110.943 108.419 112.396C106.896 114.177 104.271 117.388 101.247 121.887C80.3893 152.823 76.5224 192.008 89.4591 226.998C95.3182 242.794 104.763 261.614 119.223 274.175L135.605 257.559C146.034 246.989 148.143 231.029 141.44 217.788C137.222 209.445 133.918 198.031 134.457 183.079C134.996 168.127 139.87 153.104 149.385 141.316C159.463 128.824 176.712 116.356 205.421 116.684L279.057 114.927V114.88Z" fill="#F4F5F7"/> | |
| 11 | <path d="M120.606 273.12L85.5453 308.039C79.6394 313.922 83.8112 324 92.131 324H195.578C195.578 324 251.028 324 287.518 280.057C288.76 278.557 289.979 277.057 291.244 275.604C292.768 273.823 295.393 270.612 298.416 266.112C319.274 235.177 323.141 195.991 310.204 161.001C304.345 145.205 294.901 126.386 280.44 113.824L264.059 130.44C253.63 141.01 251.52 156.97 258.223 170.212C262.442 178.555 265.746 189.968 265.207 204.921C264.668 219.873 259.793 234.895 250.278 246.684C240.201 259.175 222.951 271.643 194.242 271.315L120.606 273.073V273.12Z" fill="#F4F5F7"/> | |
| 12 | </svg> | |
| @@ -13,7 +13,7 @@ Keep propellers removed during bench integration. This release receives physical | ||
| 13 | 13 | to `.env` and run `./buddy key:generate`. Run `bun run simulate` before connecting a flight controller. |
| 14 | 14 | 4. Validate the camera independently with Raspberry Pi's [AI Camera guide](https://www.raspberrypi.com/documentation/accessories/ai-camera.html) |
| 15 | 15 | or [camera software guide](https://www.raspberrypi.com/documentation/computers/camera_software.html). |
| 16 | `rpicam-hello --list-cameras` lists detected cameras. The [camera pipeline](https://github.com/stacksjs/drone/blob/main/docs/camera-tracking.md) now consumes IMX500 frames/detections; its on-device validation remains pending. | |
| 16 | `rpicam-hello --list-cameras` lists detected cameras. The [camera pipeline](camera-tracking.md) now consumes IMX500 frames/detections; its on-device validation remains pending. | |
| 17 | 17 | 5. Install the supported ArduCopter firmware for Pixhawk 6C using an appropriate ground station. |
| 18 | 18 | Connect the autopilot to the Pi over USB using the exact connector on your board, then identify its |
| 19 | 19 | stable `/dev/serial/by-id/...` device. Grant the service account the OS's serial-device permissions. |
| @@ -37,7 +37,7 @@ companion application and simulator, not a native board autopilot. | ||
| 37 | 37 | - Calibrated selected-point localization with explicit depth/pose association, GNSS pairing, |
| 38 | 38 | conservative fusion and owned sensor-to-control physics. Measured calibration, depth adapters, |
| 39 | 39 | surveyed heading and hardware campaigns remain in [#17](https://github.com/stacksjs/drone/issues/17). |
| 40 | - An [executable behavior audit](https://github.com/stacksjs/drone/blob/main/docs/parity.md) with source-backed cases, evidence selectors and upstream refresh. | |
| 40 | - An [executable behavior audit](../parity.md) with source-backed cases, evidence selectors and upstream refresh. | |
| 41 | 41 | Unclassified dimensions and unsupported cases remain explicit in [#28](https://github.com/stacksjs/drone/issues/28). |
| 42 | 42 | |
| 43 | 43 | - Shared v2 vehicle missions on the raw sensor/estimator/authority runtime, with typed actuator leases, |
| @@ -57,10 +57,10 @@ companion application and simulator, not a native board autopilot. | ||
| 57 | 57 | |
| 58 | 58 | Public-safety collection now connects native incident roles, source-bound observations and reviews, |
| 59 | 59 | recipient-confirmed handover and an authorized read/command workspace with |
| 60 | [live synthetic execution and deliberate source admission](https://github.com/stacksjs/drone/blob/main/docs/public-safety-execution.md). | |
| 60 | [live synthetic execution and deliberate source admission](../public-safety-execution.md). | |
| 61 | 61 | Separately accepted local purge remains disabled by default. Sector/team |
| 62 | 62 | responsibility and operational/hardware qualification remain in |
| 63 | [#23](https://github.com/stacksjs/drone/issues/23). See [workspace semantics](https://github.com/stacksjs/drone/blob/main/docs/public-safety-workspace.md). | |
| 63 | [#23](https://github.com/stacksjs/drone/issues/23). See [workspace semantics](../public-safety-workspace.md). | |
| 64 | 64 | |
| 65 | 65 | Crop scouting now collects acknowledged numeric red/NIR and visible frames through the owned |
| 66 | 66 | survey runtime. Panel/irradiance calibration, an independently checked numerical model, field/parcel |
| @@ -72,7 +72,7 @@ Prescribed inert-water and inert-granule application now runs on the owned groun | ||
| 72 | 72 | separate implement leases, quantized delivery instruments, exclusions, fault latches and independent |
| 73 | 73 | shutdown probes. Exact finite-kernel dose/coverage/overlap reports and source replay are implemented. |
| 74 | 74 | Physical calibration, distribution, dose/drift, local requirements and HIL remain in |
| 75 | [#22](https://github.com/stacksjs/drone/issues/22). See [application evidence](https://github.com/stacksjs/drone/blob/main/docs/application.md). | |
| 75 | [#22](https://github.com/stacksjs/drone/issues/22). See [application evidence](../application.md). | |
| 76 | 76 | |
| 77 | 77 | Asset-relative bridge inspection now uses the owned mission/control loop, measured modeled range |
| 78 | 78 | registration, visible/synthetic thermal pixels, explicit operator reviews and repeat-visit geometry. |
| @@ -142,7 +142,7 @@ The inventory pins PX4 `ddcaad6601be20453ec6acd0f08e567af3a7e1bb` and ArduPilot | ||
| 142 | 142 | not a claim to track every future upstream change. Run `bun run roadmap:check` to catch unmapped |
| 143 | 143 | entries, dangling issue links and dependency cycles in the retained snapshot. |
| 144 | 144 | |
| 145 | See [the feature matrix](https://github.com/stacksjs/drone/blob/main/docs/roadmap/feature-coverage.md), [driver contract](https://github.com/stacksjs/drone/blob/main/docs/drivers.md), and | |
| 146 | [the architecture decision](https://github.com/stacksjs/drone/blob/main/docs/adr/0001-owned-autonomy.md). External stack feature availability | |
| 145 | See [the feature matrix](feature-coverage.md), [driver contract](../drivers.md), and | |
| 146 | [the architecture decision](../adr/0001-owned-autonomy.md). External stack feature availability | |
| 147 | 147 | varies by vehicle, firmware version, hardware and configuration. Their existence in an upstream |
| 148 | 148 | module does not mean this project's adapter exposes it. |
| @@ -28,11 +28,11 @@ means there is no native implementation yet. A protocol-compatible transport is | ||
| 28 | 28 | | Crop scouting, multispectral calibration and livestock monitoring | Owned raw red/NIR scouting, panel/irradiance model, clipped numeric sampling layer, parcel reports and source-bound explicit animal declarations; measured hardware/field/agronomy and richer interchange pending | Not exposed | [#21](https://github.com/stacksjs/drone/issues/21) | |
| 29 | 29 | | Spraying, spreading, prescription maps and implement interlocks | Owned inert-material physics, separate implement leases, quantized meters, exact coverage and shutdown audit | Physical calibration, delivery, field dose/drift, local requirements and HIL remain open | [#22](https://github.com/stacksjs/drone/issues/22) | |
| 30 | 30 | | SAR, fire/disaster support and authorized police observation | Owned collection/runtime, authenticated incident roles, source-bound annotations/review, private datasets, recipient-confirmed handover, authorized workspace with live synthetic execution and deliberate source admission, and separately accepted default-disabled local purge | Sector/team responsibility and full physical/operational qualification remain open | [#23](https://github.com/stacksjs/drone/issues/23) | |
| 31 | | Perimeter patrol, scheduling, docks and charging | Partial: retained simulation, selected-pad contact, explicit partial charging, observed isolation, finite native recurrence, bounded input/summary replay and owner-only authenticated review/consumption metadata | `patrol:simulate`, `patrol:replay` with fresh consent and [four explicit review endpoints](https://github.com/stacksjs/drone/blob/main/docs/patrol-review.md); production scheduling, runtime handoff/recovery, weather and physical docking remain open | [#24](https://github.com/stacksjs/drone/issues/24) | | |
| 32 | | Cargo, long-range/BVLOS cases and redundant links | Partial: owned carried-point-mass/CG physics, prescribed split and native link-loss characterization; delivery mission, release ACK, custody, energy margin and redundant links remain open | Native `cargo:load-bench` [simulation evidence and limits](https://github.com/stacksjs/drone/blob/main/docs/cargo-load.md); no physical or BVLOS qualification | [#25](https://github.com/stacksjs/drone/issues/25) | | |
| 33 | | Gimbal/camera control, smooth paths and broadcast timecode | Partial: owned hover POI angular reframe, lagged/quantized gimbal, exposure-bound modeled stills and latched target/camera/authority faults; translational paths, physical integration, lens/video and handoff remain open | Native `cinema:simulate` [simulation semantics and limits](https://github.com/stacksjs/drone/blob/main/docs/cinema.md); no physical/broadcast timing qualification | [#26](https://github.com/stacksjs/drone/issues/26) | | |
| 34 | | Environment, wildlife, anti-poaching observation and atmospheric samples | Partial: owned two-height synthetic cell sampling, calibration/geotags, conditional uncertainty, collection-policy faults and unsigned five-file provenance/export; physical samples, wildlife/authority and actual geofence qualification remain open | Native `environment:simulate` [semantics and limits](https://github.com/stacksjs/drone/blob/main/docs/environment.md); human review required | [#27](https://github.com/stacksjs/drone/issues/27) | | |
| 35 | | Deep feature audit, refresh and conformance gates | Pinned directory accounting and sampled behavior audit: 79 cases, including ten gimbal/mount and ten camera-feedback/capture gaps; deeper review and implementation remain open | [Audit integrity and source provenance](https://github.com/stacksjs/drone/blob/main/docs/parity.md); 26 bounded claims, no general parity claim | [#28](https://github.com/stacksjs/drone/issues/28) | | |
| 31 | | Perimeter patrol, scheduling, docks and charging | Partial: retained simulation, selected-pad contact, explicit partial charging, observed isolation, finite native recurrence, bounded input/summary replay and owner-only authenticated review/consumption metadata | `patrol:simulate`, `patrol:replay` with fresh consent and [four explicit review endpoints](../patrol-review.md); production scheduling, runtime handoff/recovery, weather and physical docking remain open | [#24](https://github.com/stacksjs/drone/issues/24) | | |
| 32 | | Cargo, long-range/BVLOS cases and redundant links | Partial: owned carried-point-mass/CG physics, prescribed split and native link-loss characterization; delivery mission, release ACK, custody, energy margin and redundant links remain open | Native `cargo:load-bench` [simulation evidence and limits](../cargo-load.md); no physical or BVLOS qualification | [#25](https://github.com/stacksjs/drone/issues/25) | | |
| 33 | | Gimbal/camera control, smooth paths and broadcast timecode | Partial: owned hover POI angular reframe, lagged/quantized gimbal, exposure-bound modeled stills and latched target/camera/authority faults; translational paths, physical integration, lens/video and handoff remain open | Native `cinema:simulate` [simulation semantics and limits](../cinema.md); no physical/broadcast timing qualification | [#26](https://github.com/stacksjs/drone/issues/26) | | |
| 34 | | Environment, wildlife, anti-poaching observation and atmospheric samples | Partial: owned two-height synthetic cell sampling, calibration/geotags, conditional uncertainty, collection-policy faults and unsigned five-file provenance/export; physical samples, wildlife/authority and actual geofence qualification remain open | Native `environment:simulate` [semantics and limits](../environment.md); human review required | [#27](https://github.com/stacksjs/drone/issues/27) | | |
| 35 | | Deep feature audit, refresh and conformance gates | Pinned directory accounting and sampled behavior audit: 79 cases, including ten gimbal/mount and ten camera-feedback/capture gaps; deeper review and implementation remain open | [Audit integrity and source provenance](../parity.md); 26 bounded claims, no general parity claim | [#28](https://github.com/stacksjs/drone/issues/28) | | |
| 36 | 36 | |
| 37 | 37 | ## Auditable source baseline |
| 38 | 38 | |
| @@ -48,5 +48,5 @@ Primary sources: [PX4 modules](https://github.com/PX4/PX4-Autopilot/tree/ddcaad6 | ||
| 48 | 48 | [PX4 vehicle overview](https://github.com/PX4/PX4-Autopilot), |
| 49 | 49 | [ArduPilot vehicle/documentation overview](https://ardupilot.org/ardupilot/). |
| 50 | 50 | |
| 51 | Behavior-level coverage is tracked by the [executable parity audit](https://github.com/stacksjs/drone/blob/main/docs/parity.md). Its structural | |
| 51 | Behavior-level coverage is tracked by the [executable parity audit](../parity.md). Its structural | |
| 52 | 52 | gate passes only audit integrity; it reports full parity and source review as incomplete. |
| @@ -83,6 +83,6 @@ characters>`, each newline-terminated and bounded by a 160-byte input buffer. Ea | ||
| 83 | 83 | This channel is not a firmware transport or public network service. The Stacks harness serializes |
| 84 | 84 | requests, bounds response lines, times out unresponsive processes and closes them after each run. |
| 85 | 85 | |
| 86 | The optional [DS sensor stream](https://github.com/stacksjs/drone/blob/main/docs/sensors.md) shares UART TX as complete 128-byte frames. | |
| 86 | The optional [DS sensor stream](sensors.md) shares UART TX as complete 128-byte frames. | |
| 87 | 87 | DR remains 64 bytes. Awaited DR replies take priority when the current frame finishes; partial |
| 88 | 88 | frames are never overwritten. UART state has a 64-byte RX buffer and a 128-byte TX buffer. |
| @@ -12,7 +12,7 @@ sensor-to-neutral-output bench target, with no arming, PWM, flight modes or actu | ||
| 12 | 12 | - `app/Commands/Runtime*.ts`: native `defineCommand()` commands, automatically discovered by Buddy. |
| 13 | 13 | - `bin/drone.ts`: the same Stacks command definitions in a standalone CLI. No separate argument parser. |
| 14 | 14 | |
| 15 | The [language and board decision](https://github.com/stacksjs/drone/blob/main/docs/adr/0002-bench-runtime.md) records the firmware exception. | |
| 15 | The [language and board decision](adr/0002-bench-runtime.md) records the firmware exception. | |
| 16 | 16 | The Pico 2 is an additional development board, not the existing Pi 5 and not yet an approved |
| 17 | 17 | flight controller. Existing ArduPilot and PX4 drivers continue independently. This bench protocol |
| 18 | 18 | cannot be adapted into flight `Telemetry` from a synthetic scalar; flight integration needs real |
| @@ -137,7 +137,7 @@ The watchdog is refreshed only after a healthy completed tick. Deadline/clock fa | ||
| 137 | 137 | reset and stop watchdog feeding. Invalid frames revoke diagnostic authority but keep sampling neutral. |
| 138 | 138 | |
| 139 | 139 | Boot/session identity, freshness, version mismatch, sequence exhaustion, lease expiry and invalid |
| 140 | capabilities are described in the [protocol specification](https://github.com/stacksjs/drone/blob/main/docs/runtime-protocol.md). There is no crypto | |
| 140 | capabilities are described in the [protocol specification](runtime-protocol.md). There is no crypto | |
| 141 | 141 | authentication: local UART is a trusted bench boundary. Network transport and physical flight authority |
| 142 | 142 | remain separate work. A diagnostic lease never changes GP15 from neutral. |
| 143 | 143 | |
| @@ -149,9 +149,9 @@ remain separate work. A diagnostic lease never changes GP15 from neutral. | ||
| 149 | 149 | - Board boot, UART capture, deadline timing, stack high-water and watchdog reset: **not measured**. |
| 150 | 150 | Issue #2 remains open for those acceptance gates. No physical flight capability is claimed. |
| 151 | 151 | |
| 152 | The [validation record](https://github.com/stacksjs/drone/blob/main/docs/validation.md) tracks the complete release checks, and the | |
| 152 | The [validation record](validation.md) tracks the complete release checks, and the | |
| 153 | 153 | [historical runtime build evidence snapshot](https://github.com/stacksjs/drone/blob/main/docs/runtime-evidence.json) records artifact hashes and static footprint. Add real bench captures, |
| 154 | 154 | logic-analyser measurements, exact board revision and stack/watchdog results before closing #2. |
| 155 | 155 | |
| 156 | The optional [sensor bench profile](https://github.com/stacksjs/drone/blob/main/docs/sensors.md) adds bounded IMU, barometer and GNSS acquisition. | |
| 156 | The optional [sensor bench profile](sensors.md) adds bounded IMU, barometer and GNSS acquisition. | |
| 157 | 157 | Its larger footprint must be checked separately from the historical synthetic-only snapshot. |
| @@ -27,7 +27,7 @@ serialization at 115200 baud; this is not hardware latency evidence. | ||
| 27 | 27 | |
| 28 | 28 | ## Pico 2 acquisition profile |
| 29 | 29 | |
| 30 | Keep the [runtime toolchain setup](https://github.com/stacksjs/drone/blob/main/docs/runtime.md) and disabled-load wiring. Build a separate image: | |
| 30 | Keep the [runtime toolchain setup](runtime.md) and disabled-load wiring. Build a separate image: | |
| 31 | 31 | |
| 32 | 32 | ```sh |
| 33 | 33 | ./buddy runtime:build --target pico2 --sensors --sdk /path/to/pico-sdk --toolchain /path/to/arm-gnu-toolchain |
| @@ -18,7 +18,7 @@ | ||
| 18 | 18 | Desktop and phone layouts were visually inspected against the existing operator workspace design. |
| 19 | 19 | - Evidence is owned physics simulation. Physical mission execution, hardware payload dispatch, |
| 20 | 20 | whole-runtime durable restart, terrain following and external driver compilation remain open in |
| 21 | [#10](https://github.com/stacksjs/drone/issues/10). See [the mission guide](https://github.com/stacksjs/drone/blob/main/docs/missions.md). | |
| 21 | [#10](https://github.com/stacksjs/drone/issues/10). See [the mission guide](missions.md). | |
| 22 | 22 | |
| 23 | 23 | ## External-driver protocol software slice |
| 24 | 24 | |
| @@ -65,7 +65,7 @@ | ||
| 65 | 65 | - Physical kill/RC/disarm, board supervisor port, measured HIL failures and recovery controllers |
| 66 | 66 | remain open in [#6](https://github.com/stacksjs/drone/issues/6). Zero modeled thrust is not a |
| 67 | 67 | landing controller. Parachute, rally/emergency landing and redundant links are explicitly deferred |
| 68 | in [the authority contract](https://github.com/stacksjs/drone/blob/main/docs/authority.md). Physical outputs remain inhibited. | |
| 68 | in [the authority contract](authority.md). Physical outputs remain inhibited. | |
| 69 | 69 | |
| 70 | 70 | ## Simulated multirotor control slice |
| 71 | 71 | |
| @@ -200,7 +200,7 @@ are not applicable. Newly authored visible copy uses no em-dash or separator en- | ||
| 200 | 200 | - Firmware flashing, sensor calibration, RC link, actuator outputs or physical airworthiness tests. |
| 201 | 201 | - Authenticated paired GNSS transport or calibrated metric visual-position fusion. |
| 202 | 202 | - Board-validated runtime, estimation/controls and the domain workflows listed in the |
| 203 | [replacement matrix](https://github.com/stacksjs/drone/blob/main/docs/roadmap/feature-coverage.md). They remain planned work. | |
| 203 | [replacement matrix](roadmap/feature-coverage.md). They remain planned work. | |
| 204 | 204 | |
| 205 | 205 | The scaffold warns that feature-stripped defaults differ from the installed full defaults. Build |
| 206 | 206 | output can warn about inherited unused image assets and an unset deployed sitemap domain. No cloud |
| @@ -114,4 +114,4 @@ leak, power, thermal, sensor timing, thruster and tether evidence; implement the | ||
| 114 | 114 | board target and tether protocol; demonstrate operator stop and watchdog expiry; |
| 115 | 115 | and validate recovery behavior in a controlled tank. Open-water hull, dam, |
| 116 | 116 | pipeline and aquaculture inspection remain acceptance work. See |
| 117 | [ADR 0015](https://github.com/stacksjs/drone/blob/main/docs/adr/0015-subsea-profile.md) for the software boundary. | |
| 117 | [ADR 0015](adr/0015-subsea-profile.md) for the software boundary. | |
| @@ -63,8 +63,8 @@ TypeScript controllers. Native board execution, external firmware SITL, HIL and | ||
| 63 | 63 | vehicle acceptance remain separate gates. VTOL, helicopter, soaring, blimp and other vehicle |
| 64 | 64 | families remain explicit roadmap work. |
| 65 | 65 | |
| 66 | Read [air](https://github.com/stacksjs/drone/blob/main/docs/vehicles-air.md), [ground](https://github.com/stacksjs/drone/blob/main/docs/vehicles-ground.md), [surface](https://github.com/stacksjs/drone/blob/main/docs/vehicles-surface.md), [subsea](https://github.com/stacksjs/drone/blob/main/docs/vehicles-subsea.md), | |
| 67 | [mission semantics](https://github.com/stacksjs/drone/blob/main/docs/missions.md) and [the replacement matrix](https://github.com/stacksjs/drone/blob/main/docs/roadmap/feature-coverage.md). | |
| 66 | Read [air](vehicles-air.md), [ground](vehicles-ground.md), [surface](vehicles-surface.md), [subsea](vehicles-subsea.md), | |
| 67 | [mission semantics](missions.md) and [the replacement matrix](roadmap/feature-coverage.md). | |
| 68 | 68 | |
| 69 | 69 | ## Subsea inspection records |
| 70 | 70 | |
| @@ -110,4 +110,4 @@ uncertainty with held-out trajectories. Complete on-Pi acquisition, restart/rese | ||
| 110 | 110 | authority campaigns. Neither this dataset nor a `declared-bench` import closes those gates. |
| 111 | 111 | |
| 112 | 112 | Issue #17 remains open for those campaigns, physical sensor adapters and broader appearance/privacy |
| 113 | evaluation if an appearance tracker is introduced. See [ADR 17](https://github.com/stacksjs/drone/blob/main/docs/adr/0017-calibrated-vision.md). | |
| 113 | evaluation if an appearance tracker is introduced. See [ADR 17](adr/0017-calibrated-vision.md). | |
| @@ -186,7 +186,7 @@ executed GDAL/PDAL interoperability campaign. No physical reference survey has b | ||
| 186 | 186 | |
| 187 | 187 | Issue [#19](https://github.com/stacksjs/drone/issues/19) remains open for measured independent survey |
| 188 | 188 | comparison, larger external datasets, numeric raster/point-cloud adapters, qualified meshing and |
| 189 | basal surfaces, acquisition calibration and full field acceptance. See [ADR 19](https://github.com/stacksjs/drone/blob/main/docs/adr/0019-known-surface-volumes.md). | |
| 189 | basal surfaces, acquisition calibration and full field acceptance. See [ADR 19](adr/0019-known-surface-volumes.md). | |
| 190 | 190 | |
| 191 | 191 | Format and policy references: [GDAL AAIGrid](https://gdal.org/en/stable/drivers/raster/aaigrid.html), |
| 192 | 192 | [indexed PLY](https://www.loc.gov/preservation/digital/formats/fdd/fdd000501.shtml), |