Signals 1.4.0
Minimal local aggregates that feed deterministic policy; they are observations, never DOM mutations.
Signal contract
| Signal | Shape / meaning | Privacy |
|---|---|---|
viewport | { width, height } | Local aggregate |
prefersReducedMotion | Boolean media preference | Local preference |
prefersContrast | more / less / no-preference | Local preference |
scrollDepth | 0…1 aggregate | No page text |
ctaClicks | Count per semantic role | No target content |
returnVisit | Boolean | No cross-site identifier |
Collection and flow
collectSignals() produces policy input. Signals → Policy → Intent → Validator → Guardrails → Semantic Apply → Audit / Undo.
Allowed and forbidden
| Allowed | Forbidden |
|---|---|
| Viewport buckets, preferences, counts | Keystrokes or form values |
| Short-lived in-memory aggregates | Full URL query PII or screenshots |
| Explicit host-provided overrides | Unrestricted DOM serialization or tracking IDs |
Limits
Signals do not select a mutation directly. Policy emits candidates, and every candidate still passes validation and guardrails.