docs(ecosystem): ground-truth sibling integrations + launcher carve-out#178
Merged
Merged
Conversation
…ble/panll) + launcher carve-out
Resolves the repo-audit rows that read as unexplained gaps by recording, with
per-repo source evidence, how NeuroPhone actually relates to four siblings and
the estate desktop launcher standard. None of the four is buildable today —
three are not-applicable/precedent-only by nature, and the one substantive
integration (burble) is blocked on burble's own unfinished Phase 0 — so this is
an honest status record, not fabricated wiring.
- docs/governance/SIBLING-INTEGRATIONS.adoc (new): authoritative disposition
per sibling, ground-truthed 2026-07-09:
* groove — NOT-APPLICABLE: service-discovery protocol for HTTP services;
neurophone runs no server, offers no capability, has no Rust SDK.
* cleave — NOT-APPLICABLE: pre-alpha design corpus, zero code, no overlap.
* burble — BLOCKED: every consumed artifact (NearbyPresence.idr,
nearby-presence.a2ml, Android emitter) is still design-only in
burble; ADR-0010 is Proposed.
* panll — PRECEDENT-ONLY: Tauri->Gossamer migration precedent; no runtime
data flow.
* launcher — CARVE-OUT: the standard assumes runtime.kind="server-url"
(localhost port, start command, pid-file, .desktop integration),
which does not map onto an Android APK.
- .machine_readable/6a2/ECOSYSTEM.a2ml: enriched the near-empty file with
[related-projects], [integration-status] and [carve-outs] (launcher-standard),
recording the owner's carve-out decision machine-readably.
- docs/BT-PRESENCE-PLAN.adoc: added the ground-truthed upstream-BLOCKED status
and fixed two real defects — the codegen path (6a2/ -> descriptiles/; 6a2 is
neurophone's namespace, not burble's) and the stale Kotlin scanner plan (must
follow the gossamer migration #83, not reintroduce banned Kotlin).
- .github/workflows/dogfood-gate.yml: groove-check no longer treats a bare
TcpListener as a server signal (a test-only #[cfg(test)] loopback fake tripped
it), keying on production HTTP-server framework markers instead. Same fix made
at source in rsr-template-repo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh
|
hyperpolymath
marked this pull request as ready for review
July 9, 2026 21:42
11 tasks
hyperpolymath
added a commit
that referenced
this pull request
Jul 9, 2026
…visory (#179) ## Summary #178 merged with two checks red; both are now red on `main`. This follow-up greens them. Neither is a regression in application code — one is a cross-repo-awareness gap in a scanner heuristic, the other a newly-published upstream advisory. ## Changes - **`docs/governance/SIBLING-INTEGRATIONS.adoc`** — the new governance doc from #178 tripped two `structural_drift/SD022` findings (`doc references src/Burble/`, `doc references src/core/`). Hypatia's rename-drift heuristic has no cross-repo awareness, so it flags any `src/<dir>/` it cannot resolve locally — even a path the doc explicitly attributes to a sibling repo. Rather than add two more acknowledged false-positives to `.hypatia-baseline.json`, the two sibling artefacts are now cited by **module/file name** (`Burble.ABI.NearbyPresence` Idris2 module; panll's `EventChain.res` parser) instead of by `src/<dir>/` path. Accurate, and the SD022 trigger disappears — so the gate stays maximally strict with **no new suppressions**. - **`Cargo.lock`** — bump `crossbeam-epoch` 0.9.18 → 0.9.20 for **RUSTSEC-2026-0204** (published 2026-07-06: invalid pointer dereference in the `fmt::Pointer` impl for `Atomic`/`Shared`). It is a transitive dependency, so the advisory turned `rust-ci / Cargo audit` red on every branch without any local code change. Surgical `cargo update -p crossbeam-epoch --precise 0.9.20`; only the version + checksum move (the crate's own `crossbeam-utils` dep is unchanged). ## RSR Quality Checklist ### Required - [x] Tests pass — no application code changed; lockfile patch bump + doc wording - [x] Code is formatted (`cargo fmt --check`) — verified clean - [x] Linter clean — no Rust source changed - [x] No banned language patterns - [x] No `unsafe` without `// SAFETY:` — n/a - [x] No proof escape hatches — n/a - [x] SPDX headers present — files pre-existing/headered - [x] No secrets included ### As Applicable - [ ] `.machine_readable/6a2/*` — not needed - [x] Documentation updated (governance doc wording) - [x] New dependencies reviewed — patch bump of an existing transitive dep, same licence ## Testing - `cargo update -p crossbeam-epoch --precise 0.9.20` resolved the full graph (incl. the `conative-gating` git dep) and moved only that crate → `crossbeam-epoch v0.9.18 -> v0.9.20`. - `cargo fmt --check` → exit 0. - SD022 reproduction: the Hypatia baseline job reported exactly these two `medium` SD022 findings as `baseline_status: "new"` on `docs/governance/SIBLING-INTEGRATIONS.adoc`; the reword removes every `src/<dir>/` dir-form (only the real local file `crates/claude-client/src/lib.rs` remains, which does not match the heuristic). - Full `cargo build`/`cargo audit` are verified in CI (local build is gated on the external `conative-gating` egress). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh --- _Generated by [Claude Code](https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
12 tasks
hyperpolymath
added a commit
that referenced
this pull request
Jul 10, 2026
…eacon (#180) ## Summary burble **froze its BLE nearby-presence wire format v1** on 2026-07-09 (PR #154, ADR-0015) — explicitly "to unblock neurophone." That resolved the exact upstream blocker recorded in #178. This PR lands the neurophone-side **Phase-2 consumer** the BT-PRESENCE plan called for: a pure-Rust, host-testable decode + contact-resolution + presence-decay core, **proven byte-exact against burble's frozen conformance vectors**. Read-only on the wire — no microphone, no outbound advertising. End-to-end runtime still awaits burble's Phase-1 *emitter* (its Android client, not yet shipped), but that does not block neurophone's build: the consumer is built, tested, and pinned to the frozen v1 format, ready to receive. ## Changes **New crate `crates/bt-presence/`:** - `vendor/` — byte-exact vendored copies of burble's FROZEN `nearby-presence.a2ml` + `ble-spa-v1.json`, provenance pinned to burble commit `2b5914b` + sha256 (`vendor/PROVENANCE.adoc`). Vendored, not fetched → reproducible, offline-buildable. - `build.rs` — code-generates the wire constants from the vendored spec (single source of truth, no hand-copied protocol numbers) and **fails the build loudly** if the vendored spec is not a frozen `wire-version 1` (honours burble's freeze covenant). - `src/decode.rs` — 24-byte frame decode; `epoch = unix/900`; contact resolution by reproducing `HMAC-SHA256(secret, "BRBL-PRES-v1" ‖ magic ‖ ver_type ‖ epoch)[0..18]` with a **constant-time compare** and a ±1 epoch freshness window (mirrors burble's `resolve_presence/3`). - `src/decay.rs` — RSSI-reinforced exponential-decay presence score (`0.0..=1.0`). - `tests/vectors.rs` — replays burble's frozen vectors; `presence_beacon_id_is_byte_exact` asserts the beacon id matches burble's independent HMAC oracle byte-for-byte. **Wiring:** - `crates/sensors` — new `SensorKind::Presence` (arity 1) so the decoded score flows through the existing `SensorPipeline` into the LSM, sensor-class like light/proximity. - `Cargo.toml`/`Cargo.lock` — add `bt-presence` member; new deps `hmac`, `sha2` (MIT/Apache-2.0), `subtle` (constant-time), `toml` (build-time spec parse). **Docs corrected** (yesterday's #178 recorded burble as BLOCKED; it froze hours later): - `SIBLING-INTEGRATIONS.adoc` burble row: BLOCKED → **CONSUMER IMPLEMENTED**; EXISTS-vs-PLANNED table flipped. - `BT-PRESENCE-PLAN.adoc`, `ECOSYSTEM.a2ml`, `STATE.a2ml` updated to match (only burble Phase-1 emitter pending). ## RSR Quality Checklist ### Required - [x] Tests pass (`cargo test`) — `bt-presence` 11 unit + 3 conformance green; full workspace builds - [x] Code is formatted (`cargo fmt --check`) — clean - [x] Linter is clean (`cargo clippy --all-targets -- -D warnings`) — clean - [x] No banned language patterns (pure Rust; the stale `.kt` sketch in the plan is explicitly redirected to gossamer/JNI) - [x] No `unsafe` blocks — `#[forbid(unsafe_code)]`; `deny(unwrap/expect)` in non-test code - [x] No proof escape hatches - [x] SPDX license headers present on all new files (MPL-2.0 code; CC-BY-SA-4.0 docs) - [x] No secrets — the only keys are burble's published *non-production* test-vector secrets ### As Applicable - [x] `.machine_readable/6a2/STATE.a2ml` updated (new crate, test count, blockers) - [x] `.machine_readable/6a2/ECOSYSTEM.a2ml` updated (burble status) - [x] Documentation updated (`BT-PRESENCE-PLAN.adoc`, `SIBLING-INTEGRATIONS.adoc`) - [x] New dependencies reviewed for license compatibility (MPL-2.0) — hmac/sha2/subtle/toml are MIT/Apache-2.0 ## Testing ``` cargo test -p bt-presence # 11 unit (decode/decay) + 3 conformance vectors — all pass cargo clippy -p bt-presence -p sensors --all-targets -- -D warnings # clean cargo fmt --check # clean cargo build --workspace # all crates incl. neurophone-android — Finished ``` The key correctness claim — **wire-compatibility** — is `presence_beacon_id_is_byte_exact`: this crate's Rust HMAC-SHA256 reproduces every `beacon_id` in burble's frozen `ble-spa-v1.json` (independently generated) exactly, and resolves each vector to its named contact while rejecting a stranger's secret. ## FLAGS / owner-manual residuals - **burble Phase-1 (emitter) is still pending** — no `client/android/` in burble; ADR-0015 is `Status: Proposed`. Nothing on the air to receive until burble ships it; this PR is deliberately the consumer side only. - **Device-side scan glue** (turning raw BLE manufacturer-data into the 24 bytes this crate decodes) belongs on the **gossamer** Android surface (#83), not Kotlin — noted in the plan, not implemented here. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh --- _Generated by [Claude Code](https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh)_ --------- Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Summary
Resolves the repo-audit rows that read as unexplained gaps by recording, with per-repo source evidence, how NeuroPhone actually relates to four sibling repositories (
groove,cleave,burble,panll) and the estate desktop launcher standard. Each disposition was ground-truthed on 2026-07-09 against the sibling repo's own source, not against design docs or memory.The honest conclusion of the integration audit is that none of the four is buildable today — three are not-applicable/precedent-only by nature, and the one substantive integration (
burble) is blocked onburblecompleting its own unfinished Phase 0. So this PR is an honest status record, not fabricated wiring.Changes
docs/governance/SIBLING-INTEGRATIONS.adoc(new) — authoritative disposition per sibling:groove— NOT-APPLICABLE: runtime service-discovery protocol for HTTP services that offer capabilities; NeuroPhone runs no server, offers none, and has no Rust SDK to call.cleave— NOT-APPLICABLE: pre-alpha design corpus (zero implementation, 0/7 proofs), no ABI/schema/SDK, no domain overlap.burble— BLOCKED (upstream Phase 0): every consumed artifact (NearbyPresence.idr,nearby-presence.a2ml, the Android emitter, the server bridge) is still design-only inburble; ADR-0010 isProposed. EXISTS-vs-PLANNED table included.panll— PRECEDENT-ONLY: Tauri→Gossamer migration precedent; no runtime data flow (panll's live ingest path is panll↔panic-attack, not neurophone).runtime.kind = "server-url"(localhost port, start command, pid-file,.desktop/Start-Menu integration), which does not map onto an Android APK..machine_readable/6a2/ECOSYSTEM.a2ml— enriched the near-empty file (previously justproject+position) with[related-projects],[integration-status], and[carve-outs], recording the owner's launcher carve-out decision machine-readably.docs/BT-PRESENCE-PLAN.adoc— added the ground-truthed upstream-BLOCKED status and fixed two real defects: the codegen path (6a2/→descriptiles/;6a2/is NeuroPhone's namespace, not burble's) and the stale Kotlin scanner plan (must follow the gossamer migration build: migrate Kotlin/Gradle Android app to gossamer (clears banned-language CI) #83, not reintroduce banned Kotlin)..github/workflows/dogfood-gate.yml—groove-checkno longer treats a bareTcpListeneras a server signal (a test-only#[cfg(test)]loopback fake tripped it, producing a spurious non-blocking groove warning); it now keys on production HTTP-server framework markers. The same fix was made at source inrsr-template-repo(companion PR).RSR Quality Checklist
Required
just test/cargo test) — no Rust touched; docs/CI/manifest onlyjust fmt/cargo fmt --check) — no Rust touchedcargo clippy --all-targets -- -D warnings) — no Rust touchedunsafeblocks without// SAFETY:comments — n/a.adoccarriesCC-BY-SA-4.0).envfiles includedAs Applicable
.machine_readable/6a2/ECOSYSTEM.a2mlupdated (integrations changed).machine_readable/6a2/STATE.a2mlupdated — not needed (no project-state change)proofs/README.adoc— n/aTesting
python3 -c "import yaml; yaml.safe_load(...)"→dogfood-gate.yml: YAML OKpython3 -c "import tomllib; tomllib.load(...)"→ECOSYSTEM.a2ml: TOML OK(a2ml is TOML-shaped; validated by the estatea2ml-validateaction in CI)asciidoctornot present in the environment; the two.adocfiles use only standard blocks/tables already in this repo's docs.223a020, cleavea3f17fa, burble0926a15, panll5c19002).FLAGS / owner-manual residuals
burblePhase 2 remains blocked upstream. NeuroPhone cannot create codegen or a vendored schema untilburbleauthors and freezes the BLE advertisement wire format (manifest + Idris2 ABI + Android emitter, all currently absent; ADR-0010Proposed). Recorded, not worked around.conative-gating(Adopt conative-gating as policy/egress GO/NO-GO veto (refs proof-obligation #84-3.1) #103) andgossamer(build: migrate Kotlin/Gradle Android app to gossamer (clears banned-language CI) #83) integration status is recorded inECOSYSTEM.a2mlas blocked-external / in-progress respectively — unchanged by this PR.🤖 Generated with Claude Code
https://claude.ai/code/session_0172RBMz3qYjb1ttzD2i7RNh
Generated by Claude Code