diff --git a/docs/development/byo-funnel-telemetry.md b/docs/development/byo-funnel-telemetry.md index 7966f17b39..95b08ba94f 100644 --- a/docs/development/byo-funnel-telemetry.md +++ b/docs/development/byo-funnel-telemetry.md @@ -4,6 +4,19 @@ The authenticated BYO page posts fixed event names to `POST /api/stats/byo-step` The endpoint stores `userId`, `step`, and server time in `byo_telemetry`. Commands, keys, names, and clipboard contents are never sent. +Setup OS and listener eligibility (TASK-714) are not stored in `byo_telemetry`. +`seat-created` and every step also send `setupOs` and `listenerAvailable`, the +copy steps add a `copyType`, and the server writes those to the person's User +row instead: `users.onboarding.byoSetupOs` (`mac`, `linux`, `windows` or +`other`) and `users.onboarding.byoListenerEligible`, both written once (the +first request with a valid OS and a boolean wins; a later OS is ignored), and +one write-once first-copy mark per +type (`byoListenCopiedAt`, `byoMcpClaudeCopiedAt`, `byoMcpCursorCopiedAt`, +`byoDaemonCopiedAt`, `byoTokenCopiedAt`). A query for "which OS did they set up +on" reads the User row. The `byo_telemetry` rows only answer "did they reach +this step, and when". On 2026-11-01 a read of `byo_telemetry` alone found no +setup OS at all, although prod had already written the fields to the User row. + As of TASK-483 and TASK-493 (2026-10-24), the browser sends: | Event | Observed state | diff --git a/fleet-skills/working-in-turns/SKILL.md b/fleet-skills/working-in-turns/SKILL.md index 9e448fadea..3b55e602be 100644 --- a/fleet-skills/working-in-turns/SKILL.md +++ b/fleet-skills/working-in-turns/SKILL.md @@ -7,7 +7,8 @@ last_updated: 2026-11-01 # Working in Turns -- End each turn before its run limit, not at it. The default run limit is 15 minutes, and only adapters that honor `COMMONLY_AGENT_RUN_TIMEOUT_MS` can use a longer one such as `2700000` (45 minutes). On a 45-minute limit, end the turn by about 35 minutes; on the 15-minute default, by about 10. Before ending: commit and push what you have (a draft PR is enough), and post the next step as a one-line note on the row. The next wake continues from the pushed branch. If the work is larger, split it and say how in the row. A timeout sends SIGTERM and loses uncommitted work. +- End each turn before its run limit, not at it. The default run limit is 15 minutes, and only adapters that honor `COMMONLY_AGENT_RUN_TIMEOUT_MS` can use a longer one such as `2700000` (45 minutes). On a 45-minute limit, end the turn by about 35 minutes; on the 15-minute default, by about 10. Before ending: commit and push what you have (an open PR is enough; open it ready), and post the next step as a one-line note on the row. The next wake continues from the pushed branch. If the work is larger, split it and say how in the row. A timeout sends SIGTERM and loses uncommitted work. +- Open your PR as ready, not as a draft. A later `gh pr ready` can be refused by the harness's permission classifier ("Unrequested Commit in a Connected App") when your turn never said to undraft. That refusal comes from the harness, not from the seat `gh` fence. - **One review round per change.** Before you hand a PR to the press, run your own quick subagent review of its diff. Tier 2 changes (auth, grants, record, schema, wake, money, security) need an Opus-class reviewer. That one review also covers screenshots against the design frame, any lane checks and the zh-CN glossary. Don't ask a second reviewer, and don't ask anyone to re-review after you push a fix. - Then answer every CodeRabbit thread and get CI green. A push that only answers CodeRabbit or CI keeps your PASS. - If your review comes back HOLD, fix it, push, and review again yourself.