# Content contract

The retained original and adaptation are complete authored specimens, not source
film screenshots. Original: **Fern Field Laboratory**. Adaptation: **Kiln House
Collective**. All example domains and email addresses use `.example.test`.

## Single resource relationship

Keep exactly seven boards in each `addon/inputs/*-design.json`. Each board has
exactly `title` and `address`. The fourth board, array index 3, supplies:

1. `board3Title` and `board3Address` in the list.
2. `thumbnail3Title`, derived from the title before ` | `.
3. The dialog's `selectedTitle`, identical to the full board title.
4. `selectedAddress`, after removing the leading age pattern `number + letters +
   space + middle-dot + space` (implemented as `/^\d+[a-z]+ · /u`).
5. The dialog heading. This must not be separately authored.

All other thumbnail titles derive from their own corresponding board title.
Owner name, owner email and initials come from the same design specimen. This is
display-only original sample content, not a working sharing or permission UI.

## Heading fit

The `code/content.mjs` module inside `addon` first applies only declared suffix abbreviations to the
selected resource name, then prepends `Share `. It tests the full result, followed
by successively shorter Unicode-character sequences plus `…`. It picks the first
candidate whose measured width is at most **424 pixels**. Missing measurements,
an ellipsis-only result or an independently supplied `dialogTitle` fail.

The actual measurement uses bundled Geist, CSS family `Fieldnotes`, weight 600,
25 px. The complete scene additionally validates every text box after loading
that same font. It does not shrink type to fit.

| Specimen | Heading | Fresh measured width |
| --- | --- | --- |
| Original | `Share Habitat Map | Fern Field Lab` | 408.85162353515625 px |
| Adaptation | `Share Firing Log | Kiln House Coll…` | 410.276611328125 px |

Original explicitly permits `Laboratory` → `Lab` as a suffix abbreviation.
Adaptation has no abbreviation map and uses measured ellipsis. The selected card
still shows `Habitat Map | Fern Field Laboratory` or `Firing Log | Kiln House
Collective` in full; shortening the heading does not rename the selected board.
`content-measurements.json` retains all tested candidate widths and browser/font
binding. Both replays also passed the renderer's full text-fit gate.

## Editing without breaking the study

The exact replay launcher intentionally rejects edits to bound addon files. Do
not silently update `input-binding.json` and call an edited result an exact replay.
Create a separately named adaptation workspace with a separately recorded input
binding. Reuse `headingCandidates` and `buildShareFocusContent`; supply widths from
the pinned browser/font. Run the unchanged `validateRenderInput` and `FontGate`
checks before accepting a new render. Keep all seven resource relationships,
colors, thumbnail geometry, 57 frame controls and pointer optics unless a new
brief explicitly changes them. This handoff renders only the two supplied
specimens; it does not certify arbitrary new text.

For per-node text, font size, weight, line-height multiplier, spacing and alignment,
use `controls/original-text.csv` and `controls/adaptation-text.csv`. Position and
box size are in `controls/all-layers.csv`; the parent hierarchy is in
`controls/layer-index.json`. Text+ is not presumed pixel-identical to browser text:
the provided code-derived static plates are the practical typography bridge.
