ForgeKitFORGEKIT

Build Log

Known Lens Engine v0.2 — Product Glow Pass

June 27, 2026

Made the engine tell the truth: Handoff is now operational notes, Known Card is ruthless, What Helps gives exact words, and the Portrait finally shows who he actually is.

KnownProductLens Engine
3
new optional fields on KnownContextObject
3
new recent care observation seed objects
6
lens sections restructured or fixed
1
new helper: isRecentCareObservation()
0
new product surfaces added

Timeline

Start
Read all four files + prior retro
Loaded session context, confirmed prototype route structure, checked previous session outputs
10m
Product review written before touching code
Six-question analysis of each tab: useful / weird / repeated / missing / too broad / not actionable
20m
Zeb confirmed review, added guardrails
Avoid brittle string extraction. Add cardLabel/suggestedPhrase/offerableCue instead. Differentiate seed data — don't make everything daysAgo(1).
30m
types.ts updated
Three optional fields added to KnownContextObject. WhatHelpsCard rebuilt with six structured sections.
45m
data.ts rewritten
Standing context pushed to 15–45 days old. Three new recent care observations (ctx-021/022/023) with change_signal tags and cardLabel/suggestedPhrase/offerableCue.
60m
lenses.ts rewritten
All five fixes applied: Handoff (isRecentCareObservation), Known Card (caps + cardLabel), What Helps (six sections), Portrait (identity tags), groupBy generic fixed.
75m
page.tsx rebuilt
All six view components updated for new WhatHelpsCard shape. Print polish: debug hidden, underlined tabs, calmer headings, max-width content column.
80m
tsc clean, build clean, 200
One TypeScript error (groupBy generic constraint) caught and fixed. All checks pass.

What shipped

Added optional fields to KnownContextObject: cardLabel (short topic label), suggestedPhrase (exact words to use), offerableCue (physical/sensory thing to offer)

Rebuilt WhatHelpsCard type: whatMayBeHappening, doNotSay, trySaying, tryOffering, environmentalAdjustments, ifThisKeepsHappening

Differentiated seed data: standing context (15–45 days old) vs recent care observations (1–2 days old)

Added ctx-021: yesterday shower went better after coffee — change_signal + observed improvement

Added ctx-022: wife-asking pattern after lunch increasing this week — change_signal + handoff note

Added ctx-023: TV caused visible agitation today, settled after it was turned off — change_signal + trigger

Added isRecentCareObservation() helper: gates Handoff content to caregiver_observation and handoff_note sources only

Known Card: youShouldKnow widened (boundary/dignity now included), sections capped at 3, safeTopics uses cardLabel not full guidance, whatHelps uses offerableCue first

What Helps: six structured sections with exact phrases quoted in UI, trySaying shows only objects with suggestedPhrase

Portrait: whoHeIs changed from emotionalTone === 'identity' to tags.includes('identity') — now shows actual identity facts

Handoff: isRecentCareObservation() gates all content, fallback to repeated-pattern calming cues only if no recent observations

Print polish: debug info hidden in print via print:hidden, underlined tab nav, calmer headings, max-width content column

Fixed groupBy generic constraint (Record<string, unknown> → T) so it accepts typed interfaces

tsc --noEmit: 0 errors. npm run build: clean. GET /known/prototype: 200

The danger now is not 'can we build it?' The danger is accidentally building a clever renderer that produces bad care artifacts.

Zeb's pre-session direction — on why the glow pass comes before the brand pass