---
title: "Collect signals, not raw chats"
lesson_id: "02"
---

# Collect signals, not raw chats

- **Lesson ID:** 02
- **Goal:** Collect on-device feedback signals without raw transcripts by default. Name the fields and the consent bar for text.
- **Human lesson:** [02-collect-signals.html](02-collect-signals.html)

## Prerequisites

- Lesson 01, or the loop picture.

## Inputs, outputs, and artifacts

- **Inputs:** A thumbs-down control.
- **Outputs:** A FeedbackSignal record.
- **Artifacts:** Progressive `.flow` diagrams and a Swift FeedbackSignal struct.

## Agent build steps

1. List default fields with no transcript.
2. Allow text only after a clear yes.
3. Sync only to infrastructure you control.
4. Link the prompt registry for version ids.

## Constraints

Keep the language simple, friendly, and literal. iOS 27 and macOS 27 only. No quizzes, Mermaid, or em dashes. Do not invent API names. Mark sketches as sketches and tell the reader to confirm them in the Xcode 27 SDK.

## Key concepts

- A signal can hold feature, prompt version, profile, rating, reason, tool path, and TTFT bucket.
- The default payload has no raw transcript.
- Store on device first. Optional sync uses the same fields.
- Text sharing needs clear consent and matching privacy labels.

## Takeaways

- The default signal has no user sentences.
- A pile of thumbs-down on one prompt version is a rollback candidate first.
- Do not build a stealth uploader.

## Acceptance checks

- Default payload has no user text.
- Consent is required for sentences.
- Sibling links, progressive `.flow` diagrams, and an Agent brief link are present.
- [ ] Proceed to [lesson 03 brief](03-synthetic-data.llms.md).
