Version: v1 · 2026-04-21 · SCOUT
Status: design spec — ready for HERALD review
Companion plan: EMERGENT-CONSTELLATION-PLAN-2026-04-21.md
Relationship: the Tree is the user's felt sense of their own growth. The Constellation is the analytical map. Same underlying data; different metaphorical register.
---
The Constellation externalizes pattern — it shows the user a map of what they keep returning to. That is a cognitive artifact. The Tree externalizes vitality — it shows the user that something is growing because of the time they've given it. That is an emotional artifact.
These are not redundant. Research on metaphor in health communication (PubMed 27869576, 2016) establishes that conceptual metaphors reduce stigma and increase engagement precisely because they bypass the analytical frame. The Constellation talks to the user's noticing-self. The Tree talks to their nurturing-self.
Visual metaphor research verdict (addressed below in Section 7): plant/growth metaphors outperform points and levels for long-term intrinsic motivation in wellness contexts. They outperform animal companions because animals require feeding and die, introducing loss-aversion dynamics that this product explicitly rejects. The tree grows; it does not die.
---
The tree is fed by meaningful engagement, not by time or volume. Specifically:
| Trigger | Why it qualifies |
|---|---|
| Completing a meaningful conversational turn (depth-tagged by LLM as disclosure level 3+) | Measures actual inner work, not clicks |
| Returning after an absence of 4+ days | Non-punitive; the return itself is the act, not the streak |
| First time a named theme is introduced (the corresponding star is born) | Marks genuine expansion of scope |
| Setting a monthly Intention Word | Deliberate self-direction act (from Constellation B6) |
| Crossing a Threshold (first grief named, first boundary set, first "I was wrong," first dream logged) | Van Gennep threshold; already tracked by Constellation |
| An insight preserved to the Library (user saves a passage or their own sentence) | Marks the moment inner knowing becomes held knowledge |
| Completing an Echo-Week reflection (engaging with a quote-back) | Return to past self; narrative coherence act |
The bar is not high — a single honest sentence in a real conversation qualifies. But it cannot be gamed by volume.
---
Each stage is a discrete SVG illustration (see Section 6 for structural sketch of stages 1–4).
| Stage | Name | Condition | Visual |
|---|---|---|---|
| 1 | Seed | Account created, 0 conversations | A small oval seed, no ground visible, neutral warm palette |
| 2 | Sprout | First conversation completed | Seed cracked, single curved shoot with one small leaf |
| 3 | Seedling | 3+ meaningful turns (disclosure level 3+) | 10–15cm shoot, two or three leaves, visible soil line |
| 4 | Young Sapling | First Threshold crossed | Distinct trunk beginning, 4–6 leaves, small root suggestion below soil |
| 5 | Branching | 10+ unique themes in Constellation | First fork in the trunk, two branches, leaves on both |
| 6 | Flowering | First insight preserved to Library | Full small tree with 3–4 branches, single blossom cluster visible |
| 7 | Mature | 3+ months of at least one meaningful turn per week (not consecutive — rolling window) | Full canopy, visible root base, seasonal bloom possible |
Stage transitions are permanent and cannot regress. The user never goes backward. A long absence does not wither the tree — it simply pauses new growth until they return.
Stage 7 does not mean "finished." After Mature, seasonal bloom events are possible (see Section 5). The tree keeps being the tree.
---
Primary home: /garden route.
A dedicated, quiet page. The tree is centered, large, uncluttered. Below the tree: the date the seed was planted. Above or beside it: the current stage name in small type (optional, can be hidden). No numbers. No bars. No counters.
Secondary presence: profile tile on /home or /me.
A small thumbnail of the current tree stage — roughly 80×80px — shown as a decorative element, not a score. Tapping it navigates to /garden.
Not in the chat UI. The chat remains a clean conversational space. The tree lives outside it. The user goes to the garden; the garden does not intrude on the conversation.
---
Tapping or clicking the tree on /garden opens a quiet log — a private feed of the events that fed it, in reverse chronological order. Each entry is a single line:
No scores, no XP labels, no share buttons on individual items. The log is a personal record, readable only by the user.
The user can optionally tap any log entry to see the conversation turn that produced it (if it was turn-based), or the exact text they saved (if Library-based).
There is no social sharing from the /garden page by default (see M3 for opt-in export).
---
Certain Threshold crossings (tracked by the Constellation's Threshold Ceremonies mechanism, B1) trigger a temporary "bloom" event on the tree. This is not a new stage; it is a visual accent that persists for 72 hours after the event.
Bloom triggers:
The bloom is a small cluster of petals or flowers that appears at the current highest branch. After 72 hours the bloom gently fades; the tree remains at its current stage. No notification is sent. The user discovers it when they visit the garden.
This is the Van Gennep principle applied visually: the threshold is honored quietly, not announced.
---
Option A (preferred): Extend user profile.
The existing DynamoDB user-profile table (already in use for Constellation tag storage) gains a new growth map:
"growth": {
"stage": 3,
"units": 11,
"events": [
{ "type": "threshold_grief", "ts": 1713654000 },
{ "type": "return_after_gap", "ts": 1713567600 },
{ "type": "meaningful_turn", "ts": 1713481200 }
],
"bloom_active_until": null,
"planted_at": 1712448000
}
Option B: New table innerverse-growth.
Use if growth event volume grows large enough to need independent read/write capacity. Probably unnecessary until M2.
Stage computation: server-side Lambda computes current stage deterministically from events array on each profile read. No stage stored directly — it is derived, so it cannot drift out of sync.
Growth unit emission: the same Lambda that currently writes Constellation theme tags (post-turn processing) additionally evaluates whether the turn qualifies as a growth trigger and appends to events if so.
/garden route: a new React page. Tree is an inline SVG React component (<TreeStage stage={n} bloomActive={bool} />). Each stage is a separate SVG defined in a single file with named <g> layers (see SVG sketch below). Stage transitions animate with a 1.2s opacity-fade + subtle upward translate on new elements. Library: Framer Motion or CSS transitions — no heavy dependency needed.
Profile tile: same component, constrained to 80px viewBox, no animation, no interactive state.
This is the element architecture — not production artwork, but the structural contract for the illustrator and the dev.
<!-- Stage 1: Seed -->
<svg viewBox="0 0 200 300" xmlns="http://www.w3.org/2000/svg">
<g id="ground" opacity="0">
<!-- hidden at stage 1 -->
</g>
<g id="seed">
<ellipse cx="100" cy="240" rx="18" ry="22"
fill="#8B6914" stroke="#5C4008" stroke-width="2"/>
<!-- subtle highlight -->
<ellipse cx="94" cy="234" rx="6" ry="8" fill="#A07820" opacity="0.5"/>
</g>
</svg>
<!-- Stage 2: Sprout -->
<svg viewBox="0 0 200 300" xmlns="http://www.w3.org/2000/svg">
<g id="ground">
<rect x="20" y="255" width="160" height="45"
fill="#4A3728" rx="4"/>
<!-- surface line -->
<line x1="20" y1="255" x2="180" y2="255"
stroke="#6B4F3A" stroke-width="1.5"/>
</g>
<g id="seed-cracked">
<ellipse cx="100" cy="258" rx="14" ry="9"
fill="#8B6914"/>
<!-- crack lines -->
<path d="M93 252 L100 258 L107 252" fill="none"
stroke="#5C4008" stroke-width="1.5"/>
</g>
<g id="shoot">
<!-- main stem -->
<path d="M100 255 C98 230 102 210 100 190"
fill="none" stroke="#4A7C3F" stroke-width="3"
stroke-linecap="round"/>
<!-- single leaf, left -->
<path d="M100 210 C88 200 82 192 86 184
C90 184 98 196 100 200 Z"
fill="#5A9E4F" stroke="#3D7035" stroke-width="1"/>
</g>
</svg>
<!-- Stage 3: Seedling -->
<svg viewBox="0 0 200 300" xmlns="http://www.w3.org/2000/svg">
<g id="ground">
<rect x="20" y="255" width="160" height="45"
fill="#4A3728" rx="4"/>
<line x1="20" y1="255" x2="180" y2="255"
stroke="#6B4F3A" stroke-width="1.5"/>
</g>
<g id="trunk">
<path d="M100 255 C97 225 103 195 100 165"
fill="none" stroke="#5C3D1A" stroke-width="5"
stroke-linecap="round"/>
</g>
<g id="leaves">
<!-- leaf 1 left -->
<path d="M100 210 C82 198 76 184 80 172
C88 172 98 194 100 200 Z"
fill="#5A9E4F" stroke="#3D7035" stroke-width="1"/>
<!-- leaf 2 right -->
<path d="M100 195 C118 183 124 170 120 158
C112 158 102 180 100 186 Z"
fill="#6AB55A" stroke="#3D7035" stroke-width="1"/>
<!-- leaf 3 top -->
<path d="M100 168 C92 158 90 146 94 140
C100 142 104 158 100 165 Z"
fill="#5A9E4F" stroke="#3D7035" stroke-width="1"/>
</g>
</svg>
<!-- Stage 4: Young Sapling -->
<svg viewBox="0 0 200 300" xmlns="http://www.w3.org/2000/svg">
<g id="ground">
<rect x="20" y="255" width="160" height="45"
fill="#4A3728" rx="4"/>
<line x1="20" y1="255" x2="180" y2="255"
stroke="#6B4F3A" stroke-width="1.5"/>
<!-- root suggestion -->
<path d="M90 258 C82 262 74 266 68 270"
fill="none" stroke="#5C3D1A" stroke-width="2.5"
stroke-linecap="round" opacity="0.7"/>
<path d="M110 258 C118 262 126 268 130 274"
fill="none" stroke="#5C3D1A" stroke-width="2.5"
stroke-linecap="round" opacity="0.7"/>
</g>
<g id="trunk">
<!-- tapered trunk — wider at base -->
<path d="M94 255 C91 220 97 185 100 145"
fill="none" stroke="#6B4520" stroke-width="8"
stroke-linecap="round"/>
<path d="M106 255 C109 220 103 185 100 145"
fill="none" stroke="#6B4520" stroke-width="8"
stroke-linecap="round"/>
</g>
<g id="branches">
<!-- left branch -->
<path d="M100 175 C90 162 78 155 68 152"
fill="none" stroke="#5C3D1A" stroke-width="4"
stroke-linecap="round"/>
<!-- right branch -->
<path d="M100 165 C112 150 122 144 132 140"
fill="none" stroke="#5C3D1A" stroke-width="4"
stroke-linecap="round"/>
</g>
<g id="leaves">
<!-- cluster left branch -->
<circle cx="68" cy="148" r="14" fill="#5A9E4F" opacity="0.9"/>
<circle cx="60" cy="140" r="10" fill="#6AB55A" opacity="0.85"/>
<circle cx="76" cy="138" r="9" fill="#4E8C45" opacity="0.9"/>
<!-- cluster right branch -->
<circle cx="134" cy="136" r="14" fill="#5A9E4F" opacity="0.9"/>
<circle cx="142" cy="128" r="10" fill="#6AB55A" opacity="0.85"/>
<circle cx="126" cy="128" r="9" fill="#4E8C45" opacity="0.9"/>
<!-- top tuft -->
<circle cx="100" cy="140" r="12" fill="#5A9E4F" opacity="0.95"/>
<circle cx="100" cy="130" r="9" fill="#6AB55A" opacity="0.85"/>
</g>
</svg>
Stages 5–7 extend this pattern: stage 5 adds a second trunk fork and additional branch pairs; stage 6 adds a <g id="bloom"> layer with petal circles in warm pink/white on the highest branch cluster; stage 7 widens the canopy, deepens the root system visibility, and optionally introduces a subtle ambient particle animation (falling petals, via CSS @keyframes on cloned <circle> elements with staggered animation-delay).
---
Three sources examined:
Source 1: Forest app (forest.app, 2024). The tree metaphor drives 4M+ active users primarily through loss aversion — the tree dies if you leave. That mechanism is explicitly off-limits for Silent Infinity (Constellation plan C1, Neff self-compassion framing). However, Forest proves the metaphor is legible, beloved, and motivating at scale without being abstract. The affective hook is not the punishment — it is the living thing you made. Silent Infinity takes the positive side of that hook without the negative.
Source 2: Finch self-care app (4.95 stars, 550K+ reviews, 2024, per Calmevo review). Finch's bird is non-punishing — it never dies. It succeeds because the companion metaphor triggers nurturing motivation. However, animal companions introduce attachment anxiety (will it be okay if I don't check in?) and personhood projection (I'm neglecting my bird). For a contemplative app used during emotionally vulnerable states, that projected guilt is a contraindication. The tree avoids this: plants are patient, plants don't suffer, the user's absence doesn't hurt anything. Biophilia research (Wilson 1984) suggests humans feel genuine affiliation with growing things without anthropomorphizing them into dependents.
Source 3: PubMed 27869576 (Journal of Computer-Mediated Communication, 2016) on visual metaphors in mental health communication. Conceptual metaphors — particularly growth/flourishing metaphors — led to greater message engagement and reduced stigma compared to abstract representations. The growth-from-seed arc is a culturally cross-contextual metaphor for development that does not require explanation. It is also non-comparative: my tree is not measured against yours. This aligns with Constellation plan C2 (no leaderboards) and Deci's finding that comparative feedback destroys intrinsic motivation.
Verdict: a tree or plant metaphor has stronger research alignment with this product's ethical stance than an animal companion (which requires non-neglect motivation) or a character/avatar (which introduces comparison and costume arms races). The non-dying, patiently growing plant is structurally congruent with the no-streak, no-shame, no-punishment ethic of the Constellation plan.
---
| Dimension | Constellation | Tree |
|---|---|---|
| What it shows | Themes, patterns, avoidances | Vitality, growth, investment |
| Metaphorical register | Sky map, intellectual | Living organism, felt |
| Interaction mode | Exploratory (click stars, read turns) | Contemplative (look at it) |
| Primary feed | LLM theme tags | Growth-trigger events |
| Data overlap | 100% — same events, different lens | |
| Where it lives | /me/constellation | /garden |
| Introduced | M1 of Constellation plan | M1 of this plan (parallel or M2) |
These two features share the same underlying event table. No duplicate storage. The Constellation's threshold events and Echo-Week completions are already being written; the growth Lambda listens on the same stream and appends to growth.events.
---
growth.stage) may be aggregated across all users for product health metrics (e.g., "% of users at Stage 2+"), but individual event logs are not.growth map permanently (same as Constellation).---
growth map appended to existing DynamoDB user-profile; 3 trigger types wired (meaningful turn, first conversation, return-after-gap)/garden route with SVG stages 1–3; profile thumbnailDependencies: Constellation M0 must be complete (turn-tagger live) as growth wires to the same tagging Lambda.
---
1. Stage names — the names listed above (Seed, Sprout, Seedling, etc.) are working labels. Should the user ever see the stage name, or only the visual? The Constellation deliberately avoids naming levels. Consider whether stage names are ever surfaced or stay as internal identifiers only.
2. Meaningful turn threshold — "disclosure level 3+" is a proposed bar. This requires calibration with whatever scoring the LLM uses for Mirror Index. What disclosure level is right? Too low and a one-sentence check-in feeds the tree; too high and long-term casual users feel invisible growth.
3. Multiple plants or one tree — one tree per user keeps it simple and personally significant. A future direction (post-M3) could allow the user to have one plant per active Intention Word, forming a small garden over time. Not recommended for M1-M2; mentioned here for design memory.
4. Theming — does the tree follow the app's existing visual theme, or does it have its own earthy/natural palette that intentionally contrasts with the dark/contemplative UI? The contrast may be beneficial (the garden as a place you visit, distinct in feel from the mirror).
---
> The Constellation shows the user the map of what they keep returning to. The Tree shows them that something is alive because they kept returning.
— SCOUT
2026-04-21