# socials — source adapters

The `socials` skill resolves a named **subject** to a normalized intermediate that
the shared render core consumes. One adapter per subject kind. This file is the
contract and the **extension point**: a future subject (a testimonial, a launch, an
event) is a new row here, not a new skill.

## The normalized intermediate

Every adapter resolves its subject to this shape:

```
{
  topic,              // one short phrase naming what the tiles are about
  headlineCandidates, // [string] — lead lines, strongest first
  subCandidates,      // [string] — supporting lines, paired to headlines
  copyFacts,          // { eyebrow, specs[], domain, phone } — overlay scalars
  candidateImages,    // [{ key, path, isPerson }] — vetted backgrounds
  piiBearing          // boolean — does this source carry client data?
}
```

`candidateImages[].key` becomes the tile `hero` and the filename suffix
(`og-<format>-<key>.png`). `isPerson: true` marks a hero that must render
**portrait only** (a landscape or square crop cuts off the head). `piiBearing`
decides whether the PII gate in [`pii-strip.md`](pii-strip.md) runs before any of
this reaches a template.

## Adapters

### `microsite` — `piiBearing: false`

Reads a built `site/` directory (the output of `web-design`): the brand pack
(`brand.md` tokens, `images/logo.png`) and the curated hero photos at the fixed
paths the site uses:

| key | image | leads with |
|---|---|---|
| `main` | `images/hero-01.webp` | the business's lead line |
| `detail` | `images/hero-03.webp` | a quality / detail line |
| `work` | `images/hero-06.webp` | a what-we-do line |
| `founder` | `images/founder-portrait.webp` | "meet the…" — **`isPerson: true`, portrait only** |

`copyFacts` for `microsite` is the brand pack's own credential cells (sector,
services, areas, years) plus `domain`, `phone`, and the site's full `WEBSITE_URL`
(the microsite-only og:image wiring needs the absolute URL, not just the domain).

Brand-safe by nature (the site is already published copy), so the PII gate is
skipped. This is the path `web-intake` calls as its final stage; it also wires the
site's `og:image`/`twitter:image` to the landscape `main` tile. If the site has no
figurehead, drop the `founder` key.

### `bespoke` — `piiBearing: true` (operator may waive)

An operator-chosen topic with the operator's own photos and notes. The operator
supplies the topic, the headline/sub ideas, and the candidate images. The PII gate
runs by default; the operator may declare the material brand-safe (their own
marketing photos, no client identifiable) to skip it — that declaration is the only
way the gate is waived for a bespoke subject.

## Adding a subject later

A new subject kind (testimonial, launch, event, …) is a new adapter section here:
name what it reads, how it maps to the normalized intermediate, and its `piiBearing`
value. No new skill, no new render core, no new caption register. If the source can
carry client data, set `piiBearing: true` and the existing gate covers it.
