fix(think): gate level:low facets out of activity creation; per-facet descriptions
ActivityStateMachine.update treated every sense facet as activity-worthy and
stamped the segment-level activity_summary onto every record. A code-signing
segment with five facets produced five activity records — two of them
peripheral (level:low) — all sharing the dominant work summary.
Two surgical changes in update():
- Exclude any facet whose raw level is exactly "low" when building
current_facets, so it is treated identically to an absent facet: it never
creates or continues an activity, and a previously-active facet that drops
to low winds down through the existing 2-segment facet-gone hysteresis
(no new/abrupt end path). Missing/invalid level still normalizes to medium
and stays engaged.
- Source each record's description from that facet's own facets[i].activity,
falling back to activity_summary only when the per-facet text is
missing/empty.
Forward-behavior only; already-written records are unchanged. level_avg,
active_entities, idle/gap/type-change handling, and completed-record shape are
untouched for high/medium facets.
Tests: new TestLevelGate covers AC1-AC5 (the founder's example facet set,
per-facet vs distinct descriptions, summary fallback, drop-to-low hysteresis,
all-low wind-down). Reconciled six low->medium fixtures whose intent was
multi-facet/pipeline behavior, and three description assertions plus a
facet_activity test-helper param so the per-facet description source is proven.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>