@@ -50,6 +50,136 @@ Reliable P2P data transfer across NAT. Tag intentionally held for review.
5050 the direct and relay paths, so two NAT'd peers reconverge in ~ 1 RTT
5151 instead of waiting 28 s–3 min for blackhole detection.
5252
53+ ## [ 1.12.0] - 2026-06-21
54+
55+ ### Added
56+
57+ - ** Consent-gated Ed25519 telemetry client (PILOT-400, #263 ).** The daemon now
58+ includes a telemetry subsystem that emits signed events to
59+ ` telemetry.pilotprotocol.network ` . Each daemon derives a stable Ed25519
60+ identity (` seed = SHA-256(node_id) ` ), signs every event with three headers
61+ (` X-Pilot-Timestamp ` , ` X-Pilot-Public-Key ` , ` X-Pilot-Signature ` ), and emits
62+ only when the operator has given explicit consent. Consent is stored in
63+ ` ~/.pilot/consent.json ` and checked on every emission. (telemetry)
64+
65+ - ** Telemetry events: ` app_installed ` , ` catalogue_viewed ` , ` app_detail_viewed ` ,
66+ ` app_usage ` (PILOT-401, 402, 406, 407, #277 ).** Emitted at the appropriate
67+ points in the app-store flow, each carrying ` app_id ` in the signed payload.
68+ ` app_usage ` fires on every successful ` pilotctl appstore call ` . All events are
69+ gated behind the consent check. (telemetry)
70+
71+ - ** ` pilotctl update ` — self-update command (PILOT-396, #262 ).** Checks the
72+ latest GitHub release, downloads the matching binary for the current OS/arch,
73+ verifies the SHA-256 checksum, and replaces the running binary. Respects
74+ ` --dry-run ` and ` --version <tag> ` . (pilotctl)
75+
76+ - ** ` pilotctl appstore review ` — leave a signed review (PILOT-410, #276 ).**
77+ ` pilotctl appstore review <id> --subject <text> --rating <1-5> ` submits a
78+ signed review. Subject is capped at 140 characters; rating must be 1–5;
79+ both validated client-side before the signed POST. (pilotctl)
80+
81+ - ** Agent-first CLI overhaul (#247 ).** ` pilotctl send-message ` , ` list-agents ` ,
82+ and related commands now produce bounded, human-readable output by default —
83+ truncated at a configurable line count with specialist name + summary
84+ highlighted. ` --json ` still emits raw envelopes. (pilotctl)
85+
86+ - ** Consent + sandbox controls.** ` pilotctl consent ` sub-commands
87+ (` grant ` /` revoke ` /` show ` ) manage the consent file interactively.
88+ ` pilot-daemon --sandbox ` prevents all outbound emission including telemetry.
89+ ` skillinject ` gains ` --mode=append|prepend|replace ` . Install-time and review
90+ flows show a consent-disclosure section before writing. (consent)
91+
92+ - ** Signed app-store catalogue + Pages catalogue site (#249 ).** Catalogue JSON
93+ is now Ed25519-signed; ` pilotctl appstore install ` rejects any catalogue
94+ whose signature fails. A static GitHub Pages site renders the catalogue as a
95+ human-browsable app directory. CI validates catalogue schema on every PR
96+ (#259 ). (app store)
97+
98+ - ** Catalogue list UX: name + headline only, with ` view: ` pointer (PILOT-404,
99+ PILOT-405, #275 ).** ` pilotctl appstore catalogue ` shows one line per app
100+ (` <id> <display_name> — <headline> ` ) and a trailing ` view: ` pointer to
101+ ` pilotctl appstore view <id> ` . (app store)
102+
103+ - ** Per-platform app bundles — v3 catalogue format (#296 ).** App manifests now
104+ carry a ` platforms ` map (` linux/amd64 ` , ` darwin/arm64 ` , etc.) so
105+ ` pilotctl appstore install ` downloads only the binary matching the current
106+ OS and architecture. The catalogue format is versioned at v3; older ` pilotctl `
107+ treats missing platform keys as a single universal bundle (backward compat).
108+ (app store)
109+
110+ - ** ` io.pilot.sixtyfour ` v0.1.0 — new app in the catalogue (#289 ).** First
111+ non-preview app published under the signed per-platform bundle format.
112+
113+ - ** Verified-badge client layer (#295 ).** Daemons can now request and cache a
114+ cryptographic verification badge from the Pilot CA. The badge is exposed via
115+ IPC and surfaced in ` pilotctl info ` and ` pilotctl verify status ` . Serves as
116+ the groundwork for badge-gated specialist trust in a future release.
117+
118+ - ** ` pilotctl verify status ` with offline check (#297 ).** New sub-command
119+ reports the local badge state (verified / unverified / expired) without a
120+ network round-trip, with a ` --how-to ` flag that prints the steps to earn
121+ verification. (pilotctl)
122+
123+ ### Fixed
124+
125+ - ** Decompression bomb protection in ` untarUnder ` (PILOT-418, #288 ).** App-store
126+ bundle extractor now enforces a 256 MiB per-entry cap and a 1 GiB total cap;
127+ oversized archives are rejected and partial extracts cleaned up. (security)
128+
129+ - ** ` crypto/rand ` replaces ` math/rand ` in three daemon files (PILOT-417, #283 ).**
130+ Key-exchange nonces, ephemeral-port selection, and session-token generation
131+ now use ` crypto/rand.Read ` . (security)
132+
133+ - ** ` node_id ` now populated in all telemetry events (#281 , #282 ).** The telemetry
134+ client was initialized before the daemon identity resolved, leaving ` node_id `
135+ empty. Client now reads it lazily. A missing ` app_id ` in ` catalogue_viewed `
136+ payload was also corrected.
137+
138+ - ** Consent gates added to all app-store telemetry paths (#278 ).** Several
139+ app-store emission sites skipped the consent check. Each now calls
140+ ` consent.IsGranted() ` and short-circuits if consent is absent or revoked.
141+
142+ - ** Review prompt output no longer captured by ` pilotctl appstore call `
143+ (PILOT-409, #268 ).** The stdio intercept is now scoped to the method's
144+ structured-output phase only; LLM sub-call progress streams to the terminal.
145+
146+ - ** ` pilotctl skills disable/enable ` rejects non-` all ` skill IDs (PILOT-394,
147+ #260 ).** Previously silently matched nothing and exited 0. Now returns a
148+ non-zero exit code with a clear message when no skills match.
149+
150+ - ** Default telemetry endpoint set to production.** The daemon no longer ships
151+ with a localhost fallback; default is
152+ ` https://telemetry.pilotprotocol.network/v1/events ` . The ` PILOT_TELEMETRY_URL `
153+ env override remains for staging.
154+
155+ - ** Inner packet ` Src ` bound to authenticated ` peerNodeID ` (#294 ).** Previously
156+ the source node ID in the inner packet was taken from the unverified frame
157+ header. It is now always overwritten with the node ID authenticated by the
158+ key-exchange layer, preventing a peer from spoofing a different node's address
159+ inside an established tunnel.
160+
161+ ### Changed
162+
163+ - ** MOTD sourced from ` pilot-changelog ` feed-motd.json (#285 ).** The poll loop
164+ introduced in v1.11.2 now fetches from ` pilot-changelog ` 's ` scope: motd `
165+ output instead of the bespoke ` pilot-motd ` repo. No behavior change for users;
166+ ` --motd-feed-url ` / ` $PILOT_MOTD_URL ` overrides still work. (motd)
167+
168+ - ** Module path renamed: ` TeoSlayer ` → ` pilot-protocol ` (#287 ).** All internal
169+ imports updated from ` github.com/TeoSlayer/pilotprotocol/... ` to
170+ ` github.com/pilot-protocol/pilotprotocol/... ` . The GitHub repository rename
171+ provides a redirect for existing ` go get ` users.
172+
173+ - ** Catalogue CI moved into ` web4 ` (#272 ).** App-store catalogue validation
174+ now ships as a workflow inside this repo so catalogue PRs validate in place.
175+
176+ ### Infrastructure
177+
178+ - ` CODEOWNERS ` restricted to ` @TeoSlayer ` only.
179+ - WAL torn-tail registry test reconciled with current protocol contract.
180+ - Daemon package tests now isolate ` $HOME ` to prevent cross-test interference
181+ (#252 ).
182+
53183## [ 1.11.2] - 2026-06-15
54184
55185### Added
0 commit comments