End-to-end install fix. The 0.0.1 install path was broken in five places, all reported by an OpenClaw 2026.4.21 maintainer who tried it on a real install. Re-running npx -y @latitude-data/openclaw-telemetry install cleans up any leftover 0.0.1 keys.
Fixed
openclaw.jsonwritten by the installer is now accepted by OpenClaw's strict zod schema. 0.0.1 wrotehooks.allowConversationAccess: true(the stricthooksnamespace only acceptsallowPromptInjectionon older OpenClaw versions, andallowPromptInjection+allowConversationAccesson 2026.4.22+) andLATITUDE_*keys at top-levelenv(the root schema'senvblock only accepts{shellEnv, vars}, not arbitrary keys). Both fields caused the gateway file-watcher to quarantine the new config asclobbered.<ts>and silently roll back tolast-good. We now write everything underplugins.entries[id].config, which isrecord(string, unknown)and accepted by every OpenClaw version.- Plugin discovery now finds us. OpenClaw scans
<configDir>/extensions/<plugin>for anopenclaw.plugin.jsonmanifest at the plugin root — npmmainis irrelevant, and globalnpm install -gis not enough. Two changes: (1) we now shipopenclaw.plugin.jsonin the package, with the requiredidandconfigSchema, and (2) the installer materializes the package'sdist/+ manifest into~/.openclaw/extensions/latitude-telemetry/so discovery picks it up. api.pluginConfigis now the primary source of credentials. 0.0.1's runtime readprocess.env.LATITUDE_*and ignoredapi.pluginConfig. Combined with the schema-rejection bug, the plugin disabled itself silently because creds were dropped on the floor before they reached our runtime. The newloadConfigreadsapi.pluginConfigfirst (the user'splugins.entries[id].config), and falls back to env vars for compatibility.allowConversationAccessis now actually honored. 0.0.1 advertised the flag but always attached full content to spans. The new runtime gatesgen_ai.input.messages,gen_ai.output.messages,gen_ai.system_instructions,gen_ai.tool.call.arguments,gen_ai.tool.call.result, and the interaction'suser_prompton this flag. When off, spans still emit with the same shape — timing, token usage, model name, agent name, ids — just scrubbed of payload content. Alatitude.captured.contentboolean attribute makes the gate state visible in the Latitude UI.
Changed
- Default capture posture flipped at runtime, kept on at install. The runtime now defaults
allowConversationAccesstofalseif the key is missing frompluginConfig(privacy-preserving default for hand-edited configs). The interactive installer still writestrueby default — pass--no-contentto install with structural-only telemetry. This means re-installing on top of an old config is a no-op for capture posture; only hand-edited configs that drop the key change behaviour. - Migration on re-install.
npx -y @latitude-data/openclaw-telemetry installnow stripshooks.allowConversationAccessand any top-levelenv.LATITUDE_*keys our 0.0.1 installer left behind, before writing the new entry. No manual cleanup required.
Added
openclaw.plugin.jsonmanifest at the package root, with a JSON schema forapiKey/project/baseUrl/allowConversationAccess/enabled/debug.--no-contentinstall flag for shipping structural telemetry without payloads.latitude.captured.contentboolean attribute on every span so operators can see whether content capture was on for a given trace.