Skip to content

Commit 8458f47

Browse files
TeoSlayerteovlclaude
authored
docs: update README — fix errors, add app store, messaging, consent, env vars
Factual fixes: - Remove "libpilot C FFI" claim (SDKs communicate over Unix socket IPC) - Remove stale test count assertion Missing feature coverage: - Add send-message / inbox as the primary agent messaging surface - Add App Store section with catalogue, install, call commands - Add Key environment variables reference table (PILOT_REGISTRY, PILOT_BEACON, etc.) Privacy & consent: - Replace narrow "Agent skill injection (transparency)" section with comprehensive "Privacy controls & consent" covering all four opt-out features: telemetry, broadcasts, reviews, skill injection - Each feature documents: what it does, who benefits, what you're accepting, who should opt out, and the exact commands - Includes daemon sandbox mode documentation Co-authored-by: Teodor Calin <teodor@vulturelabs.io> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 0a896ec commit 8458f47

1 file changed

Lines changed: 180 additions & 32 deletions

File tree

README.md

Lines changed: 180 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,20 @@ pilotctl ping agent-alpha # round-trip over the encrypted tunnel
9292
pilotctl bench agent-alpha # 1 MB echo benchmark
9393
```
9494

95-
Once you have a trusted peer of your own, you can send and receive messages on any port:
95+
Once you have a trusted peer, agent-to-agent messaging uses the data exchange service on port 1001:
96+
97+
```bash
98+
# Send a structured message (waits for reply by default)
99+
pilotctl send-message other-agent --data "hello"
100+
101+
# Read messages delivered to your inbox
102+
pilotctl inbox
103+
104+
# Read a specific message
105+
pilotctl inbox read <id>
106+
```
107+
108+
For lower-level raw port messaging:
96109

97110
```bash
98111
# on the sender
@@ -127,7 +140,7 @@ $ pilotctl --json find nonexistent
127140

128141
## Programmatic access (SDKs)
129142

130-
Once the daemon is running, you can interact with agents programmatically through the SDK instead of the CLI. All three SDKs wrap the same libpilot C FFI and expose the full agent surface — handshake, trust, send, receive, stream, and gateway — in the language of your choice.
143+
Once the daemon is running, you can interact with agents programmatically through the SDK instead of the CLI. All three SDKs communicate with the local Pilot daemon over its Unix socket IPC and expose the full agent surface — handshake, trust, send, receive, stream, and gateway — in the language of your choice.
131144

132145
| Language | Package | Quickstart |
133146
|----------|---------|------------|
@@ -296,45 +309,180 @@ curl -fsSL https://pilotprotocol.network/install.sh | PILOT_EMAIL=user@example.c
296309

297310
---
298311

312+
## App Store
313+
314+
Pilot includes a built-in app store for installing and calling local IPC apps:
315+
316+
```bash
317+
pilotctl appstore catalogue # browse available apps
318+
pilotctl appstore view io.pilot.cosift # inspect before installing
319+
pilotctl appstore install io.pilot.cosift # install an app
320+
pilotctl appstore list # list installed apps
321+
pilotctl appstore call io.pilot.cosift cosift.help '{}' # discover methods + latencies
322+
pilotctl appstore call io.pilot.cosift cosift.search '{"q":"raft consensus","k":"5"}'
323+
```
324+
325+
Apps are signed (ed25519), verified at install and at every spawn. The daemon brokers all inter-app calls — an app can only be reached through the methods it declares in its manifest. See the [App Store docs](https://pilotprotocol.network/docs/app-store) for building, signing, and publishing apps.
326+
327+
---
328+
299329
## Testing
300330

301331
```bash
302332
go test -parallel 4 -count=1 ./tests/
303333
```
304334

305-
1048 tests pass. The `-parallel 4` flag is required -- unlimited parallelism exhausts ports and causes dial timeouts.
335+
The `-parallel 4` flag is required — unlimited parallelism exhausts ports and causes dial timeouts.
336+
337+
---
338+
339+
## Privacy controls & consent
340+
341+
Four features ship **on by default**. Each one improves Pilot — for you, for developers, or for the network — but each carries a cost you should understand before accepting it. None of them affect core messaging, routing, or encryption.
342+
343+
Full documentation, risk profiles, and per-feature commands: **[pilotprotocol.network/docs/consent](https://pilotprotocol.network/docs/consent)**
344+
345+
---
346+
347+
### Telemetry — risk: low
348+
349+
**What it does.** When you browse or install apps, a signed event (app ID + action) is sent to `telemetry.pilotprotocol.network`.
350+
351+
**Who it helps.** App developers get signal on what's actually used; the catalogue surfaces quality apps over abandoned ones; you benefit from a curated store that improves based on real usage — not advertising.
352+
353+
**What you're accepting.** The telemetry server receives the app ID, action type, and a signature from your Ed25519 key (pseudonymous unless you registered with `-email`). Your IP is visible during the TLS connection. No message contents or conversation data is ever sent.
354+
355+
**To opt out:**
356+
```json
357+
{"consent": {"telemetry": false}}
358+
```
359+
Set in `~/.pilot/config.json`. The telemetry client becomes a hard no-op — no dial, no goroutine. Takes effect immediately for CLI commands.
360+
361+
**Who should opt out:** Users with strict no-telemetry policies, high-sensitivity deployments, or automated pipelines where any outbound telemetry is undesirable.
362+
363+
---
364+
365+
### Broadcasts — risk: medium
366+
367+
**What it does.** Network administrators can send a single authenticated datagram to every agent in a network simultaneously. Your daemon checks the admin token and forwards the payload to your agent.
368+
369+
**Who it helps.** Fleet operators coordinate all agents in one command — config refreshes, rolling restarts, incident response — without O(N) individual messages. The only O(1) coordination mechanism in a large peer mesh.
370+
371+
**What you're accepting.** Any party holding the network's admin token can deliver arbitrary data to your agent. The token's security is the bound: if it's leaked or held by someone you don't trust, an attacker can reach your agent.
372+
373+
**To opt out:**
374+
```json
375+
{"consent": {"broadcasts": false}}
376+
```
377+
Incoming datagrams are silently dropped before reaching your agent. Restart the daemon for the change to take effect.
378+
379+
**Who should opt out:** Solo users (no fleet, no admin — the feature offers you no benefit and you're accepting an attack surface for nothing). Users joining networks whose administrators they do not know or trust.
380+
381+
---
382+
383+
### Reviews — risk: low
384+
385+
**What it does.** After ~5% of `pilotctl send-message` calls, a prompt appears on stderr inviting a review. After ~5% of `pilotctl appstore call` invocations, the output is replaced by a review prompt for that app. The explicit `pilotctl review <subject>` command sends a review directly.
386+
387+
**Who it helps.** Community reviews surface quality signals before install. App developers get direct feedback. Review scores drive catalogue ranking — good apps get visibility, broken ones get deprioritized.
388+
389+
**What you're accepting.** Review text is entirely user-authored and opt-in. The main operational risk is the 5% intercept corrupting stdout in scripts.
390+
391+
```bash
392+
pilotctl review pilot --rating 5 --text "Works great"
393+
pilotctl review io.pilot.cosift --rating 4
394+
```
395+
396+
**To opt out:**
397+
```json
398+
{"consent": {"reviews": false}}
399+
```
400+
No prompts, no intercepts, no data sent. Takes effect immediately.
401+
402+
**Who should opt out:** Users running `pilotctl` in automation or pipelines where stdout must be clean. Users who don't want unsolicited prompts during normal operation.
403+
404+
---
405+
406+
### Skill injection — risk: medium
407+
408+
**What it does.** The daemon writes a `SKILL.md` and heartbeat directive into the config directories of supported agent toolchains (Claude Code `~/.claude/CLAUDE.md`, Cursor `.cursor/rules`, OpenHands, OpenClaw, Hermes), telling those agents to reach for Pilot tools before falling back to `web_search` or `curl`.
409+
410+
**Who it helps.** You get zero-config integration — agents automatically know Pilot is available for peer messaging, specialist queries, and app calls. The network gains more active agents on the mesh, enriching the ecosystem for everyone.
411+
412+
**What you're accepting.** The injector fetches content at runtime from [`TeoSlayer/pilot-skills`](https://github.com/TeoSlayer/pilot-skills) and writes it to your agent's config directory. If that repository is compromised, injected content could influence your agent's behavior. In `auto` mode, updates land every 15 minutes without your review. In `manual` mode (the default), updates only apply when you explicitly run `pilotctl update`.
413+
414+
**Three modes — choose your risk/convenience trade-off:**
415+
416+
| Mode | Behavior |
417+
|------|----------|
418+
| `manual` *(default on fresh install)* | Install once at daemon start. Update only when you run `pilotctl update`. |
419+
| `auto` | Reconcile every 15 minutes. Always current. |
420+
| `disabled` | No injection. No updates. Removes existing injected files immediately. |
421+
422+
```bash
423+
pilotctl skills status # show mode + managed file paths
424+
pilotctl skills set-mode manual # install once, update on your terms
425+
pilotctl skills set-mode auto # continuous 15-min updates
426+
pilotctl skills set-mode disabled # remove everything, stop all ticks
427+
pilotctl update # force-apply latest skills now (all modes)
428+
```
429+
430+
Mode is stored in `~/.pilot/config.json` under `skill_inject.mode`. Changes take effect immediately — no restart needed.
431+
432+
Everything injected is open source: [`pilot-protocol/skillinject`](https://github.com/pilot-protocol/skillinject) (the injector), [`TeoSlayer/pilot-skills`](https://github.com/TeoSlayer/pilot-skills) (the content).
433+
434+
**Who should opt out or use `manual`:** Users with strict agent config control requirements. Users in environments where any external write to config directories is a compliance issue.
435+
436+
---
437+
438+
### Daemon sandbox mode
439+
440+
The `pilotd` daemon accepts a `-sandbox` flag that confines all filesystem access to a single directory. This is not a privacy feature — it does not change what data is sent — but it limits the blast radius if the daemon is compromised.
441+
442+
```bash
443+
pilotd -sandbox # confine to ~/.pilot (default)
444+
pilotd -sandbox -sandbox-dir /opt/pilot # confine to a custom directory
445+
```
446+
447+
Any explicitly-passed path that resolves outside the sandbox directory causes a fatal error at startup, before the daemon reads or writes anything. Unset path flags are automatically redirected inside the sandbox directory.
448+
449+
---
450+
451+
### Disable everything at once
452+
453+
```json
454+
{
455+
"consent": {
456+
"telemetry": false,
457+
"broadcasts": false,
458+
"reviews": false
459+
},
460+
"skill_inject": {"mode": "disabled"}
461+
}
462+
```
463+
464+
Set in `~/.pilot/config.json` and restart the daemon. Core networking is unaffected.
306465

307466
---
308467

309-
## Agent skill injection (transparency)
310-
311-
The daemon runs an **open-source skill injector**
312-
([`pilot-protocol/skillinject`](https://github.com/pilot-protocol/skillinject),
313-
AGPL-3.0, registered in [`cmd/daemon/main.go`](cmd/daemon/main.go)). Every ~15
314-
minutes it keeps the core `SKILL.md` and a short "heartbeat" directive current
315-
in each detected agent tool's well-known directory (Claude Code, OpenClaw,
316-
PicoClaw, OpenHands, Hermes).
317-
318-
**Why it's on by default.** The host gives an agent default tools
319-
(`web_search`, `curl`). Pilot is a third party, and an agent only captures the
320-
overlay's value if it *reaches for Pilot first* instead of defaulting to those
321-
tools. Keeping that directive present is what makes "pilot first" the default —
322-
the same reason a person sets a third-party browser as their system default.
323-
It's a strong nudge, never a lock-in, and we hold it to a transparency bar
324-
that matches the privilege of writing into someone else's agent:
325-
326-
- **Everything injected is open source.** The injected text and skills live in
327-
[`TeoSlayer/pilot-skills`](https://github.com/TeoSlayer/pilot-skills); the
328-
injector that installs them is
329-
[`pilot-protocol/skillinject`](https://github.com/pilot-protocol/skillinject).
330-
Bytes are fetched at runtime from those public repos — nothing is embedded
331-
or hidden — and can be pinned to an Ed25519 signing key.
332-
- **Non-destructive.** It rewrites only its own marker block; operator-authored
333-
content in heartbeat files is never touched.
334-
- **Opt-out anytime.** `pilotctl skills disable all` removes everything it
335-
wrote and stops future ticks (state in `~/.pilot/config.json`); re-enable
336-
with `pilotctl skills enable all`. Inspect what it manages with
337-
`pilotctl skills status`.
468+
## Key environment variables
469+
470+
Most daemon flags have an environment variable equivalent. Useful for containerized deployments and CI.
471+
472+
| Variable | Flag equivalent | Purpose |
473+
|----------|----------------|---------|
474+
| `PILOT_REGISTRY` | `-registry` | Registry server address |
475+
| `PILOT_BEACON` | `-beacon` | Beacon server address |
476+
| `PILOT_SOCKET` | `-socket` | Unix socket path |
477+
| `PILOT_EMAIL` | `-email` | Account email |
478+
| `PILOT_HOSTNAME` | `-hostname` | Discovery hostname |
479+
| `PILOT_ADMIN_TOKEN` | `-admin-token` | Admin token for network operations |
480+
| `PILOT_MOTD_URL` | `-motd-feed-url` | Message-of-the-day feed URL |
481+
| `PILOT_TELEMETRY_URL` | `-telemetry-url` | Telemetry endpoint override |
482+
| `PILOT_SYN_WHITELIST` | `-syn-whitelist` | Nodes exempt from SYN rate limit |
483+
| `PILOT_REPLY_WHITELIST` | `-reply-whitelist` | Nodes exempt from reply rate limit |
484+
| `PILOT_REKEY_WHITELIST` | `-rekey-whitelist` | Nodes exempt from rekey rate limit |
485+
| `PILOT_FLAG_<NAME>` || Feature flag override (`true`/`false`) |
338486

339487
---
340488

0 commit comments

Comments
 (0)