The AtmosphereConf talks your skyline missed
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

docs(spec): network attention display review round 1

- Simplify 'missed' detail text to static 'Your network missed this'
(attentionInverse is always 1.0 for missed state, so percentage is
always 100% and adds no information).
- Use percentage for 'engaged' state instead: 'X% of your network
missed this' — the gradient IS meaningful there.
- Add className='h-full' to LumeCard in code snippet.
- Add note to copy card content JSX from existing page.tsx.
- Fix prose contradiction about unauthenticated fetch behavior.

+10 -7
+10 -7
docs/superpowers/specs/2026-04-10-network-attention-display.md
··· 140 140 {scoredTalks.map(({ talk, score }, index) => ( 141 141 <Link key={talk.rkey} href={`/talk/${talk.rkey}`}> 142 142 <LumeCard 143 + className="h-full" 143 144 glowIntensity={score?.intensity ?? 0} 144 145 tileIndex={index} 145 146 score={score} 146 147 > 147 - {/* Card content: speakers, title, chips — same as current */} 148 + {/* Card content: speakers, title, room chip, duration chip. 149 + Copy the existing JSX from talks/page.tsx (the <div className="p-5"> 150 + block with speakers, h2 title, and metadata chips). */} 148 151 </LumeCard> 149 152 </Link> 150 153 ))} ··· 179 182 180 183 | `score.state` | Text | Color | 181 184 |---|---|---| 182 - | `"missed"` | `"{X}% of your network missed this"` | `text-primary-fixed` (mint) | 183 - | `"engaged"` | `"Discussed by {N} of {T} follows"` | `text-on-surface-variant` (muted) | 185 + | `"missed"` | `"Your network missed this"` | `text-primary-fixed` (mint) | 186 + | `"engaged"` | `"{X}% of your network missed this"` | `text-on-surface-variant` (muted) | 184 187 | `"unknown"` | (no detail strip) | — | 185 188 | `null` | (no detail strip) | — | 186 189 187 190 Where: 188 - - `X` = `Math.round(score.layer1.attentionInverse * 100)` — e.g., 97 189 - - `N` = `score.layer1.uniqueFollows` — e.g., 3 190 - - `T` = `score.layer1.totalFollows` — e.g., 423 191 + - `X` = `Math.round(score.layer1.attentionInverse * 100)` — e.g., 83 192 + 193 + **Why no percentage for "missed":** The `missed` state means `uniqueFollows === 0`, so `attentionInverse` is always exactly `1.0` — the percentage would always read "100%". A static message is clearer and avoids pointless math. For `engaged` talks, the percentage IS meaningful: "83% of your network missed this" conveys the gradient between "almost nobody talked about it" and "most of your follows discussed it." 191 194 192 195 **Interaction:** 193 196 - Desktop: detail appears on `:hover` via CSS transition (opacity 0 → 1, translateY(4px) → 0). No JavaScript state needed. ··· 242 245 243 246 ## 8. Edge Cases 244 247 245 - - **Not authenticated:** Grid renders without scores. No `/api/crawl` call is made (the hook fetches, gets 401, sets `mentions=null`). Same as today. 248 + - **Not authenticated:** Grid renders without scores. The hook fires `fetch("/api/crawl")` which returns 401; the hook treats this as "no data" and sets `mentions=null`. Same visual as today. 246 249 - **Zero follows:** `/api/crawl` returns `followCount: 0`. `rankTalks` produces all `unknown` states. Grid renders without glow. Acceptable — the user needs follows for the scoring to be meaningful. 247 250 - **Crawl timeout (30s):** `/api/crawl` returns 504. Hook receives error. Grid stays in Phase 1. 248 251 - **Partial crawl data:** Some talks have mentions, some don't (out-of-scope talks). `rankTalks` classifies absent talks as `unknown`. They sort to the bottom.