# Session 0002.0 — Transcript

> App: makers-collective-demo
> Start: 2026-07-05T14-37 (PST)
> End: 2026-07-06T08-03 (PST)
> Type: brainstorming
> Posture: careful
> Claude-Session: 0e39182f-2c88-4de3-b122-0acc1d49e29e
> Checkout: /Users/benstull/git/wiggleverse.org/wiggleverse/makers-collective-demo
> Status: FINALIZED

## Summary

The session opened as "where should I start on a social platform for Makers?"
and closed 31 iterations later with **Hearth** — *your social life, in one
place* — a platform-of-spaces design captured as a complete Solution Design.
Pre-state: greenfield repo (README + app.json), backlog #1 (passwordless auth).

**Outputs, all on `main` (pushed):**
- `specs/hearth-platform-v1.md` v0.1.1 — the founding Solution Design,
  `status: proposed` (careful-posture submit; awaiting operator review).
  Business + product + founding-depth engineering lenses; 11 invariants
  (OHM-audit findings made binding); Feature decomposition F1–F15 (F1 = #1).
- `ui/designs/hearth-platform/index.html` — the canonical interactive prototype
  (§5.1 design bundle; self-contained; mirrors the session's Claude artifact).

**Key design moves** (full log in the Arc below): broad-not-deep prototype →
Hearth generalization (spaces, personas) → shops/vouching → modules-as-data +
AI composer → AI moderation (triage/custom rules/author nudges) → OHM audit
(4 violations found → fixed → invariants) → relationship models → typed
profiles + profile modules → businesses as OHM non-human entities → space
lineup (Lens/Loop/Work/PFM/SAM/detections.ai/Swiftly/family) → slogan + brand
mark → profile editors w/ Shopify connector → spec capture → finalize.

## Cut state / operator plate

- Spec awaits Ben's formal review (status: proposed).
- Next step (memory `Next /goal:`): deploy the prototype to
  hearth.wiggleverse.org on the existing wiggleverse-rfc VM (gcloud reauth
  needed — all local identities expired).
- Parked, awaiting green-light to file as issues: Hearth Epic + F1–F15 capture;
  OHM gap RFC candidates (spec §13); repo-identity question (spec Q7).

## Launch prompt

> I'd like to create a social media platform for Makers. Where should I start?

## Plan

> Anchor: none — operator redirected away from #1 (passwordless auth) at the first
> checkpoint: "showcase the idea — a tangible prototype without the critical things
> wired up under the hood — broad, not deep."
>
> Session output: a broad clickable **design prototype** (Claude Artifact, mock data,
> nothing wired) covering six agreed surfaces: landing/pitch, explore/discover,
> maker profile, home feed, completed-project showcase, and project ideas + recruit
> (the collaboration loop the operator added). Aesthetic agreed: warm & craft-forward
> (cream/clay/forest, serif display).
>
> Artifact: https://claude.ai/code/artifact/f4ca6127-c577-405f-a812-c0d24c19493d
>
> Iteration 2 (operator request): added per-maker **product catalog** to the profile
> (in-stock + made-to-order items + open commissions) and a **"Vouched for"** section —
> complementary products from other makers, each with a personal why-I-vouch quote —
> plus a "Shop drop" post type in the feed linking into the shop. Ordering deliberately
> unwired (buy-side remains deferred; buttons flip to "Request sent").
>
> Iteration 3: replaced flat material swatches with illustrated plates (14 hand-drawn
> SVG line illustrations over textured grounds with lighting/vignette).
>
> Iteration 4 (major scope evolution, operator-directed): the operator asked what a
> generalized platform would take — login + basic profile + user-created "scenarios"
> (professional/LinkedIn-like, family spaces). Gave a three-tier estimate (demo: days;
> real MVP w/ passwordless auth per #1: ~2–3 months; scenario engine w/ personas &
> privacy: several more months) and the "hardcode 2–3 scenarios before building the
> engine" caution. Operator chose "extend the demo": prototype now shows **Hearth**,
> a platform-of-spaces — Spaces dashboard + template gallery, create-a-space wizard
> (template → name/privacy → module toggles), Meridian Design Guild (professional:
> experience timeline, endorsements-as-vouches, opportunities), The Marsh Family
> (private: events+RSVP, albums, family project with role slots), per-space accent
> theming and per-space personas (Chairmaker / Furniture designer / Dad). If pursued
> for real, this is an Epic to capture — it outgrows the repo's makers-only charter.
>
> Iteration 5: **Admin & moderation console** (operator: "admin tools + AI
> auto-moderation"). New Admin view in the maker space: stats, AI-triaged moderation
> queue (auto-hidden spam @98%, ambiguous-hostility deferred to humans @61%,
> marketplace-authenticity report routed to a peer craft expert), per-space auto-mod
> rule toggles, moderator roster. Design stance recorded: AI triages with shown
> reasoning + audit trail + appeal; humans own judgment; AI never auto-removes speech;
> model is swappable. NOTE: operator cited "Open Human Model" as the moderation model —
> could not verify any such model exists; flagged to operator, demo copy kept
> model-agnostic pending clarification. Operator also framed the product as a
> "Reddit+Facebook mash-up" — positioning discussion logged (per-space personas,
> doing-together primitives, trust rails as the differentiators).
>
> Iteration 6: **Module Studio** (operator: how are modules created/maintained? —
> vision: users build & maintain modules/spaces, small team owns the platform).
> Architecture answer recorded: modules are DATA, not code — declarative manifests
> over a fixed primitive set (typed objects, views, action pairs, role slots,
> notifications); L2 on the L0–L3 spectrum (WordPress-plugin L3 rejected as
> small-team-unviable). AI = module composer (NL → manifest) and maintainer
> (migrations, health, orphan care). Governance reuses vouch rails: registry with
> per-module vouches/installs/forks, named stewards, adoptable orphans. Demo adds:
> Modules nav (hub) — AI-composer conversation (Seed Swap), community registry
> (Tool Library v3.2 by Theo, Recipe Box by Elena, Critique Circle by Ruth,
> orphaned Carpool Board with Adopt flow), "who maintains what" split
> (platform team: primitives/identity/moderation/registry · community: everything above).
>
> Iteration 7: **Unified feed** ("For you", hub-level nav) — cross-space activity
> river: items badged + color-striped per space (M&C wood / Guild blue / Family
> green), working space filters, mixed item types (family RSVP, role openings,
> shop restock w/ vouch context, admin mod-duty nudge, module update), per-item
> persona reminders ("here, you're Dad"). Design note: ranking/muting/notification
> digest deliberately out of demo scope — flagged as the real build's hard part.
>
> Iteration 8: **First-run experience** (operator request: basic profile info +
> discover/join spaces). New Welcome view (entry: "Preview the first-run experience"
> button on the Spaces hub): step 1 basics (avatar color picker, name/city/one-liner —
> framed as the BASE profile that seeds per-space personas), step 2 private interest
> chips (multi-select, tunes suggestions only), step 3 space discovery — suggested
> spaces w/ match reasons, three join mechanics (public Join, invite-only Request w/
> member vouch note, family Accept-invite) + invite-code field; finish card → For you
> feed. New mock user "Alex Rivera" used so onboarding isn't Silas-specific.
>
> Iteration 9: **Functional headers + About page** (operator: headers shouldn't be a
> pitch). New header scheme on all functional pages: eyebrow = context (space/Hearth),
> h1 = plain function ("Feed", "Spaces", "Admin & moderation"), ⓘ info-dot deep-linking
> to the matching About section. All marketing copy relocated to a new About view
> (nav: hub-level) with anchored sections: overview/positioning, spaces, personas,
> feeds, projects, shops & vouching, modules, moderation, who-maintains-what (moved
> from Module studio). Exception kept deliberately: the M&C landing page retains its
> pitch — it IS the space's marketing front door.
>
> Iteration 10: **Auto-mod extensions** (operator: examine external links, ban news,
> flag unwise speech). Built: (1) link scanning — AI follows every external link
> pre-post; queue demo catches a dropship storefront counterfeiting June's mugs
> (link safety × trust rails); (2) news ban as a PER-SPACE house rule — auto-declined
> at post time w/ friendly pointer elsewhere, no penalty, mod can grant exceptions;
> (3) "flag unwise speech" deliberately REFRAMED (design pushback, offered to reverse):
> mod-facing flagging of allowed speech rejected as speech-policing contrary to the
> demo's stated stance; built as private author-only THINK-TWICE NUDGE (pre-post,
> "post anyway/soften/sleep on it", mods see only tallies: 23 shown/14 rethought/
> 9 posted anyway). Three new rule switches; About §moderation updated to match.
>
> Iterations 11–12: **Instagram/TikTok/LinkedIn example spaces + even-keel pass.**
> (11) Two new spaces: Golden Hour (private photo circle — chronological/no ads/no
> strangers/no follower counts; persona "Si") and Loop (public short-video commons —
> front page picked by rotating HUMAN curators, not an algorithm; persona
> "@silasmakes · 2.1k followers", creator stats in For-you). Two new templates
> (Photo circle, Short video), 3 new illustrations (mountain, bike, dog), feed
> filters/items extended to 5 spaces. LinkedIn request satisfied by upgrading the
> existing professional space rather than duplicating: "Open to" signals
> (commissions ✓ / contract ✓ / not full-time), second opportunity (recruiter
> full-time ask w/ "Not looking" decline), "recruiters reach your work persona,
> never your family one". (12) Operator: tone down Makers emphasis, drop the word
> "guild" — renamed **Meridian Design Guild → Meridian Design Network** (all 15
> occurrences of guild removed), About copy generalized (shops: any space can sell;
> projects: fundraiser/party examples; overview: hobby/profession/family/friends),
> app now OPENS on the Spaces hub instead of the makers landing, title →
> "Hearth — Platform Prototype". M&C landing keeps its maker pitch (space-local).
>
> Iteration 13: **Chats + custom AI mod rules.** Chats (hub nav): three scopes with
> distinct privacy — space rooms (space rules apply; kiln-build room shows chat×role-slot
> integration "Silas claimed: firebrick unload"), in-space DMs (persona-to-persona,
> E2E-encrypted), root Hearth DMs (base-profile↔base-profile, mutual opt-in). Stance:
> AI moderation NEVER reads DMs; only participant reports share excerpts. Admin gains
> mod-authored custom rules: two examples (weekend no-selling; beginners-protected) +
> AI rule-composer conversation (no-AI-images-passed-as-real → interpreted, edge case
> asked, routes to expert review not auto-removal); custom rules published to public
> house rules. About: new Chats section + moderation paragraph.
>
> Iteration 14: **Per-space following + post audiences** (operator, from Golden Hour
> discussion). Design: follows attach to personas within a space (follow @junethrows
> in Loop ≠ following June elsewhere); every post picks audience — "everyone in
> space" vs "my followers" (followers-only never appears in Explore/to non-followers);
> small private rooms (family, photo circle) skip the choice — all posts to the whole
> room. Demo: M&C feed gains a composer with working audience picker; audience
> badges on posts ("To: everyone in M&C" / "To: her followers"); Explore maker cards
> get per-space Follow buttons w/ per-space toast. About §Feeds updated.
>
> Iteration 15: **OHM audit + Philadelphia Farmers Markets room.** (a) Read the real
> Open Human Model corpus (/Users/benstull/git/wiggleverse.org/wiggleverse/ohm-content/rfcs
> — RFC-0001 human.md + identity/relationality/informed-consent + ~30 concept RFCs);
> corrected the it.10 note (OHM exists; it's the Wiggleverse RFC vocabulary, not a
> moderation model). Audit found 4 violations/tensions: Loop follower/view counts vs
> RFC-0001 P8 ego-reduction; think-twice mod tally vs Interiority/data-minimization;
> module auto-update copy vs no-retroactive-harm; link-scan third-party flag ("June
> flagged too") vs relationality flow rules. Strong alignments: personas≈identity.md,
> per-space follows/audiences≈relationality flows, no-AI-in-DMs, published custom
> rules, human curation. 9 missing-OHM-concept RFC candidates listed (wise-speech
> general, shared-space stewardship, delegated enforcement, attention, minors/assent,
> joint works, memorialization, collective exit, Hearth sustainability). Demo fixes
> NOT yet applied — operator hasn't chosen. (b) Friend's farmers-market use case
> mapped to Hearth (market=space, attendance=event RSVP, lineup=event+attached
> catalog items, "Market Day" module w/ steward). Built the **Philadelphia Farmers
> Markets** room: weekend market-date cards, Headhouse Sunday lineup w/ honest
> "bringing ×N" counts, June as cross-space visiting vendor, late-withdrawal shown
> openly (OHM cart-order/mutual-commitment honesty), Market Day v1.4 module card
> (steward Dana R.) in registry, For-you item + filter; Silas persona #6: "shopper".
>
> Iteration 16: **Public-readable spaces, join-to-participate** (operator). Model:
> "public" = readable by anyone without joining (lurking legitimate); participation
> (post/like/RSVP/crew/DM) requires membership — "membership is the signature on the
> house rules". Demo: Spaces hub gains "Worth a look" discover section → visitor view
> of PDX Urban Gardeners (no persona chip, dashed join banner, readable posts w/
> 🔒-locked actions that toast the gate, Join CTA). Wizard privacy chips reworded
> (public=read-free; invite-only=even reading gated); About §Spaces documents it.
> Also this turn (prev message): Facebook Login question answered — no categorical
> Meta policy bar since Dec 2018 core-functionality clause removal, but unilateral
> termination discretion + competitor-cutoff history (Voxer/MessageMe/Phhhoto) +
> OHM conflicts (relationality flows, data minimization, exit-portability) →
> recommended against; passwordless magic-link (#1) remains the auth direction.
>
> Iteration 17: **Relationship models as a first-class space primitive** (operator
> insight: people won't create spaces; they expect one big room + follow individuals
> → different spaces need different relationship models). Five models named: follow
> graph (feed = who YOU follow), mutual circle (everyone sees everything),
> connections (mutual ties), roles (vendor/shopper), open commons (membership +
> follows overlay). Golden Hour reworked from 23-friend private circle → public
> 8.2k-member follow-graph photo commons (Instagram-shaped): handles (@si,
> @priya.dyes), "your feed = who you follow", Find people, suggested-follow card
> ("suggested because people you follow loved this — never engagement prediction"),
> counts private-to-you (ego-reduction preserved). Wizard gains step 3 "How do
> people relate here?" (model picker; modules now step 4); About gains
> §Relationship models; hub card/feed items updated.
>
> Iteration 18: **Wizard module step opened up** (operator: "Turn on the modules"
> was a limited hardcoded set, contradicting the module-ecosystem thesis). Step 4
> is now three tiers: built-in basics (switches), community registry (search field
> "240+ modules", three add-able registry modules w/ vouch counts + stewards, link
> to full registry), and AI composer escape hatch ("describe what you need" →
> Compose with AI).
>
> Iteration 19: **Openwork + detections.ai + rename.** (a) First-class LinkedIn
> space: **Openwork** — professional commons, 2.1M members, connections model
> (mutual-only), vow chips ("no recruiter reach without consent", "open-to signals
> do the talking"), new-role feed post, opportunity matched on endorsements,
> connection requests, and an OHM-linkability showpiece: "Link Meridian profile
> here?" — explicit, revocable persona-linking consent (identity.md §linkability).
> Meridian retained as the smaller specialized network (two scales of professional
> space). (b) **detections.ai** company space (operator's new employer, starts
> ~Jul 2026 — saved to memory user-detections-ai.md): private, 38 people, roles
> model; persona "Silas Marsh · Detection Engineer"; CEO announcement, Q3 staffed
> project (crew mechanics), channels → Chats, On-Call Rotation community module,
> work-stays-at-work / identity-leaves-with-you card (exit-portability). New
> "Company" template. Both in Your-feed w/ filters. (c) Renamed "For you" →
> **"Your feed"** (nav, h1, About).
>
> Iteration 20: **Third-party integrations = personal modules** (operator insight
> confirmed: modules have a second attachment axis — space-level vs persona-level).
> Architecture: a connector maps external data into Hearth primitives (Shopify
> products→listings, inventory→honest ×N, calendar→RSVPs); platform team maintains
> connector RAILS (OAuth/sync/sandbox) once, mappings stay declarative + community-
> shared; external service remains source of truth (strengthens exit-portability;
> auto-true inventory per fulfillment-inventory RFC). Demo: "Shop connections" card
> on Silas's shop (Shopify connected/synced 2h ago, + Square), Module studio gains
> "Attached to you, not the room" section (Shopify Catalog Sync v2.1 "runs on 1.2k
> personas", Calendar Sync w/ per-space scoping note), Headhouse lineup notes June's
> counts sync from her Shopify, About §Modules documents the two attachment levels.
>
> Iteration 21: **Profile modules + typed profiles** (operator design — the biggest
> architecture addition since relationship models). Persona stack is now 3 layers:
> base profile → TYPED profiles (professional/social/family — authored once, worn
> by every space of that type; explains why Openwork/Meridian/detections.ai all
> dress the same professional Silas) → space personas (typed profile + overlays).
> Modules now attach at THREE levels: space / personal (integrations) / PROFILE
> (attach to a typed profile: experience, endorsements, catalog were retroactively
> profile modules all along; Favorites is the first third-party-reading one).
> Visibility = triple gate: user enabled it × space wears that type AND allows the
> module × viewer holds the right root-level typed relationship ("professionally
> connected" = connection attached to the professional profile). Demo: Favorites
> card on Openwork profile (3 items from connected catalogs incl. Kenji visible-
> since-connect; shown-in chips Openwork ✓ Meridian ✓ / detections.ai disallows),
> Meridian lists its profile modules, Favorites v1.0 card in registry (forks:
> books/recordings/tools), About §personas (typed-profile layer + triple gate) and
> §modules (three levels) updated.
>
> Iteration 22: **Business profiles as OHM non-human entities** (operator question:
> how are businesses handled — e.g. PFM vendors RSVPing). Model grounded directly
> in OHM participants.md ("an LLC is not a Human but is controlled by one") +
> RFC-0003: a business is an ENTITY, not a login — profile (catalog/hours/market
> confirmations) + OPERATORS (Humans in named roles acting via professional
> personas) + optional home space (business ≠ space; detections.ai has both).
> Two-name rule: every business action records the business it was for AND the
> Human who took it ("confirmed by Marta H., owner"). Reputation anchors to
> operators — vouches don't transfer on sale (reputation.md lock-in hazard).
> Demo: Hexamer & Sons business profile view (catalog, dual-attributed market
> confirmations, operators, standing, vouches-don't-transfer card) linked from
> the Headhouse lineup; About gains §Businesses.
>
> Iteration 23: **Space lineup restructure** (operator): renamed Makers & Collective
> → **Seattle Area Makers** (all copy, badges M&C→SAM, JS, chats, onboarding);
> renamed Golden Hour → **Lens** (pairs with Loop; "golden hour at the ridge"
> survives as a photo caption); REMOVED Meridian Design Network (view deleted;
> Omar opportunity retagged → Openwork, Tool Library update → Seattle Makers;
> Openwork's persona-link card now links the SAM maker shop instead; Favorites
> shown-in now Openwork ✓ / Swiftly Alums ✓); ADDED **Swiftly Engineering Alums**
> (alumni network · 312 · invite-only · connections; runs on the professional
> typed profile — zero re-entry; alum post, warm-intro job lead "no recruiter in
> the middle", reunion RSVP, self-reported "where alums landed" incl. detections.ai
> ×3); Your-spaces grid reordered big-public-first: Lens, Loop, Openwork, PFM,
> SAM, then detections.ai, Swiftly, family.
>
> Iteration 24: **SPEC DRAFTED** (operator: "capture Hearth as a very detailed
> document to start building"). Solution Design authored per the engineering
> TEMPLATE at platform altitude: specs/hearth-platform-v1.md v0.1.0 on branch
> session-0002 (pushed). Contents: business lens (8 pains, 5 BOs, 8 BUCs),
> solution proposal + rejected alternatives, 7 product personas, 14 PUCs
> (gherkin), UX = prototype-as-canonical-design (§5.1 Design→Code, handoff
> pending), engineering lens at founding depth (11 invariants, architecture,
> domain model, relationship-model×audience matrix, 10 key decisions incl. FB
> Login rejection), Feature decomposition F1–F15 (F1 = tracker #1 auth), success
> metrics that deliberately exclude engagement, telemetry w/ INV-3-safe privacy
> classes, ops/runbooks, docs plan (About page ships as product content), OHM
> traceability column in §12, 10 open questions (sustainability, Sybil teeth,
> minors, module-engine perf, repo re-homing…), 14 logged decisions.
> Review URL handed to operator (whole-document review gate, careful posture):
> https://git.wiggleverse.org/wiggleverse/makers-collective-demo/src/branch/session-0002/specs/hearth-platform-v1.md
>
> Iteration 25: **Profiles management + modules-by-level + spec alignment.**
> (a) "Your profiles" view (entry: topbar avatar): base profile card, three typed-
> profile cards (modules-on-profile chips, worn-by lists), per-space override rows
> (SAM/Loop/DAI/PFM — incl. "some fields set by the space" for company), starting-
> point-never-a-cage rule card. (b) Module studio reorganized by attachment level:
> Space modules / Profile modules (Favorites moved + new Experience, Catalog cards)
> / Personal modules & integrations. (c) Operator asked "anything not displayed
> well?" — biggest finding: demo contradicted its own spec invariants (OHM audit
> fixes never applied). Fixed: Loop public follower/view counts removed (INV-11,
> "curator pick" replaces view counts), mod-facing nudge tally removed (INV-3,
> "not even as counts"), Tool Library item now pinned/opt-in (INV-7), link-scan
> third-party notification now marked as inference + narrow logged rule exception
> (relationality). Remaining known gaps (not yet built, offered to operator):
> sign-in/magic-link mock (F1's surface), member-side report buttons + appeal
> surface, module version-pinning UI in a space's admin, export/leave-space
> surface (exit & portability), wizard control for allowed profile modules,
> "chronological" chip on Your feed.
>
> Iteration 26: **Typed-profile editors** (operator). All three typed-profile cards
> on Your profiles now open editing experiences: Professional (identity fields,
> Experience entry editor, **Catalog module w/ Shopify connector card** — synced-2h-
> ago/source-of-truth/Sync-now — and product data rows with per-product provenance
> badges Shopify-synced vs manual + a draft item; Favorites editor; aside: module
> switches, worn-where visibility, Preview-as-a-connection), Social (handle,
> Photo grid/Clips/Catalog-off switches, counts-private note), Family (name-only,
> Albums switch, protected-by-construction card: never in search/suggestions, no
> cross-type module reads).
>
> Iteration 27: **Slogan adopted** — operator proposed "Your Social Platform";
> discussed (the "Your" is the load-bearing ownership word, "platform" is
> industry-speak vs the brand's domestic voice); operator chose the offered
> alternative **"Your social life, in one place."** Placed: page <title>, Spaces
> hub tagline (italic serif under the h1 — the app's opening view), About header +
> overview lead sentence, first-run welcome line. "Your Social Platform" retained
> as pitch-deck positioning language (not in demo). Spec §1.1/§2 can absorb the
> slogan at review.
>
> Iteration 28: operator couldn't find the admin page (ctx-scoped to SAM's nav;
> hub-opening made it less discoverable). Explained the three paths; fixed the
> gap: SAM's hub card now shows "· admin" on the persona chip + a "⚑ Admin · 3
> waiting" shortcut for spaces you steward.
>
> Iteration 29: renamed **Openwork → Work** (operator) — 15 occurrences + OW→Wk
> tiles; big-three consumer spaces now read Lens · Loop · Work.
>
> Iteration 30: operator caught tile-casing inconsistency (LP vs Ln/Wk — edit-
> history accident). Rule adopted: SPACE tiles all-caps (LN/LP/WK, matching
> SAM/PFM/DAI/SW/MF); mixed-case reserved for module (Sy/Fv) and profile-type
> (Pr/So/Fa) tiles as a category signal.
>
> Iteration 31: **Hearth logo** (operator: what's the IG-camera equivalent?).
> Designed the mark: arched fireplace opening + flame + hearthstone baseline,
> three strokes in the demo's round-capped line style; clay accent color; flame-
> alone is the tiny-size variant. Added as i-hearth symbol + rendered in the
> topbar wordmark. Rationale: like IG's camera, it's the object the app is named
> for, drawn nameably simple ("the little fireplace").
>
> ## Deferred decisions (appended)
>
> - Spec authored at PLATFORM (epic) altitude without an eligible non-epic anchor
>   issue — deliberate operator-directed override of handbook §4.3 R1 ("capture
>   Hearth as one very detailed document"). Mitigation: §7.1 carries the F1–F15
>   Feature decomposition; the Hearth Epic + child Features still need capturing
>   on the tracker (wgl-capture), with #1 slotting in as F1.

## Deferred decisions

_Autonomous-mode low-confidence calls the driver made and would have
liked operator input on. Appended as the session runs; surfaced at
finalize. Empty if none._
