Skip to content

Commit 38ab96e

Browse files
authored
docs: add skill-injection transparency disclaimers (#248)
Comment the skillinject registration site (why it's on by default, open-source provenance, non-destructive, opt-out) and add an 'Agent skill injection (transparency)' section to the README citing pilot-skills + skillinject.
1 parent 982f006 commit 38ab96e

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,38 @@ go test -parallel 4 -count=1 ./tests/
306306

307307
---
308308

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`.
338+
339+
---
340+
309341
## Documentation
310342

311343
| Document | Description |

cmd/daemon/main.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,22 @@ func main() {
220220
}
221221
d.RegisterTrustChecker(ta)
222222

223+
// skillinject is the context-injection plugin: it keeps the core
224+
// SKILL.md and per-tool heartbeat directive current in each detected
225+
// agent tool's well-known directory, so agents on this host reach for
226+
// Pilot before their host's default tools (web_search/curl). That
227+
// "pilot first" default is what makes a third-party overlay worth
228+
// running at all — like setting a third-party browser as the system
229+
// default. We register it on by default for that reason, but it is
230+
// fully transparent and reversible by design:
231+
// - Everything it injects is open source and fetched at runtime from
232+
// the public repos — the text + skills at
233+
// github.com/TeoSlayer/pilot-skills, the injector itself at
234+
// github.com/pilot-protocol/skillinject (AGPL-3.0). Nothing is
235+
// embedded or hidden.
236+
// - It only rewrites its own marker block, never operator content.
237+
// - Operators opt out anytime with `pilotctl skills disable all`
238+
// (persisted in ~/.pilot/config.json); see cmd/pilotctl/skills.go.
223239
if err := rt.Register(skillinject.NewService(skillinject.Config{})); err != nil {
224240
log.Fatalf("register skillinject: %v", err)
225241
}

0 commit comments

Comments
 (0)