# 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 `content.mjs` module in the addon’s code directory 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**. Before selecting, r02
requires an own-property, finite, nonnegative numeric width for **every** string
returned by `headingCandidates`, including candidates after the first fit.
Missing entries, `undefined`, NaN, infinities, negative widths and nonnumeric
values fail; they are not evidence that a candidate is too wide. An inherited
property cannot replace a missing measurement. Unrelated extra entries are ignored.
An ellipsis-only result or an independently supplied `dialogTitle` also fails.

A complete map still permits measured truncation: if a candidate's finite width
exceeds the limit, the next fitting candidate is considered normally. The actual
complete measurement maps for both supplied specimens produce unchanged content.
See `R02.md` for the focused repair and its red/green regression evidence.

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 | Retained measured width (r01) |
| --- | --- | --- |
| 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 retained replays also passed the renderer's full text-fit gate.
R02 reuses that actual measurement report; it does not claim fresh measurements.

## 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.
