@mongrov/analytics 0.23.2 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/migrations.d.ts.map +1 -1
- package/dist/core/migrations.js +35 -0
- package/dist/core/migrations.js.map +1 -1
- package/dist/core/reading-quality.d.ts +90 -0
- package/dist/core/reading-quality.d.ts.map +1 -0
- package/dist/core/reading-quality.js +247 -0
- package/dist/core/reading-quality.js.map +1 -0
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +5 -2
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/warehouse.d.ts.map +1 -1
- package/dist/core/warehouse.js +21 -0
- package/dist/core/warehouse.js.map +1 -1
- package/dist/rules/compiler.d.ts.map +1 -1
- package/dist/rules/compiler.js +4 -1
- package/dist/rules/compiler.js.map +1 -1
- package/dist/sync/baseline-compute.d.ts.map +1 -1
- package/dist/sync/baseline-compute.js +4 -1
- package/dist/sync/baseline-compute.js.map +1 -1
- package/dist/sync/factory.d.ts +7 -0
- package/dist/sync/factory.d.ts.map +1 -1
- package/dist/sync/factory.js +31 -1
- package/dist/sync/factory.js.map +1 -1
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mapper/firmware.d.ts.map +1 -1
- package/dist/sync/mapper/firmware.js +7 -5
- package/dist/sync/mapper/firmware.js.map +1 -1
- package/dist/sync/mapper/schema.d.ts +29 -36
- package/dist/sync/mapper/schema.d.ts.map +1 -1
- package/dist/sync/mapper/schema.js +11 -12
- package/dist/sync/mapper/schema.js.map +1 -1
- package/dist/sync/mapper/sleep.d.ts +50 -43
- package/dist/sync/mapper/sleep.d.ts.map +1 -1
- package/dist/sync/mapper/sleep.js +99 -138
- package/dist/sync/mapper/sleep.js.map +1 -1
- package/dist/sync/mapper/types.d.ts +17 -18
- package/dist/sync/mapper/types.d.ts.map +1 -1
- package/dist/sync/sleep-correction/classify.d.ts +86 -0
- package/dist/sync/sleep-correction/classify.d.ts.map +1 -0
- package/dist/sync/sleep-correction/classify.js +247 -0
- package/dist/sync/sleep-correction/classify.js.map +1 -0
- package/dist/sync/sleep-correction/correct.d.ts +46 -0
- package/dist/sync/sleep-correction/correct.d.ts.map +1 -0
- package/dist/sync/sleep-correction/correct.js +60 -0
- package/dist/sync/sleep-correction/correct.js.map +1 -0
- package/dist/sync/sleep-correction/index.d.ts +8 -0
- package/dist/sync/sleep-correction/index.d.ts.map +1 -0
- package/dist/sync/sleep-correction/index.js +8 -0
- package/dist/sync/sleep-correction/index.js.map +1 -0
- package/dist/sync/sleep-correction/night.d.ts +26 -0
- package/dist/sync/sleep-correction/night.d.ts.map +1 -0
- package/dist/sync/sleep-correction/night.js +48 -0
- package/dist/sync/sleep-correction/night.js.map +1 -0
- package/dist/sync/sleep-correction/orchestrate.d.ts +50 -0
- package/dist/sync/sleep-correction/orchestrate.d.ts.map +1 -0
- package/dist/sync/sleep-correction/orchestrate.js +57 -0
- package/dist/sync/sleep-correction/orchestrate.js.map +1 -0
- package/dist/sync/sleep-correction/settle.d.ts +24 -0
- package/dist/sync/sleep-correction/settle.d.ts.map +1 -0
- package/dist/sync/sleep-correction/settle.js +59 -0
- package/dist/sync/sleep-correction/settle.js.map +1 -0
- package/dist/sync/sleep-correction/sql.d.ts +44 -0
- package/dist/sync/sleep-correction/sql.d.ts.map +1 -0
- package/dist/sync/sleep-correction/sql.js +329 -0
- package/dist/sync/sleep-correction/sql.js.map +1 -0
- package/dist/sync/sleep-correction/staging.d.ts +32 -0
- package/dist/sync/sleep-correction/staging.d.ts.map +1 -0
- package/dist/sync/sleep-correction/staging.js +51 -0
- package/dist/sync/sleep-correction/staging.js.map +1 -0
- package/dist/sync/sleep-derive.d.ts +55 -0
- package/dist/sync/sleep-derive.d.ts.map +1 -0
- package/dist/sync/sleep-derive.js +180 -0
- package/dist/sync/sleep-derive.js.map +1 -0
- package/dist/tools/impls/anomaly.js +1 -1
- package/dist/tools/impls/compare.js +1 -1
- package/dist/tools/impls/hrv.js +1 -1
- package/dist/tools/impls/spo2.js +1 -1
- package/dist/tools/impls/temperature.js +1 -1
- package/package.json +3 -3
package/dist/core/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export { dismissInsight } from './insight';
|
|
|
17
17
|
export type { DismissInsightArgs, DismissInsightDeps } from './insight';
|
|
18
18
|
export { BASELINE_MIN_DAYS, BASELINE_WINDOW_DAYS, baselineAggregateFor, getBaselineMetricIds, } from './metric_metadata';
|
|
19
19
|
export type { BaselineDailyAggregate, BaselineWindowDays, } from './metric_metadata';
|
|
20
|
+
export { cleanViewFor, isQualityTable, PLAUSIBLE_RANGES, QUALITY_FLAG_COLUMNS, QUALITY_TABLES, qualityViewDdls, qualityViewFor, READING_QUALITY_COUNTS_SQL, readViewFor, } from './reading-quality';
|
|
21
|
+
export type { QualityTable, QualityView } from './reading-quality';
|
|
20
22
|
export { createSamplingResolver, fallbackSampling, minimumWindowMinutes, SAMPLING_CACHE_TTL_MS, } from './sampling';
|
|
21
23
|
export type { EffectiveSampling, SamplingResolver, SamplingResolverConfig, } from './sampling';
|
|
22
24
|
export { dropViewDdl, generateViewDdl, LOCAL_SCHEMAS, quoteQualifier, TABLE_NAMES, VIEWED_TABLES, watermarkColumnFor, } from './schemas';
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAIvD,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAGvE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAIvD,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAExB,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAE9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAGvE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EACV,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAI1B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,cAAc,EACd,0BAA0B,EAC1B,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKlE,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,YAAY,CAAA;AAUnB,OAAO,EACL,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAK5C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAGzD,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EACR,qBAAqB,EACrB,OAAO,EACP,WAAW,EACX,eAAe,EACf,OAAO,EACP,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAE1B,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA"}
|
package/dist/core/index.js
CHANGED
|
@@ -20,6 +20,9 @@ export { useAnalytics, useInsight, useTimeseries } from './hooks';
|
|
|
20
20
|
export { dismissInsight } from './insight';
|
|
21
21
|
// Baseline metadata (Sprint 5 §7).
|
|
22
22
|
export { BASELINE_MIN_DAYS, BASELINE_WINDOW_DAYS, baselineAggregateFor, getBaselineMetricIds, } from './metric_metadata';
|
|
23
|
+
// Signal-quality views (T-25, sprint6 §13). Claims read `v_{vital}_clean`;
|
|
24
|
+
// `v_{vital}_q` carries the per-reading flags for diagnostics and muted charts.
|
|
25
|
+
export { cleanViewFor, isQualityTable, PLAUSIBLE_RANGES, QUALITY_FLAG_COLUMNS, QUALITY_TABLES, qualityViewDdls, qualityViewFor, READING_QUALITY_COUNTS_SQL, readViewFor, } from './reading-quality';
|
|
23
26
|
// Effective sampling cadence (Sprint 5 T-41, principle 22). Chart data
|
|
24
27
|
// providers and gap detection should resolve cadence through this rather
|
|
25
28
|
// than reading metric_metadata directly.
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,sEAAsE;AACtE,oEAAoE;AACpE,8CAA8C;AAC9C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAOxB,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG9D,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAOjE,4CAA4C;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG1C,mCAAmC;AACnC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAM1B,uEAAuE;AACvE,yEAAyE;AACzE,yCAAyC;AACzC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAOnB,yEAAyE;AACzE,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EACL,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,sEAAsE;AACtE,wEAAwE;AACxE,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAuB5E,2EAA2E;AAC3E,6DAA6D;AAC7D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,sEAAsE;AACtE,oEAAoE;AACpE,8CAA8C;AAC9C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAOxB,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG9D,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAOjE,4CAA4C;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG1C,mCAAmC;AACnC,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAM1B,2EAA2E;AAC3E,gFAAgF;AAChF,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,cAAc,EACd,0BAA0B,EAC1B,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAG1B,uEAAuE;AACvE,yEAAyE;AACzE,yCAAyC;AACzC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,YAAY,CAAA;AAOnB,yEAAyE;AACzE,gEAAgE;AAChE,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EACL,WAAW,EACX,eAAe,EACf,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,WAAW,CAAA;AAGlB,sEAAsE;AACtE,wEAAwE;AACxE,mDAAmD;AACnD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAuB5E,2EAA2E;AAC3E,6DAA6D;AAC7D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,mBAAmB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrE;AAkDD,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrE;AAkDD,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAuRzC,CAAA;AAEF,uEAAuE;AACvE,eAAO,MAAM,eAAe,EAAE,MAA0B,CAAA;AAExD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAWD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAyCjC"}
|
package/dist/core/migrations.js
CHANGED
|
@@ -266,6 +266,41 @@ export const MIGRATIONS = Object.freeze([
|
|
|
266
266
|
await db.execute(`ALTER TABLE ${local}.temperature_v2 RENAME TO temperature;`);
|
|
267
267
|
},
|
|
268
268
|
},
|
|
269
|
+
{
|
|
270
|
+
version: 8,
|
|
271
|
+
name: 'sleep_session += settle_min, recovered_min; sleep_stage += source (sleep-correction §3)',
|
|
272
|
+
// The correction pipeline's per-night scalars and per-minute provenance.
|
|
273
|
+
// All three are nullable and appended last, so every existing row copies
|
|
274
|
+
// across unchanged and reads NULL for the new columns.
|
|
275
|
+
//
|
|
276
|
+
// Rebuild, not ALTER, for the same reason as 6 and 7: both tables carry a
|
|
277
|
+
// primary key, and a copy-and-swap is the path this file already trusts.
|
|
278
|
+
// Idempotent: a table that already has the new column is skipped.
|
|
279
|
+
//
|
|
280
|
+
// Local only, per the rule above. A remote catalog created before this has
|
|
281
|
+
// the old shapes; the `v_*` union reads `SELECT *` on both sides, so cloud
|
|
282
|
+
// sync needs the remote tables evolved server-side before it is switched
|
|
283
|
+
// on (sleep-correction §3 note). Cloud sync is off today.
|
|
284
|
+
async up(db, catalogs) {
|
|
285
|
+
const local = quoteQualifier(catalogs.local);
|
|
286
|
+
const additions = [
|
|
287
|
+
['sleep_session', 'settle_min'],
|
|
288
|
+
['sleep_stage', 'source'],
|
|
289
|
+
];
|
|
290
|
+
for (const [table, marker] of additions) {
|
|
291
|
+
const cols = await listColumns(db, catalogs.local, table);
|
|
292
|
+
if (cols.length === 0 || cols.includes(marker))
|
|
293
|
+
continue; // absent (migration 1 creates it new) or already migrated
|
|
294
|
+
const columnList = cols.join(', ');
|
|
295
|
+
await db.execute(`DROP TABLE IF EXISTS ${local}.${table}_v2;`);
|
|
296
|
+
await db.execute(LOCAL_SCHEMAS[table].replace(`CREATE TABLE ${table}`, `CREATE TABLE ${local}.${table}_v2`));
|
|
297
|
+
await db.execute(`INSERT INTO ${local}.${table}_v2 (${columnList}) `
|
|
298
|
+
+ `SELECT ${columnList} FROM ${local}.${table} ON CONFLICT DO NOTHING;`);
|
|
299
|
+
await db.execute(`DROP TABLE ${local}.${table};`);
|
|
300
|
+
await db.execute(`ALTER TABLE ${local}.${table}_v2 RENAME TO ${table};`);
|
|
301
|
+
}
|
|
302
|
+
},
|
|
303
|
+
},
|
|
269
304
|
]);
|
|
270
305
|
/** Version of the latest known migration — target for every attach. */
|
|
271
306
|
export const CURRENT_VERSION = MIGRATIONS.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal-quality flags and clean-read views (sprint6 spec §13, T-25).
|
|
3
|
+
*
|
|
4
|
+
* Alpha ships processed metrics, not raw firmware values: a user must never
|
|
5
|
+
* see a claim computed from a reading the ring could not honestly have taken
|
|
6
|
+
* — a temperature from a ring on the nightstand, a 10x Android decode, an
|
|
7
|
+
* SpO2 taken mid-gesture, one 190 bpm spike between two 60s.
|
|
8
|
+
*
|
|
9
|
+
* Two view layers per vital, on top of the `v_{table}` union views:
|
|
10
|
+
*
|
|
11
|
+
* v_{table}_q every reading + its flags (`worn`, `warm_up`, `still`,
|
|
12
|
+
* `plausible`, and `spike` / `scale_suspect` where they
|
|
13
|
+
* apply). Diagnostics read this.
|
|
14
|
+
* v_{table}_clean same columns as `v_{table}`, dirty readings removed.
|
|
15
|
+
* Baselines, rules, verdicts and narratives read this —
|
|
16
|
+
* the §13 consume rule.
|
|
17
|
+
*
|
|
18
|
+
* Why views and not flag columns written at ingest (§13a says "computed once
|
|
19
|
+
* at sync"):
|
|
20
|
+
* - Most flags need neighbours. A spike is judged against the readings
|
|
21
|
+
* either side; warm-up against the previous temperature. Sync is delta and
|
|
22
|
+
* rows are insert-only, so the neighbour that decides a flag often arrives
|
|
23
|
+
* in a LATER sync than the reading it decides.
|
|
24
|
+
* - Columns need a migration locally AND an ALTER on the remote Iceberg
|
|
25
|
+
* tables, which the device cannot issue; a local-only column breaks the
|
|
26
|
+
* `SELECT *` union in `v_{table}`.
|
|
27
|
+
* - Plausibility is a pure function of the value, so computing it at read
|
|
28
|
+
* time gives the same answer ingest would.
|
|
29
|
+
*
|
|
30
|
+
* Excluded readings are flagged, never deleted: the raw row stays in
|
|
31
|
+
* `v_{table}` for charts (which may mute or omit them) and diagnostics.
|
|
32
|
+
*
|
|
33
|
+
* The ring reports no wear signal, so `worn` comes from temperature: a
|
|
34
|
+
* reading below 30 C is ambient, not skin. A vital is judged by the latest
|
|
35
|
+
* temperature at or before it, and only if that temperature is recent — with
|
|
36
|
+
* no recent evidence the reading is assumed worn, because absence of a
|
|
37
|
+
* temperature is not evidence the ring was off.
|
|
38
|
+
*/
|
|
39
|
+
export declare const QUALITY_TABLES: readonly ["heart_rate", "hrv", "spo2", "temperature"];
|
|
40
|
+
export type QualityTable = (typeof QUALITY_TABLES)[number];
|
|
41
|
+
/** §13b clamps, inclusive. Outside ⇒ `plausible = false`. */
|
|
42
|
+
export declare const PLAUSIBLE_RANGES: {
|
|
43
|
+
readonly temp_c: readonly [30, 43];
|
|
44
|
+
readonly spo2: readonly [70, 100];
|
|
45
|
+
readonly bpm: readonly [30, 220];
|
|
46
|
+
readonly hrv_ms: readonly [5, 200];
|
|
47
|
+
};
|
|
48
|
+
/** Below this the ring is reading ambient air, not skin. */
|
|
49
|
+
export declare const WEAR_TEMP_MIN_C = 30;
|
|
50
|
+
/** How long a temperature reading counts as wear evidence for later vitals. */
|
|
51
|
+
export declare const WEAR_EVIDENCE_MINUTES = 60;
|
|
52
|
+
/** §13c: discard the first 10 minutes after the ring goes back on. */
|
|
53
|
+
export declare const WARM_UP_MINUTES = 10;
|
|
54
|
+
/** Same "still" test as rule context `resting` and the D-G resting metrics. */
|
|
55
|
+
export declare const STILL_WINDOW_MINUTES = 15;
|
|
56
|
+
/** §13c: a reading this far from BOTH neighbours is a single-slot spike. */
|
|
57
|
+
export declare const SPIKE_DELTA_BPM = 40;
|
|
58
|
+
/** Neighbours further apart than this are a gap, not neighbours. */
|
|
59
|
+
export declare const SPIKE_NEIGHBOUR_MINUTES = 60;
|
|
60
|
+
/** Flag columns each `_q` view adds, in order. The `_clean` view drops them. */
|
|
61
|
+
export declare const QUALITY_FLAG_COLUMNS: Readonly<Record<QualityTable, readonly string[]>>;
|
|
62
|
+
export declare function isQualityTable(table: string): table is QualityTable;
|
|
63
|
+
export declare function qualityViewFor(table: QualityTable): string;
|
|
64
|
+
export declare function cleanViewFor(table: QualityTable): string;
|
|
65
|
+
/**
|
|
66
|
+
* The view a claim-producing query reads for `table`: the clean view for a
|
|
67
|
+
* vital, the plain union view for everything else.
|
|
68
|
+
*/
|
|
69
|
+
export declare function readViewFor(table: string): string;
|
|
70
|
+
export interface QualityView {
|
|
71
|
+
name: string;
|
|
72
|
+
sql: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Every quality view, in creation order (each reads only earlier ones and
|
|
76
|
+
* the `v_{table}` union views). They carry no tenant literal — the union
|
|
77
|
+
* views underneath already bake it in — so they are recreated alongside them
|
|
78
|
+
* on every attach and need no context.
|
|
79
|
+
*/
|
|
80
|
+
export declare function qualityViewDdls(): QualityView[];
|
|
81
|
+
/** Reverse creation order, so no view is dropped while another reads it. */
|
|
82
|
+
export declare function qualityViewNames(): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Diagnostic count of excluded readings per vital and reason (§13d: a
|
|
85
|
+
* `scale_suspect` temperature surfaces here, never on a user-facing
|
|
86
|
+
* surface). Binds `$userId`, `$brand`, `$familyId`, `$days`. Counts are
|
|
87
|
+
* BIGINT. `moving` is reported for every vital but gates only SpO2 and HRV.
|
|
88
|
+
*/
|
|
89
|
+
export declare const READING_QUALITY_COUNTS_SQL: string;
|
|
90
|
+
//# sourceMappingURL=reading-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reading-quality.d.ts","sourceRoot":"","sources":["../../src/core/reading-quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAIH,eAAO,MAAM,cAAc,uDAAyF,CAAA;AACpH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAA;AAEV,4DAA4D;AAC5D,eAAO,MAAM,eAAe,KAAK,CAAA;AACjC,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,KAAK,CAAA;AACvC,sEAAsE;AACtE,eAAO,MAAM,eAAe,KAAK,CAAA;AACjC,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,KAAK,CAAA;AACtC,4EAA4E;AAC5E,eAAO,MAAM,eAAe,KAAK,CAAA;AACjC,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,KAAK,CAAA;AAEzC,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC,CAKlF,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AA2ID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAM/C;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAiBD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,QAKhB,CAAA"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Signal-quality flags and clean-read views (sprint6 spec §13, T-25).
|
|
3
|
+
*
|
|
4
|
+
* Alpha ships processed metrics, not raw firmware values: a user must never
|
|
5
|
+
* see a claim computed from a reading the ring could not honestly have taken
|
|
6
|
+
* — a temperature from a ring on the nightstand, a 10x Android decode, an
|
|
7
|
+
* SpO2 taken mid-gesture, one 190 bpm spike between two 60s.
|
|
8
|
+
*
|
|
9
|
+
* Two view layers per vital, on top of the `v_{table}` union views:
|
|
10
|
+
*
|
|
11
|
+
* v_{table}_q every reading + its flags (`worn`, `warm_up`, `still`,
|
|
12
|
+
* `plausible`, and `spike` / `scale_suspect` where they
|
|
13
|
+
* apply). Diagnostics read this.
|
|
14
|
+
* v_{table}_clean same columns as `v_{table}`, dirty readings removed.
|
|
15
|
+
* Baselines, rules, verdicts and narratives read this —
|
|
16
|
+
* the §13 consume rule.
|
|
17
|
+
*
|
|
18
|
+
* Why views and not flag columns written at ingest (§13a says "computed once
|
|
19
|
+
* at sync"):
|
|
20
|
+
* - Most flags need neighbours. A spike is judged against the readings
|
|
21
|
+
* either side; warm-up against the previous temperature. Sync is delta and
|
|
22
|
+
* rows are insert-only, so the neighbour that decides a flag often arrives
|
|
23
|
+
* in a LATER sync than the reading it decides.
|
|
24
|
+
* - Columns need a migration locally AND an ALTER on the remote Iceberg
|
|
25
|
+
* tables, which the device cannot issue; a local-only column breaks the
|
|
26
|
+
* `SELECT *` union in `v_{table}`.
|
|
27
|
+
* - Plausibility is a pure function of the value, so computing it at read
|
|
28
|
+
* time gives the same answer ingest would.
|
|
29
|
+
*
|
|
30
|
+
* Excluded readings are flagged, never deleted: the raw row stays in
|
|
31
|
+
* `v_{table}` for charts (which may mute or omit them) and diagnostics.
|
|
32
|
+
*
|
|
33
|
+
* The ring reports no wear signal, so `worn` comes from temperature: a
|
|
34
|
+
* reading below 30 C is ambient, not skin. A vital is judged by the latest
|
|
35
|
+
* temperature at or before it, and only if that temperature is recent — with
|
|
36
|
+
* no recent evidence the reading is assumed worn, because absence of a
|
|
37
|
+
* temperature is not evidence the ring was off.
|
|
38
|
+
*/
|
|
39
|
+
export const QUALITY_TABLES = ['heart_rate', 'hrv', 'spo2', 'temperature'];
|
|
40
|
+
/** §13b clamps, inclusive. Outside ⇒ `plausible = false`. */
|
|
41
|
+
export const PLAUSIBLE_RANGES = {
|
|
42
|
+
temp_c: [30, 43],
|
|
43
|
+
spo2: [70, 100],
|
|
44
|
+
bpm: [30, 220],
|
|
45
|
+
hrv_ms: [5, 200],
|
|
46
|
+
};
|
|
47
|
+
/** Below this the ring is reading ambient air, not skin. */
|
|
48
|
+
export const WEAR_TEMP_MIN_C = 30;
|
|
49
|
+
/** How long a temperature reading counts as wear evidence for later vitals. */
|
|
50
|
+
export const WEAR_EVIDENCE_MINUTES = 60;
|
|
51
|
+
/** §13c: discard the first 10 minutes after the ring goes back on. */
|
|
52
|
+
export const WARM_UP_MINUTES = 10;
|
|
53
|
+
/** Same "still" test as rule context `resting` and the D-G resting metrics. */
|
|
54
|
+
export const STILL_WINDOW_MINUTES = 15;
|
|
55
|
+
/** §13c: a reading this far from BOTH neighbours is a single-slot spike. */
|
|
56
|
+
export const SPIKE_DELTA_BPM = 40;
|
|
57
|
+
/** Neighbours further apart than this are a gap, not neighbours. */
|
|
58
|
+
export const SPIKE_NEIGHBOUR_MINUTES = 60;
|
|
59
|
+
/** Flag columns each `_q` view adds, in order. The `_clean` view drops them. */
|
|
60
|
+
export const QUALITY_FLAG_COLUMNS = {
|
|
61
|
+
heart_rate: ['spike', 'worn', 'warm_up', 'still', 'plausible', 'clean'],
|
|
62
|
+
hrv: ['worn', 'warm_up', 'still', 'plausible', 'hrv_clean', 'stress_clean'],
|
|
63
|
+
spo2: ['worn', 'warm_up', 'still', 'plausible', 'clean'],
|
|
64
|
+
temperature: ['worn', 'warm_up', 'still', 'plausible', 'scale_suspect', 'clean'],
|
|
65
|
+
};
|
|
66
|
+
export function isQualityTable(table) {
|
|
67
|
+
return QUALITY_TABLES.includes(table);
|
|
68
|
+
}
|
|
69
|
+
export function qualityViewFor(table) {
|
|
70
|
+
return `v_${table}_q`;
|
|
71
|
+
}
|
|
72
|
+
export function cleanViewFor(table) {
|
|
73
|
+
return `v_${table}_clean`;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The view a claim-producing query reads for `table`: the clean view for a
|
|
77
|
+
* vital, the plain union view for everything else.
|
|
78
|
+
*/
|
|
79
|
+
export function readViewFor(table) {
|
|
80
|
+
return isQualityTable(table) ? cleanViewFor(table) : `v_${table}`;
|
|
81
|
+
}
|
|
82
|
+
const WEAR_VIEW = 'v_wear';
|
|
83
|
+
const [TEMP_MIN, TEMP_MAX] = PLAUSIBLE_RANGES.temp_c;
|
|
84
|
+
const [SPO2_MIN, SPO2_MAX] = PLAUSIBLE_RANGES.spo2;
|
|
85
|
+
const [BPM_MIN, BPM_MAX] = PLAUSIBLE_RANGES.bpm;
|
|
86
|
+
const [HRV_MIN, HRV_MAX] = PLAUSIBLE_RANGES.hrv_ms;
|
|
87
|
+
const DEVICE_WINDOW = 'PARTITION BY user_id, brand, family_id, device_id ORDER BY ts';
|
|
88
|
+
/**
|
|
89
|
+
* Per temperature reading: is the ring on, and is this the first on-wrist
|
|
90
|
+
* reading after an off-wrist one (the warm-up onset)? The very first reading
|
|
91
|
+
* of a device is not an onset — nothing says it was just put on.
|
|
92
|
+
*/
|
|
93
|
+
function wearViewDdl() {
|
|
94
|
+
return `CREATE OR REPLACE VIEW ${WEAR_VIEW} AS
|
|
95
|
+
SELECT user_id, brand, family_id, device_id, ts,
|
|
96
|
+
temp_c >= ${WEAR_TEMP_MIN_C} AS on_wrist,
|
|
97
|
+
COALESCE(temp_c >= ${WEAR_TEMP_MIN_C}
|
|
98
|
+
AND LAG(temp_c) OVER (${DEVICE_WINDOW}) < ${WEAR_TEMP_MIN_C}, FALSE) AS onset
|
|
99
|
+
FROM v_temperature;`;
|
|
100
|
+
}
|
|
101
|
+
/** Latest wear evidence at or before each reading, same device. */
|
|
102
|
+
const WEAR_JOIN = `ASOF LEFT JOIN ${WEAR_VIEW} w
|
|
103
|
+
ON w.user_id = m.user_id AND w.brand = m.brand
|
|
104
|
+
AND w.family_id = m.family_id AND w.device_id = m.device_id
|
|
105
|
+
AND m.ts >= w.ts`;
|
|
106
|
+
const WORN = `CASE WHEN w.ts IS NULL OR w.ts < m.ts - INTERVAL ${WEAR_EVIDENCE_MINUTES} MINUTE
|
|
107
|
+
THEN TRUE ELSE w.on_wrist END`;
|
|
108
|
+
const WARM_UP = `COALESCE(w.onset AND m.ts < w.ts + INTERVAL ${WARM_UP_MINUTES} MINUTE, FALSE)`;
|
|
109
|
+
/** Tenant-scoped like the rules' `resting` join, not device-scoped. */
|
|
110
|
+
const STILL = `NOT EXISTS (
|
|
111
|
+
SELECT 1 FROM v_activity a
|
|
112
|
+
WHERE a.user_id = m.user_id AND a.brand = m.brand AND a.family_id = m.family_id
|
|
113
|
+
AND a.steps > 0
|
|
114
|
+
AND a.ts >= m.ts - INTERVAL ${STILL_WINDOW_MINUTES} MINUTE
|
|
115
|
+
AND a.ts < m.ts + INTERVAL ${STILL_WINDOW_MINUTES} MINUTE)`;
|
|
116
|
+
function sharedFlags() {
|
|
117
|
+
return `${WORN} AS worn,
|
|
118
|
+
${WARM_UP} AS warm_up,
|
|
119
|
+
${STILL} AS still`;
|
|
120
|
+
}
|
|
121
|
+
function heartRateQDdl() {
|
|
122
|
+
// Spike needs both neighbours present and close; an edge reading or one
|
|
123
|
+
// next to a gap cannot be judged and is kept. A step change (60 → 110 →
|
|
124
|
+
// 120) is not a spike: the second reading agrees with the first.
|
|
125
|
+
return `CREATE OR REPLACE VIEW ${qualityViewFor('heart_rate')} AS
|
|
126
|
+
SELECT *, COALESCE(worn AND NOT warm_up AND plausible AND NOT spike, FALSE) AS clean
|
|
127
|
+
FROM (
|
|
128
|
+
SELECT m.*, ${sharedFlags()},
|
|
129
|
+
COALESCE(m.bpm BETWEEN ${BPM_MIN} AND ${BPM_MAX}, FALSE) AS plausible
|
|
130
|
+
FROM (
|
|
131
|
+
SELECT *, COALESCE(
|
|
132
|
+
LAG(ts) OVER n >= ts - INTERVAL ${SPIKE_NEIGHBOUR_MINUTES} MINUTE
|
|
133
|
+
AND LEAD(ts) OVER n <= ts + INTERVAL ${SPIKE_NEIGHBOUR_MINUTES} MINUTE
|
|
134
|
+
AND abs(bpm - LAG(bpm) OVER n) >= ${SPIKE_DELTA_BPM}
|
|
135
|
+
AND abs(bpm - LEAD(bpm) OVER n) >= ${SPIKE_DELTA_BPM}, FALSE) AS spike
|
|
136
|
+
FROM v_heart_rate
|
|
137
|
+
WINDOW n AS (${DEVICE_WINDOW})
|
|
138
|
+
) m
|
|
139
|
+
${WEAR_JOIN}
|
|
140
|
+
) f;`;
|
|
141
|
+
}
|
|
142
|
+
function spo2QDdl() {
|
|
143
|
+
// Motion corrupts the optical read, so a moving SpO2 is excluded outright.
|
|
144
|
+
return `CREATE OR REPLACE VIEW ${qualityViewFor('spo2')} AS
|
|
145
|
+
SELECT *, COALESCE(worn AND NOT warm_up AND plausible AND still, FALSE) AS clean
|
|
146
|
+
FROM (
|
|
147
|
+
SELECT m.*, ${sharedFlags()},
|
|
148
|
+
COALESCE(m.spo2 BETWEEN ${SPO2_MIN} AND ${SPO2_MAX}, FALSE) AS plausible
|
|
149
|
+
FROM v_spo2 m
|
|
150
|
+
${WEAR_JOIN}
|
|
151
|
+
) f;`;
|
|
152
|
+
}
|
|
153
|
+
function temperatureQDdl() {
|
|
154
|
+
// Android 10x guard: a value that only lands in range when divided by ten
|
|
155
|
+
// is flagged, never divided. Corrected data is fabricated data.
|
|
156
|
+
return `CREATE OR REPLACE VIEW ${qualityViewFor('temperature')} AS
|
|
157
|
+
SELECT *, COALESCE(worn AND NOT warm_up AND plausible, FALSE) AS clean
|
|
158
|
+
FROM (
|
|
159
|
+
SELECT m.*, ${sharedFlags()},
|
|
160
|
+
COALESCE(m.temp_c BETWEEN ${TEMP_MIN} AND ${TEMP_MAX}, FALSE) AS plausible,
|
|
161
|
+
COALESCE(m.temp_c > ${TEMP_MAX}
|
|
162
|
+
AND m.temp_c / 10 BETWEEN ${TEMP_MIN} AND ${TEMP_MAX}, FALSE) AS scale_suspect
|
|
163
|
+
FROM v_temperature m
|
|
164
|
+
${WEAR_JOIN}
|
|
165
|
+
) f;`;
|
|
166
|
+
}
|
|
167
|
+
function hrvQDdl() {
|
|
168
|
+
// One row carries two vitals with different gates, so cleanliness is per
|
|
169
|
+
// column. HRV: clamp + still (§13c). Stress: no clamp, but an `active`
|
|
170
|
+
// reading is masked from alerting and tense-day counts (§13c) — the raw
|
|
171
|
+
// raster still shows it, reading `v_hrv`. HRV 0 is below the 5 ms clamp:
|
|
172
|
+
// the firmware reports it when RR variance is under its floor, which is a
|
|
173
|
+
// real observation of "unmeasurable", not a measurement.
|
|
174
|
+
return `CREATE OR REPLACE VIEW ${qualityViewFor('hrv')} AS
|
|
175
|
+
SELECT *,
|
|
176
|
+
COALESCE(hrv_ms IS NOT NULL AND worn AND NOT warm_up AND plausible AND still, FALSE) AS hrv_clean,
|
|
177
|
+
COALESCE(stress IS NOT NULL AND worn AND NOT warm_up AND still, FALSE) AS stress_clean
|
|
178
|
+
FROM (
|
|
179
|
+
SELECT m.*, ${sharedFlags()},
|
|
180
|
+
COALESCE(m.hrv_ms BETWEEN ${HRV_MIN} AND ${HRV_MAX}, FALSE) AS plausible
|
|
181
|
+
FROM v_hrv m
|
|
182
|
+
${WEAR_JOIN}
|
|
183
|
+
) f;`;
|
|
184
|
+
}
|
|
185
|
+
function cleanViewDdl(table) {
|
|
186
|
+
const exclude = `EXCLUDE (${QUALITY_FLAG_COLUMNS[table].join(', ')})`;
|
|
187
|
+
if (table === 'hrv') {
|
|
188
|
+
return `CREATE OR REPLACE VIEW ${cleanViewFor('hrv')} AS
|
|
189
|
+
SELECT * ${exclude}
|
|
190
|
+
REPLACE (CASE WHEN hrv_clean THEN hrv_ms END AS hrv_ms,
|
|
191
|
+
CASE WHEN stress_clean THEN stress END AS stress)
|
|
192
|
+
FROM ${qualityViewFor('hrv')}
|
|
193
|
+
WHERE hrv_clean OR stress_clean;`;
|
|
194
|
+
}
|
|
195
|
+
return `CREATE OR REPLACE VIEW ${cleanViewFor(table)} AS
|
|
196
|
+
SELECT * ${exclude} FROM ${qualityViewFor(table)} WHERE clean;`;
|
|
197
|
+
}
|
|
198
|
+
const Q_DDL = {
|
|
199
|
+
heart_rate: heartRateQDdl,
|
|
200
|
+
hrv: hrvQDdl,
|
|
201
|
+
spo2: spo2QDdl,
|
|
202
|
+
temperature: temperatureQDdl,
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Every quality view, in creation order (each reads only earlier ones and
|
|
206
|
+
* the `v_{table}` union views). They carry no tenant literal — the union
|
|
207
|
+
* views underneath already bake it in — so they are recreated alongside them
|
|
208
|
+
* on every attach and need no context.
|
|
209
|
+
*/
|
|
210
|
+
export function qualityViewDdls() {
|
|
211
|
+
return [
|
|
212
|
+
{ name: WEAR_VIEW, sql: wearViewDdl() },
|
|
213
|
+
...QUALITY_TABLES.map(t => ({ name: qualityViewFor(t), sql: Q_DDL[t]() })),
|
|
214
|
+
...QUALITY_TABLES.map(t => ({ name: cleanViewFor(t), sql: cleanViewDdl(t) })),
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
/** Reverse creation order, so no view is dropped while another reads it. */
|
|
218
|
+
export function qualityViewNames() {
|
|
219
|
+
return qualityViewDdls().map(v => v.name).reverse();
|
|
220
|
+
}
|
|
221
|
+
function countsFor(table, excluded, extra = {}) {
|
|
222
|
+
return `SELECT '${table}' AS metric,
|
|
223
|
+
COUNT(*) AS total,
|
|
224
|
+
COUNT(*) FILTER (WHERE ${excluded}) AS excluded,
|
|
225
|
+
COUNT(*) FILTER (WHERE NOT worn) AS off_wrist,
|
|
226
|
+
COUNT(*) FILTER (WHERE warm_up) AS warm_up,
|
|
227
|
+
COUNT(*) FILTER (WHERE NOT plausible) AS implausible,
|
|
228
|
+
COUNT(*) FILTER (WHERE NOT still) AS moving,
|
|
229
|
+
${extra.spike ? 'COUNT(*) FILTER (WHERE spike)' : 'CAST(0 AS BIGINT)'} AS spike,
|
|
230
|
+
${extra.scale ? 'COUNT(*) FILTER (WHERE scale_suspect)' : 'CAST(0 AS BIGINT)'} AS scale_suspect
|
|
231
|
+
FROM ${qualityViewFor(table)}
|
|
232
|
+
WHERE user_id = $userId AND brand = $brand AND family_id = $familyId
|
|
233
|
+
AND ts > now() - (INTERVAL 1 DAY) * CAST($days AS BIGINT)`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Diagnostic count of excluded readings per vital and reason (§13d: a
|
|
237
|
+
* `scale_suspect` temperature surfaces here, never on a user-facing
|
|
238
|
+
* surface). Binds `$userId`, `$brand`, `$familyId`, `$days`. Counts are
|
|
239
|
+
* BIGINT. `moving` is reported for every vital but gates only SpO2 and HRV.
|
|
240
|
+
*/
|
|
241
|
+
export const READING_QUALITY_COUNTS_SQL = [
|
|
242
|
+
countsFor('heart_rate', 'NOT clean', { spike: true }),
|
|
243
|
+
countsFor('hrv', 'NOT hrv_clean'),
|
|
244
|
+
countsFor('spo2', 'NOT clean'),
|
|
245
|
+
countsFor('temperature', 'NOT clean', { scale: true }),
|
|
246
|
+
].join('\nUNION ALL\n');
|
|
247
|
+
//# sourceMappingURL=reading-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reading-quality.js","sourceRoot":"","sources":["../../src/core/reading-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAG5C,qEAAqE;AACrE,eAAO,MAAM,WAAW,uPAiBd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,SAAS,CAEnD,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAG5C,qEAAqE;AACrE,eAAO,MAAM,WAAW,uPAiBd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,SAAS,CAEnD,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAwNtD,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,wJAWhB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACrF,MAAM,CA2BR;AAsBD,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKrF;AAED;;;;;;GAMG;AACH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAgBjF,CAAA;AAKJ,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAI7D,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAW,EACtD,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
package/dist/core/schemas.js
CHANGED
|
@@ -140,7 +140,9 @@ export const SCHEMAS = Object.freeze({
|
|
|
140
140
|
light_minutes INTEGER,
|
|
141
141
|
awake_minutes INTEGER,
|
|
142
142
|
avg_confidence DOUBLE,
|
|
143
|
-
night_of DATE
|
|
143
|
+
night_of DATE,
|
|
144
|
+
settle_min INTEGER,
|
|
145
|
+
recovered_min INTEGER
|
|
144
146
|
) PARTITIONED BY (day(ts_start), user_id);`,
|
|
145
147
|
sleep_stage: `CREATE TABLE sleep_stage (
|
|
146
148
|
ts TIMESTAMP NOT NULL,
|
|
@@ -150,7 +152,8 @@ export const SCHEMAS = Object.freeze({
|
|
|
150
152
|
user_id VARCHAR NOT NULL,
|
|
151
153
|
device_id VARCHAR NOT NULL,
|
|
152
154
|
stage INTEGER NOT NULL,
|
|
153
|
-
confidence DOUBLE
|
|
155
|
+
confidence DOUBLE,
|
|
156
|
+
source VARCHAR
|
|
154
157
|
) PARTITIONED BY (day(ts), user_id);`,
|
|
155
158
|
sleep_raw: `CREATE TABLE sleep_raw (
|
|
156
159
|
ts TIMESTAMP NOT NULL,
|
package/dist/core/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAEzC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,YAAY;IACZ,MAAM;IACN,aAAa;IACb,UAAU;IACV,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,SAAS;IACT,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;CACP,CAAA;AAIV;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA2B,IAAI,GAAG,CAAY;IAC1E,eAAe;CAChB,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAwC,MAAM,CAAC,MAAM,CAAC;IACxE,GAAG,EAAE;;;;;;;;;;;qCAW8B;IAEnC,UAAU,EAAE;;;;;;;qCAOuB;IAEnC,IAAI,EAAE;;;;;;;qCAO6B;IAEnC,WAAW,EAAE;;;;;;;;;;;;;;;;qCAgBsB;IAEnC,QAAQ,EAAE;;;;;;;qCAOyB;IAEnC,eAAe,EAAE;;;;;;;;qCAQkB;IAEnC,aAAa,EAAE
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warehouse.d.ts","sourceRoot":"","sources":["../../src/core/warehouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,WAAW,EAEX,WAAW,EACZ,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"warehouse.d.ts","sourceRoot":"","sources":["../../src/core/warehouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,WAAW,EAEX,WAAW,EACZ,MAAM,SAAS,CAAA;AAiBhB,mFAAmF;AACnF,MAAM,WAAW,UAAU;IACzB,mBAAmB,EAAE,CACnB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAA;IACX,WAAW,EAAE,WAAW,CAAA;IACxB,qBAAqB,EAAE,qBAAqB,CAAA;IAC5C,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAA;IACvB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAA;IACpB,sEAAsE;IACtE,cAAc,EAAE,IAAI,CAAA;IACpB,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AASD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,YAAY,CAAC,CA0FvB;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAaf;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,YAAY,CAAC,CA2BvB;AAwDD,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAWzE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAEf;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,YAAY,EAChB,GAAG,EAAE;IACH,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GACA,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/D"}
|
package/dist/core/warehouse.js
CHANGED
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
* <phase>, cause)`.
|
|
34
34
|
*/
|
|
35
35
|
import { AnalyticsError } from './errors';
|
|
36
|
+
import { qualityViewDdls, qualityViewNames } from './reading-quality';
|
|
36
37
|
import { dropViewDdl, generateViewDdl, VIEWED_TABLES } from './schemas';
|
|
37
38
|
/**
|
|
38
39
|
* Peel one layer of `AnalyticsError('query_failed')` off engine-wrapped
|
|
@@ -266,6 +267,17 @@ export async function createViews(db, ctx) {
|
|
|
266
267
|
throw new AnalyticsError('attach_failed', `CREATE VIEW v_${table} failed`, rootCause(cause));
|
|
267
268
|
}
|
|
268
269
|
}
|
|
270
|
+
// Signal-quality views (T-25) read the union views above, so they come
|
|
271
|
+
// after them. A missing clean view would fail every rule and baseline, so
|
|
272
|
+
// it fails the attach just as loudly.
|
|
273
|
+
for (const view of qualityViewDdls()) {
|
|
274
|
+
try {
|
|
275
|
+
await db.execute(view.sql);
|
|
276
|
+
}
|
|
277
|
+
catch (cause) {
|
|
278
|
+
throw new AnalyticsError('attach_failed', `CREATE VIEW ${view.name} failed`, rootCause(cause));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
269
281
|
}
|
|
270
282
|
/**
|
|
271
283
|
* Drop every union view. Idempotent (`DROP VIEW IF EXISTS`), and tolerant
|
|
@@ -274,6 +286,15 @@ export async function createViews(db, ctx) {
|
|
|
274
286
|
* in `detaching`.
|
|
275
287
|
*/
|
|
276
288
|
export async function dropViews(db) {
|
|
289
|
+
// Dependents first: the quality views read the union views.
|
|
290
|
+
for (const name of qualityViewNames()) {
|
|
291
|
+
try {
|
|
292
|
+
await db.execute(`DROP VIEW IF EXISTS ${name};`);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// Best-effort, as below.
|
|
296
|
+
}
|
|
297
|
+
}
|
|
277
298
|
for (const table of VIEWED_TABLES) {
|
|
278
299
|
try {
|
|
279
300
|
await db.execute(dropViewDdl(table));
|