Skip to content

Commit 5445298

Browse files
docs(ecosystem): ground-truth sibling integrations + launcher carve-out (#178)
## 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 on `burble` completing 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 in `burble`; ADR-0010 is `Proposed`. 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). - launcher — **CARVE-OUT**: the standard assumes `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 just `project` + `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 #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, producing a spurious non-blocking groove warning); it now keys on production HTTP-server framework markers. The same fix was made at source in `rsr-template-repo` (companion PR). ## RSR Quality Checklist ### Required - [x] Tests pass (`just test` / `cargo test`) — no Rust touched; docs/CI/manifest only - [x] Code is formatted (`just fmt` / `cargo fmt --check`) — no Rust touched - [x] Linter is clean (`cargo clippy --all-targets -- -D warnings`) — no Rust touched - [x] No banned language patterns (no TypeScript, no npm/bun, no Go/Python) - [x] No `unsafe` blocks without `// SAFETY:` comments — n/a - [x] No proof escape hatches — n/a - [x] SPDX license headers present on all new/modified source files (new `.adoc` carries `CC-BY-SA-4.0`) - [x] No secrets, credentials, or `.env` files included ### As Applicable - [x] `.machine_readable/6a2/ECOSYSTEM.a2ml` updated (integrations changed) - [x] Documentation updated for user-facing changes - [ ] `.machine_readable/6a2/STATE.a2ml` updated — not needed (no project-state change) - [ ] `proofs/README.adoc` — n/a - [ ] JNI surface changes — n/a ## Testing - `python3 -c "import yaml; yaml.safe_load(...)"` → `dogfood-gate.yml: YAML OK` - `python3 -c "import tomllib; tomllib.load(...)"` → `ECOSYSTEM.a2ml: TOML OK` (a2ml is TOML-shaped; validated by the estate `a2ml-validate` action in CI) - AsciiDoc: `asciidoctor` not present in the environment; the two `.adoc` files use only standard blocks/tables already in this repo's docs. - Integration dispositions verified at source across the four cloned sibling repos (groove `223a020`, cleave `a3f17fa`, burble `0926a15`, panll `5c19002`). ## FLAGS / owner-manual residuals - **`burble` Phase 2 remains blocked upstream.** NeuroPhone cannot create codegen or a vendored schema until `burble` authors and freezes the BLE advertisement wire format (manifest + Idris2 ABI + Android emitter, all currently absent; ADR-0010 `Proposed`). Recorded, not worked around. - **`conative-gating` (#103) and `gossamer` (#83)** integration status is recorded in `ECOSYSTEM.a2ml` as blocked-external / in-progress respectively — unchanged by this PR. 🤖 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>
1 parent 86a07a1 commit 5445298

4 files changed

Lines changed: 303 additions & 4 deletions

File tree

.github/workflows/dogfood-gate.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,15 @@ jobs:
211211
HAS_GROOVE_CODE="true"
212212
fi
213213
214-
# Check if this repo likely serves HTTP (has server/listener code)
214+
# Check if this repo likely serves HTTP in production. Key on
215+
# production HTTP-server framework markers only. A bare `TcpListener`
216+
# is deliberately NOT a signal: it is dominated by test/utility use
217+
# (e.g. a #[cfg(test)] loopback fake), so matching it produced a
218+
# spurious groove nudge on client-only apps. A real hand-rolled Rust
219+
# server still pairs the listener with `axum::serve`/`hyper::Server`,
220+
# which are matched here.
215221
HAS_SERVER="false"
216-
if grep -rl 'TcpListener\|Bandit\|Plug.Cowboy\|httpz\|vweb\|axum::serve\|actix_web' --include='*.rs' --include='*.ex' --include='*.zig' --include='*.v' . 2>/dev/null | head -1 | grep -q .; then
222+
if grep -rl 'Bandit\|Plug.Cowboy\|httpz\|vweb\|axum::serve\|actix_web\|hyper::Server\|rocket::build\|warp::serve' --include='*.rs' --include='*.ex' --include='*.zig' --include='*.v' . 2>/dev/null | head -1 | grep -q .; then
217223
HAS_SERVER="true"
218224
fi
219225
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,42 @@
11
# SPDX-License-Identifier: MPL-2.0
22
# ECOSYSTEM.a2ml — Ecosystem position
33
# Converted from ECOSYSTEM.scm on 2026-03-15
4+
# Enriched 2026-07-09: sibling-integration status + launcher carve-out,
5+
# ground-truthed against cloned sibling repos. Full evidence in
6+
# docs/governance/SIBLING-INTEGRATIONS.adoc.
47

58
[metadata]
69
project = "neurophone"
710
ecosystem = "hyperpolymath"
11+
version = "1.0.0"
12+
last-updated = "2026-07-09"
813

914
[position]
1015
type = "component"
16+
role = "on-device Android neurosymbolic-AI app (sensor -> LSM -> ESN -> bridge -> LLM)"
17+
18+
[related-projects]
19+
# relationship in { dependency, dependent, sibling-standard, precedent,
20+
# potential-consumer, not-applicable }. `status` is the ground-truthed
21+
# integration state as of [metadata].last-updated.
22+
projects = [
23+
{ name = "gossamer", relationship = "dependency", status = "in-progress", note = "Android WebView/JNI runtime shell; Kotlin->Rust migration (#83). The Android surface targets gossamer, not Kotlin." },
24+
{ name = "conative-gating", relationship = "dependency", status = "blocked-external", note = "GO/NO-GO egress veto in front of claude-client (#103); upstream Rust client not yet reachable in-session." },
25+
{ name = "burble", relationship = "potential-consumer", status = "blocked-upstream", note = "BLE nearby-presence sensor, read-only consumer. Blocked on burble Phase 0 - wire manifest + Idris2 ABI + Android emitter do not yet exist; ADR-0010 Proposed. See docs/BT-PRESENCE-PLAN.adoc." },
26+
{ name = "panll", relationship = "precedent", status = "precedent-only", note = "Migration precedent (Tauri->Gossamer). No runtime data flow; panll's live ingest path is panll<->panic-attack event-chains, not neurophone." },
27+
{ name = "groove", relationship = "not-applicable", status = "not-applicable", note = "Runtime service-discovery protocol for HTTP services offering capabilities. neurophone runs no server and offers none." },
28+
{ name = "cleave", relationship = "not-applicable", status = "not-applicable", note = "Pre-alpha design corpus; zero implementation, no ABI/schema/SDK, no domain overlap." },
29+
{ name = "panic-attack", relationship = "dependency", status = "wired", note = "Static-analysis scanner run over neurophone's own source (Justfile, audits/)." },
30+
{ name = "verisimdb", relationship = "potential-consumer", status = "design", note = "Scan-result hexad persistence (estate Records); not wired from neurophone." },
31+
]
32+
33+
[integration-status]
34+
# Durable record of the sibling-integration audit. Full evidence and
35+
# EXISTS-vs-PLANNED tables in the governance doc below.
36+
reference = "docs/governance/SIBLING-INTEGRATIONS.adoc"
37+
ground-truthed = "2026-07-09"
38+
39+
[carve-outs]
40+
# Estate standards from which neurophone is a documented, justified exception.
41+
# Authority + full rationale in docs/governance/SIBLING-INTEGRATIONS.adoc.
42+
launcher-standard = { status = "carve-out", authority = "owner decision 2026-07-09", reason = "neurophone is an on-device Android app, not a desktop/server launcher target. The estate launcher standard assumes runtime.kind = 'server-url' (a localhost-bound process with a start command, pid-file, URL polling, and XDG .desktop / Start-Menu integration). None of that maps onto an APK, whose launch surface is the platform LAUNCHER intent in AndroidManifest.", ref = "docs/governance/SIBLING-INTEGRATIONS.adoc" }

docs/BT-PRESENCE-PLAN.adoc

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,43 @@
1212
cross-repo Bluetooth integration. This document covers only the neurophone side.
1313
====
1414

15+
[IMPORTANT]
16+
====
17+
*Upstream status — BLOCKED (ground-truthed 2026-07-09 against burble @ `0926a15`).*
18+
19+
NeuroPhone's Phase-2 work cannot begin: every burble-side artifact this plan
20+
consumes is still design-only in burble, and burble has not completed its own
21+
Phase 0.
22+
23+
* `Burble.ABI.NearbyPresence` (Idris2 wire type) — *absent* from burble's ABI
24+
directory and from its `burble-abi.ipkg` module list; it appears only as a
25+
planned "NEW" line in burble's `ANDROID-CLIENT.adoc`.
26+
* `nearby-presence.a2ml` (wire format) — *does not exist* in burble, at any path.
27+
* burble's Android client (which must emit the advertisement) — *does not exist*
28+
(`client/android/` is absent; burble's doc says "Design only — no code yet").
29+
* burble `docs/decisions/0010-presence-discovery-and-trust-zones.adoc` is
30+
`Status: Proposed` (2026-07-08) and states "Nothing here is built yet"; there
31+
is no defined advertisement UUID or byte layout — only a prose knock-packet
32+
sketch, explicitly *not* a continuous advertisement.
33+
34+
No NeuroPhone codegen or vendored schema can be created against a format that has
35+
never been authored. This plan resumes when burble authors and freezes the
36+
advertisement format. Full audit: link:governance/SIBLING-INTEGRATIONS.adoc[SIBLING-INTEGRATIONS.adoc].
37+
38+
*Path correction.* Earlier revisions of this doc pointed the codegen at
39+
`burble/.machine_readable/6a2/nearby-presence.a2ml`. That was wrong: `6a2/` is
40+
*NeuroPhone's* machine-readable namespace, not burble's. burble's planned
41+
location is `.machine_readable/descriptiles/nearby-presence.a2ml`. The citations
42+
below have been corrected.
43+
44+
*Toolchain correction.* The Kotlin scanner files in the file-by-file plan below
45+
(`*.kt`) predate the gossamer Android migration (#83) and NeuroPhone's current
46+
language policy, which bans Kotlin/Java for mobile. When burble unblocks, the
47+
Android-side scanner must be expressed through the gossamer surface (Rust/JNI),
48+
not reintroduced as Kotlin. The `.kt` entries are retained only as a
49+
functional sketch of the scanner's responsibilities.
50+
====
51+
1552
== Scope
1653

1754
NeuroPhone gains a Bluetooth Low Energy *presence sensor* that feeds the existing
@@ -36,7 +73,7 @@ Burble owns the wire protocol and the voice client. NeuroPhone owns only the con
3673
|===
3774
| Lives in burble | Lives in neurophone
3875

39-
| `.machine_readable/6a2/nearby-presence.a2ml` (wire format)
76+
| `.machine_readable/descriptiles/nearby-presence.a2ml` (wire format) — _planned in burble; not yet authored_
4077
| `crates/bt-presence/` (scanner + decoder + decay)
4178

4279
| `src/Burble/ABI/NearbyPresence.idr` (Idris2 type)
@@ -51,6 +88,8 @@ Burble owns the wire protocol and the voice client. NeuroPhone owns only the con
5188

5289
The neurophone build pulls the a2ml manifest from burble at build time (via
5390
`crates/bt-presence/build.rs` codegen) — single source of truth, no protocol fork.
91+
_(Blocked: the manifest does not yet exist in burble — see the Upstream status
92+
note above.)_
5493

5594
== File-by-file plan
5695

@@ -118,7 +157,7 @@ NeuroPhone work begins at Phase 2 in the cross-repo plan:
118157
* link:../README.adoc[README.adoc] — privacy commitments to preserve.
119158
* link:../TOPOLOGY.adoc[TOPOLOGY.adoc] — existing sensor → LSM → ESN → bridge pipeline diagram.
120159
* `burble/docs/architecture/ANDROID-CLIENT.adoc` — authoritative cross-repo plan.
121-
* `burble/.machine_readable/6a2/nearby-presence.a2ml` — wire format that codegen reads.
160+
* `burble/.machine_readable/descriptiles/nearby-presence.a2ml` — wire format that codegen reads (planned in burble; not yet authored).
122161

123162
== Memory pointer
124163

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
// SPDX-License-Identifier: CC-BY-SA-4.0
2+
// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell (hyperpolymath)
3+
= NeuroPhone — Sibling-Integration Status
4+
:toc: preamble
5+
:toclevels: 3
6+
7+
[NOTE]
8+
====
9+
*Purpose.* This document is the authoritative, ground-truthed record of how
10+
NeuroPhone relates to four sibling repositories that a repo audit flagged as
11+
"not integrated" — `groove`, `cleave`, `burble`, `panll` — plus the estate
12+
*launcher standard* carve-out. It exists so those rows stop reading as
13+
unexplained compliance gaps: each is either genuinely *not applicable*,
14+
*precedent-only*, or *blocked on upstream work that does not yet exist*.
15+
16+
*Method.* Each disposition below was verified against the sibling repository's
17+
own source at the commit noted, not against design docs or memory. Where a
18+
NeuroPhone-side doc previously asserted an integration artifact, the assertion
19+
was checked against the upstream file it names. "EXISTS" means the artifact is
20+
present in the upstream tree today; "PLANNED" means it appears only in an
21+
upstream design doc.
22+
23+
*Ground-truthed:* 2026-07-09.
24+
====
25+
26+
== Summary
27+
28+
[cols="1,2,3",options="header"]
29+
|===
30+
| Sibling | Classification | One-line disposition
31+
32+
| `groove`
33+
| NOT-APPLICABLE
34+
| Runtime service-discovery protocol for HTTP services that offer capabilities. NeuroPhone runs no server and offers none.
35+
36+
| `cleave`
37+
| NOT-APPLICABLE
38+
| Pre-alpha design corpus — zero implementation, no ABI/schema/SDK, no domain overlap.
39+
40+
| `burble`
41+
| BLOCKED (upstream Phase 0)
42+
| Real future integration (BLE nearby-presence sensor), but every burble-side artifact NeuroPhone would consume is still design-only.
43+
44+
| `panll`
45+
| PRECEDENT-ONLY
46+
| Migration precedent (Tauri→Gossamer). No runtime data flow; panll's live ingest path is panll↔panic-attack, not panll↔neurophone.
47+
48+
| launcher standard
49+
| CARVE-OUT
50+
| NeuroPhone is an Android app, not a desktop/server launcher target. The standard assumes a `server-url` runtime.
51+
|===
52+
53+
The honest conclusion of the integration audit is that *none of the four is
54+
buildable today*: three are not-applicable or precedent-only by nature, and the
55+
one genuinely-substantive integration (`burble`) is blocked on `burble`
56+
completing its own unfinished Phase 0. Creating integration code for any of them
57+
now would be fabrication, not wiring.
58+
59+
== groove — NOT-APPLICABLE
60+
61+
*What it is.* A runtime service-discovery + capability-negotiation protocol
62+
(working draft v0.2.0, grade C+). Every groove-aware system MUST expose
63+
`GET /.well-known/groove` returning a manifest that advertises the capabilities
64+
it `offers` and `consumes`; peers probe local ports and compose.
65+
66+
*Why NeuroPhone is out of scope.* NeuroPhone is a read-only, on-device Android
67+
app. It runs no HTTP server and offers no local capability to peer processes.
68+
The groove spec is explicit that this places it outside the protocol: a manifest
69+
with zero capabilities "SHOULD be flagged by tooling: a service that offers
70+
nothing has no reason to speak Groove" (groove `spec/SPEC.adoc` §2.1.1). There is
71+
also no Rust client SDK to call: `clients/` is JavaScript-only, and the
72+
`groove-core` Rust library the README references does not exist in the tree
73+
(removed per groove ADR 0001). Rust bindings are listed only as an aspiration.
74+
75+
*Disposition.* No groove manifest, no groove code. NeuroPhone's
76+
`.github/workflows/dogfood-gate.yml` `groove-check` job is *advisory* (emits a
77+
non-blocking `::warning::`, never fails) and only fires when a repo has server
78+
code but no manifest — which NeuroPhone does not.
79+
80+
[NOTE]
81+
====
82+
*Fixed defect (this change).* The `has_server` heuristic in `groove-check`
83+
grepped for a bare `TcpListener`, which matched NeuroPhone's *test-only* fake
84+
Claude server (`crates/claude-client/src/lib.rs`, inside a `#[cfg(test)]`
85+
module). That could surface a spurious — though non-blocking — groove warning in
86+
CI summaries. The detector now keys on production HTTP-server framework markers
87+
(`axum::serve`, `actix_web`, `hyper::Server`, `Bandit`, `Plug.Cowboy`, …), which
88+
a test loopback listener does not trip. The same fix was made at source in
89+
`rsr-template-repo`, the template this workflow is copied from.
90+
====
91+
92+
== cleave — NOT-APPLICABLE
93+
94+
*What it is.* A design corpus / draft specification for a proposed Rust
95+
"transmutable interface-engine" library. Its own status line: "Design corpus.
96+
ZERO lines of cleave-specific implementation exist. 0 of 7 proofs done"
97+
(cleave `README.adoc`).
98+
99+
*Why NeuroPhone is out of scope.* There is nothing to integrate against — no
100+
crate, no header, no ABI, no wire format, no schema, no client SDK. cleave
101+
explicitly delegates wire encoding to `weft` and protocol/manifest handshake to
102+
`groove`, so even its aspirational "unified protocol endpoint" does not live in
103+
the repo. A repo-wide search for NeuroPhone's domain terms (sensor, reservoir,
104+
LSM/ESN, bluetooth, presence, android, on-device LLM) returns no matches.
105+
106+
*Disposition.* No integration point exists or is planned. The only conceivable
107+
future tie is a conceptual analogy between cleave's (unbuilt) FFI-dial "kernel"
108+
and NeuroPhone's JNI/FFI boundary — an analogy, not an integration, and it
109+
cannot be specified until cleave writes its kernel.
110+
111+
== burble — BLOCKED (upstream Phase 0 incomplete)
112+
113+
*What it is.* A self-hostable voice-first communications platform. Relevant to
114+
NeuroPhone only via a planned Bluetooth Low Energy *nearby-presence* signal that
115+
NeuroPhone would consume read-only as one more sensor input (see
116+
`docs/BT-PRESENCE-PLAN.adoc`). NeuroPhone's work begins at the cross-repo plan's
117+
Phase 2 and depends on burble finishing Phases 0–1 first.
118+
119+
*Ground truth — every consumed artifact is still PLANNED, not present:*
120+
121+
[cols="2,3,1",options="header"]
122+
|===
123+
| Artifact NeuroPhone's plan names | Reality in `burble` @ `0926a15` | Status
124+
125+
| `src/Burble/ABI/NearbyPresence.idr` (Idris2 wire type)
126+
| Absent from the ABI dir and from the `burble-abi.ipkg` module list; appears only as a "NEW" line in `docs/architecture/ANDROID-CLIENT.adoc`
127+
| PLANNED
128+
129+
| `nearby-presence.a2ml` (wire format)
130+
| Does not exist. NeuroPhone's plan cited `.machine_readable/6a2/…` — but `6a2/` is *NeuroPhone's* namespace; burble uses `descriptiles/`, and the file is absent there too
131+
| PLANNED (+ wrong path)
132+
133+
| burble Android client emitting the advertisement (Phase-1 precondition)
134+
| No `client/android/` exists; `ANDROID-CLIENT.adoc`: "Design only — no code yet"
135+
| PLANNED
136+
137+
| `server/lib/burble/bridges/neurophone.ex`
138+
| No `bridges/` directory exists
139+
| PLANNED
140+
141+
| Defined advertisement UUID / byte layout
142+
| None defined anywhere; only a prose knock-packet sketch, explicitly *not* a continuous advertisement
143+
| UNDEFINED
144+
|===
145+
146+
The governing decision, burble `docs/decisions/0010-presence-discovery-and-trust-zones.adoc`,
147+
is `Status: Proposed` (dated 2026-07-08) and states "Nothing here is built yet."
148+
burble's own `PRODUCTION-BLOCKER-HANDOFF.adoc` flags the Android BLE design as
149+
internally contradictory and unbuilt.
150+
151+
*Disposition.* The honest NeuroPhone-side artifact today is a *blocked-on note*,
152+
not codegen and not a vendored schema — you cannot vendor or generate against a
153+
wire format that has never been authored. `docs/BT-PRESENCE-PLAN.adoc` has been
154+
annotated with this upstream status and two corrections (the `6a2/`→`descriptiles/`
155+
path error, and the now-superseded Kotlin scanner plan, which must follow the
156+
gossamer migration per #83 rather than reintroduce banned Kotlin). NeuroPhone
157+
resumes Phase 2 the moment burble authors and freezes the advertisement format.
158+
159+
== panll — PRECEDENT-ONLY
160+
161+
*What it is.* A cognitive-relief, multi-pane "Human-Things Interface" desktop
162+
panel host (ReScript/TEA front end; Rust + Gossamer back end). Event-chain
163+
viewing is *one* panel feature, not its identity.
164+
165+
*Why the relationship is precedent, not runtime.* The only relationship asserted
166+
in either repo's code or docs is a *migration precedent*: panll migrated
167+
`src-tauri/` → `src-gossamer/` (desktop only), and NeuroPhone's RFC cites that as
168+
the template for its own Kotlin→Rust Android migration
169+
(`docs/migrations/RFC-ANDROID-KOTLIN-TO-RUST.adoc`). No runtime data flow is
170+
claimed anywhere. panll's one *live* data-ingest path is panll↔`panic-attack`
171+
event-chain JSON (`src/core/EventChain.res`), and in NeuroPhone `panic-attack` is
172+
only ever run as a scanner over NeuroPhone's own source — NeuroPhone emits no
173+
event chains.
174+
175+
*Latent (design-only) options, none built.* panll offers three extension
176+
surfaces — a `DatabaseModule` ReScript protocol (internal, compile-time), a
177+
groove endpoint (fixed consumed-capability set), and a design-phase "transmutable
178+
panel" clade `.a2ml`. A future NeuroPhone↔panll link could ride any of them
179+
(e.g. NeuroPhone exporting `panic-attack`-shaped event-chain JSON that panll's
180+
Pane-W could load), but no NeuroPhone-side artifact for it exists today.
181+
182+
*Disposition.* Recorded as precedent-only. No action required unless a runtime
183+
integration is later commissioned.
184+
185+
== Launcher standard — CARVE-OUT
186+
187+
*The standard.* The estate launcher standard
188+
(`standards/launcher/launcher-standard.a2ml` + `docs/UX-standards/launcher-standard.adoc`)
189+
describes a *desktop/server* application launcher. Its load-bearing assumption is
190+
`[runtime].kind = "server-url"`: a long-running local process bound to a
191+
`localhost` port, started by a shell `command`, tracked by a `pid-file`, and
192+
polled until its `url` responds (`wait-for-url-timeout-seconds`) — after which it
193+
opens a browser. Its `--integ`/`--disinteg` modes install XDG `.desktop` files,
194+
Start-Menu/Applications entries, and desktop icons on Linux/macOS/Windows. The
195+
reference descriptor `burble.launcher.a2ml` is exactly this shape
196+
(`kind = "server-url"`, port 4020, `mix phx.server`, XDG desktop categories).
197+
198+
*Why NeuroPhone is a carve-out.* NeuroPhone is an on-device Android application
199+
(Rust workspace + JNI/Android surface). It has *no* server URL, no `localhost`
200+
port, no shell start `command`, no pid-file, and no desktop entry. An Android
201+
app's launch surface is the platform `LAUNCHER` intent declared in
202+
`AndroidManifest.xml` (`MainActivity` with `android.intent.action.MAIN` +
203+
`android.intent.category.LAUNCHER`) — provided by the OS, not by an estate
204+
launcher script. None of the `[runtime]` fields the standard requires can be
205+
populated for an APK.
206+
207+
*Scope of the standard.* The standard is provisioned by `launch-scaffolder` for
208+
repos that ship a desktop/server app, and its lock-step CI gate runs only inside
209+
`standards` itself — it does not scan consumer repos. So this carve-out is a
210+
documentation/audit disposition, not a suppressed CI failure.
211+
212+
*Disposition.* NeuroPhone is out of scope for the desktop/server launcher
213+
standard, by owner decision (2026-07-09). Recorded machine-readably in
214+
`.machine_readable/6a2/ECOSYSTEM.a2ml` `[carve-outs]`. If NeuroPhone ever ships a
215+
companion *desktop* control panel, that component — not the APK — would adopt the
216+
standard.
217+
218+
== See also
219+
220+
* link:../BT-PRESENCE-PLAN.adoc[BT-PRESENCE-PLAN.adoc] — the burble presence-sensor plan, now annotated with upstream status.
221+
* link:../migrations/RFC-ANDROID-KOTLIN-TO-RUST.adoc[RFC-ANDROID-KOTLIN-TO-RUST.adoc] — the panll migration precedent.
222+
* `../../.machine_readable/6a2/ECOSYSTEM.a2ml` — machine-readable related-projects + carve-outs.

0 commit comments

Comments
 (0)