This report summarizes scanner evidence for pollen-robotics/microduck. SynthScan examined 195,349 lines of code across 391 source files, recording 1625 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 9.6 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 1365 finding(s).
Are imports declared and package/API names verified? 20 finding(s).
Are wrappers, guards, and repeated structures necessary? 246 finding(s).
Which changes need focused human review? 1625 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1625 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 1 | # Workspace root for the robot daemon. | COMMENT |
| LOW | Cargo.toml | 21 | default-members = ["btd", "configd", "duck-ble", "duck-ble", "duck-control", "duck-detect", "duck-ipc-proto", "kinematic | COMMENT |
| LOW | Cargo.toml | 41 | [workspace.metadata.rknpu] | COMMENT |
| LOW | Cargo.toml | 61 | # The duck detector, the same way: trained in pollen-robotics/duck_detector, published on the Hub, | COMMENT |
| LOW | btd/Cargo.toml | 21 | serde_json.workspace = true | COMMENT |
| LOW | btd/src/session.rs | 1 | //! One connected central, from `hello` to disconnect. | COMMENT |
| LOW | btd/src/route.rs | 1 | //! Which calls BLE may make, and which of a service's connections carries them. | COMMENT |
| LOW | btd/src/route.rs | 21 | use duck_ipc_proto as proto; | COMMENT |
| LOW | btd/src/route.rs | 81 | COMMENT | |
| LOW | btd/src/route.rs | 101 | // question an owner whose update failed actually has. Bigger than every other reply here | COMMENT |
| LOW | btd/src/route.rs | 121 | // | COMMENT |
| LOW | btd/src/route.rs | 141 | // The owner's switch for anonymous usage data. The phone is where an owner looks for a | COMMENT |
| LOW | btd/src/route.rs | 161 | // stronger flag be satisfied if it were set: the agent leaves every handler `None`, which | COMMENT |
| LOW | btd/src/route.rs | 181 | SystemServices => true, | COMMENT |
| LOW | btd/src/route.rs | 201 | COMMENT | |
| LOW | btd/src/route.rs | 221 | // ── refused ───────────────────────────────────────────────────────── | COMMENT |
| LOW | btd/src/route.rs | 241 | // `updaterd`'s private questions to `robotd` — may I restart the control loop, which | COMMENT |
| LOW | btd/src/route.rs | 261 | // robot up is the *first* of the two things the gamepad's Start button does; the second | COMMENT |
| LOW | btd/src/route.rs | 281 | // phone that can send this is in the room with the robot by construction. It is also the | COMMENT |
| LOW | btd/src/route.rs | 301 | // refusal either way, and the same reason to lift it — an app that can play the duck. | COMMENT |
| LOW | btd/src/route.rs | 321 | // Switching modes means the robot goes home, loads other policies and drives differently | COMMENT |
| LOW | btd/src/route.rs | 341 | // words with different durability depending on who asked — the ephemeral "try it until | COMMENT |
| LOW | btd/src/route.rs | 361 | // in the policy path that only a terminal on the robot could reach — `[[policy.skill]]` | COMMENT |
| LOW | btd/src/route.rs | 381 | RobotVetbook | RobotVetbookNote(_) => true, | COMMENT |
| LOW | btd/src/route.rs | 401 | // | COMMENT |
| LOW | btd/src/route.rs | 421 | // `remote-webrtc.md` §4 gives about BLE generally: it is PIN-bonded, and ten metres of | COMMENT |
| LOW | btd/src/route.rs | 441 | // Daemon-to-daemon: how `mediad` and `tofd` report to the book. Nothing a phone sends. | COMMENT |
| LOW | btd/src/route.rs | 461 | // latch and `init` argues with it rather than winning. A client that has those does not | COMMENT |
| LOW | btd/src/route.rs | 481 | // The hazard is real for the robot that *is* standing, and it is the one the app is | COMMENT |
| LOW | btd/src/route.rs | 501 | // `robot.stop` deserves its own line, because refusing it looks wrong. An emergency stop | COMMENT |
| LOW | btd/src/route.rs | 521 | // It is also not `btd`'s to forward: `padd` is deliberately not one of the sockets `btd` | COMMENT |
| LOW | btd/src/route.rs | 581 | #[cfg(test)] | COMMENT |
| LOW | btd/src/lib.rs | 1 | //! `btd` — the BLE front door onto the robot's API. | COMMENT |
| LOW | btd/src/lib.rs | 21 | //! | COMMENT |
| LOW | btd/src/link.rs | 1 | //! The seam between the radio and everything worth testing. | COMMENT |
| LOW | btd/src/link.rs | 21 | /// Sized so that a **maximal inbound line never has to block**, which is a correctness | COMMENT |
| LOW | btd/src/link.rs | 41 | pub outbound: mpsc::Sender<Vec<u8>>, | COMMENT |
| LOW | btd/src/pairing.rs | 1 | //! Who is allowed to talk to this robot over BLE. | COMMENT |
| LOW | btd/src/pairing.rs | 21 | //! Pairing is just-works (all agent handlers `None`, which BlueZ reads as `NoInputNoOutput`), so | COMMENT |
| LOW | btd/src/pairing.rs | 41 | //! | COMMENT |
| LOW | btd/src/pairing.rs | 61 | //! `updater-design.md` §5.7's per-device state. | COMMENT |
| LOW | btd/src/main.rs | 21 | /// `updaterd`'s socket. | COMMENT |
| LOW | btd/src/main.rs | 41 | /// pre-shipping development tooling and the usable one wins. The cost is real and unhedged: | COMMENT |
| LOW | btd/src/main.rs | 81 | /// reordered chunk does not fail — it reassembles into something that parses as the wrong thing. | COMMENT |
| LOW | btd/src/bluez.rs | 1 | //! The radio. BlueZ via `bluetoothd`'s D-Bus API, Linux only. | COMMENT |
| LOW | btd/src/bluez.rs | 21 | //! bytes into it. | COMMENT |
| LOW | btd/src/bluez.rs | 61 | /// **This is the only backpressure the callback model offers, and it has to exist.** | COMMENT |
| LOW | btd/src/bluez.rs | 81 | /// A `notify` that fails while the session is *not* stopped is a queue that is momentarily full, | COMMENT |
| LOW | btd/src/bluez.rs | 101 | /// identified the interval from the arrivals rather than from a guess. | COMMENT |
| LOW | btd/src/bluez.rs | 141 | /// so this is generous enough to survive a loaded board rather than tuned for a spinner. | COMMENT |
| LOW | btd/src/bluez.rs | 161 | /// `configd` would be the tidier answer and is a protocol change nobody needs yet. | COMMENT |
| LOW | btd/src/bluez.rs | 181 | /// would multiply the traffic to `configd` by five to buy nothing it answers. | COMMENT |
| LOW | btd/src/bluez.rs | 201 | /// Waiting for an adapter to *appear* was never enough. Everything after that wait — powering the | COMMENT |
| LOW | btd/src/bluez.rs | 261 | adapter.set_powered(true).await?; | COMMENT |
| LOW | btd/src/bluez.rs | 361 | // wrong: a client that vanishes mid-request leaves a partial line in the reassembler and | COMMENT |
| LOW | btd/src/bluez.rs | 421 | // acknowledgement per chunk. A client that wants a *refusal* to be visible | COMMENT |
| LOW | btd/src/bluez.rs | 561 | }, | COMMENT |
| LOW | btd/src/bluez.rs | 641 | ¤t, | COMMENT |
| LOW | btd/src/bluez.rs | 681 | retries = NOTIFY_RETRIES, | COMMENT |
| LOW | btd/src/bluez.rs | 721 | /// | COMMENT |
| 1289 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | btd/src/route.rs | 86 | // ── the update subset §4.1 names ──────────────────────────────────── | COMMENT |
| MEDIUM | btd/src/route.rs | 148 | // ── provisioning, which is what §4.1 puts BLE here for ────────────── | COMMENT |
| MEDIUM | btd/src/route.rs | 207 | // ── the gamepad ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | btd/src/route.rs | 221 | // ── refused ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | btd/src/route.rs | 417 | // ── the account, which BLE is the right transport for ──────────────── | COMMENT |
| MEDIUM | duck-control/src/model.rs | 157 | // ── battery ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/robotd.toml | 605 | # ── Controller-IMU head control ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/robotd.toml | 624 | # ── Pad walking speeds ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/robotd.toml | 642 | # ── Pad joystick axes ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/robotd.toml | 680 | # ── Pad over UDP ──────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/updater.toml | 84 | # ── daemon ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | deploy/updater.toml | 182 | # ── models ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | robotd/tests/updater_gate.rs | 25 | // ── locating and running the real robotd ───────────────────────────────────── | COMMENT |
| MEDIUM | robotd/tests/updater_gate.rs | 150 | // ── fixture ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | robotd/tests/updater_gate.rs | 247 | // ── the wire ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | robotd/tests/updater_gate.rs | 357 | // ── the M1 done-test ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | robotd/tests/updater_gate.rs | 437 | // ── version reporting over the wire ────────────────────────────────────────── | COMMENT |
| MEDIUM | robotd/src/main.rs | 8277 | // ── the policy channel ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 54 | # ── mood ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 94 | # ── badges ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 142 | # ── fun facts ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 196 | # ── personality and star sign ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 232 | # ── palette and season ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vetbook/traits.py | 256 | # ── a football card ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/shared/wire.py | 103 | # ── the surface `app.py` uses ──────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/shared/wire.py | 196 | # ── the wire ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/shared/wire.py | 344 | # ── checking the lane against the real rendezvous and a real duck ───────── | COMMENT |
| MEDIUM | spaces/policy-playground/web/src/main.ts | 111 | // ── talking to the duck ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/policy-playground/web/src/main.ts | 426 | // ── the page ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vision-demo/wire.py | 103 | # ── the surface `app.py` uses ──────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vision-demo/wire.py | 196 | # ── the wire ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | spaces/vision-demo/wire.py | 344 | # ── checking the lane against the real rendezvous and a real duck ───────── | COMMENT |
| MEDIUM | pad-imu/src/lib.rs | 308 | // ── quaternion arithmetic, w first ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/updater.example.toml | 101 | # ── daemon ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/updater.example.toml | 154 | # ── models ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/updater.example.toml | 206 | # ── local (dev / CI) ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/ipc.rs | 29 | // ── fixture ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/ipc.rs | 307 | // ── tests ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/ipc.rs | 689 | // ── scheduled checks (§8.1) ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/ipc.rs | 1006 | // ── peer credential enforcement ────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/ipc.rs | 1149 | // ── account.* ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 23 | // ── fixture ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 403 | // ── happy path ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 884 | // ── refusals: nothing changes ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 1081 | // ── rollback ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 1292 | // ── crash recovery ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 1495 | // ── explicit transitions ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 1634 | // ── bookkeeping ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 1796 | // ── regressions ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 2326 | // ── §16.2 Tier-1 gaps closed ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 2623 | // ── installing by ref (the dev channel, `docs/project/roadmap.md` M2) ──────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 2736 | // ── installing from a directory on the board (`apply --from`) ──────────────────────── | COMMENT |
| MEDIUM | updater/tests/apply.rs | 2910 | // ── the run transcript ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/tests/install.rs | 189 | // ── the bootstrap ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/policy.rs | 1103 | // ── the community library ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/ipc.rs | 582 | // ── read-only ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/ipc.rs | 618 | // ── mutating ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/ipc.rs | 707 | // ── account.* ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/ipc.rs | 726 | // ── telemetry.* ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | updater/src/ipc.rs | 743 | // ── os.* ──────────────────────────────────────────────────────────── | COMMENT |
| 160 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | spaces/shared/wire.py | 157 | except WireError: | CODE |
| HIGH | spaces/vision-demo/receiver.py | 295 | except WebSocketDisconnect: | CODE |
| HIGH | spaces/vision-demo/wire.py | 157 | except WireError: | CODE |
| HIGH | spaces/vision-demo/app.py | 97 | except Exception: # noqa: BLE001 - a logger that raises is worse than a line lost | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spaces/vetbook/cards.py | 9 | CODE | |
| LOW | spaces/vetbook/app.py | 22 | CODE | |
| LOW | spaces/vetbook/traits.py | 7 | CODE | |
| LOW | spaces/vetbook/gallery.py | 13 | CODE | |
| LOW | spaces/shared/rendezvous.py | 29 | CODE | |
| LOW | spaces/shared/control.py | 21 | CODE | |
| LOW | spaces/shared/control.py | 23 | CODE | |
| LOW | spaces/shared/wire.py | 38 | CODE | |
| LOW | spaces/vision-demo/rendezvous.py | 29 | CODE | |
| LOW | spaces/vision-demo/boot.py | 13 | CODE | |
| LOW | spaces/vision-demo/control.py | 21 | CODE | |
| LOW | spaces/vision-demo/control.py | 23 | CODE | |
| LOW | spaces/vision-demo/receiver.py | 27 | CODE | |
| LOW | spaces/vision-demo/wire.py | 38 | CODE | |
| LOW | spaces/vision-demo/app.py | 29 | CODE | |
| LOW | spaces/vision-demo/app.py | 39 | CODE | |
| LOW | spaces/vision-demo/filters.py | 10 | CODE | |
| LOW | pet-detect/training/train.py | 21 | CODE | |
| LOW | scripts/endurance-plot.py | 21 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spaces/vetbook/app.py | 273 | except Exception as e: # noqa: BLE001 — one odd book must not empty the gallery | CODE |
| LOW | spaces/vetbook/app.py | 294 | except Exception as e: # noqa: BLE001 — the visitor's request will try again | CODE |
| LOW | spaces/shared/wire.py | 282 | except Exception as e: # noqa: BLE001 - see below; a reader cannot pick its exception | CODE |
| LOW | spaces/vision-demo/boot.py | 24 | except Exception: # noqa: BLE001 - the whole point is that any failure becomes a page | CODE |
| LOW | spaces/vision-demo/receiver.py | 119 | except Exception as e: # noqa: BLE001 - a bad unit is not a bad stream | CODE |
| LOW | spaces/vision-demo/receiver.py | 297 | except Exception as e: # noqa: BLE001 - one bad socket is not a bad Space | CODE |
| LOW | spaces/vision-demo/wire.py | 282 | except Exception as e: # noqa: BLE001 - see below; a reader cannot pick its exception | CODE |
| LOW | spaces/vision-demo/app.py | 97 | except Exception: # noqa: BLE001 - a logger that raises is worse than a line lost | CODE |
| LOW | spaces/vision-demo/app.py | 181 | except Exception as e: # noqa: BLE001 - a teardown that fails still ends this side | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spaces/vetbook/test_traits.py | 20 | def test_moods_in_priority_order(): | CODE |
| LOW⚡ | spaces/vetbook/test_traits.py | 32 | def test_badges_rarest_first_and_records_count(): | CODE |
| LOW⚡ | spaces/vetbook/test_traits.py | 39 | def test_facts_say_something_true(): | CODE |
| LOW⚡ | spaces/vetbook/test_traits.py | 45 | def test_star_sign_and_season(): | CODE |
| LOW⚡ | spaces/vetbook/test_traits.py | 53 | def test_a_book_with_nothing_in_it_still_makes_a_card(): | CODE |
| LOW⚡ | spaces/vetbook/test_traits.py | 58 | def test_only_a_listed_book_is_in_the_gallery(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spaces/shared/rendezvous.py | 88 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/shared/control.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/shared/wire.py | 51 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/vision-demo/rendezvous.py | 88 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/vision-demo/control.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/vision-demo/receiver.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | spaces/vision-demo/wire.py | 51 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/provision.sh | 19 | # This orchestrates `setup-board.sh`, `migrate-network.sh` and `install.sh`; it does not | COMMENT |
| MEDIUM | .github/workflows/_promote-release.yml | 11 | # bytes, which quietly made a tag named like scaffolding load-bearing for the customer channel — and | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/provision.sh | 436 | # Create the log before systemd does, so it exists with a mode chosen here rather than | COMMENT |
| MEDIUM | .github/workflows/release.yml | 3 | # Create a release in the web interface and this decides what that means, from the tag and from what | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | spaces/vetbook/app.py | 123 | await page.evaluate("document.fonts.ready.then(() => window.fit && window.fit())") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | spaces/shared/wire.py | 259 | CODE | |
| LOW | spaces/vision-demo/receiver.py | 230 | CODE | |
| LOW | spaces/vision-demo/receiver.py | 247 | CODE | |
| LOW | spaces/vision-demo/wire.py | 259 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/systemd-test.sh | 86 | # copied in. One at a time, and the harness controls when. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/publish-space.sh | 10 | # Usage: | COMMENT |