# Task 05b — The `interactiveCopy` data **Agent**: `content-i18n-migrator` · **Model**: MiniMax-M3 **Depends on**: 05 · **Blocks**: 15d **Worktree**: `.agents/scripts/worktree.sh start 05b guide-interactive-data` ## Why this task exists It is not in the original plan, and it is the second hole of exactly this kind (see [task 04b](task-04b-chapters-data.md), which filled the empty `chapters` collection). Task 05 moved `phases`, `providers`, `efforts`, `skillSources`, `handsOnPrompts` and `skillInstallPrompts` out of `app.js`. It did not move `const interactiveCopy` at `app.js:160`, which holds six more datasets: | Key | Feeds | Rendered by | | --------------- | ---------------------- | --------------------- | | `workers` | `#worker-detail` | `renderWorker` | | `trees` | `#tree-detail` | `renderTree` | | `routes` | `#route-detail` | `renderRoute` | | `skillFiles` | `#skill-detail` | `renderSkillFile` | | `skillWorkflow` | `#builder-detail` | `renderSkillWorkflow` | | `commonSkills` | `#common-skill-detail` | `renderCommonSkill` | Task 15d stopped before writing a line because of this — six of the nine groups `GuideSelector` drives have no data to read. It was right to stop. ## Scope `src/content/config.ts` (new collections only) and the new `src/content/*/` JSON. **You own `config.ts`** — you are the only agent who may edit it. Do not change an existing collection's schema. ## The shapes are already written down `src/components/islands/GuideSelector.astro` declares a `GuideSelectorData` interface at the top of the file. It is the contract 15d will feed. Match it — if you think a field there is wrong, say so in your report rather than diverging silently. Note the non-obvious ones, verified against `app.js`: - `trees[id]` has `owner` and `note` localized, but `path` and `command` are **single strings, not localized** — they are shell paths. - `routes[id].score` is a **number**, rendered into `style="--score:N%"`. - `workers[id]` is `{ en: string[], pt: string[] }` — a three-element array (`span`, `strong`, `small`), not an object. - `skillFiles[id]` mixes `icon`/`title` (unlocalized) with `en`/`pt` strings. - `providers[id].tiers` is `[string, string, Localized][]`. Read the real `app.js` for each. Do not infer a shape from a sibling. ## Rules that bite here - **Both `en` and `pt` are mandatory on every localized field.** A missing `pt` must fail the build. Never make a field optional to clear a validation error — find the real Portuguese string in `app.js`. - Copy strings **verbatim**. This is a move, not a rewrite. No fixed typos, no improved phrasing, nothing translated that is already translated. Several strings contain inline HTML; keep it exactly as-is. - Prove it. Diff each migrated string against the `app.js` original programmatically and report the result — task 15b did this for the prompt bodies and it is the standard here. - Do not delete `interactiveCopy` from `app.js`. The legacy page still runs on it until task 20 cuts over, and `verify.mjs` still asserts against it. - Do not migrate a page or touch a component. 15d owns that. - Do not edit `verify.mjs`, `tokens.css`, or `astro.config.mjs`. ## Done when - [ ] Six collections defined and exported from `config.ts` - [ ] Entries for every id in `interactiveCopy`, both locales - [ ] Shapes match `GuideSelectorData`, or the divergence is argued in the report - [ ] Every string proven byte-identical to its `app.js` original - [ ] `pnpm run gate` green — the full gate, not `verify` + `audit-ui` alone - [ ] 42 assertions intact