docs: add task 05b for the unmigrated interactiveCopy datasets

This commit is contained in:
Marcos Paulo
2026-09-05 18:39:09 +00:00
parent 99d42f8fbc
commit 966dfcb926
2 changed files with 80 additions and 2 deletions
@@ -0,0 +1,78 @@
# 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