Skip to content

RAC v0.10.6 - the "count me in" release

Choose a tag to compare

@tcballard tcballard released this 12 Jun 20:59
· 547 commits to main since this release
a76a87e

The "count me in" release - if you want Lore to keep getting better, you can now say so in one word, and we learn exactly three things: you exist, what version you run, and how many repositories you're grounding. Nothing else, and nothing at all unless you ask.

pip install --upgrade requirements-as-code
rac telemetry on

One honest question

v0.10.5 gave you telemetry you could read before you share it - a local log and a prefilled GitHub issue you submit yourself. That works while we can talk to every user individually. It doesn't tell us the thing that decides where the next month of work goes: do installs come back?

So this release asks. Once, plainly, at the moment you set up a repository:

$ rac init
Initialized repository (key: PROJ).

Share anonymous usage to help shape Lore? [y/N]

Default is No. Empty answer is No. Not a real terminal — CI, pipes, --json — and the question never appears. Either answer is persisted, so you're asked at most once per machine. Change your mind any time:

rac telemetry status   # exactly what is shared, and whether sending is even possible
rac telemetry on       # opt in
rac telemetry off      # opt out

The entire transmission, verbatim

With consent on, rac mcp sends at most one ping per 24 hours. This is the whole thing - not a sample, the complete payload:

{
  "api_key": "phc_…",
  "event": "lore-daily-ping",
  "timestamp": "2026-06-12T20:37:04Z",
  "properties": {
    "distinct_id": "cd03eed3dd98b784834485e27a436914",
    "$process_person_profile": false,
    "schema_version": "1",
    "rac_version": "0.10.6",
    "active_repos": 2
  }
}

What the fields are: the install id is a random token minted when you opt in — derived from nothing, so it identifies nothing (we deliberately rejected hashing machine attributes: derivable is the opposite of anonymous). active_repos is a count of distinct repositories Lore served in the last 30 days, tracked locally as salted digests — the salt never leaves your machine, only the integer does. $process_person_profile: false tells the sink to create no person profile, so the event stays anonymous on the receiving side too.

What is never sent, under any setting: paths, queries, tool arguments, artifact text, or a single byte of your repository's content. Adding any field to this payload requires a new recorded decision (ADR-041, the way decisions are recorded here) — and the test suite pins the exact key set, so it can't drift in quietly.

Trust, enforced rather than promised

The v0.10.5 notes said "RAC still contains no network code." That sentence is retired honestly, not eroded - ADR-041 amends it on the record, and the replacement claim is one the code enforces:

  • The network surface of RAC is one readable file (rac/mcp/ping.py). A test fails the build if any other module imports a network client - "what does this tool phone home" is answerable by reading one page of source.
  • Sharing is never silent. When it's on, the server says so on stderr at startup, names what's sent, and tells you how to turn it off.
  • It can never get in your way. The ping is fire-and-forget: three-second timeout, failures dropped without retries, and tool responses are byte-identical with sharing on or off.
  • Two switches, not one. Remote sharing is independent of the local --telemetry log - each is its own opt-in, and neither implies the other.

Upgrading

pip install --upgrade requirements-as-code
uv tool upgrade requirements-as-code

Everything is additive: one new command (rac telemetry) and one one-time question at rac init on a real terminal — the first interactive prompt this CLI has ever had, which is itself recorded in ADR-041. Every existing command, file, JSON contract, and exit code works exactly as in v0.10.5, and without consent (the default), nothing is ever sent — behaviour is byte-for-byte what it was before.