---
title: "Turn signals into synthetic data"
lesson_id: "03"
---

# Turn signals into synthetic data

- **Lesson ID:** 03
- **Goal:** Turn signals into reviewed synthetic pairs. Name SampleGenerator as a growth tool, not an autopilot.
- **Human lesson:** [03-synthetic-data.html](03-synthetic-data.html)

## Prerequisites

- Lesson 02, or FeedbackSignal rows.

## Inputs, outputs, and artifacts

- **Inputs:** Product signals.
- **Outputs:** Reviewed prompt and target pairs, plus a Mac JSONL file.
- **Artifacts:** Progressive `.flow` diagrams and a Python JSONL writer.

## Agent build steps

1. Hand-write seed pairs from a signal.
2. Name SampleGenerator and require review. SampleGenerator stays in Swift Evaluations.
3. State the slang and language gap.
4. Write reviewed rows to JSONL in Python for the LoRA loop.
5. Link the eval harness.

## 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. Training file format is Python JSONL. SampleGenerator is Swift.

## Key concepts

- Hand-write seed prompt and target pairs from signals. A second person reviews them.
- Evaluations `SampleGenerator` can grow reviewed paraphrases.
- The same facts feed the eval harness and LoRA JSONL in different formats.
- No unread synthetic row enters training.

## Takeaways

- `SampleGenerator` stays in Swift tests. The training file is Python for PEFT.
- Reviewed synthetic rows are safer than uploading a week of chats.
- Synthetic data misses slang and languages you did not write.

## Acceptance checks

- Review is required.
- SampleGenerator is named.
- Python JSONL writer is shown.
- Sibling links, progressive `.flow` diagrams, and an Agent brief link are present.
- [ ] Proceed to [lesson 04 brief](04-lora-and-export.llms.md).
