Repository navigation
feat(telemetry): ask who is measured at opt-in - #1034
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
The on use case takes who the clone is measured as: the identity already set, none, or one chosen. It refuses an identifier the identity rules refuse, and staying anonymous while an identity is set, before writing anything, and writes the identity only after consent is granted. A proposal is read from git's user.name, else user.email, never under AIDD_TELEMETRY=0. The command still passes keep: nothing changes yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
`aidd telemetry on` takes --as <id> or --anonymous. Interactively, with no identity set, it asks once the opt-in is confirmed: the git name when there is one, another identifier, or anonymous. --yes with no identity and neither flag is an error before anything is written, so scripts and tests now pass --anonymous. `on` and `status` say who the measurement names, and the text report labels nobody `anonymous`; the envelope is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
…minal The usage contract, the contributor map and the plugin README describe who is measured at `on`. The 00-init start action reads the identity, asks how the person appears when none is set, offering the git name, and runs `on --yes --as <id>` or `--anonymous`. Gate evidence recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
A typed identifier the identity rules refuse is asked again instead of ending `on` after the opt-in was confirmed. The refusal and the prompt say "one non-empty line of at most 128 characters", and the command prints the refusal through the display instead of a copy of its text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
…help The 00-init skill asks the person to type an identifier or stay anonymous, runs `on --yes --as '<id>'` quoted or `--anonymous`, and says that `aidd telemetry on` in a terminal offers the git name: no name reaches the session before the person chooses. Its probe now requires `--anonymous` in `aidd telemetry on --help`. The start test table loses the row its two new rows cover. Contract rules 5 and 6 say what ships. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
A refused typed identifier now prints the identity rule before the prompt repeats. The start action says how to keep a quote inside the single-quoted --as value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
Brings in the report filters (#1033). Both sides kept: the `on` identity question and options beside the report's filter options, both public telemetry modules declared, both rows of the contributor map. The absent person filter now reads `anonymous`, as the report rows do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
The review's two rounds, the gates rerun on the tree merged with the report filters, and the contract and plan marked done. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp
blafourcade
marked this pull request as ready for review
October 16, 2026 04:41
Merged
3 of 12 tasks
1 of 7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎯 What & why
Before this change,
--axis personnamed someone only after they ranaidd telemetry identity <id>, a command almost nobody finds. Otherwise the row readnot set, and nothing said which name a machine was measured under.aidd telemetry onnow asks that question at opt-in, andstatusreports the answer.🛠️ How it works
The question comes after consent and before any write. The command collects the choice and passes it to the
onuse case. The use case writes the identity only when the opt-in succeeds, so a refusedonwrites neither consent nor identity. The order is shown in contract.md.Interactive
onwith no identity set offers three choices:user.name, elseuser.email, read through a port and only shown, never stored unless chosen;A typed identifier goes through
personIdOf. A refused one prints the rule and asks again (telemetry.ts:79). UnderAIDD_TELEMETRY=0, git is not read and the git name is not offered.Non-interactive.
on --yes --as <id>oron --yes --anonymous. With no identity set,--yesalone exits 1 before writing anything (telemetry.ts:156):--yesnever decides anything implicitly. The redesignedonhas never been released (it exists onnextonly, since feat(telemetry): deterministic claude code token measurement, release 1 #993), so no released behaviour breaks.Anonymous is a label, not a value. The text report labels the person row
anonymous. The JSON envelope is unchanged (kindabsent,key: null), so--absent person(feat(telemetry): filter the report by task, ticket, person and more #1033) still selects that row. Choosing to stay anonymous is not stored, so the nextonasks again.The
00-initskill reads nothing from git, so no name reaches the session transcript before the person chooses. It asks the person to type an identifier or stay anonymous, then runson --yes --as '<id>'(single quotes escaped) or--anonymous. It runsaidd telemetry on --helpfirst and stops if--anonymousis missing (an older CLI).🧪 How to verify
cd cli && pnpm test: 6621 passed, 1 skipped, on the tree merged withnext.pnpm test:mutation:telemetry: 96.6 (floor 96), with no survivor on a changed line.pnpm smoke: 132/0/1. Bundle 692.8 KB of a 695 KB budget.node scripts/check-claude-tokens-end-to-end.cjs cli/dist/cli.js, and again with--attended: both exit 0.HOMEand the config directories set to temporary ones:aidd telemetry on --yes --as "Ada Example"printsMeasured as "Ada Example".aidd telemetry report --person "Ada Example"selects that person's call.aidd telemetry report --absent personprintsSelected: person = anonymous.--personfilter compares against this machine's own identity. Locally, it selects every call or none until team figures are gathered (feat(framework): upload out of band, never at the session's expense #662).🔗 Linked issue
Closes #1029
✅ I certify
🤖 Generated with Claude Code
https://claude.ai/code/session_01VWNxk63AGKkqE8HRqHLjGp