Patch Changes
-
6c8c956: Attribution:
feedback()gains the fact tables that have no verdict of their own.flightscounts, per async source, flights started, landed, and abandoned (superseded by a newer flight before landing — the re-ask-on-every-keystroke signature) with landed wall time.fallbacksmeasures, per loading boundary (named by owner path), how many times and for how long its fallback was shown and how many shows were sub-150ms flashes — the other end of the SILENT_HOLD spectrum.sourcesrows gainlate/lateMs: acknowledged holds that still ran pastholds.infoMs, where the affordance is not the whole answer. NewAttributionHooks.boundaryFallbackhook point at the boundary's source-set transitions.@solidjs/diagnosticsexports theFlightStatsandFallbackStatstypes; artifacts and the bridge carry the new tables through the existingfeedbackfield. -
d5aba4b:
WIDE_WRITEandHOT_SCOPE_FANOUTdiagnostics, and the reactivity-diagnostics and agent-loops skills, now prescribe a projection (createProjection, or acreateStore(fn)keyed by id) as the fan-out repair. They previously named an API that is not part of 2.0 (#3304). -
1a1e2f2: Diagnostics: the responsiveness gate — holds and feedback in the artifact,
expectNoSilentHolds, and Loop 4.The artifact (format v2) now carries
attribution.holds— every transition hold the scenario caused, with the held writes, the blockers, the wait measured from the interaction, and which affordances acknowledged it — andattribution.feedback, the rankedsources/interactionstables folded from them. JSONL egress emitsholdandfeedbackrecords; the browser bridge and the/__solid/diagnosticsprotocol gainholds()andfeedback()live queries.New gates:
expectNoSilentHolds(artifact, { maxSilentMs })fails on any hold the screen never acknowledged (noisPending()/latest()reader, no optimistic value, noaffects()mark, nothing painted) with the interaction, held write, blocker, and duration as evidence;expectHoldBudget(artifact, ms, { source })bounds hold latency regardless of acknowledgment.ScenarioBudgetgainsmaxSilentHoldMsandmaxHoldMs; Vitest gainstoHaveNoSilentHolds()andtoStayWithinHoldBudget(ms). The agent-loops skill gains "Loop 4 — Responsiveness": readfeedback.sourcesfirst, repair by shape (isPending→latest→createOptimistic), and the explicit anti-repair — never make the gate pass by moving the write off the async path. TypesHoldEvent,ChangeOrigin,AttributionFeedback,FeedbackSource,FeedbackInteractionare exported. -
f4d3c87: Responsiveness thresholds and the LONG_HOLD diagnostic.
SILENT_HOLDdefaults tighten toholds: { infoMs: 100, warnMs: 200 }(from 300/500): RAIL's "feels instant" ceiling and the INP "good" ceiling. The engine measures to the commit, not the paint, so every number is a floor on what the user saw; the console's thresholds now sit at the strict end of the band.- New
LONG_HOLD(responsivenesskind): an acknowledged hold whose quiescent tail — from the last write to join it to the commit — reachedlongHolds.infoMs(default 500ms),warnfromlongHolds.warnMs(1000ms). Measured from the last join so a hold that keeps taking input is judged by each wait, not its lifetime. The repair is a fallback: aLoadingboundary keyed withon(a revealed boundary withoutonkeeps the old content — that is the hold), a fresh boundary, or making the data fast. A silent long hold stays oneSILENT_HOLDwith the same repair appended anddata.long: true. HoldEvent.tailMsadded;holdMsnow runs from the interaction dispatch or the first parked flush, whichever is earlier (a node rewritten mid-hold keeps only its latest record, so the flush clock keeps the first wait from being forgotten).ChangeRecord.atstamps root writes.feedback().sources[].late/lateMsreplaced bylong/longMs: holds whose tail reached the long-hold threshold, acknowledged or not.@solidjs/diagnosticsartifact format version 3 (tailMson holds,long/longMson sources); hold evidence in assertion failures includestailMs.RerunEvent.phasevalue"transition"renamed to"held"("plain" | "held" | "optimistic") — the dev surface uses one word for the state.
-
Updated dependencies [215de3b]
-
Updated dependencies [6c8c956]
-
Updated dependencies [1a1e2f2]
-
Updated dependencies [7c14e23]
-
Updated dependencies [ef2b02c]
-
Updated dependencies [c6c415b]
-
Updated dependencies [6c8c956]
-
Updated dependencies [d5aba4b]
-
Updated dependencies [3ae0ca0]
-
Updated dependencies [ae46c92]
-
Updated dependencies [6c8c956]
-
Updated dependencies [1a1e2f2]
-
Updated dependencies [f98bd77]
-
Updated dependencies [fc7e626]
-
Updated dependencies [d50e855]
-
Updated dependencies [8f9f369]
-
Updated dependencies [c531e2a]
-
Updated dependencies [aed21ac]
-
Updated dependencies [b3c94be]
-
Updated dependencies [0653673]
-
Updated dependencies [6c8c956]
-
Updated dependencies [94fe5b4]
-
Updated dependencies [23477ae]
-
Updated dependencies [f4d3c87]
-
Updated dependencies [067e3bc]
-
Updated dependencies [8a65e5e]
-
Updated dependencies [f24e53d]
-
Updated dependencies [fa568d3]
-
Updated dependencies [d601119]
-
Updated dependencies [ac5159a]
-
Updated dependencies [de1c8b5]
-
Updated dependencies [c07a044]
-
Updated dependencies [01e3a57]
-
Updated dependencies [e346e61]
-
Updated dependencies [713a910]
-
Updated dependencies [e346e61]
-
Updated dependencies [0255729]
-
Updated dependencies [6c8c956]
- @solidjs/signals@2.0.0-rc.7