@camstack/addon-post-analysis 1.2.634 → 1.2.636

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.
Files changed (16) hide show
  1. package/THIRD_PARTY_MODELS.md +1 -1
  2. package/dist/{clip-model-registry-BP3Klg3J.mjs → clip-model-registry-BV-RBus_.mjs} +6344 -10603
  3. package/dist/{clip-model-registry-3bxa67Bp.js → clip-model-registry-DgRbne5j.js} +6349 -10602
  4. package/dist/embedding-encoder/index.js +1 -1
  5. package/dist/embedding-encoder/index.mjs +1 -1
  6. package/dist/pipeline-analytics/_stub.js +2 -2
  7. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BVWmFXOZ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Coin4M0B.mjs} +3 -3
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-j6sD2jfA.mjs +26 -0
  9. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Bcrs7B9G.mjs +26 -0
  10. package/dist/pipeline-analytics/{hostInit-DdkLvWFM.mjs → hostInit-c7viEcQt.mjs} +3 -3
  11. package/dist/pipeline-analytics/index.js +166 -1957
  12. package/dist/pipeline-analytics/index.mjs +165 -1956
  13. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  14. package/package.json +7 -2
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DhEtuamJ.mjs +0 -26
  16. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-MOlfkem8.mjs +0 -26
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-3bxa67Bp.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-DgRbne5j.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
@@ -314,7 +314,7 @@ function buildArmAnnouncement(coverage, deviceName, bypassed = []) {
314
314
  };
315
315
  }
316
316
  /**
317
- * "Attivi: Porta retro, Cancello — Bypassati: Finestra veranda."
317
+ * "Attivi: Porta retro, Cancello — Bypassati: Finestra porch."
318
318
  *
319
319
  * Both halves are named: the bypassed sensors are why the operator pressed
320
320
  * Arm anyway, and the remaining ones are what is still promised. An
@@ -351,7 +351,7 @@ function armedWithBypass(coverage, bypassed, deviceName) {
351
351
  };
352
352
  }
353
353
  /**
354
- * "Aperti: Finestra veranda, Porta retro" + where the Arm anyway is.
354
+ * "Aperti: Finestra porch, Porta retro" + where the Arm anyway is.
355
355
  *
356
356
  * The one alarm sentence about something that did not happen, so it has to
357
357
  * carry both halves an operator needs to act: WHICH devices are open, and —
@@ -479,7 +479,7 @@ function buildArmingAnnouncement(coverage, seconds, deviceName, bypassed = []) {
479
479
  };
480
480
  }
481
481
  /**
482
- * "Attivi: Porta retro, Cancello — Bypassati: Finestra veranda" while the exit
482
+ * "Attivi: Porta retro, Cancello — Bypassati: Finestra porch" while the exit
483
483
  * delay still runs — same halves as {@link armedWithBypass}, with `seconds`
484
484
  * frozen for the title.
485
485
  */
@@ -1622,7 +1622,7 @@ function artifactRowBody(record, ownerUserId) {
1622
1622
  *
1623
1623
  * Every node runs this addon, so every node resolved that path and tried to
1624
1624
  * create it. On the Mac agent `/media-fast` does not exist (`ENOENT`); on
1625
- * `little-unraid` it exists and is not ours (`EACCES`). Both logged
1625
+ * `agent-a` it exists and is not ours (`EACCES`). Both logged
1626
1626
  * `nc-artifact data-plane failed to serve` on a loop, and the EACCES one is the
1627
1627
  * worse of the two: a path of the same name on another machine is not the same
1628
1628
  * directory, and `mkdir -p` of somebody else's mount point is precisely the
@@ -6764,7 +6764,7 @@ function patchDisplayLabel(patch) {
6764
6764
  * machine step and the operator override of each family are listed, because a
6765
6765
  * hand-assigned identity is still an identity.
6766
6766
  *
6767
- * Callers use it to pick a SENTENCE: "Gianluca è arrivato" and "Veicolo AB123CD"
6767
+ * Callers use it to pick a SENTENCE: "Alice è arrivato" and "Veicolo AB123CD"
6768
6768
  * are different keys in the notification text catalog, and a single
6769
6769
  * `{{label}}` slot cannot word both.
6770
6770
  */
@@ -10699,7 +10699,7 @@ var LABEL_MAX_CHARS = 32;
10699
10699
  * A camera name, reduced to a LABEL.
10700
10700
  *
10701
10701
  * Looser than {@link plainVocabulary} — two words survive instead of one, so
10702
- * "Ingresso cancello" and "Front door" still read as themselves — and that
10702
+ * "Front door cancello" and "Front door" still read as themselves — and that
10703
10703
  * looseness is the whole design question, because a device name is only
10704
10704
  * SEMI-trusted: the operator can rename a camera, but the name it was adopted
10705
10705
  * with came from the camera itself.
@@ -11467,7 +11467,7 @@ function stateToRow(key, state, updatedAt) {
11467
11467
  * That is not a corner case, it is the ORDINARY way a rule begins: an operator
11468
11468
  * writes an occupancy rule about a thing they can see, which means the thing is
11469
11469
  * usually there when they press save. Live on 2026-08-12 a became-occupied rule
11470
- * on zone "Parcheggio papa'" (device 617, class `car`) was authored with the car
11470
+ * on zone "Parking pat'" (device 102, class `car`) was authored with the car
11471
11471
  * already parked, and the next analysis pass would have announced its arrival.
11472
11472
  *
11473
11473
  * The invariant, stated once: AN EDGE MAY ONLY ARISE FROM A TRANSITION BETWEEN
@@ -12544,7 +12544,7 @@ var NcSummaryFiltersSchema = require_clip_model_registry.object({
12544
12544
  * summaries still include an enormous number of stationary tracks". Since
12545
12545
  * D161 a track promoted to the stationary registry is persisted rather than
12546
12546
  * dropped (it owns media the retention sweep has to reach), so the car parked
12547
- * in front of camera 617 now enters every window it overlaps and, ranked on
12547
+ * in front of camera 102 now enters every window it overlaps and, ranked on
12548
12548
  * importance and dwell, wins tiles from the passages the digest is about. The
12549
12549
  * measured effect on the live hub was 1-2 tiles becoming 10.
12550
12550
  *
@@ -12965,7 +12965,7 @@ var NcTestEventInputSchema = require_clip_model_registry.object({
12965
12965
  */
12966
12966
  systemEvent: require_clip_model_registry.object({
12967
12967
  kind: require_clip_model_registry.NcSystemEventKindSchema,
12968
- /** The dedup subject (`device:617`, `node:agent-1`, …). */
12968
+ /** The dedup subject (`device:102`, `node:agent-1`, …). */
12969
12969
  subject: require_clip_model_registry.string().min(1),
12970
12970
  titleKey: require_clip_model_registry.string().min(1),
12971
12971
  bodyKey: require_clip_model_registry.string().min(1),
@@ -15019,7 +15019,7 @@ function isRetentionExemptOwnerKind(kind) {
15019
15019
  * ## What happened
15020
15020
  *
15021
15021
  * On 2026-08-02 media writes started failing with
15022
- * `ENOSPC: no space left on device, mkdir '/recordings/617/events/track/…'`.
15022
+ * `ENOSPC: no space left on device, mkdir '/recordings/102/events/track/…'`.
15023
15023
  * For roughly five hours every new track was recorded with positions, a class,
15024
15024
  * a `bestEventId` and **zero snapshots** — a track that looks complete in the
15025
15025
  * list and has no picture behind it. The operator found it by noticing the
@@ -15156,7 +15156,7 @@ var OWNER_KINDS = [
15156
15156
  * already documents two paragraphs up, verbatim, one owner kind later — and
15157
15157
  * D476 moved it to `'object'`, its own docblock flagging the choice as
15158
15158
  * pragmatic. Both are ids in a namespace the writer does not own, and the
15159
- * consequence was measured: 675 delivered mosaics (271 MiB on camera 615, one
15159
+ * consequence was measured: 675 delivered mosaics (271 MiB on camera 101, one
15160
15160
  * rule, growing ~27 MiB/day) that no probe could resolve and no sweep could
15161
15161
  * ever collect.
15162
15162
  *
@@ -17866,7 +17866,7 @@ var MAX_CENSUS_SITES = 200;
17866
17866
  /**
17867
17867
  * How many evidence candidates one camera may return.
17868
17868
  *
17869
- * A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and 617 was
17869
+ * A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and 102 was
17870
17870
  * carrying ~497 of them when the mis-binding was found, so the default has to
17871
17871
  * be a page, not the archive.
17872
17872
  */
@@ -18277,7 +18277,7 @@ var DEBUG_RETENTION_NOTE = "A `debug` mark does not pin retention. A track with
18277
18277
  function debugArchiveFilename(nowMs) {
18278
18278
  return `camstack-debug-${new Date(nowMs).toISOString().replace(/[:.]/g, "-")}.zip`.replace(/[\r\n"]/g, "");
18279
18279
  }
18280
- /** Parse `?deviceIds=615,617` — empty means every camera. */
18280
+ /** Parse `?deviceIds=101,102` — empty means every camera. */
18281
18281
  function parseDebugDeviceIds(url) {
18282
18282
  const query = url.includes("?") ? url.slice(url.indexOf("?") + 1) : "";
18283
18283
  const raw = new URLSearchParams(query).get("deviceIds");
@@ -19488,7 +19488,7 @@ var TrackIdsSchema = require_clip_model_registry.array(require_clip_model_regist
19488
19488
  * True when the SQLite settings backend would hand `text` back DECODED: it
19489
19489
  * parses any TEXT that starts with `[` or `{` and is valid JSON
19490
19490
  * (`decodeColumnValue` decodes by content, not by declared type). Free text
19491
- * like that cannot round-trip through a TEXT column (follow-up 617, review M2).
19491
+ * like that cannot round-trip through a TEXT column (follow-up 102, review M2).
19492
19492
  */
19493
19493
  function decodesAsJson(text) {
19494
19494
  if (!(text.startsWith("[") || text.startsWith("{"))) return false;
@@ -19513,7 +19513,7 @@ function freeText(raw) {
19513
19513
  * that starts with `[` on read (`decodeColumnValue`), so the store sees the
19514
19514
  * ARRAY it wrote; a string is parsed here only for a backend (or an old row)
19515
19515
  * that hands the text back as written. `JSON.parse(String(array))` threw on the
19516
- * decoded array and every promoted row was skipped as malformed (follow-up 617).
19516
+ * decoded array and every promoted row was skipped as malformed (follow-up 102).
19517
19517
  * `null` = unreadable, absent included (the column is NOT NULL, so absence is
19518
19518
  * corruption) — the row is reported, never repaired.
19519
19519
  */
@@ -19633,7 +19633,7 @@ var TapeStatusOutputSchema = require_clip_model_registry.object({ cameras: requi
19633
19633
  var TapeLightingInputSchema = require_clip_model_registry._enum(["day", "ir"]);
19634
19634
  /**
19635
19635
  * Free text the settings store would hand back decoded is refused by name
19636
- * (follow-up 617, review M2): whole JSON array/object text in a TEXT column
19636
+ * (follow-up 102, review M2): whole JSON array/object text in a TEXT column
19637
19637
  * comes back as an array or object, and the index could not read the row.
19638
19638
  */
19639
19639
  var NOT_JSON_TEXT = "must not be JSON array/object text — the settings store would hand it back decoded";
@@ -20695,7 +20695,7 @@ var FACE_ALIGNMENT_SCRFD_V2 = "scrfd-v2";
20695
20695
  /**
20696
20696
  * The moment every node was running the fixed detector.
20697
20697
  *
20698
- * `addon-pipeline` landed on the hub at 12:08:18Z and on little-unraid at
20698
+ * `addon-pipeline` landed on the hub at 12:08:18Z and on agent-a at
20699
20699
  * 12:08:27Z on 2026-09-26 (package.json mtimes, read 2026-09-26); the Mac agent
20700
20700
  * was deployed in the same run. 12:30Z leaves margin for the Mac and for a
20701
20701
  * runner respawn.
@@ -22139,7 +22139,7 @@ function embeddingMagnitudeVerdict(magnitude, bound) {
22139
22139
  * A photograph has no camera, and `MediaStore.put` requires a number for the
22140
22140
  * blob path. `0` is the ABSENCE of a camera, not a camera — so it appears in a
22141
22141
  * media path and never in `tags: { deviceId }`, which is the key that answers
22142
- * "why is 617 worse than 615?" and which a photo cannot answer.
22142
+ * "why is 102 worse than 101?" and which a photo cannot answer.
22143
22143
  */
22144
22144
  var PHOTO_ENROLL_DEVICE_ID = 0;
22145
22145
  /** The step tree analysis runs: a face detector ROOT with the embedder nested. */
@@ -24652,7 +24652,7 @@ var FaceStore = class {
24652
24652
  *
24653
24653
  * This exists because the loss it reports ran for weeks without a single log
24654
24654
  * line: the prune only ever logged an aggregate count with no `deviceId`, so
24655
- * "why did camera 618 forget the person it asked me about" could not be asked
24655
+ * "why did camera 108 forget the person it asked me about" could not be asked
24656
24656
  * of the logs at all. One line per camera (not per row) keeps the volume sane
24657
24657
  * while still answering the per-camera question.
24658
24658
  *
@@ -25284,7 +25284,7 @@ var FaceStore = class {
25284
25284
  * which is what a mis-enrolment actually looks like.
25285
25285
  *
25286
25286
  * `suspicion` is the EXCESS — `bestForeign − selfMean` — because that is the
25287
- * only one of the two that discriminates on real data. Measured on Roberta's
25287
+ * only one of the two that discriminates on real data. Measured on Bob's
25288
25288
  * 106 samples, 2026-09-08: `selfMean` has a median of 0.188 and a p90 of 0.235,
25289
25289
  * so ANY absolute reading of "does not look like itself" fires on the whole
25290
25290
  * gallery. The first version of this module scored `(1 − selfMean) / 2` and
@@ -27673,7 +27673,7 @@ function intersection(a, b) {
27673
27673
  * consumer that cuts pixels from `TrackedDetectionOut.bbox` — the best-shot
27674
27674
  * thumbnail, `wideCentralSquareLayout`'s central square, the close-time
27675
27675
  * keyFrame→thumbnail derive — framed a motorcycle with its rider's head cut
27676
- * off. Operator, device 617, tracks `7f50622b` and `9cbc4791`, three minutes
27676
+ * off. Operator, device 102, tracks `7f50622b` and `9cbc4791`, three minutes
27677
27677
  * apart: "motocicli e veicoli a due ruote devono includere il conducente nel
27678
27678
  * keyframe" [motorcycles and two-wheeled vehicles must include the rider in the keyframe] (D407).
27679
27679
  *
@@ -27761,7 +27761,7 @@ var MAX_PREDICTION_MS = 1e3;
27761
27761
  /**
27762
27762
  * A frame more than `maxMissedMs` behind the latest is a CLOCK STEP only as
27763
27763
  * the K-th such frame in a row, each in order with the one before (follow-up
27764
- * 617, fix round 3; D49: a read that would destroy work needs another to
27764
+ * 102, fix round 3; D49: a read that would destroy work needs another to
27765
27765
  * agree). A step ends every track on the camera; one stray timestamp — a
27766
27766
  * backlog spike 4.5 s late — or two runner clocks delivering interleaved
27767
27767
  * (a camera migrating between runners) must not. Three is the least that a
@@ -27910,7 +27910,7 @@ var SpawnRefusalSampler = class {
27910
27910
  * How far back the "did this thing actually go anywhere" question looks.
27911
27911
  *
27912
27912
  * Long enough to span several breaths of a flickering box (the measured cycle
27913
- * on 617 runs about five analysed frames), short enough that a car which stops
27913
+ * on 102 runs about five analysed frames), short enough that a car which stops
27914
27914
  * is called stopped while the operator is still watching it.
27915
27915
  */
27916
27916
  var DEFAULT_STILL_WINDOW_MS = 6e3;
@@ -27918,7 +27918,7 @@ var DEFAULT_STILL_WINDOW_MS = 6e3;
27918
27918
  * The span the centroid may wander inside that window and still count as
27919
27919
  * still, as a fraction of the subject's smaller side.
27920
27920
  *
27921
- * Measured on 617: the parked car's centroid band is 105 px on a 461x536 box —
27921
+ * Measured on 102: the parked car's centroid band is 105 px on a 461x536 box —
27922
27922
  * 0.23 of the short side. A car crossing the frame covers roughly 1.8 box
27923
27923
  * widths in the same window. 0.35 sits in the gap with room on both sides, and
27924
27924
  * scaling by the subject means one number serves a 40 px person and a 461 px
@@ -28662,7 +28662,7 @@ var arcKey = (from, to) => `${from}\u0000${to}`;
28662
28662
  /**
28663
28663
  * The rejections that mean "geometry or appearance said no to a plausible
28664
28664
  * continuation" of a confirmed predecessor — a track the operator sees break
28665
- * (follow-up 617, F5). Every one of them is past `hardRejection`, so the
28665
+ * (follow-up 102, F5). Every one of them is past `hardRejection`, so the
28666
28666
  * predecessor is confirmed. NOT here (fix round 1): `unconfirmed`;
28667
28667
  * `has-successor` (continued elsewhere); `concurrent` and `identity-conflict`
28668
28668
  * (two subjects — the normal case, and the most frequent); `dropped` (an
@@ -28766,7 +28766,7 @@ var DeferredLinker = class {
28766
28766
  else seen.add(p.identity);
28767
28767
  }
28768
28768
  /**
28769
- * A clock step (follow-up 617, fix round 2): every piece still undecided is
28769
+ * A clock step (follow-up 102, fix round 2): every piece still undecided is
28770
28770
  * decided `new`, so nothing that existed before the step can be absorbed
28771
28771
  * across it — whatever was ready was committed just before. The facade
28772
28772
  * rebases its clock past `LINK_MAX_GAP_MS`, so no later piece can continue
@@ -29540,7 +29540,7 @@ var Tracklet = class {
29540
29540
  * frames reach the tracker out of capture order, up to 1.2 s back) is
29541
29541
  * `stale`: it changes nothing. A rewound tracklet would be measured from a
29542
29542
  * box its subject left a second ago, and L2 refused a link by reach on
29543
- * exactly that (follow-up 617, F1). The caller reports it.
29543
+ * exactly that (follow-up 102, F1). The caller reports it.
29544
29544
  */
29545
29545
  observeConfident(det, t, faceBearing) {
29546
29546
  if (t < this.lastSeenAt) return "stale";
@@ -30002,7 +30002,7 @@ var TrackerV2 = class {
30002
30002
  return step.emissions.map((e) => this.emit(e, t));
30003
30003
  }
30004
30004
  /**
30005
- * A frame stamped before the latest one already taken (follow-up 617, F1;
30005
+ * A frame stamped before the latest one already taken (follow-up 102, F1;
30006
30006
  * ~1 % of frames, up to 1.2 s back). It is decided ONCE, for the whole
30007
30007
  * frame (fix round 1, H1): matched against the tracklets' NEWEST boxes, a
30008
30008
  * stale box can land on another subject — a walker's old box on the walker
@@ -31602,7 +31602,7 @@ var UPDATE_MIN_CROP_AREA_GROWTH = .15;
31602
31602
  * the async detail plane and writes it to the row (`applyLabelCandidate`) —
31603
31603
  * never into a frame patch — so a signal reading only the patch can never
31604
31604
  * fire the identity trigger for a recognised face. Measured on the live hub
31605
- * (2026-09-05, device 590): six of six face identities reached Home
31605
+ * (2026-09-05, device 104): six of six face identities reached Home
31606
31606
  * Assistant only on the `end` event at track close + sweep (~lastSeen+33 s),
31607
31607
  * zero during the track's life, while the subject was still on camera.
31608
31608
  */
@@ -32461,8 +32461,8 @@ var TrackCloser = class {
32461
32461
  *
32462
32462
  * One message, one `reason` field, so the rate is a single Loki query and the
32463
32463
  * breakdown is a `sum by (reason)` rather than five differently-worded lines
32464
- * nobody thinks to correlate. Always tagged with the device: "why is 617
32465
- * worse than 615" is the only form this question has ever been asked in.
32464
+ * nobody thinks to correlate. Always tagged with the device: "why is 102
32465
+ * worse than 101" is the only form this question has ever been asked in.
32466
32466
  */
32467
32467
  logNoThumbnailAtClose(t, reason, extra) {
32468
32468
  this.deps.logger.info("track closed with no thumbnail (last preview chance missed)", {
@@ -32699,7 +32699,7 @@ function trackProvenanceOf(frame) {
32699
32699
  *
32700
32700
  * ×1.2 → ×1.05 (operator, 2026-09-03: "riduci e proviamo"). The complaint was
32701
32701
  * that a best shot carries too much surrounding scene, and the measurement says
32702
- * where it goes. On 26 148 person samples from camera 617 the median bbox is
32702
+ * where it goes. On 26 148 person samples from camera 102 the median bbox is
32703
32703
  * 1.44× taller than wide, so the square is driven by HEIGHT and half its width
32704
32704
  * is empty before the 16:9 extension adds any:
32705
32705
  *
@@ -32778,7 +32778,7 @@ function squareSubjectCropRegion(bbox, frame) {
32778
32778
  * appears in the lateral thirds. It is deliberately given up in ONE case: a
32779
32779
  * subject against the edge of the SCENE, whose square is clamped by the frame
32780
32780
  * border. There the slack is zero, no crop can both contain and avoid a fill,
32781
- * and the operator ruled (2026-07-31, device 617, a pram) that real pixels
32781
+ * and the operator ruled (2026-07-31, device 102, a pram) that real pixels
32782
32782
  * off-centre beat a synthesized blurred band. The full history of that bound —
32783
32783
  * imposed, dropped, and re-imposed with this exception on 2026-08-20 after
32784
32784
  * 7.7% of best shots measured mis-framed — is written at the slide itself.
@@ -32907,7 +32907,7 @@ function wideCentralSquareLayout(bbox, frame, options = {}) {
32907
32907
  * {@link deliveredWideCentralSquareLayout} (when the whole track never offered
32908
32908
  * one, delivery falls back to the contained layout). Measured 2026-08-21 over
32909
32909
  * 48h / 2133 tracks: 3.4% of best shots fell under this line, 23% on the worst
32910
- * camera (617) — and the operator-reported track carried 6.8%.
32910
+ * camera (102) — and the operator-reported track carried 6.8%.
32911
32911
  */
32912
32912
  var CENTRAL_SQUARE_CONTAINMENT_MIN = .5;
32913
32913
  /**
@@ -34572,7 +34572,7 @@ var TrackerSweep = class {
34572
34572
  * The gate ALREADY logs every decision. `logs.query` is an in-memory ring that
34573
34573
  * measured 40 000 entries covering 38 MINUTES of fleet traffic on 2026-09-08 —
34574
34574
  * so a fourteenth field on that line answers nothing the next morning, and the
34575
- * questions this data exists for ("what fraction of births on 617 were decided
34575
+ * questions this data exists for ("what fraction of births on 102 were decided
34576
34576
  * on a coasted frame, over the week the operator complained about") are all
34577
34577
  * multi-day. A previous investigation in this repo was blocked for exactly
34578
34578
  * this.
@@ -40829,7 +40829,7 @@ function isAfterCursor(row, cursor) {
40829
40829
  * few to accumulate the repeated evidence a stationary ENTRY needs, so nothing
40830
40830
  * suppresses them. Events reads `listRecentTracks`, which hides only
40831
40831
  * `closedReason = stationary-promotion`. Stamping that reason on THIS class of
40832
- * close is what keeps the six 617/3829 re-fires out of the gallery.
40832
+ * close is what keeps the six 102/3829 re-fires out of the gallery.
40833
40833
  *
40834
40834
  * Net displacement, not walk: `1e073359` walked 6 px of jitter and was labelled
40835
40835
  * moving; its start→end net was 0.5 px. Walk is the wrong "did it go anywhere".
@@ -43282,7 +43282,7 @@ var TrackStore = class {
43282
43282
  * and the store has no column projection, so each row carries its ~8.5 KB
43283
43283
  * `positions`/`snapshots` JSON through the sort. PER PAGE. Draining 17 940
43284
43284
  * rows took 36 such pages: measured on a copy of the live database, 36 full
43285
- * scans, and on the hub itself single statements of 1 196–1 615 ms each,
43285
+ * scans, and on the hub itself single statements of 1 196–1 101 ms each,
43286
43286
  * every one of them blocking the one synchronous thread the whole cluster
43287
43287
  * reads configuration through. `listDeviceIds` has ~10 callers.
43288
43288
  *
@@ -45105,8 +45105,8 @@ var StillnessSettingsSchema = require_clip_model_registry.object({
45105
45105
  * The camera's "not travelling" bar: centroid speed as a fraction of the
45106
45106
  * SUBJECT's own box diagonal, per second. `0` = not calibrated (see above).
45107
45107
  *
45108
- * Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device 592,
45109
- * close view, mostly parked subjects) to 0.3081 (device 615, far view, only
45108
+ * Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device 107,
45109
+ * close view, mostly parked subjects) to 0.3081 (device 101, far view, only
45110
45110
  * transits).
45111
45111
  */
45112
45112
  stillnessSpeedFracPerSec: require_clip_model_registry.number().min(0).max(STILLNESS_BAR_MAX).default(0),
@@ -47493,7 +47493,7 @@ function describeTapeStatus(input) {
47493
47493
  /**
47494
47494
  * Long side of the gif.
47495
47495
  *
47496
- * 640, against the 480 the notification used to ask for. Measured on a real 615
47496
+ * 640, against the 480 the notification used to ask for. Measured on a real 101
47497
47497
  * clip: 480 px at 8 fps is 195 KB and 640 px is 324 KB — both far under the
47498
47498
  * smallest cap any notifier declares (pushover's 5 MiB), and the difference is
47499
47499
  * the one an operator notices on a phone.
@@ -47530,7 +47530,7 @@ var NC_GIF_SPEED = 4;
47530
47530
  * copied — it is a `libx264` burst. The OPERATOR priced that and took it. It is
47531
47531
  * one encode per event over a ~12 s window, not a permanent transcode child
47532
47532
  * ([D84](../../../../../../docs/decisions/adr-0084.md) is about the latter), and
47533
- * it was measured on a real 615 720p cut before being chosen: **0.23 s of
47533
+ * it was measured on a real 101 720p cut before being chosen: **0.23 s of
47534
47534
  * encode, 254 KB out**, against the 922 KB the copy of the same window carried.
47535
47535
  * The re-encode is smaller than what it replaces.
47536
47536
  *
@@ -48322,7 +48322,7 @@ function checkTimelapsePacing(input) {
48322
48322
  * listed, before anything is rendered.
48323
48323
  *
48324
48324
  * Every log line here carries `tags: { deviceId }`. A miss is always asked
48325
- * per-camera ("why is 1441 worse than 615?") and a line without the tag cannot
48325
+ * per-camera ("why is 1441 worse than 101?") and a line without the tag cannot
48326
48326
  * answer it.
48327
48327
  */
48328
48328
  /** `part / whole` to two decimals — the shape a log line is read in. An empty
@@ -50928,7 +50928,7 @@ function observeLevel(state, sample, cfg) {
50928
50928
  * ON by default (`enabled` defaults to TRUE). An earlier version of this line
50929
50929
  * said "Ships DORMANT: `enabled` defaults to `false`" — that was stale, and on
50930
50930
  * 2026-07-30 it nearly produced the conclusion that the gate was not running at
50931
- * all. It is: it suppressed several phantom births on device 615 that same day.
50931
+ * all. It is: it suppressed several phantom births on device 101 that same day.
50932
50932
  * Read the schema, not this paragraph.
50933
50933
  *
50934
50934
  * The gate is fail-DEFERRED, not fail-open (changed 2026-08-01). Anything that
@@ -51585,7 +51585,7 @@ var EmbeddingDispatcher = class {
51585
51585
  *
51586
51586
  * The line is deliberately NOT tagged with a single `deviceId`: it is not
51587
51587
  * about one camera, it is about all of them at once. The per-camera question
51588
- * the tag exists to answer ("why is 617 different from 615?") is answered by
51588
+ * the tag exists to answer ("why is 102 different from 101?") is answered by
51589
51589
  * `meta.perDevice`, which carries the numeric id and count for every camera
51590
51590
  * in the window.
51591
51591
  */
@@ -52532,7 +52532,7 @@ function deriveSuggestionMinCosine(similarityThreshold) {
52532
52532
  *
52533
52533
  * `bufferMaxPerDevice` evicts oldest-first, and a row the recognizer put a
52534
52534
  * `suggestedIdentityId` on was exempt from nothing. Measured 2026-08-25: 15 of
52535
- * 24 live cameras sat at EXACTLY the cap, and on camera 618 (59 faces in 25 h)
52535
+ * 24 live cameras sat at EXACTLY the cap, and on camera 108 (59 faces in 25 h)
52536
52536
  * a suggestion survived roughly one day. A question the system asked was
52537
52537
  * deleted before the operator could answer it, silently.
52538
52538
  *
@@ -52658,7 +52658,7 @@ function planStoredMinFaceConfidencePurge(raw) {
52658
52658
  * Both come from the live hub, 2026-09-07, three hours, 20 cameras with gate
52659
52659
  * traffic:
52660
52660
  *
52661
- * - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`salone`, 369
52661
+ * - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`hall`, 369
52662
52662
  * gate verdicts) held at most FIVE distinct birth candidates in any 4 s
52663
52663
  * window; the next busiest held four. Eight is that worst case with margin.
52664
52664
  * - `BIRTH_EVIDENCE_TTL_MS = 4 000`. `confirmationGateMaxDeferralMs` defaults
@@ -53082,7 +53082,7 @@ var SUPPRESS_IOU = .6;
53082
53082
  * rather than a DIFFERENT vehicle. Below this floor a detection can neither
53083
53083
  * confirm nor wake the entry (it is a different object).
53084
53084
  *
53085
- * This overlap gate is the fix for the 617 parking-lot flood: the previous
53085
+ * This overlap gate is the fix for the 102 parking-lot flood: the previous
53086
53086
  * wake test used a centroid-distance radius of half the frame diagonal, so any
53087
53087
  * other vehicle merely PRESENT in the lot (a car driving through, or a second
53088
53088
  * car parked ~120px away) satisfied "near + moved" and retired the parked
@@ -53098,7 +53098,7 @@ var WAKE_ASSOC_IOU = .1;
53098
53098
  * long IS a parked object" — and it was measuring the wrong thing: it rewarded
53099
53099
  * an object seen well and often, while the parked cars that actually need
53100
53100
  * suppressing are re-discovered as dozens of short tracks that never live this
53101
- * long (device 617: 140 tracks for one car, median life 6.8 s). Birth moved to
53101
+ * long (device 102: 140 tracks for one car, median life 6.8 s). Birth moved to
53102
53102
  * repetition — see `stationary-evidence.ts`.
53103
53103
  *
53104
53104
  * The stillness test survives because it was doing TWO jobs and only one of
@@ -53108,7 +53108,7 @@ var WAKE_ASSOC_IOU = .1;
53108
53108
  * closes early and the next motion re-opens it — so one recent stillness read
53109
53109
  * is the right amount of proof. Without this valve, removing promotion would
53110
53110
  * leave every session containing a parked car pinned to `maxSessionHoldMs`
53111
- * (120 s) forever: 617 measured 504 sessions in 24 h, which is 70% detection
53111
+ * (120 s) forever: 102 measured 504 sessions in 24 h, which is 70% detection
53112
53112
  * uptime on one camera, and three cameras are already above 50%.
53113
53113
  */
53114
53114
  var SESSION_STILLNESS_WINDOW_MS = 3e4;
@@ -53124,7 +53124,7 @@ var ENTRY_TTL_MS = 5 * 6e4;
53124
53124
  * D49 says a destructive one-shot needs a second read that agrees. Until
53125
53125
  * 2026-08-28 this registry satisfied that by counting to two, and the two reads
53126
53126
  * it counted were consecutive frames of the SAME optical event — which is one
53127
- * read reported twice. Measured on device 617 that day: the same two parked
53127
+ * read reported twice. Measured on device 102 that day: the same two parked
53128
53128
  * cars were promoted five times in 17 minutes and retired three times as
53129
53129
  * `departed`, while the stored images prove neither car moved.
53130
53130
  *
@@ -53172,7 +53172,7 @@ var DEPARTURE_STRIKE_TTL_MS = 3e4;
53172
53172
  * absence may confirm a pending departure.
53173
53173
  *
53174
53174
  * A miss is not a read of the object; it is the absence of one, and on this
53175
- * fleet it is the single most common non-signal — media capture on 617 fails
53175
+ * fleet it is the single most common non-signal — media capture on 102 fails
53176
53176
  * ~25% of the time, the detector drops boxes at night, and the pipeline has a
53177
53177
  * whole dropout-skip mechanism because detector dropouts come in bursts. So an
53178
53178
  * absence confirms only when it is SUSTAINED: five consecutive unassociated
@@ -53190,7 +53190,7 @@ var DEPARTURE_ABSENCE_MIN_READS = 5;
53190
53190
  *
53191
53191
  * At 5.9–7.9 fps a 5 s gap is 30–40 missing frames, far beyond any dropout
53192
53192
  * hiccup, and far below the minutes that separate two motion sessions on a
53193
- * session-dispatch camera (the observed re-promotions on 617 were 2–6 min
53193
+ * session-dispatch camera (the observed re-promotions on 102 were 2–6 min
53194
53194
  * apart). Crossing it resets the warm-up and discards every pending strike:
53195
53195
  * evidence gathered in one session may not settle a question raised in another.
53196
53196
  */
@@ -53200,7 +53200,7 @@ var GATE_SESSION_GAP_MS = 5e3;
53200
53200
  *
53201
53201
  * The first frames of a session are the least trustworthy pixels the pipeline
53202
53202
  * ever sees — a cold h265 decoder emits loose, half-built boxes — and one of the
53203
- * three observed 617 retirements fired on the session's first two frames, which
53203
+ * three observed 102 retirements fired on the session's first two frames, which
53204
53204
  * were **0.9 s apart**. Two seconds is more than twice that, and at the ~1.1 fps
53205
53205
  * those cold frames actually arrived it covers the first two or three of them.
53206
53206
  *
@@ -53235,7 +53235,7 @@ var DEFAULT_MATCH_CONFIG = {
53235
53235
  * EVERY detection on a live parked object is suppressed, not just the one
53236
53236
  * the entry matched best (D275) — the operator's requirement is stated over
53237
53237
  * detections ("a detection matching type AND box must not open a track"),
53238
- * and the entry-driven reading of it leaked 13 of 23 tracks on device 617.
53238
+ * and the entry-driven reading of it leaked 13 of 23 tracks on device 102.
53239
53239
  *
53240
53240
  * 2. `trackIsStill` — given a track's recent centroid path, decides whether it
53241
53241
  * has stopped moving. Reuses the static-track-gate metrics (net
@@ -53316,14 +53316,14 @@ function centroidInside(b, p) {
53316
53316
  * 0.30, down from the 0.55 that was measured against 3829's SUV (~0.78 of 4K,
53317
53317
  * where centroid-inside is true for almost every vehicle in view). The SUV is
53318
53318
  * far above both numbers and is unaffected. What sits in the band [0.30, 0.55)
53319
- * on this fleet is 617's own parked car at 0.36 — and the dawn "envelope
53319
+ * on this fleet is 102's own parked car at 0.36 — and the dawn "envelope
53320
53320
  * exploded" ghost at 0.361 that ate a genuinely different parked motorcycle
53321
53321
  * as a "fragment" of itself (D495, D497). D497 answered that by refusing the
53322
53322
  * BIRTH on area, which cannot separate the car from the ghost (0.360 against
53323
53323
  * 0.361, twelve refusals of the car in twelve hours). This answers it where
53324
53324
  * the damage is: an oversize entry may be born, and may not REACH.
53325
53325
  *
53326
- * The cost was measured before the number moved. 617, 2026-09-16, 03:26 to
53326
+ * The cost was measured before the number moved. 102, 2026-09-16, 03:26 to
53327
53327
  * 06:50, with the 0.353 car as the camera's only entry: 1 717 detections
53328
53328
  * absorbed and `continuable: 0` — not one weak hold. Every read of an oversize
53329
53329
  * parked object is strong, so it loses nothing by being held that way; the
@@ -53365,7 +53365,7 @@ function detectionSwallowsEntry(det, parked) {
53365
53365
  * entry and sitting (almost) wholly inside it.
53366
53366
  *
53367
53367
  * The mirror of {@link detectionSwallowsEntry}, and the case neither IoU
53368
- * threshold can see. Measured on 617: a 34x137 box inside a 452x420 parked
53368
+ * threshold can see. Measured on 102: a 34x137 box inside a 452x420 parked
53369
53369
  * motorcycle scores IoU 0.024 — BELOW `wakeAssocIou` (0.1), so the filter read
53370
53370
  * it as "no detection overlaps this entry" and let it open a track, accumulate
53371
53371
  * its own evidence and promote into a registry entry of its own. The camera
@@ -53426,7 +53426,7 @@ function bboxMatchesParkedEntry(bbox, className, entries, suppressIou = SUPPRESS
53426
53426
  * It is deliberately the same predicate the per-frame filter uses
53427
53427
  * ({@link parkedEntryHoldsDetection}): a box the filter would suppress as a
53428
53428
  * parked object's own must not be able to become a second parked object. Device
53429
- * 617 held four rows for one car and a fifth for a fragment of a motorcycle
53429
+ * 102 held four rows for one car and a fifth for a fragment of a motorcycle
53430
53430
  * because the birth path asked nothing at all.
53431
53431
  */
53432
53432
  function findParkedOccupant(entries, className, bbox, suppressIou = SUPPRESS_IOU, wakeAssocIou = WAKE_ASSOC_IOU) {
@@ -53459,7 +53459,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
53459
53459
  *
53460
53460
  * Matching is ASSOCIATION-GATED by box overlap so an entry can only ever be
53461
53461
  * confirmed or woken by ITS OWN object — never by a different same-class
53462
- * vehicle merely present elsewhere in the frame (the 617 parking-lot flood:
53462
+ * vehicle merely present elsewhere in the frame (the 102 parking-lot flood:
53463
53463
  * passing/neighbouring cars used to retire parked entries, forcing endless
53464
53464
  * re-spawns). Per entry, over the best-overlapping same-class detection:
53465
53465
  *
@@ -53484,7 +53484,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
53484
53484
  * requires a second read that agrees — and until 2026-08-28 this file satisfied
53485
53485
  * that requirement while completely defeating it, because the two reads it
53486
53486
  * counted were **consecutive frames of the same optical event**. One retirement
53487
- * on device 617 fired on the session's first two frames, 0.9 s apart, off a
53487
+ * on device 102 fired on the session's first two frames, 0.9 s apart, off a
53488
53488
  * cold h265 decode; another off a passing car occluding the parked one (IoU
53489
53489
  * 0.36, centroid outside — a textbook departing read, twice, 150 ms apart).
53490
53490
  * Correlated evidence is not confirmation. The result: the same two parked cars
@@ -53534,7 +53534,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
53534
53534
  * absorbed ONE detection per frame and released every other detection sitting on
53535
53535
  * the very same parked box to the tracker, where it opened a track — precisely
53536
53536
  * the operator's report ("many tracks on parked cars") and precisely the
53537
- * measurement: over 2 h on device 617, **13 of 23 tracks sat on one of the three
53537
+ * measurement: over 2 h on device 102, **13 of 23 tracks sat on one of the three
53538
53538
  * stationary boxes at IoU ≥ 0.5**. IoU 0.5 clears the association floor (0.1)
53539
53539
  * and the centroid test, so those detections were eligible for suppression by
53540
53540
  * every geometric criterion in this file, and were released anyway.
@@ -53549,7 +53549,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
53549
53549
  *
53550
53550
  * D275 predicted that a moving vehicle overlapping a parked one "loses a frame
53551
53551
  * or two while it passes" and coasts through on `maxAge`. Measured on device
53552
- * 617 on 2026-09-08 it lost the whole pass: the parked cars sit at the frame
53552
+ * 102 on 2026-09-08 it lost the whole pass: the parked cars sit at the frame
53553
53553
  * edge, so a car driving across their front is held on every frame from the
53554
53554
  * first overlap to the moment it leaves the frame, and the tracker — which had
53555
53555
  * followed it for 5–10 frames — coasts `maxMissedMs` on nothing and drops it.
@@ -53758,7 +53758,7 @@ function trackIsStill(input) {
53758
53758
  *
53759
53759
  * The generic `StationaryObjectRegistry` used to promote a track that recorded
53760
53760
  * 4 positions inside a 30 s window — a criterion built for a car parking in
53761
- * device 617's lot and observed on EVERY frame. (It has since moved to repeated
53761
+ * device 102's lot and observed on EVERY frame. (It has since moved to repeated
53762
53762
  * evidence across many sightings, `stationary-evidence.ts`; the impossibility
53763
53763
  * below is what forced this path to exist, and the class SKIP in the generic
53764
53764
  * loop is what keeps it separate now.)
@@ -53770,7 +53770,7 @@ function trackIsStill(input) {
53770
53770
  * why `PackageDropDetector` never fired once in its life (0 `pa-pkg-*` rows on
53771
53771
  * every camera, ever, verified 2026-08-13).
53772
53772
  *
53773
- * Measured on device 615 (the only camera that has ever produced a `package`
53773
+ * Measured on device 101 (the only camera that has ever produced a `package`
53774
53774
  * box): three separate tracks at 02:01:08, 02:03:14 and 02:05:29, each alive
53775
53775
  * for 4–5 s, each carrying TWO frames ~1.2 s apart, each on a NEW trackId. The
53776
53776
  * facts to accommodate are therefore:
@@ -53784,7 +53784,7 @@ function trackIsStill(input) {
53784
53784
  * is given (IoU re-association across looks, not tracker minHits);
53785
53785
  * - a settle burst of three frames ~400 ms apart is still three hits in
53786
53786
  * tests and when the step runs that often; at governor cadence each look
53787
- * is one hit. Device 615 2026-08-24 13:40: a real parcel expired at
53787
+ * is one hit. Device 101 2026-08-24 13:40: a real parcel expired at
53788
53788
  * rounds=1 / dwell 1458 ms vs 15 s — the 5 s round-gap plus 15 s dwell
53789
53789
  * were the miss.
53790
53790
  *
@@ -53814,7 +53814,7 @@ function trackIsStill(input) {
53814
53814
  * and re-sights a parcel that is still there before the expiry is judged.
53815
53815
  *
53816
53816
  * `sweep` judges the same TTL off a timer, so a pick-up is not held until the
53817
- * next frame happens to arrive (615, 2026-09-30: 29 s). It concludes ONLY a
53817
+ * next frame happens to arrive (101, 2026-09-30: 29 s). It concludes ONLY a
53818
53818
  * promoted parcel with an ABSENCE READ since its last sighting — a frame on
53819
53819
  * which the package step LOOKED (`looked`) and found no box at that place,
53820
53820
  * with no person or vehicle box over it (`occluders`). A parcel nobody looked
@@ -53837,14 +53837,14 @@ var PACKAGE_STILLNESS_ROUND_GAP_MS = 5e3;
53837
53837
  /**
53838
53838
  * How long a candidate survives without being re-associated, in OBSERVED time.
53839
53839
  * Must comfortably outlast several governor polls — the real inter-round gap
53840
- * measured on 615 was ~2 minutes, not the nominal 45 s, because a
53840
+ * measured on 101 was ~2 minutes, not the nominal 45 s, because a
53841
53841
  * session-dispatch camera decodes nothing between motion sessions.
53842
53842
  */
53843
53843
  var PACKAGE_STILLNESS_TTL_MS = 5 * 6e4;
53844
53844
  /**
53845
53845
  * Association floor. Deliberately looser than the registry's `SUPPRESS_IOU`
53846
53846
  * (0.6): a box re-detected minutes later by a fresh track jitters more than one
53847
- * confirmed frame-to-frame. Measured jitter on 615's doormat across 4 minutes
53847
+ * confirmed frame-to-frame. Measured jitter on 101's doormat across 4 minutes
53848
53848
  * was IoU ≈ 0.98, so 0.3 is generous without being meaningless.
53849
53849
  */
53850
53850
  var PACKAGE_STILLNESS_ASSOC_IOU = .3;
@@ -54320,7 +54320,7 @@ function injectSecondarySubjects(frame, pending) {
54320
54320
  * Memory of births whose ritual has already RUN, per device+source.
54321
54321
  *
54322
54322
  * A birth is a decision, and a decision is taken once. Until 2026-09-07 it
54323
- * could be taken twice, on camera 615 it routinely was, and the second vote
54323
+ * could be taken twice, on camera 101 it routinely was, and the second vote
54324
54324
  * won:
54325
54325
  *
54326
54326
  * 04:59:38.335Z confirmation gate: birth confirmed {trackId=f585b2ee…
@@ -54403,7 +54403,7 @@ var RETIRED_REJECTIONS_PER_DEVICE = 256;
54403
54403
  * resurrection. So a rejected birth has already been written by the time the
54404
54404
  * verdict exists. It correctly gets no `start`, no media and no notification —
54405
54405
  * but the record stayed, and surfaced in `listRecentTracks`. On 2026-07-31 six
54406
- * full-frame phantoms on device 615 in nine minutes were every one of them
54406
+ * full-frame phantoms on device 101 in nine minutes were every one of them
54407
54407
  * suppressed AND listed.
54408
54408
  *
54409
54409
  * Retracting once is not enough. The tracker keeps carrying a rejected id for
@@ -54951,8 +54951,8 @@ function openRetrainUploadSink(target) {
54951
54951
  * set of paths under one `cwd`. This is a different job. A track's media lives
54952
54952
  * across several storage LOCATION roots (`eventMedia` and whatever else the
54953
54953
  * operator relocated to), under paths that encode nothing a training set wants —
54954
- * `615/events/track/<uuid>/keyFrame.jpg` — and every entry has to be RENAMED on
54955
- * the way in, to `tracks/615/<trackId>/keyFrame.jpg`. `tar.create` takes a list
54954
+ * `101/events/track/<uuid>/keyFrame.jpg` — and every entry has to be RENAMED on
54955
+ * the way in, to `tracks/101/<trackId>/keyFrame.jpg`. `tar.create` takes a list
54956
54956
  * of paths relative to a single cwd and gives no rename hook, so using it would
54957
54957
  * mean staging a whole shadow tree on disk first: a full second copy of the
54958
54958
  * dataset, written and then deleted, to avoid writing 100 lines.
@@ -56372,7 +56372,7 @@ async function reembedFaceGallery(deps, options) {
56372
56372
  * Per IDENTITY and not just in total, because the total is the number that
56373
56373
  * misleads: a gallery 80% re-embedded can still have one person at zero, and
56374
56374
  * `minIdentitySamples` means that person simply stops being recognised. On
56375
- * 2026-08-20 that person would have been Daniel, with 64 recognitions that day.
56375
+ * 2026-08-20 that person would have been Carol, with 64 recognitions that day.
56376
56376
  * Pure — the operator surface reads it, the pass does not.
56377
56377
  *
56378
56378
  * ## Why `unrecoverable` is an INPUT and not derived here
@@ -57054,14 +57054,14 @@ var OverlayDetailStateStore = class {
57054
57054
  * docs/superpowers/specs/2026-07-17-detection-config-exposure-design.md
57055
57055
  * (surface C). Confirmation is N frames (default 3); dwell default is 0
57056
57056
  * (an extra bar). The 15 s dwell plus a 5 s round-gap missed a real
57057
- * parcel on device 615 (2026-08-24 13:40).
57057
+ * parcel on device 101 (2026-08-24 13:40).
57058
57058
  */
57059
57059
  var PackageDropSettingsSchema = require_clip_model_registry.object({
57060
57060
  /**
57061
57061
  * Explicit per-camera OFF. **On by default: the ZONE RULE is what enables
57062
57062
  * package detection**, not a second switch.
57063
57063
  *
57064
- * As an opt-in default-false this was a parallel source of truth. Device 615
57064
+ * As an opt-in default-false this was a parallel source of truth. Device 101
57065
57065
  * on 2026-07-30 had the zone (`Uscio`), an enabled `package`-stage zone rule
57066
57066
  * (`Pacchetti`, classFilter `['package']`), and a notification rule on
57067
57067
  * `delivery: 'package-event'` — three layers of operator intent, all defeated
@@ -57079,7 +57079,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
57079
57079
  * Same bar as tracker `minHits`: one frame is a flicker, two can still
57080
57080
  * be a passer-by's bag, three is "it stayed". A settle burst of three
57081
57081
  * frames in ~1 s is enough; no second governor round after the courier
57082
- * left. Device 615 2026-08-24 13:40 expired at 1 round / 1.5 s dwell.
57082
+ * left. Device 101 2026-08-24 13:40 expired at 1 round / 1.5 s dwell.
57083
57083
  */
57084
57084
  packageDropMinFrames: require_clip_model_registry.number().int().min(1).max(20).default(3),
57085
57085
  /**
@@ -57094,7 +57094,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
57094
57094
  /**
57095
57095
  * Reject near-scene-sized blobs: MAX bbox area as a fraction of the frame.
57096
57096
  *
57097
- * Measured on device 615 (2026-08-21 analysis): 348/350 package false
57097
+ * Measured on device 101 (2026-08-21 analysis): 348/350 package false
57098
57098
  * positives were ONE static object — the streetlight's light wedge on the
57099
57099
  * granite paving — at 7.96–9.47% of the frame, scoring up to 0.877.
57100
57100
  * Confidence cannot separate it (the one true parcel scored 0.885); area
@@ -57109,7 +57109,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
57109
57109
  * package step spanning ≥ 10 s that found the doormat empty and unoccluded,
57110
57110
  * with somebody in the drop-off zone around the disappearance — instead of
57111
57111
  * waiting out the 300 s TTL. OFF by default: the one pick-up the stored data
57112
- * could replay (615, 2026-09-30) is no sample to judge the false-departure
57112
+ * could replay (101, 2026-09-30) is no sample to judge the false-departure
57113
57113
  * risk by. Silence always keeps the TTL.
57114
57114
  */
57115
57115
  packageDropEarlyPickupEnabled: require_clip_model_registry.boolean().default(false),
@@ -57120,7 +57120,7 @@ var PackageDropSettingsSchema = require_clip_model_registry.object({
57120
57120
  * box first appeared — and a departure only counts as `picked-up` with
57121
57121
  * somebody in that zone around the disappearance. Whole-camera motion (a
57122
57122
  * walker at the far gate) does not count. 0 disables both gates. Device
57123
- * 615's streetlight wedge cycled delivered→picked-up ~23×/night with
57123
+ * 101's streetlight wedge cycled delivered→picked-up ~23×/night with
57124
57124
  * nobody in the drop-off zone. Default 300 s: wide enough to absorb the
57125
57125
  * motion-settle governor's cadence (the box is often first SEEN minutes
57126
57126
  * after the courier left).
@@ -57322,7 +57322,7 @@ function shouldSkipDropoutFrame(activeTrackCount, detectionCount, consecutiveSki
57322
57322
  *
57323
57323
  * Until D665 the skip counted `frame.detections` only, so a frame whose sole
57324
57324
  * box was a person at 0.5 read as a detector glitch and never reached the
57325
- * tracker — on camera 590 more than half the frames of a re-split gap were
57325
+ * tracker — on camera 104 more than half the frames of a re-split gap were
57326
57326
  * dropout-skipped. A frame with a continuable box is not empty; `floor` is the
57327
57327
  * camera's low-score floor, `null` when the tier is off.
57328
57328
  */
@@ -59037,7 +59037,7 @@ var NEAR_FULL_DIMENSION = .95;
59037
59037
  /**
59038
59038
  * Detection score at/above which a near-full-frame box is trusted as a REAL
59039
59039
  * close subject rather than an exploded envelope/artifact. Live evidence
59040
- * 2026-07-23 (dev615, near-top-down driveway camera): cars passing diagonally
59040
+ * 2026-07-23 (dev101, near-top-down driveway camera): cars passing diagonally
59041
59041
  * right under the lens produce GENUINE 0,0→640,341 boxes at score 0.45-0.9 —
59042
59042
  * the size-only guard rejected every frame of every such track, so those
59043
59043
  * tracks never landed a best `thumbnail` or `keyFrame` at all. The observed
@@ -59096,7 +59096,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
59096
59096
  * burst. Both are gone, for measured reasons:
59097
59097
  *
59098
59098
  * - The area bar separated nothing. The operator's own parked car on device
59099
- * 617 measures 0.360 of the frame; the dawn "envelope exploded" ghost that
59099
+ * 102 measures 0.360 of the frame; the dawn "envelope exploded" ghost that
59100
59100
  * motivated the bar measured 0.361. Twelve refusals in twelve hours were
59101
59101
  * the car, in a band nine thousandths wide.
59102
59102
  * - The burst door was built on a mislabel. The runner filed every LIVE
@@ -59112,7 +59112,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
59112
59112
  * (D495's loss). That is answered where the reach is decided: at or above
59113
59113
  * `OVERSIZE_AREA_FRAC` (`stationary-match.ts`) an entry holds a detection on a
59114
59114
  * STRONG read only — no jitter hold, no fragment hold — exactly as the
59115
- * scene-sized SUV on 3829 always has. Measured on 617 between 03:26 and 06:50
59115
+ * scene-sized SUV on 3829 always has. Measured on 102 between 03:26 and 06:50
59116
59116
  * on 2026-09-16, with the 0.353 car as the only entry: 1 717 detections
59117
59117
  * absorbed, `continuable: 0` — every read of an oversize parked car is strong,
59118
59118
  * so the object loses nothing by being held that way.
@@ -59150,7 +59150,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
59150
59150
  //#endregion
59151
59151
  //#region src/pipeline-analytics/pipeline/stationary/stationary-evidence.ts
59152
59152
  /**
59153
- * `vehicle` and its kin. Every number below is read off device 617 over 24 h
59153
+ * `vehicle` and its kin. Every number below is read off device 102 over 24 h
59154
59154
  * (18 402 vehicle observations, 290 tracks) with the three parked cars the
59155
59155
  * operator can see out of the window as the bench.
59156
59156
  *
@@ -59161,7 +59161,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
59161
59161
  * - `minAgreementRatio` **0.6** — the measured gap is [0.29, 0.90]; 0.6 is the
59162
59162
  * middle of it. Raising it to 0.95 starts dropping real parked cars.
59163
59163
  * - `minAgreed` **8** — a floor, not a discriminator: sweeping it 3→60 changes
59164
- * nothing on 617 (the smallest true positive promotes with N=15). Set well
59164
+ * nothing on 102 (the smallest true positive promotes with N=15). Set well
59165
59165
  * below that so a rarely-seen object is never excluded for being rare, which
59166
59166
  * is the entire point of using a ratio.
59167
59167
  * - `minSpanMs` **120 000** — the real discriminator. True positives span
@@ -59178,7 +59178,7 @@ var VEHICLE_EVIDENCE_POLICY = {
59178
59178
  * strictest numbers in the file, because these are MEASURED, not cautious.
59179
59179
  *
59180
59180
  * This is not caution, it is a measurement. Replaying 24 h of person
59181
- * observations from devices 617, 1443, 590 and 592 through this exact ledger:
59181
+ * observations from devices 102, 111, 104 and 107 through this exact ledger:
59182
59182
  *
59183
59183
  * | ratio | minAgreed | minSpanMs | promotions / 24 h across 4 cameras |
59184
59184
  * | ----- | --------- | --------- | ---------------------------------- |
@@ -59186,9 +59186,9 @@ var VEHICLE_EVIDENCE_POLICY = {
59186
59186
  * | 0.95 | 40 | 1800 s | 10 |
59187
59187
  * | 0.99 | 80 | 1800 s | **6** |
59188
59188
  *
59189
- * There is no setting that reaches zero. Device 590 holds a person-shaped thing
59189
+ * There is no setting that reaches zero. Device 104 holds a person-shaped thing
59190
59190
  * that agrees with itself 1292 times out of 1654 (0.78) across 26 tracks over
59191
- * ten hours, and device 592 produced eleven candidates at ratio 1.00 between
59191
+ * ten hours, and device 107 produced eleven candidates at ratio 1.00 between
59192
59192
  * 02:00 and 05:00 — a statue, a poster, an IR artifact; the ledger cannot tell
59193
59193
  * those from a person standing still, because they look identical to it.
59194
59194
  *
@@ -59225,7 +59225,7 @@ function evidencePolicyFor(className) {
59225
59225
  * How long a candidate survives without being touched.
59226
59226
  *
59227
59227
  * Six hours. Derived from the WORST case this criterion has to serve — a camera
59228
- * whose only producer is occasion A. The busiest parking spot on 617 is
59228
+ * whose only producer is occasion A. The busiest parking spot on 102 is
59229
59229
  * rediscovered ~0.5 times per hour at night, so evidence has to survive a
59230
59230
  * multi-hour gap between sessions or it can never accumulate at all.
59231
59231
  *
@@ -59235,7 +59235,7 @@ function evidencePolicyFor(className) {
59235
59235
  */
59236
59236
  var EVIDENCE_WINDOW_MS = 360 * 6e4;
59237
59237
  /** Per-device candidate cap. A camera producing detections in novel places
59238
- * forever must not decide how much of hub-main's heap this uses. 617, the
59238
+ * forever must not decide how much of hub-main's heap this uses. 102, the
59239
59239
  * busiest lot in the fleet, holds 8. */
59240
59240
  var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
59241
59241
  /**
@@ -59245,7 +59245,7 @@ var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
59245
59245
  * A track binds at its first emitted frame and, until 2026-08-28, never
59246
59246
  * re-bound. A track emitted on a settling box therefore captured whichever of
59247
59247
  * a device's ~497 accumulated candidates it happened to touch first and stayed
59248
- * there for its whole life. The arithmetic from the 617 audit: a promotion
59248
+ * there for its whole life. The arithmetic from the 102 audit: a promotion
59249
59249
  * carried `agreed: 240 / seen: 240` — exactly one track's 239 observations plus
59250
59250
  * the candidate's birth — while a second track's **267 observations of the same
59251
59251
  * spot** were folded into a different row entirely. Had they landed together
@@ -59263,7 +59263,7 @@ var EVIDENCE_REBIND_MAX_BOUND_OVERLAP = .05;
59263
59263
  * these, sliding.
59264
59264
  *
59265
59265
  * Fifteen minutes, chosen against the two failure modes it sits between. Too
59266
- * short and a parked car that nobody observes for a while — 617's busiest spot
59266
+ * short and a parked car that nobody observes for a while — 102's busiest spot
59267
59267
  * is rediscovered ~0.5 times an hour at night — arrives at an empty window and
59268
59268
  * cannot answer at all. Too long and it becomes the lifetime counter it is
59269
59269
  * replacing. Fifteen minutes holds several motion sessions on a daytime camera
@@ -59419,7 +59419,7 @@ function stillnessVerdictFor(source, trackState) {
59419
59419
  * `stationaryThresholdSec` had not elapsed — `moving` in name only. On a
59420
59420
  * session-dispatched camera those frames are a third of every 36 s track, and
59421
59421
  * a session cut short by a passer-by is made of nothing else. Measured on
59422
- * device 617 (DNRG309, 2026-09-19 20:32 → 09-20 07:53): 13 of the 21 tracks
59422
+ * device 102 (DNRG309, 2026-09-19 20:32 → 09-20 07:53): 13 of the 21 tracks
59423
59423
  * bound to the candidate never reached `idle`, the ledger's ratio was 0.493
59424
59424
  * against 0.6, and a parked car took 11.3 h and 19 tracks to be censused.
59425
59425
  *
@@ -59651,8 +59651,8 @@ function computeStationaryEntryZones(entry, zones, minOverlap) {
59651
59651
  *
59652
59652
  * It used to be `source === 'pipeline'`, in five places, each explaining that
59653
59653
  * the gate "runs on that plane". The reason given was WHERE the flood it was
59654
- * written for had been measured (617, the ML plane), never an argument that the
59655
- * firmware's boxes were unfit. The cost of the accident, on device 640: a still
59654
+ * written for had been measured (102, the ML plane), never an argument that the
59655
+ * firmware's boxes were unfit. The cost of the accident, on device 106: a still
59656
59656
  * object is never promoted, so it holds `hasLiveTrack` true for as long as it
59657
59657
  * sits there, and every detection session runs to its 120 s cap instead of
59658
59658
  * closing on cooldown — `closed at the max-hold cap with a subject still
@@ -61805,7 +61805,7 @@ var StationaryEvidenceLedger = class {
61805
61805
  /**
61806
61806
  * Which candidate each of a device's live tracks is bound to.
61807
61807
  *
61808
- * The 617 audit could not answer this — the binding map was private, and the
61808
+ * The 102 audit could not answer this — the binding map was private, and the
61809
61809
  * whole D280 defect is invisible without it: a promotion's `agreed`/`seen`
61810
61810
  * tell you a row was fed, never WHICH track fed it or which track went
61811
61811
  * somewhere else. Read-only, and the only reason it is public.
@@ -62084,7 +62084,7 @@ var StationaryEvidenceLedger = class {
62084
62084
  * so it confirms and never re-anchors. Letting a weak box move the anchor would
62085
62085
  * let a passing lorry drag a parked car's reference across the frame.
62086
62086
  *
62087
- * It has one failure mode, and device 617 sat in it for eight and a half hours.
62087
+ * It has one failure mode, and device 102 sat in it for eight and a half hours.
62088
62088
  * Entry `02e6bf01` was anchored, at promotion, on its source track's last box:
62089
62089
  * **406x1103**. The car's real reading is **399x814** — same object, same
62090
62090
  * place, a box inflated by a merged frame. IoU ≈ 0.58 against a `suppressIou`
@@ -62098,7 +62098,7 @@ var StationaryEvidenceLedger = class {
62098
62098
  * - worse, a weak hold is CONTINUABLE, so a passer-by's coasting track latches
62099
62099
  * onto the parked car's box, its velocity drops below the still threshold,
62100
62100
  * and the predicted box freezes there. Measured over 12 h: 18 198 weak holds
62101
- * on 617 of which **1 330 were consumed by a confirmed track**, against
62101
+ * on 102 of which **1 330 were consumed by a confirmed track**, against
62102
62102
  * **0** on a healthy camera. Four moving vehicles were provably captured
62103
62103
  * this way, each sitting 33-35 s of its 35-38 s life on the parked car's box.
62104
62104
  *
@@ -62117,7 +62117,7 @@ var StationaryEvidenceLedger = class {
62117
62117
  * How much the repeated box must still OVERLAP the anchor it is correcting.
62118
62118
  *
62119
62119
  * The time bound alone is not enough, and the first hour in production proved
62120
- * it: on `Videocamera studio` a `person` entry of 236x568 was re-anchored onto
62120
+ * it: on `Camera studio` a `person` entry of 236x568 was re-anchored onto
62121
62121
  * a 1094x1406 box — eleven times the area, IoU 0.087. That is not an anchor
62122
62122
  * that is slightly wrong, it is a different object standing in front of the
62123
62123
  * entry long enough to steal it. The rule this replaces refused exactly that,
@@ -62126,7 +62126,7 @@ var StationaryEvidenceLedger = class {
62126
62126
  * So the correction is bounded at BOTH ends. Above `suppressIou` (0.60) a read
62127
62127
  * already re-anchors on the spot and needs none of this. Below this floor the
62128
62128
  * two boxes are not the same object and no amount of patience makes them one.
62129
- * 0.45 sits between: it admits 617's 0.58 — the two-hundredths case this exists
62129
+ * 0.45 sits between: it admits 102's 0.58 — the two-hundredths case this exists
62130
62130
  * for — and refuses the 0.087 that broke the studio.
62131
62131
  */
62132
62132
  var STALE_ANCHOR_MIN_IOU = .45;
@@ -62324,7 +62324,7 @@ var StationaryObjectRegistry = class {
62324
62324
  * produced plenty and none of them was this car. The first says nothing
62325
62325
  * about the object; the second says it is gone.
62326
62326
  *
62327
- * Measured on device 617: a motorcycle parked for 29 HOURS was retired by TTL
62327
+ * Measured on device 102: a motorcycle parked for 29 HOURS was retired by TTL
62328
62328
  * after 6.2 minutes of observed time without a confirmation, while it was
62329
62329
  * still physically there — a debug-flagged track two hours later sat on its
62330
62330
  * exact spot with a median centroid displacement of 0.0 px. Losing the entry
@@ -62607,7 +62607,7 @@ var StationaryObjectRegistry = class {
62607
62607
  * predicate the per-frame filter uses (`findParkedOccupant`): a box the
62608
62608
  * filter would suppress as a parked object's own can never become a second
62609
62609
  * parked object. Until 2026-09-14 this method minted whatever it was handed,
62610
- * and device 617 reported EIGHT parked vehicles — four of them one car, the
62610
+ * and device 102 reported EIGHT parked vehicles — four of them one car, the
62611
62611
  * same box to the decimal, promoted again roughly once an hour because the
62612
62612
  * weak-continuation path (D410) keeps feeding the ledger from a track riding
62613
62613
  * a parked object. The re-promotion is not the anomaly and is not worth
@@ -62615,7 +62615,7 @@ var StationaryObjectRegistry = class {
62615
62615
  * still there. It just must not produce a neighbour.
62616
62616
  *
62617
62617
  * A merge never DOWNGRADES the tenant: it advances the clock and adopts an
62618
- * identity the tenant lacks (the 617 duplicates arrived unlabelled while the
62618
+ * identity the tenant lacks (the 102 duplicates arrived unlabelled while the
62619
62619
  * row they belonged to was already `Car`), and it never overwrites one it
62620
62620
  * has.
62621
62621
  */
@@ -62694,8 +62694,8 @@ var StationaryObjectRegistry = class {
62694
62694
  * ONLY for the cameras this node analyses ({@link analyses}). Every node runs
62695
62695
  * this addon and every node hydrates the SAME table in {@link load}, so a
62696
62696
  * sweep over every hydrated device judges — and mutates — cameras it has no
62697
- * frames for. Measured 2026-09-14: the duplicate collapse for device 617 was
62698
- * logged by `MacMiniAgent.localdomain` and by `little-unraid`, the same
62697
+ * frames for. Measured 2026-09-14: the duplicate collapse for device 102 was
62698
+ * logged by `MacMiniAgent.localdomain` and by `agent-a`, the same
62699
62699
  * rows, seven seconds apart.
62700
62700
  *
62701
62701
  * Expiry is measured against the device's latest processed-frame timestamp
@@ -64551,7 +64551,7 @@ function buildOrphanScopes(collections = auditableCollections()) {
64551
64551
  /**
64552
64552
  * Deliberately unhurried. One hour of grace is ~24× the shortest measured
64553
64553
  * retention window's resolution and far under the shortest window itself
64554
- * (1 day on 590), so it can protect the write/index race without ever
64554
+ * (1 day on 104), so it can protect the write/index race without ever
64555
64555
  * shadowing a real prune.
64556
64556
  */
64557
64557
  var DEFAULT_ORPHAN_LIMITS = {
@@ -65832,7 +65832,7 @@ var RetentionSweepRunner = class {
65832
65832
  * every entity the track owns goes with it.
65833
65833
  *
65834
65834
  * **One sweep does not mean one cutoff.** Retention is per device and that is
65835
- * deliberate: measured 1 day on 590 against 7 on 615/617. What is singular is
65835
+ * deliberate: measured 1 day on 104 against 7 on 101/102. What is singular is
65836
65836
  * the SELECTION — one entity kind, one clock, one cascade — not the number.
65837
65837
  *
65838
65838
  * `deviceIds` is passed in so the whole pass shares one device set and one
@@ -67074,7 +67074,7 @@ var FAMILY_PLATE_OCR = "plate-ocr";
67074
67074
  * The "failure" here is NOT suppressed and must not be — a person standing over
67075
67075
  * a car is a real person, and this repo will not trade that away for a cleaner
67076
67076
  * count (D275 made the same choice for stationary suppression). It is counted so
67077
- * the phantom rate is a number instead of an impression: 4 of 23 on camera 617
67077
+ * the phantom rate is a number instead of an impression: 4 of 23 on camera 102
67078
67078
  * in two hours, measured by hand on 2026-08-28.
67079
67079
  */
67080
67080
  var FAMILY_PERSON_BIRTH = "person-birth";
@@ -67350,7 +67350,7 @@ function isFullFrameBbox(bbox) {
67350
67350
  var NATIVE_CROP_METRIC_INTERVAL_MS = 3e4;
67351
67351
  /**
67352
67352
  * Above this `maxWidth`, a full-frame fetch is a NATIVE full frame (~1–1.5 MB
67353
- * on a 4K camera) rather than a boxed timeline tile or a pinned ≤640 detection
67353
+ * on a 4K camera) rather than a boxed timeline tile or a pinned ≤106 detection
67354
67354
  * frame (tens of kB). The two belong in different counters or the window line
67355
67355
  * says "full frames" and means two payload classes three orders of magnitude
67356
67356
  * apart. (D470) No caller asks for that rung since D422 (the key frame) and
@@ -68372,7 +68372,7 @@ var CameraIndexUnknownDrops = class {
68372
68372
  * Mapped sensor/control caps that a CAMERA must NOT contribute for ITSELF.
68373
68373
  *
68374
68374
  * A sensor cap bound on a camera makes the camera both the source and the
68375
- * subject — a composed doorbell on camera 615 (D671), a native Reolink
68375
+ * subject — a composed doorbell on camera 101 (D671), a native Reolink
68376
68376
  * doorbell, a camera-side button. Those have no other route into the per-camera event
68377
68377
  * substrate, so the camera includes itself.
68378
68378
  *
@@ -68643,9 +68643,9 @@ var LinkedCamerasCache = class {
68643
68643
  * every consumer of a device-event attributes it to the same cameras.
68644
68644
  *
68645
68645
  * It is shared on purpose. The self-camera half (a doorbell bound on camera
68646
- * 615 makes 615 both source and subject) was added to the history-row
68646
+ * 101 makes 101 both source and subject) was added to the history-row
68647
68647
  * ingest on 2026-08-07 and NOT to the synthetic-track projection beside it,
68648
- * which kept resolving `camerasFor` alone. The result: camera 615's real
68648
+ * which kept resolving `camerasFor` alone. The result: camera 101's real
68649
68649
  * doorbell press on 2026-08-08 06:59Z produced a `SensorEvent` row and no
68650
68650
  * timeline marker, for weeks, with the divergence invisible in both codepaths.
68651
68651
  * Two derivations of "which cameras" is one too many.
@@ -68732,7 +68732,7 @@ function isSliceRecord(slice) {
68732
68732
  * One `DeviceStateChanged` → N history rows, one per camera the event belongs
68733
68733
  * to: the emitting device's LINKED cameras, plus the emitting device ITSELF
68734
68734
  * when it is a camera carrying the sensor cap (a doorbell bound on camera
68735
- * 615 — see `SELF_CAMERA_EXCLUDED_CAPS` for the one cap that is not
68735
+ * 101 — see `SELF_CAMERA_EXCLUDED_CAPS` for the one cap that is not
68736
68736
  * self-ingested). The EVENT_KIND_BY_CAP gate exits first so non-sensor cap
68737
68737
  * churn costs one map lookup. Returns the number of rows inserted (0 when
68738
68738
  * unmapped, or when no camera takes a row for the device — a non-camera
@@ -69947,9 +69947,9 @@ var EventMediaDispatcher = class {
69947
69947
  * `camerasFor` alone — LINKED cameras only — while the history-row ingest
69948
69948
  * beside it had gained the self-camera half on 2026-08-07. A doorbell can be
69949
69949
  * served on the CAMERA itself (a composed doorbell, D671, writes the `doorbell`
69950
- * slice onto camera 615; Reolink registers it at camera level), so
69951
- * `camerasFor(615)` answered `[]` and the
69952
- * projection returned on a `debug` line nobody runs at. Camera 615's real
69950
+ * slice onto camera 101; Reolink registers it at camera level), so
69951
+ * `camerasFor(101)` answered `[]` and the
69952
+ * projection returned on a `debug` line nobody runs at. Camera 101's real
69953
69953
  * press at 2026-08-08 06:59Z therefore produced a `SensorEvent` row, a HomeKit
69954
69954
  * ring, an Alexa post and a matched notification rule — and no track. Both
69955
69955
  * halves now derive their cameras from {@link resolveSensorEventCameras}.
@@ -69965,7 +69965,7 @@ var EventMediaDispatcher = class {
69965
69965
  * **Nothing here is silent.** A marker that lands emits one `info` line; every
69966
69966
  * branch that lands none emits one line carrying the reason. Both carry
69967
69967
  * `tags: { deviceId }` with the CAMERA id, because the question always arrives
69968
- * as "why did 617 get a marker and 615 not".
69968
+ * as "why did 102 get a marker and 101 not".
69969
69969
  *
69970
69970
  * **The marker is also the notification's PICTURE.** A doorbell press has no
69971
69971
  * detection behind it, so nothing else on the notification path owns a frame of
@@ -69983,7 +69983,7 @@ var EventMediaDispatcher = class {
69983
69983
  /**
69984
69984
  * The bound a sensor marker's snapshot gets: 2.5 s.
69985
69985
  *
69986
- * Measured rather than guessed — a `snapshot.getSnapshot` on camera 615 answers
69986
+ * Measured rather than guessed — a `snapshot.getSnapshot` on camera 101 answers
69987
69987
  * in ~0.6 s end-to-end from OUTSIDE the hub (the cap serves a ≤10 s cached
69988
69988
  * frame; `force` is never set here). 2.5 s leaves four times the observed cost
69989
69989
  * and still bounds what the doorbell notification waits for.
@@ -70402,1797 +70402,6 @@ Object.freeze({
70402
70402
  "readClipBytes"
70403
70403
  ]
70404
70404
  });
70405
- /** cap name -> the numeric state field whose strict advance IS the cap's one-shot event. */
70406
- var CAP_ADVANCE_FIELDS = Object.freeze({ "doorbell": "lastPressedAt" });
70407
- Object.freeze({
70408
- "air-quality-sensor": [
70409
- {
70410
- "path": "co2Ppm",
70411
- "valueType": "number"
70412
- },
70413
- {
70414
- "path": "vocPpb",
70415
- "valueType": "number"
70416
- },
70417
- {
70418
- "path": "pm25",
70419
- "valueType": "number"
70420
- },
70421
- {
70422
- "path": "pm10",
70423
- "valueType": "number"
70424
- },
70425
- {
70426
- "path": "aqi",
70427
- "valueType": "number"
70428
- },
70429
- {
70430
- "path": "unit",
70431
- "valueType": "string"
70432
- },
70433
- {
70434
- "path": "precision",
70435
- "valueType": "number"
70436
- }
70437
- ],
70438
- "alarm-panel": [
70439
- {
70440
- "path": "state",
70441
- "valueType": "enum",
70442
- "enumValues": [
70443
- "disarmed",
70444
- "armed_home",
70445
- "armed_away",
70446
- "armed_night",
70447
- "armed_vacation",
70448
- "armed_custom_bypass",
70449
- "arming",
70450
- "disarming",
70451
- "pending",
70452
- "triggered"
70453
- ]
70454
- },
70455
- {
70456
- "path": "targetMode",
70457
- "valueType": "enum",
70458
- "enumValues": [
70459
- "home",
70460
- "away",
70461
- "night",
70462
- "vacation",
70463
- "custom_bypass"
70464
- ]
70465
- },
70466
- {
70467
- "path": "requiresCode",
70468
- "valueType": "boolean"
70469
- }
70470
- ],
70471
- "ambient-light-sensor": [
70472
- {
70473
- "path": "lux",
70474
- "valueType": "number"
70475
- },
70476
- {
70477
- "path": "unit",
70478
- "valueType": "string"
70479
- },
70480
- {
70481
- "path": "precision",
70482
- "valueType": "number"
70483
- }
70484
- ],
70485
- "audio-metrics": [
70486
- {
70487
- "path": "ts",
70488
- "valueType": "number"
70489
- },
70490
- {
70491
- "path": "windowSec",
70492
- "valueType": "number"
70493
- },
70494
- {
70495
- "path": "level.rms",
70496
- "valueType": "number"
70497
- },
70498
- {
70499
- "path": "level.dbfs",
70500
- "valueType": "number"
70501
- },
70502
- {
70503
- "path": "peakDbfs",
70504
- "valueType": "number"
70505
- },
70506
- {
70507
- "path": "avgDbfs",
70508
- "valueType": "number"
70509
- },
70510
- {
70511
- "path": "current.className",
70512
- "valueType": "string"
70513
- },
70514
- {
70515
- "path": "current.score",
70516
- "valueType": "number"
70517
- },
70518
- {
70519
- "path": "current.timestamp",
70520
- "valueType": "number"
70521
- }
70522
- ],
70523
- "automation-control": [
70524
- {
70525
- "path": "enabled",
70526
- "valueType": "boolean"
70527
- },
70528
- {
70529
- "path": "isRunning",
70530
- "valueType": "boolean"
70531
- },
70532
- {
70533
- "path": "lastTriggeredAt",
70534
- "valueType": "number"
70535
- },
70536
- {
70537
- "path": "lastError",
70538
- "valueType": "string"
70539
- }
70540
- ],
70541
- "battery": [
70542
- {
70543
- "path": "percentage",
70544
- "valueType": "number"
70545
- },
70546
- {
70547
- "path": "charging",
70548
- "valueType": "enum",
70549
- "enumValues": [
70550
- "dc",
70551
- "solar",
70552
- "none",
70553
- "unknown"
70554
- ]
70555
- },
70556
- {
70557
- "path": "sleeping",
70558
- "valueType": "boolean"
70559
- },
70560
- {
70561
- "path": "lastUpdated",
70562
- "valueType": "number"
70563
- },
70564
- {
70565
- "path": "lastContactAt",
70566
- "valueType": "number"
70567
- },
70568
- {
70569
- "path": "lastFullRefreshAt",
70570
- "valueType": "number"
70571
- },
70572
- {
70573
- "path": "binary",
70574
- "valueType": "boolean"
70575
- }
70576
- ],
70577
- "binary": [{
70578
- "path": "on",
70579
- "valueType": "boolean"
70580
- }],
70581
- "brightness": [{
70582
- "path": "percentage",
70583
- "valueType": "number"
70584
- }],
70585
- "broker": [{
70586
- "path": "brokerCount",
70587
- "valueType": "number"
70588
- }, {
70589
- "path": "connectedCount",
70590
- "valueType": "number"
70591
- }],
70592
- "camera-credentials": [
70593
- {
70594
- "path": "host",
70595
- "valueType": "string"
70596
- },
70597
- {
70598
- "path": "port",
70599
- "valueType": "number"
70600
- },
70601
- {
70602
- "path": "onvifPort",
70603
- "valueType": "number"
70604
- },
70605
- {
70606
- "path": "rtspPort",
70607
- "valueType": "number"
70608
- },
70609
- {
70610
- "path": "https",
70611
- "valueType": "boolean"
70612
- },
70613
- {
70614
- "path": "hasUsername",
70615
- "valueType": "boolean"
70616
- },
70617
- {
70618
- "path": "hasPassword",
70619
- "valueType": "boolean"
70620
- },
70621
- {
70622
- "path": "onvifProfile",
70623
- "valueType": "string"
70624
- }
70625
- ],
70626
- "camera-streams": [
70627
- {
70628
- "path": "online",
70629
- "valueType": "boolean"
70630
- },
70631
- {
70632
- "path": "slotStatuses.high",
70633
- "valueType": "enum",
70634
- "enumValues": [
70635
- "unassigned",
70636
- "idle",
70637
- "connecting",
70638
- "streaming",
70639
- "error"
70640
- ]
70641
- },
70642
- {
70643
- "path": "slotStatuses.mid",
70644
- "valueType": "enum",
70645
- "enumValues": [
70646
- "unassigned",
70647
- "idle",
70648
- "connecting",
70649
- "streaming",
70650
- "error"
70651
- ]
70652
- },
70653
- {
70654
- "path": "slotStatuses.low",
70655
- "valueType": "enum",
70656
- "enumValues": [
70657
- "unassigned",
70658
- "idle",
70659
- "connecting",
70660
- "streaming",
70661
- "error"
70662
- ]
70663
- },
70664
- {
70665
- "path": "slotErrors.high",
70666
- "valueType": "string"
70667
- },
70668
- {
70669
- "path": "slotErrors.mid",
70670
- "valueType": "string"
70671
- },
70672
- {
70673
- "path": "slotErrors.low",
70674
- "valueType": "string"
70675
- }
70676
- ],
70677
- "carbon-monoxide": [{
70678
- "path": "detected",
70679
- "valueType": "boolean"
70680
- }],
70681
- "climate-control": [
70682
- {
70683
- "path": "mode",
70684
- "valueType": "enum",
70685
- "enumValues": [
70686
- "off",
70687
- "heat",
70688
- "cool",
70689
- "auto",
70690
- "heat_cool",
70691
- "fan_only",
70692
- "dry"
70693
- ]
70694
- },
70695
- {
70696
- "path": "fanMode",
70697
- "valueType": "string"
70698
- },
70699
- {
70700
- "path": "preset",
70701
- "valueType": "string"
70702
- },
70703
- {
70704
- "path": "target",
70705
- "valueType": "number"
70706
- },
70707
- {
70708
- "path": "targetHigh",
70709
- "valueType": "number"
70710
- },
70711
- {
70712
- "path": "targetLow",
70713
- "valueType": "number"
70714
- },
70715
- {
70716
- "path": "targetHumidity",
70717
- "valueType": "number"
70718
- },
70719
- {
70720
- "path": "currentTemp",
70721
- "valueType": "number"
70722
- },
70723
- {
70724
- "path": "currentHumidity",
70725
- "valueType": "number"
70726
- },
70727
- {
70728
- "path": "swingVertical",
70729
- "valueType": "boolean"
70730
- },
70731
- {
70732
- "path": "swingHorizontal",
70733
- "valueType": "boolean"
70734
- },
70735
- {
70736
- "path": "minTemp",
70737
- "valueType": "number"
70738
- },
70739
- {
70740
- "path": "maxTemp",
70741
- "valueType": "number"
70742
- },
70743
- {
70744
- "path": "tempStep",
70745
- "valueType": "number"
70746
- }
70747
- ],
70748
- "color": [
70749
- {
70750
- "path": "mode",
70751
- "valueType": "enum",
70752
- "enumValues": [
70753
- "rgb",
70754
- "hsv",
70755
- "mired"
70756
- ]
70757
- },
70758
- {
70759
- "path": "rgb.r",
70760
- "valueType": "number"
70761
- },
70762
- {
70763
- "path": "rgb.g",
70764
- "valueType": "number"
70765
- },
70766
- {
70767
- "path": "rgb.b",
70768
- "valueType": "number"
70769
- },
70770
- {
70771
- "path": "hsv.h",
70772
- "valueType": "number"
70773
- },
70774
- {
70775
- "path": "hsv.s",
70776
- "valueType": "number"
70777
- },
70778
- {
70779
- "path": "hsv.v",
70780
- "valueType": "number"
70781
- },
70782
- {
70783
- "path": "mireds",
70784
- "valueType": "number"
70785
- }
70786
- ],
70787
- "connectivity": [{
70788
- "path": "connected",
70789
- "valueType": "boolean"
70790
- }],
70791
- "contact": [{
70792
- "path": "entryOpen",
70793
- "valueType": "boolean"
70794
- }],
70795
- "control": [
70796
- {
70797
- "path": "kind",
70798
- "valueType": "enum",
70799
- "enumValues": [
70800
- "numeric",
70801
- "select",
70802
- "text",
70803
- "datetime"
70804
- ]
70805
- },
70806
- {
70807
- "path": "unit",
70808
- "valueType": "string"
70809
- },
70810
- {
70811
- "path": "min",
70812
- "valueType": "number"
70813
- },
70814
- {
70815
- "path": "max",
70816
- "valueType": "number"
70817
- },
70818
- {
70819
- "path": "step",
70820
- "valueType": "number"
70821
- },
70822
- {
70823
- "path": "precision",
70824
- "valueType": "number"
70825
- },
70826
- {
70827
- "path": "format",
70828
- "valueType": "enum",
70829
- "enumValues": [
70830
- "date",
70831
- "time",
70832
- "datetime"
70833
- ]
70834
- }
70835
- ],
70836
- "cover": [
70837
- {
70838
- "path": "state",
70839
- "valueType": "enum",
70840
- "enumValues": [
70841
- "open",
70842
- "opening",
70843
- "closing",
70844
- "closed",
70845
- "stopped"
70846
- ]
70847
- },
70848
- {
70849
- "path": "position",
70850
- "valueType": "number"
70851
- },
70852
- {
70853
- "path": "tiltPosition",
70854
- "valueType": "number"
70855
- }
70856
- ],
70857
- "day-night": [
70858
- {
70859
- "path": "mode",
70860
- "valueType": "enum",
70861
- "enumValues": [
70862
- "auto",
70863
- "day",
70864
- "night",
70865
- "schedule"
70866
- ]
70867
- },
70868
- {
70869
- "path": "sensitivity",
70870
- "valueType": "number"
70871
- },
70872
- {
70873
- "path": "switchDelaySec",
70874
- "valueType": "number"
70875
- }
70876
- ],
70877
- "device-adoption": [
70878
- {
70879
- "path": "lastDiscoveryAt",
70880
- "valueType": "number"
70881
- },
70882
- {
70883
- "path": "candidateCount",
70884
- "valueType": "number"
70885
- },
70886
- {
70887
- "path": "adoptedCount",
70888
- "valueType": "number"
70889
- },
70890
- {
70891
- "path": "lastError",
70892
- "valueType": "string"
70893
- }
70894
- ],
70895
- "device-discovery": [{
70896
- "path": "lastDiscoveryAt",
70897
- "valueType": "number"
70898
- }, {
70899
- "path": "lastError",
70900
- "valueType": "string"
70901
- }],
70902
- "device-export": [
70903
- {
70904
- "path": "linkState",
70905
- "valueType": "enum",
70906
- "enumValues": [
70907
- "unlinked",
70908
- "linked",
70909
- "error"
70910
- ]
70911
- },
70912
- {
70913
- "path": "exposedDeviceCount",
70914
- "valueType": "number"
70915
- },
70916
- {
70917
- "path": "error",
70918
- "valueType": "string"
70919
- },
70920
- {
70921
- "path": "setup.qr",
70922
- "valueType": "string"
70923
- },
70924
- {
70925
- "path": "setup.note",
70926
- "valueType": "string"
70927
- }
70928
- ],
70929
- "device-status": [{
70930
- "path": "online",
70931
- "valueType": "boolean"
70932
- }],
70933
- "dishwasher": [
70934
- {
70935
- "path": "availability",
70936
- "valueType": "enum",
70937
- "enumValues": [
70938
- "available",
70939
- "offline",
70940
- "description-missing"
70941
- ]
70942
- },
70943
- {
70944
- "path": "state",
70945
- "valueType": "enum",
70946
- "enumValues": [
70947
- "idle",
70948
- "running",
70949
- "paused",
70950
- "finished",
70951
- "error",
70952
- "unavailable"
70953
- ]
70954
- },
70955
- {
70956
- "path": "operationState",
70957
- "valueType": "enum",
70958
- "enumValues": [
70959
- "Inactive",
70960
- "Ready",
70961
- "DelayedStart",
70962
- "Run",
70963
- "Pause",
70964
- "ActionRequired",
70965
- "Finished",
70966
- "Error",
70967
- "Aborting"
70968
- ]
70969
- },
70970
- {
70971
- "path": "program",
70972
- "valueType": "string"
70973
- },
70974
- {
70975
- "path": "selectedProgram",
70976
- "valueType": "string"
70977
- },
70978
- {
70979
- "path": "remainingSeconds",
70980
- "valueType": "number"
70981
- },
70982
- {
70983
- "path": "delayedStartSeconds",
70984
- "valueType": "number"
70985
- },
70986
- {
70987
- "path": "progressPercent",
70988
- "valueType": "number"
70989
- },
70990
- {
70991
- "path": "doorOpen",
70992
- "valueType": "boolean"
70993
- },
70994
- {
70995
- "path": "doorLocked",
70996
- "valueType": "boolean"
70997
- },
70998
- {
70999
- "path": "remoteStartAllowed",
71000
- "valueType": "boolean"
71001
- },
71002
- {
71003
- "path": "remoteControlActive",
71004
- "valueType": "boolean"
71005
- },
71006
- {
71007
- "path": "localControlActive",
71008
- "valueType": "boolean"
71009
- },
71010
- {
71011
- "path": "powerOn",
71012
- "valueType": "boolean"
71013
- },
71014
- {
71015
- "path": "powerState",
71016
- "valueType": "string"
71017
- },
71018
- {
71019
- "path": "filterCleaningDue",
71020
- "valueType": "boolean"
71021
- },
71022
- {
71023
- "path": "machineCareDue",
71024
- "valueType": "boolean"
71025
- },
71026
- {
71027
- "path": "machineCareRemainingRuns",
71028
- "valueType": "number"
71029
- },
71030
- {
71031
- "path": "halfLoad",
71032
- "valueType": "boolean"
71033
- },
71034
- {
71035
- "path": "hygienePlus",
71036
- "valueType": "boolean"
71037
- },
71038
- {
71039
- "path": "extraDry",
71040
- "valueType": "boolean"
71041
- },
71042
- {
71043
- "path": "intensiveZone",
71044
- "valueType": "boolean"
71045
- },
71046
- {
71047
- "path": "varioSpeedPlus",
71048
- "valueType": "boolean"
71049
- },
71050
- {
71051
- "path": "childLock",
71052
- "valueType": "boolean"
71053
- },
71054
- {
71055
- "path": "errorCode",
71056
- "valueType": "number"
71057
- },
71058
- {
71059
- "path": "errorLabel",
71060
- "valueType": "string"
71061
- }
71062
- ],
71063
- "doorbell": [{
71064
- "path": "lastPressedAt",
71065
- "valueType": "number"
71066
- }, {
71067
- "path": "pressCountSinceStart",
71068
- "valueType": "number"
71069
- }],
71070
- "enum-sensor": [{
71071
- "path": "value",
71072
- "valueType": "string"
71073
- }, {
71074
- "path": "format",
71075
- "valueType": "enum",
71076
- "enumValues": [
71077
- "date",
71078
- "time",
71079
- "datetime"
71080
- ]
71081
- }],
71082
- "event-emitter": [
71083
- {
71084
- "path": "lastEvent.deviceId",
71085
- "valueType": "number"
71086
- },
71087
- {
71088
- "path": "lastEvent.eventType",
71089
- "valueType": "string"
71090
- },
71091
- {
71092
- "path": "lastEvent.timestamp",
71093
- "valueType": "number"
71094
- },
71095
- {
71096
- "path": "lastEvent.seq",
71097
- "valueType": "number"
71098
- },
71099
- {
71100
- "path": "eventCountSinceStart",
71101
- "valueType": "number"
71102
- }
71103
- ],
71104
- "fan-control": [
71105
- {
71106
- "path": "percentage",
71107
- "valueType": "number"
71108
- },
71109
- {
71110
- "path": "percentageStep",
71111
- "valueType": "number"
71112
- },
71113
- {
71114
- "path": "preset",
71115
- "valueType": "string"
71116
- },
71117
- {
71118
- "path": "direction",
71119
- "valueType": "enum",
71120
- "enumValues": ["forward", "reverse"]
71121
- },
71122
- {
71123
- "path": "oscillating",
71124
- "valueType": "boolean"
71125
- }
71126
- ],
71127
- "feature-probe": [
71128
- {
71129
- "path": "deviceType",
71130
- "valueType": "string"
71131
- },
71132
- {
71133
- "path": "model",
71134
- "valueType": "string"
71135
- },
71136
- {
71137
- "path": "channelCount",
71138
- "valueType": "number"
71139
- },
71140
- {
71141
- "path": "lastProbedAt",
71142
- "valueType": "number"
71143
- }
71144
- ],
71145
- "flood": [{
71146
- "path": "flooded",
71147
- "valueType": "boolean"
71148
- }],
71149
- "gas": [{
71150
- "path": "detected",
71151
- "valueType": "boolean"
71152
- }],
71153
- "heating-valve": [{
71154
- "path": "position",
71155
- "valueType": "number"
71156
- }],
71157
- "humidifier": [
71158
- {
71159
- "path": "on",
71160
- "valueType": "boolean"
71161
- },
71162
- {
71163
- "path": "currentHumidity",
71164
- "valueType": "number"
71165
- },
71166
- {
71167
- "path": "targetHumidity",
71168
- "valueType": "number"
71169
- },
71170
- {
71171
- "path": "mode",
71172
- "valueType": "string"
71173
- },
71174
- {
71175
- "path": "action",
71176
- "valueType": "string"
71177
- },
71178
- {
71179
- "path": "minHumidity",
71180
- "valueType": "number"
71181
- },
71182
- {
71183
- "path": "maxHumidity",
71184
- "valueType": "number"
71185
- }
71186
- ],
71187
- "humidity-sensor": [
71188
- {
71189
- "path": "percent",
71190
- "valueType": "number"
71191
- },
71192
- {
71193
- "path": "unit",
71194
- "valueType": "string"
71195
- },
71196
- {
71197
- "path": "precision",
71198
- "valueType": "number"
71199
- }
71200
- ],
71201
- "image": [{
71202
- "path": "url",
71203
- "valueType": "string"
71204
- }, {
71205
- "path": "lastUpdated",
71206
- "valueType": "number"
71207
- }],
71208
- "image-settings": [
71209
- {
71210
- "path": "brightness",
71211
- "valueType": "number"
71212
- },
71213
- {
71214
- "path": "contrast",
71215
- "valueType": "number"
71216
- },
71217
- {
71218
- "path": "saturation",
71219
- "valueType": "number"
71220
- },
71221
- {
71222
- "path": "sharpness",
71223
- "valueType": "number"
71224
- },
71225
- {
71226
- "path": "mirror",
71227
- "valueType": "boolean"
71228
- },
71229
- {
71230
- "path": "flip",
71231
- "valueType": "boolean"
71232
- },
71233
- {
71234
- "path": "rotate",
71235
- "valueType": "enum",
71236
- "enumValues": [
71237
- "0",
71238
- "90",
71239
- "180",
71240
- "270"
71241
- ]
71242
- },
71243
- {
71244
- "path": "whiteBalance",
71245
- "valueType": "enum",
71246
- "enumValues": ["auto", "manual"]
71247
- },
71248
- {
71249
- "path": "warmth",
71250
- "valueType": "number"
71251
- },
71252
- {
71253
- "path": "exposureMode",
71254
- "valueType": "enum",
71255
- "enumValues": ["auto", "manual"]
71256
- },
71257
- {
71258
- "path": "backlightMode",
71259
- "valueType": "enum",
71260
- "enumValues": [
71261
- "off",
71262
- "blc",
71263
- "wdr",
71264
- "hlc"
71265
- ]
71266
- }
71267
- ],
71268
- "intercom": [
71269
- {
71270
- "path": "talking",
71271
- "valueType": "boolean"
71272
- },
71273
- {
71274
- "path": "lastSessionAt",
71275
- "valueType": "number"
71276
- },
71277
- {
71278
- "path": "ability.sampleRate",
71279
- "valueType": "number"
71280
- },
71281
- {
71282
- "path": "ability.duplex",
71283
- "valueType": "enum",
71284
- "enumValues": ["half", "full"]
71285
- },
71286
- {
71287
- "path": "ability.maxBacklogMs",
71288
- "valueType": "number"
71289
- }
71290
- ],
71291
- "lawn-mower-control": [
71292
- {
71293
- "path": "activity",
71294
- "valueType": "enum",
71295
- "enumValues": [
71296
- "idle",
71297
- "mowing",
71298
- "paused",
71299
- "docked",
71300
- "error"
71301
- ]
71302
- },
71303
- {
71304
- "path": "batteryLevel",
71305
- "valueType": "number"
71306
- },
71307
- {
71308
- "path": "progressPercent",
71309
- "valueType": "number"
71310
- },
71311
- {
71312
- "path": "currentCode",
71313
- "valueType": "number"
71314
- },
71315
- {
71316
- "path": "currentCodeLabel",
71317
- "valueType": "string"
71318
- },
71319
- {
71320
- "path": "severity",
71321
- "valueType": "enum",
71322
- "enumValues": [
71323
- "info",
71324
- "warning",
71325
- "error"
71326
- ]
71327
- }
71328
- ],
71329
- "lock-control": [{
71330
- "path": "state",
71331
- "valueType": "enum",
71332
- "enumValues": [
71333
- "locked",
71334
- "unlocked",
71335
- "locking",
71336
- "unlocking",
71337
- "jammed"
71338
- ]
71339
- }],
71340
- "media-player": [
71341
- {
71342
- "path": "state",
71343
- "valueType": "enum",
71344
- "enumValues": [
71345
- "off",
71346
- "on",
71347
- "idle",
71348
- "playing",
71349
- "paused",
71350
- "buffering",
71351
- "standby"
71352
- ]
71353
- },
71354
- {
71355
- "path": "volumeLevel",
71356
- "valueType": "number"
71357
- },
71358
- {
71359
- "path": "isMuted",
71360
- "valueType": "boolean"
71361
- },
71362
- {
71363
- "path": "source",
71364
- "valueType": "string"
71365
- },
71366
- {
71367
- "path": "currentMedia.type",
71368
- "valueType": "string"
71369
- },
71370
- {
71371
- "path": "currentMedia.title",
71372
- "valueType": "string"
71373
- },
71374
- {
71375
- "path": "currentMedia.artist",
71376
- "valueType": "string"
71377
- },
71378
- {
71379
- "path": "currentMedia.album",
71380
- "valueType": "string"
71381
- },
71382
- {
71383
- "path": "currentMedia.imageUrl",
71384
- "valueType": "string"
71385
- },
71386
- {
71387
- "path": "positionMs",
71388
- "valueType": "number"
71389
- },
71390
- {
71391
- "path": "durationMs",
71392
- "valueType": "number"
71393
- },
71394
- {
71395
- "path": "shuffle",
71396
- "valueType": "boolean"
71397
- },
71398
- {
71399
- "path": "repeat",
71400
- "valueType": "enum",
71401
- "enumValues": [
71402
- "off",
71403
- "all",
71404
- "one"
71405
- ]
71406
- }
71407
- ],
71408
- "motion": [
71409
- {
71410
- "path": "detected",
71411
- "valueType": "boolean"
71412
- },
71413
- {
71414
- "path": "lastDetectedAt",
71415
- "valueType": "number"
71416
- },
71417
- {
71418
- "path": "autoClearAfterMs",
71419
- "valueType": "number"
71420
- }
71421
- ],
71422
- "motion-trigger": [{
71423
- "path": "enabled",
71424
- "valueType": "boolean"
71425
- }],
71426
- "motion-zones": [{
71427
- "path": "enabled",
71428
- "valueType": "boolean"
71429
- }, {
71430
- "path": "sensitivity",
71431
- "valueType": "number"
71432
- }],
71433
- "mqtt-broker": [{
71434
- "path": "brokerCount",
71435
- "valueType": "number"
71436
- }, {
71437
- "path": "embeddedRunning",
71438
- "valueType": "boolean"
71439
- }],
71440
- "native-object-detection": [{
71441
- "path": "enabled",
71442
- "valueType": "boolean"
71443
- }],
71444
- "navigation": [
71445
- {
71446
- "path": "mode",
71447
- "valueType": "enum",
71448
- "enumValues": [
71449
- "idle",
71450
- "cleaning",
71451
- "spot",
71452
- "following",
71453
- "goto",
71454
- "returning",
71455
- "paused",
71456
- "unknown"
71457
- ]
71458
- },
71459
- {
71460
- "path": "following",
71461
- "valueType": "boolean"
71462
- },
71463
- {
71464
- "path": "flash",
71465
- "valueType": "boolean"
71466
- },
71467
- {
71468
- "path": "lightMode",
71469
- "valueType": "enum",
71470
- "enumValues": ["auto", "manual"]
71471
- },
71472
- {
71473
- "path": "lightLevel",
71474
- "valueType": "number"
71475
- }
71476
- ],
71477
- "network-link": [
71478
- {
71479
- "path": "type",
71480
- "valueType": "enum",
71481
- "enumValues": [
71482
- "wifi",
71483
- "ethernet",
71484
- "cellular",
71485
- "unknown"
71486
- ]
71487
- },
71488
- {
71489
- "path": "signalPercent",
71490
- "valueType": "number"
71491
- },
71492
- {
71493
- "path": "rssiDbm",
71494
- "valueType": "number"
71495
- },
71496
- {
71497
- "path": "ssid",
71498
- "valueType": "string"
71499
- },
71500
- {
71501
- "path": "lastUpdated",
71502
- "valueType": "number"
71503
- }
71504
- ],
71505
- "notifier": [
71506
- {
71507
- "path": "lastSentAt",
71508
- "valueType": "number"
71509
- },
71510
- {
71511
- "path": "lastError",
71512
- "valueType": "string"
71513
- },
71514
- {
71515
- "path": "queueDepth",
71516
- "valueType": "number"
71517
- },
71518
- {
71519
- "path": "supports.image",
71520
- "valueType": "boolean"
71521
- },
71522
- {
71523
- "path": "supports.priority",
71524
- "valueType": "boolean"
71525
- },
71526
- {
71527
- "path": "supports.data",
71528
- "valueType": "boolean"
71529
- },
71530
- {
71531
- "path": "supports.actions",
71532
- "valueType": "boolean"
71533
- },
71534
- {
71535
- "path": "supports.recipients",
71536
- "valueType": "boolean"
71537
- }
71538
- ],
71539
- "numeric-sensor": [
71540
- {
71541
- "path": "value",
71542
- "valueType": "number"
71543
- },
71544
- {
71545
- "path": "unit",
71546
- "valueType": "string"
71547
- },
71548
- {
71549
- "path": "precision",
71550
- "valueType": "number"
71551
- }
71552
- ],
71553
- "pet-feeder": [
71554
- {
71555
- "path": "foodLevel",
71556
- "valueType": "number"
71557
- },
71558
- {
71559
- "path": "food1",
71560
- "valueType": "number"
71561
- },
71562
- {
71563
- "path": "food2",
71564
- "valueType": "number"
71565
- },
71566
- {
71567
- "path": "lowFood",
71568
- "valueType": "boolean"
71569
- },
71570
- {
71571
- "path": "batteryPower",
71572
- "valueType": "number"
71573
- },
71574
- {
71575
- "path": "desiccantLeftDays",
71576
- "valueType": "number"
71577
- },
71578
- {
71579
- "path": "feeding",
71580
- "valueType": "boolean"
71581
- },
71582
- {
71583
- "path": "status",
71584
- "valueType": "enum",
71585
- "enumValues": [
71586
- "normal",
71587
- "offline",
71588
- "on_batteries"
71589
- ]
71590
- },
71591
- {
71592
- "path": "error",
71593
- "valueType": "string"
71594
- },
71595
- {
71596
- "path": "errorCode",
71597
- "valueType": "number"
71598
- },
71599
- {
71600
- "path": "isDualHopper",
71601
- "valueType": "boolean"
71602
- },
71603
- {
71604
- "path": "childLock",
71605
- "valueType": "boolean"
71606
- },
71607
- {
71608
- "path": "indicatorLight",
71609
- "valueType": "boolean"
71610
- },
71611
- {
71612
- "path": "feedSound",
71613
- "valueType": "boolean"
71614
- },
71615
- {
71616
- "path": "volume",
71617
- "valueType": "number"
71618
- }
71619
- ],
71620
- "power-meter": [
71621
- {
71622
- "path": "watts",
71623
- "valueType": "number"
71624
- },
71625
- {
71626
- "path": "kwhTotal",
71627
- "valueType": "number"
71628
- },
71629
- {
71630
- "path": "volts",
71631
- "valueType": "number"
71632
- },
71633
- {
71634
- "path": "amps",
71635
- "valueType": "number"
71636
- },
71637
- {
71638
- "path": "va",
71639
- "valueType": "number"
71640
- },
71641
- {
71642
- "path": "powerFactor",
71643
- "valueType": "number"
71644
- },
71645
- {
71646
- "path": "unit",
71647
- "valueType": "string"
71648
- },
71649
- {
71650
- "path": "precision",
71651
- "valueType": "number"
71652
- }
71653
- ],
71654
- "presence": [
71655
- {
71656
- "path": "state",
71657
- "valueType": "string"
71658
- },
71659
- {
71660
- "path": "location",
71661
- "valueType": "string"
71662
- },
71663
- {
71664
- "path": "gps.latitude",
71665
- "valueType": "number"
71666
- },
71667
- {
71668
- "path": "gps.longitude",
71669
- "valueType": "number"
71670
- },
71671
- {
71672
- "path": "gps.accuracyMeters",
71673
- "valueType": "number"
71674
- },
71675
- {
71676
- "path": "batteryPercent",
71677
- "valueType": "number"
71678
- }
71679
- ],
71680
- "pressure-sensor": [
71681
- {
71682
- "path": "hpa",
71683
- "valueType": "number"
71684
- },
71685
- {
71686
- "path": "unit",
71687
- "valueType": "string"
71688
- },
71689
- {
71690
- "path": "precision",
71691
- "valueType": "number"
71692
- }
71693
- ],
71694
- "privacy-mask": [{
71695
- "path": "enabled",
71696
- "valueType": "boolean"
71697
- }, {
71698
- "path": "audioEnabled",
71699
- "valueType": "boolean"
71700
- }],
71701
- "ptz": [
71702
- {
71703
- "path": "pan",
71704
- "valueType": "number"
71705
- },
71706
- {
71707
- "path": "tilt",
71708
- "valueType": "number"
71709
- },
71710
- {
71711
- "path": "zoom",
71712
- "valueType": "number"
71713
- },
71714
- {
71715
- "path": "autofocus",
71716
- "valueType": "boolean"
71717
- }
71718
- ],
71719
- "ptz-autotrack": [
71720
- {
71721
- "path": "enabled",
71722
- "valueType": "boolean"
71723
- },
71724
- {
71725
- "path": "currentSettings.targetType",
71726
- "valueType": "string"
71727
- },
71728
- {
71729
- "path": "currentSettings.stopDelaySeconds",
71730
- "valueType": "number"
71731
- },
71732
- {
71733
- "path": "currentSettings.disappearDelaySeconds",
71734
- "valueType": "number"
71735
- }
71736
- ],
71737
- "recording-archive": [
71738
- {
71739
- "path": "deviceId",
71740
- "valueType": "number"
71741
- },
71742
- {
71743
- "path": "enabled",
71744
- "valueType": "boolean"
71745
- },
71746
- {
71747
- "path": "activeMode",
71748
- "valueType": "enum",
71749
- "enumValues": [
71750
- "off",
71751
- "events",
71752
- "continuous",
71753
- "on-device-decision"
71754
- ]
71755
- },
71756
- {
71757
- "path": "nodeId",
71758
- "valueType": "string"
71759
- },
71760
- {
71761
- "path": "storageBytes",
71762
- "valueType": "number"
71763
- }
71764
- ],
71765
- "recording-onboard": [
71766
- {
71767
- "path": "primaryTrackId",
71768
- "valueType": "string"
71769
- },
71770
- {
71771
- "path": "enabled",
71772
- "valueType": "boolean"
71773
- },
71774
- {
71775
- "path": "overwriteWhenFull",
71776
- "valueType": "boolean"
71777
- },
71778
- {
71779
- "path": "preRecordSec",
71780
- "valueType": "number"
71781
- },
71782
- {
71783
- "path": "postRecordSec",
71784
- "valueType": "number"
71785
- },
71786
- {
71787
- "path": "segmentMinutes",
71788
- "valueType": "number"
71789
- },
71790
- {
71791
- "path": "unreadableWindows",
71792
- "valueType": "number"
71793
- },
71794
- {
71795
- "path": "recordingToNowhere",
71796
- "valueType": "boolean"
71797
- }
71798
- ],
71799
- "recording-signal": [{
71800
- "path": "active",
71801
- "valueType": "boolean"
71802
- }, {
71803
- "path": "reason",
71804
- "valueType": "string"
71805
- }],
71806
- "running-state": [
71807
- {
71808
- "path": "running",
71809
- "valueType": "boolean"
71810
- },
71811
- {
71812
- "path": "since",
71813
- "valueType": "number"
71814
- },
71815
- {
71816
- "path": "source",
71817
- "valueType": "enum",
71818
- "enumValues": ["native", "assigned"]
71819
- },
71820
- {
71821
- "path": "phase",
71822
- "valueType": "string"
71823
- }
71824
- ],
71825
- "script-runner": [
71826
- {
71827
- "path": "isRunning",
71828
- "valueType": "boolean"
71829
- },
71830
- {
71831
- "path": "lastRunAt",
71832
- "valueType": "number"
71833
- },
71834
- {
71835
- "path": "lastRunSuccess",
71836
- "valueType": "boolean"
71837
- },
71838
- {
71839
- "path": "lastError",
71840
- "valueType": "string"
71841
- }
71842
- ],
71843
- "smoke": [{
71844
- "path": "detected",
71845
- "valueType": "boolean"
71846
- }],
71847
- "snapshot": [
71848
- {
71849
- "path": "lastCapturedAt",
71850
- "valueType": "number"
71851
- },
71852
- {
71853
- "path": "cacheAgeMs",
71854
- "valueType": "number"
71855
- },
71856
- {
71857
- "path": "lastBytes",
71858
- "valueType": "number"
71859
- },
71860
- {
71861
- "path": "lastStreamId",
71862
- "valueType": "string"
71863
- }
71864
- ],
71865
- "stream-params": [
71866
- {
71867
- "path": "main.width",
71868
- "valueType": "number"
71869
- },
71870
- {
71871
- "path": "main.height",
71872
- "valueType": "number"
71873
- },
71874
- {
71875
- "path": "main.codec",
71876
- "valueType": "enum",
71877
- "enumValues": ["h264", "h265"]
71878
- },
71879
- {
71880
- "path": "main.framerate",
71881
- "valueType": "number"
71882
- },
71883
- {
71884
- "path": "main.bitrate",
71885
- "valueType": "number"
71886
- },
71887
- {
71888
- "path": "main.bitrateMode",
71889
- "valueType": "enum",
71890
- "enumValues": ["vbr", "cbr"]
71891
- },
71892
- {
71893
- "path": "main.encoderProfile",
71894
- "valueType": "enum",
71895
- "enumValues": [
71896
- "high",
71897
- "main",
71898
- "baseline"
71899
- ]
71900
- },
71901
- {
71902
- "path": "main.gop",
71903
- "valueType": "number"
71904
- },
71905
- {
71906
- "path": "main.audio",
71907
- "valueType": "boolean"
71908
- },
71909
- {
71910
- "path": "sub.width",
71911
- "valueType": "number"
71912
- },
71913
- {
71914
- "path": "sub.height",
71915
- "valueType": "number"
71916
- },
71917
- {
71918
- "path": "sub.codec",
71919
- "valueType": "enum",
71920
- "enumValues": ["h264", "h265"]
71921
- },
71922
- {
71923
- "path": "sub.framerate",
71924
- "valueType": "number"
71925
- },
71926
- {
71927
- "path": "sub.bitrate",
71928
- "valueType": "number"
71929
- },
71930
- {
71931
- "path": "sub.bitrateMode",
71932
- "valueType": "enum",
71933
- "enumValues": ["vbr", "cbr"]
71934
- },
71935
- {
71936
- "path": "sub.encoderProfile",
71937
- "valueType": "enum",
71938
- "enumValues": [
71939
- "high",
71940
- "main",
71941
- "baseline"
71942
- ]
71943
- },
71944
- {
71945
- "path": "sub.gop",
71946
- "valueType": "number"
71947
- },
71948
- {
71949
- "path": "sub.audio",
71950
- "valueType": "boolean"
71951
- },
71952
- {
71953
- "path": "ext.width",
71954
- "valueType": "number"
71955
- },
71956
- {
71957
- "path": "ext.height",
71958
- "valueType": "number"
71959
- },
71960
- {
71961
- "path": "ext.codec",
71962
- "valueType": "enum",
71963
- "enumValues": ["h264", "h265"]
71964
- },
71965
- {
71966
- "path": "ext.framerate",
71967
- "valueType": "number"
71968
- },
71969
- {
71970
- "path": "ext.bitrate",
71971
- "valueType": "number"
71972
- },
71973
- {
71974
- "path": "ext.bitrateMode",
71975
- "valueType": "enum",
71976
- "enumValues": ["vbr", "cbr"]
71977
- },
71978
- {
71979
- "path": "ext.encoderProfile",
71980
- "valueType": "enum",
71981
- "enumValues": [
71982
- "high",
71983
- "main",
71984
- "baseline"
71985
- ]
71986
- },
71987
- {
71988
- "path": "ext.gop",
71989
- "valueType": "number"
71990
- },
71991
- {
71992
- "path": "ext.audio",
71993
- "valueType": "boolean"
71994
- }
71995
- ],
71996
- "switch": [{
71997
- "path": "on",
71998
- "valueType": "boolean"
71999
- }],
72000
- "tamper": [{
72001
- "path": "tampered",
72002
- "valueType": "boolean"
72003
- }],
72004
- "temperature-sensor": [
72005
- {
72006
- "path": "celsius",
72007
- "valueType": "number"
72008
- },
72009
- {
72010
- "path": "unit",
72011
- "valueType": "string"
72012
- },
72013
- {
72014
- "path": "precision",
72015
- "valueType": "number"
72016
- }
72017
- ],
72018
- "update": [
72019
- {
72020
- "path": "currentVersion",
72021
- "valueType": "string"
72022
- },
72023
- {
72024
- "path": "availableVersion",
72025
- "valueType": "string"
72026
- },
72027
- {
72028
- "path": "updatable",
72029
- "valueType": "boolean"
72030
- },
72031
- {
72032
- "path": "state",
72033
- "valueType": "string"
72034
- },
72035
- {
72036
- "path": "inProgress",
72037
- "valueType": "boolean"
72038
- }
72039
- ],
72040
- "vacuum-control": [
72041
- {
72042
- "path": "state",
72043
- "valueType": "enum",
72044
- "enumValues": [
72045
- "idle",
72046
- "cleaning",
72047
- "paused",
72048
- "returning",
72049
- "docked",
72050
- "drying",
72051
- "error"
72052
- ]
72053
- },
72054
- {
72055
- "path": "batteryLevel",
72056
- "valueType": "number"
72057
- },
72058
- {
72059
- "path": "fanSpeed",
72060
- "valueType": "string"
72061
- },
72062
- {
72063
- "path": "progressPercent",
72064
- "valueType": "number"
72065
- },
72066
- {
72067
- "path": "errorCode",
72068
- "valueType": "number"
72069
- },
72070
- {
72071
- "path": "errorLabel",
72072
- "valueType": "string"
72073
- }
72074
- ],
72075
- "valve": [{
72076
- "path": "state",
72077
- "valueType": "enum",
72078
- "enumValues": [
72079
- "open",
72080
- "opening",
72081
- "closing",
72082
- "closed",
72083
- "stopped"
72084
- ]
72085
- }, {
72086
- "path": "position",
72087
- "valueType": "number"
72088
- }],
72089
- "vibration": [{
72090
- "path": "detected",
72091
- "valueType": "boolean"
72092
- }],
72093
- "water-heater": [
72094
- {
72095
- "path": "currentTemp",
72096
- "valueType": "number"
72097
- },
72098
- {
72099
- "path": "targetTemp",
72100
- "valueType": "number"
72101
- },
72102
- {
72103
- "path": "operationMode",
72104
- "valueType": "string"
72105
- },
72106
- {
72107
- "path": "away",
72108
- "valueType": "boolean"
72109
- },
72110
- {
72111
- "path": "minTemp",
72112
- "valueType": "number"
72113
- },
72114
- {
72115
- "path": "maxTemp",
72116
- "valueType": "number"
72117
- }
72118
- ],
72119
- "weather": [
72120
- {
72121
- "path": "condition",
72122
- "valueType": "string"
72123
- },
72124
- {
72125
- "path": "temperature",
72126
- "valueType": "number"
72127
- },
72128
- {
72129
- "path": "temperatureUnit",
72130
- "valueType": "string"
72131
- },
72132
- {
72133
- "path": "humidity",
72134
- "valueType": "number"
72135
- },
72136
- {
72137
- "path": "pressure",
72138
- "valueType": "number"
72139
- },
72140
- {
72141
- "path": "pressureUnit",
72142
- "valueType": "string"
72143
- },
72144
- {
72145
- "path": "windSpeed",
72146
- "valueType": "number"
72147
- },
72148
- {
72149
- "path": "windSpeedUnit",
72150
- "valueType": "string"
72151
- },
72152
- {
72153
- "path": "windBearing",
72154
- "valueType": "number"
72155
- }
72156
- ],
72157
- "zone-analytics": [
72158
- {
72159
- "path": "ts",
72160
- "valueType": "number"
72161
- },
72162
- {
72163
- "path": "frameWidth",
72164
- "valueType": "number"
72165
- },
72166
- {
72167
- "path": "frameHeight",
72168
- "valueType": "number"
72169
- },
72170
- {
72171
- "path": "frame.totalObjects",
72172
- "valueType": "number"
72173
- },
72174
- {
72175
- "path": "frame.standingObjects",
72176
- "valueType": "number"
72177
- },
72178
- {
72179
- "path": "frame.transientObjects",
72180
- "valueType": "number"
72181
- },
72182
- {
72183
- "path": "unzoned.totalObjects",
72184
- "valueType": "number"
72185
- },
72186
- {
72187
- "path": "unzoned.standingObjects",
72188
- "valueType": "number"
72189
- },
72190
- {
72191
- "path": "unzoned.transientObjects",
72192
- "valueType": "number"
72193
- }
72194
- ]
72195
- });
72196
70405
  //#endregion
72197
70406
  //#region src/pipeline-analytics/services/sensor-transition-gate.ts
72198
70407
  /**
@@ -72209,7 +70418,7 @@ Object.freeze({
72209
70418
  * and downstream it became a `SensorEvent` row and a synthetic `contact` track
72210
70419
  * on the linked camera's timeline.
72211
70420
  *
72212
- * Measured on camera 615 / contact sensor 4131, 2026-08-29→30: **30 of 35**
70421
+ * Measured on camera 101 / contact sensor 4131, 2026-08-29→30: **30 of 35**
72213
70422
  * contact events were one of two non-events.
72214
70423
  *
72215
70424
  * - The RECOVERY family. The Zigbee entity flaps `off → unavailable → off`
@@ -72252,7 +70461,7 @@ Object.freeze({
72252
70461
  * ten that have a boolean whose edge means something. `button`, `presence`,
72253
70462
  * `enum-sensor` and `event-emitter` are NOT levels — their ARRIVAL is the
72254
70463
  * event, and three presses in a row are three markers. Gating them would
72255
- * re-ship the failure of 2026-08-08, when camera 615's press produced a row, a
70464
+ * re-ship the failure of 2026-08-08, when camera 101's press produced a row, a
72256
70465
  * ring, a matched rule and no marker. (`doorbell` is not a level either, but
72257
70466
  * it is not "arrival" any more: three presses are three ADVANCES of its stamp
72258
70467
  * — see "A press is a stamp that ADVANCES" below.)
@@ -72262,7 +70471,7 @@ Object.freeze({
72262
70471
  * "Arrival is the event" held only while every emission of a `doorbell` slice
72263
70472
  * was a press. It is not: the slice is restored durable state (the cap's
72264
70473
  * `durability: 'restored'`), and it is re-emitted by everything that rebuilds
72265
- * or re-claims it. Camera 615's composed doorbell (D670, HA
70474
+ * or re-claims it. Camera 101's composed doorbell (D670, HA
72266
70475
  * `switch.doorbell_bussano`) rang on 2026-10-04 19:22:46 and 2026-10-06
72267
70476
  * 08:10:56 with `{ lastPressedAt: null, pressCountSinceStart: <unchanged> }`:
72268
70477
  * the HA provider was being redeployed, the composer marked the field
@@ -72383,7 +70592,7 @@ var WORD_LEVEL_INACTIVE = {
72383
70592
  * which inlined every cap's Zod schema into the addon (~+100 MB heap per
72384
70593
  * post-analysis runner, D28).
72385
70594
  */
72386
- var ADVANCE_FIELD = CAP_ADVANCE_FIELDS;
70595
+ var ADVANCE_FIELD = require_clip_model_registry.CAP_ADVANCE_FIELDS;
72387
70596
  /** Default drop-summary window: one line per device per ten minutes, at most. */
72388
70597
  var DEFAULT_DROP_SUMMARY_WINDOW_MS = 6e5;
72389
70598
  var SensorTransitionGate = class {
@@ -72543,7 +70752,7 @@ var StationarySettingsSchema = require_clip_model_registry.object({
72543
70752
  suppressIou: require_clip_model_registry.number().min(.3).max(.9).default(SUPPRESS_IOU),
72544
70753
  /** Minimum IoU for a detection to be ASSOCIATED with an entry (confirm or
72545
70754
  * wake it) — the overlap gate that stops a different vehicle from waking a
72546
- * parked entry (the 617 flood fix). `WAKE_ASSOC_IOU`. */
70755
+ * parked entry (the 102 flood fix). `WAKE_ASSOC_IOU`. */
72547
70756
  wakeAssocIou: require_clip_model_registry.number().min(.02).max(.5).default(WAKE_ASSOC_IOU),
72548
70757
  /** Recent-window stillness after which a track stops holding its motion
72549
70758
  * session open (also the minimum track age). Creates nothing — birth is
@@ -77593,7 +75802,7 @@ var NcAlarmPanelDevice = class extends require_clip_model_registry.BaseDevice {
77593
75802
  }
77594
75803
  /**
77595
75804
  * What became of a match that pressed the panel during its entry delay (D705).
77596
- * Tagged with the CAMERA the match was about — "why is 615 not in the alarm
75805
+ * Tagged with the CAMERA the match was about — "why is 101 not in the alarm
77597
75806
  * picture" is asked per camera. A kept follower and a dropped one are both
77598
75807
  * stated: the drop is work the operator would otherwise never see go missing.
77599
75808
  */
@@ -79766,7 +77975,7 @@ var TrackDetailDispatcher = class {
79766
77975
  *
79767
77976
  * Per camera and per interval rather than per frame: a coasting track offers
79768
77977
  * one of these several times a second, and the question this answers is
79769
- * always "why is 617 worse than 615?".
77978
+ * always "why is 102 worse than 101?".
79770
77979
  */
79771
77980
  reportCoasted(deviceId, dev, now) {
79772
77981
  const ignored = dev.coastedFramesIgnored - dev.coastedReportedAt.count;
@@ -81451,7 +79660,7 @@ function discardedSystemEvent(event, lookup) {
81451
79660
  * `reason` is the verdict itself: `seeded` (the first observation of a
81452
79661
  * subject — the state was recorded, nothing was said) or `no-flip` (the
81453
79662
  * subject is already in this state). Both are answers to the operator's
81454
- * question "why did 617 not notify", and neither may be silent — a boot that
79663
+ * question "why did 102 not notify", and neither may be silent — a boot that
81455
79664
  * suppressed fifteen notifications and logged nothing would be
81456
79665
  * indistinguishable from a notification centre that had stopped working.
81457
79666
  */
@@ -82399,7 +80608,7 @@ function unique(values) {
82399
80608
  * The COMBINED row's two keys, or null when this transition is not one.
82400
80609
  *
82401
80610
  * D706 (2026-10-06) changed the BODY: a rule-caused trigger now says WHERE the intrusion
82402
- * went — `alarm.intrusion.body`, "Intrusion: Ingresso, Corridoio, Salone", the locations of
80611
+ * went — `alarm.intrusion.body`, "Intrusion: Front door, Hallway, Hall", the locations of
82403
80612
  * the source and of every follower (D705), frozen as `{{locations}}`. The paragraphs below
82404
80613
  * describe the D126 title, which stands; the detection sentence they defend is now the
82405
80614
  * body of the alarm rules' own INTRUSION pushes (titled with the location) instead.
@@ -82412,14 +80621,14 @@ function unique(values) {
82412
80621
  * class, identity and zones.
82413
80622
  *
82414
80623
  * The alarm used to write its own prose here ("The alarm was triggered by
82415
- * Person at gate on Ingresso"), which made the one notification that matters
80624
+ * Person at gate on Front door"), which made the one notification that matters
82416
80625
  * the only one in the system that did not look like the rule's others: no
82417
80626
  * identity, no zone, a different subject. The prefix carries the severity; the
82418
80627
  * familiar line carries the meaning.
82419
80628
  *
82420
80629
  * **Gated on the detection vocabulary, not on the source.** `detection.body`
82421
80630
  * renders `{{subject}}`, and a fire ref with no class composes it from the
82422
- * system event's dedup slot — "alarm:42 su Ingresso". A source without a class
80631
+ * system event's dedup slot — "alarm:42 su Front door". A source without a class
82423
80632
  * therefore keeps the alarm's own sentence, which is also what every row
82424
80633
  * enqueued before this deploy carries.
82425
80634
  */
@@ -82490,7 +80699,7 @@ function alarmSubjectDevice(transition, panelDeviceId) {
82490
80699
  * **WHOSE event it is.** With no attribution the event is about the PANEL —
82491
80700
  * an operator pressed a button, and the panel is the only device involved.
82492
80701
  * With one, it is about the CAMERA that set it off: that is the media owner,
82493
- * the name the body reads out ("ALLARME — Ingresso"), and the device a rule
80702
+ * the name the body reads out ("ALLARME — Front door"), and the device a rule
82494
80703
  * scoping `deviceIds` means. One sentence, and both halves of it are testable.
82495
80704
  * A SENSOR BYPASS is about the sensor — its name is the title.
82496
80705
  */
@@ -83426,7 +81635,7 @@ function providerSupplyReading(item) {
83426
81635
  * recheck's own lag (D279). Its clip is therefore anchored well in the past,
83427
81636
  * and the other source cannot take that moment over yet: measured against
83428
81637
  * `recording.getAvailability` for a 10 s window at several anchors, full
83429
- * coverage arrived at −18 s on device 590 and −26 s on 615 and 617 — the
81638
+ * coverage arrived at −18 s on device 104 and −26 s on 101 and 102 — the
83430
81639
  * recordings' edge is a PHASE of the 10-second segment cycle, not a number. So
83431
81640
  * the ring has to bridge from the event to the point the recordings can serve
83432
81641
  * it: the worst measured phase (26 s) plus the confirmation lag (29 s) is 55 s,
@@ -85209,7 +83418,7 @@ var NODE_UPDATE_KINDS = new Set(["server-update-available", "wrapper-update-avai
85209
83418
  * because "did it really come back, and what did it do while it was gone" is
85210
83419
  * an action and the page that answers it is the one the down-notification
85211
83420
  * already opened. On 2026-08-30 the operator's phone showed "Il dispositivo
85212
- * Videocamera sala feste è online" with `tapAction.value: null` — the same
83421
+ * Camera sala feste è online" with `tapAction.value: null` — the same
85213
83422
  * camera's `device-offline` an hour earlier opened the Stream Broker tab, and
85214
83423
  * the recovery opened nothing, purely because `device-online` had no entry
85215
83424
  * here.
@@ -85430,8 +83639,8 @@ async function downscaleFullFrameJpeg(jpeg, maxWidth = FULL_FRAME_MAX_WIDTH, max
85430
83639
  * emptied zone ten seconds apart are two claims about one scene.
85431
83640
  *
85432
83641
  * Nothing here is silent: a capture that lands and a camera that refuses each
85433
- * emit one line carrying `tags: { deviceId }`, because "why did 617 get a photo
85434
- * and 615 not" is the only form that question is ever asked in.
83642
+ * emit one line carrying `tags: { deviceId }`, because "why did 102 get a photo
83643
+ * and 101 not" is the only form that question is ever asked in.
85435
83644
  */
85436
83645
  /**
85437
83646
  * The owner-id namespace. It is what routes a lookup here instead of to the
@@ -85680,7 +83889,7 @@ var TITLE_MIN_PX = 16;
85680
83889
  * number and the same reasoning as `preview-frame.ts#fitTitle` — deliberately
85681
83890
  * GENEROUS, because a label that shrank slightly more than it had to is
85682
83891
  * invisible and one that overflowed runs into the tile beside it. The first
85683
- * live mosaic did exactly that: `Videocamera cortile · 07:49 · animal` was cut
83892
+ * live mosaic did exactly that: `Camera cortile · 07:49 · animal` was cut
85684
83893
  * to `…· anima` at the tile edge, mid-word.
85685
83894
  */
85686
83895
  var GLYPH_ADVANCE = .56;
@@ -87556,7 +85765,7 @@ var NcNotificationImageStage = class {
87556
85765
  * Below, and not above as the digest does it, and the difference is what gets
87557
85766
  * truncated. A digest's counts are the part you check afterwards, so its
87558
85767
  * sentence leads. A detection body's first line is the fact ("Persona su
87559
- * Ingresso") and a lock screen cuts from the end — putting a paragraph in front
85768
+ * Front door") and a lock screen cuts from the end — putting a paragraph in front
87560
85769
  * of it would push the fact off the screen on exactly the notifications that
87561
85770
  * matter most.
87562
85771
  */
@@ -87608,7 +85817,7 @@ var NC_CLIP_RING_RETENTION_SEC = 20;
87608
85817
  *
87609
85818
  * The notification is HELD for this: a notifier is one-shot, so the footage
87610
85819
  * rides the single message or does not ride at all. Measured on the
87611
- * 2026-09-30 pick-up on 615: export 1 s, derive 262 ms — so the bound is
85820
+ * 2026-09-30 pick-up on 101: export 1 s, derive 262 ms — so the bound is
87612
85821
  * almost never reached, and when it is the render is queued behind something
87613
85822
  * that holds the recorder's one ffmpeg lane for minutes (a timelapse), which
87614
85823
  * no wait worth holding a notification for would outlast.
@@ -87626,7 +85835,7 @@ var NC_RECORDED_FOOTAGE_WAIT_MS = 3e4;
87626
85835
  /**
87627
85836
  * The bounded wait for a still when the rule asked for NO footage.
87628
85837
  *
87629
- * Track media lands 1.5–5.5 s after the trigger (device 615, 2026-08-12), so a
85838
+ * Track media lands 1.5–5.5 s after the trigger (device 101, 2026-08-12), so a
87630
85839
  * notification built at the instant of the trigger routinely resolves nothing.
87631
85840
  * A rule that also wants footage gets this for free — the render already blocks
87632
85841
  * 7–8 s and the still is re-resolved after it. A rule that wants only a picture
@@ -87652,7 +85861,7 @@ var NC_STILL_WAIT_INTERVAL_MS = 500;
87652
85861
  *
87653
85862
  * It is NOT the ladder's top rung that has to be in band — that rung is the
87654
85863
  * native keyFrame, whose capture misses and retries (36 misses over 105 track
87655
- * starts on device 615 in 6 h), so it is in band only 46% of the time. Holding
85864
+ * starts on device 101 in 6 h), so it is in band only 46% of the time. Holding
87656
85865
  * out for the KIND the rule asked for would wait for the late frame. The gate
87657
85866
  * is the instant; the ladder then runs among the frames that are about it.
87658
85867
  */
@@ -89004,7 +87213,7 @@ var NcDispatcher = class {
89004
87213
  * A notifier is one-shot. The earlier design (D682) sent the alert first and
89005
87214
  * the recorded footage as a SECOND send with the same `tag`, on the promise
89006
87215
  * that "a phone collapses the two" — Zentik honours no tag, so every such
89007
- * row reached the operator as two messages (615, 2026-09-30). A moment that
87216
+ * row reached the operator as two messages (101, 2026-09-30). A moment that
89008
87217
  * reaches this path is already older than the ring (a pick-up is concluded
89009
87218
  * minutes after it happened), so waiting a few more seconds costs nothing;
89010
87219
  * a second message costs the operator a duplicate every time.
@@ -91567,7 +89776,7 @@ var DeviceLivenessHoldoff = class {
91567
89776
  var NC_LIVENESS_COLLECTION = "notification-center:liveness";
91568
89777
  var NC_LIVENESS_COLUMNS = [
91569
89778
  (
91570
- /** The subject the intake minted (`device:617`, `node:agent-1`) — one row
89779
+ /** The subject the intake minted (`device:102`, `node:agent-1`) — one row
91571
89780
  * each, so the two families can never collide on a key. */
91572
89781
  {
91573
89782
  name: "subject",
@@ -91585,7 +89794,7 @@ var NC_LIVENESS_COLUMNS = [
91585
89794
  }),
91586
89795
  (
91587
89796
  /** The kind that last wrote the row. Telemetry: it makes the table readable
91588
- * when someone asks "why did 617 not notify". */
89797
+ * when someone asks "why did 102 not notify". */
91589
89798
  {
91590
89799
  name: "kind",
91591
89800
  type: "TEXT",
@@ -91723,7 +89932,7 @@ var NcLivenessLedger = class {
91723
89932
  * all, so its FIRST observation ever seeds silently — and if that first
91724
89933
  * observation is the camera DYING, the outage is thrown away. Live cost,
91725
89934
  * 2026-08-13 21:36 CEST: the operator unplugged four cameras and received two
91726
- * notifications. `device:584` and `device:587` had never spoken; their
89935
+ * notifications. `device:103` and `device:112` had never spoken; their
91727
89936
  * unplugging was recorded and never announced. A camera that is quiet until
91728
89937
  * it dies is a camera whose death is silent, indefinitely.
91729
89938
  *
@@ -95151,7 +93360,7 @@ function findNextWindowOpen(input) {
95151
93360
  *
95152
93361
  * ## Why this exists
95153
93362
  *
95154
- * Measured on 617 the night of 2026-09-16, on the stills actually sent: every
93363
+ * Measured on 102 the night of 2026-09-16, on the stills actually sent: every
95155
93364
  * one of them contained a SECOND vehicle, and nothing in the image or the
95156
93365
  * prompt said which one was the subject. The model did what anyone would — it
95157
93366
  * invented the relationship between them ("passing a parked car"). The
@@ -95536,7 +93745,7 @@ function buildSummaryOutboxInputs(input) {
95536
93745
  * This is not a movement heuristic and deliberately so: `totalDistance` and
95537
93746
  * `state` were both measured against live traffic and both hide real passages.
95538
93747
  * What they cannot see is the shape this gate is for — a row whose whole life
95539
- * is one or two frames. Measured on device 617 (2026-08-19 04:12): two rows,
93748
+ * is one or two frames. Measured on device 102 (2026-08-19 04:12): two rows,
95540
93749
  * `closedReason` NULL so the parked pass is blind to them, dwell 53 ms,
95541
93750
  * `totalDistance` 0, two recorded sightings each. And `minImportance` cannot
95542
93751
  * cover it either, structurally: the static-track gate that demotes a frozen
@@ -95704,7 +93913,7 @@ function remainingSummaryCandidates(kept, taken, rank) {
95704
93913
  * clean whole scene (`keyFrame` → `keyFrameSmall` → `fullFrame`).
95705
93914
  *
95706
93915
  * ⚠ The whole-scene rungs are a FALLBACK and stay on the ladder. Measured on
95707
- * 60 real tracks (615/617, 24 h): 52 carry a crop, 43 carry a scene rung, and
93916
+ * 60 real tracks (101/102, 24 h): 52 carry a crop, 43 carry a scene rung, and
95708
93917
  * 2 carry a scene rung and NO crop — dropping the fallback would delete those
95709
93918
  * two tiles for nothing. A track with neither is dropped, never drawn as an
95710
93919
  * empty cell (see `NcSummaryProducer.loadTiles`).
@@ -97521,7 +95730,7 @@ function timelapseTemplateVars(input) {
97521
95730
  * **No coverage sentence.** It used to end with one whenever the window was
97522
95731
  * short, and it was removed on the operator's instruction: the clause fired on
97523
95732
  * every night the recorder had stumbled at all — including once at a printed
97524
- * *100%* (2026-08-12, device 615: 141 s missing out of 10 h, so the window was
95733
+ * *100%* (2026-08-12, device 101: 141 s missing out of 10 h, so the window was
97525
95734
  * incomplete while the rounded figure was 100) — and a line that cries wolf is
97526
95735
  * a line the reader skips, which costs the clauses beside it too. The figure
97527
95736
  * is not lost: it rides the `timelapse produced` log line as `coveragePct`,
@@ -97754,7 +95963,7 @@ var TimelapseScheduler = class {
97754
95963
  * Eligibility is scanned under a short `scanning` lock so two ticks do not
97755
95964
  * double-launch the same pair. Renders themselves are started together —
97756
95965
  * awaiting them one-by-one made camera B wait for camera A's ffmpeg
97757
- * (live: 1441 until 08:39, 615 until 08:46, both windows closed at 07:00).
95966
+ * (live: 1441 until 08:39, 101 until 08:46, both windows closed at 07:00).
97758
95967
  * A later tick that meets a pair already in `inFlight` counts it and
97759
95968
  * moves on, so a 30-minute render does not make the producer go deaf.
97760
95969
  */
@@ -104148,7 +102357,7 @@ function observeAudio(host, deviceId, sample) {
104148
102357
  * {@link reportOccupancyWatch}, which the audio side simply never had.
104149
102358
  *
104150
102359
  * Two shapes, deliberately. The summary answers "what does this hub listen
104151
- * for at all"; the per-camera line answers "why is 617 not notifying" — and
102360
+ * for at all"; the per-camera line answers "why is 102 not notifying" — and
104152
102361
  * that question is ALWAYS asked per camera, so the line carries
104153
102362
  * `tags.deviceId` and a rule scoped to no camera is reported as watching
104154
102363
  * every one rather than silently omitted — every one EXCEPT its
@@ -104199,7 +102408,7 @@ function reportAudioWatch(host, entries) {
104199
102408
  * sustain: ask the orchestrator for ONE look then. The session that armed
104200
102409
  * it often closes first (a car drives off, motion clears) and the next
104201
102410
  * sample would otherwise be the 300 s parked-object cadence — 4 min 52 s
104202
- * late on 617, 2026-10-01. Fire-and-forget: a refusal or a failure costs
102411
+ * late on 102, 2026-10-01. Fire-and-forget: a refusal or a failure costs
104203
102412
  * the early commit, never the edge (the cadence still commits it), and is
104204
102413
  * said per camera.
104205
102414
  */
@@ -104342,7 +102551,7 @@ async function persistOccupancyRow(host, row, now) {
104342
102551
  * **Only an edge that owns NOBODY.** `chooseOccupancyMediaOwner` names a
104343
102552
  * member track whenever the scope holds one, and that picture is of the
104344
102553
  * counted object itself; a photograph is strictly the stand-in for not having
104345
- * one. The case this exists for is "posto libero" (camera 617): the vehicle
102554
+ * one. The case this exists for is "posto libero" (camera 102): the vehicle
104346
102555
  * whose departure IS the notification has left, so the scope is empty, the
104347
102556
  * ladder resolves nothing and the delivery logged `no still could be resolved
104348
102557
  * … owners=[]`. A became-free edge has no owner BY CONSTRUCTION, and a
@@ -106675,7 +104884,7 @@ function onAlarmPublish(host, report) {
106675
104884
  *
106676
104885
  * `tags.deviceId` carries the SUBJECT's numeric device id (the system
106677
104886
  * subject's own `deviceId` is the sentinel {@link NC_SYSTEM_DEVICE_ID}), so
106678
- * "why is 617 louder than 2018?" is answerable by grouping. A node- or
104887
+ * "why is 102 louder than 2018?" is answerable by grouping. A node- or
106679
104888
  * package-scoped exclusion is about no device and carries no tag.
106680
104889
  */
106681
104890
  function reportSystemFilterExclusion(host, rule, subject, filter) {
@@ -109415,7 +107624,7 @@ var NC_TRACKS_AT_INSTANT_LIMIT = 25;
109415
107624
  * The box TOLERANCE (`toleranceMs`, 750 ms) is about how sparse a trail is —
109416
107625
  * a live track keeps a position every few frames — and it must never stretch
109417
107626
  * a LIFE. A track born after the frame was not on it: on 2026-10-22 the
109418
- * tracker split a dog on camera 615 and the second piece, born 676 ms after
107627
+ * tracker split a dog on camera 101 and the second piece, born 676 ms after
109419
107628
  * the key frame, was drawn at its first box as a second box on the dog. One
109420
107629
  * tick (~110–150 ms at that camera's detection rate, rounded up) absorbs the
109421
107630
  * gap between a frame and the detection that confirmed it, and nothing more.
@@ -112563,7 +110772,7 @@ var ObjectEmbeddingStore = class {
112563
110772
  * own. Both were wrong in the same way, and the second only less obviously:
112564
110773
  * a vector's row id IS the trackId — exactly one row per track — so a vector
112565
110774
  * is owned by its track completely, and giving it a second clock could only
112566
- * ever produce disagreement. It did: measured on device 590, events back 1.0
110775
+ * ever produce disagreement. It did: measured on device 104, events back 1.0
112567
110776
  * day and embeddings back 22.1, with 1,446 of 2,222 rows pointing at nothing
112568
110777
  * that could be rendered.
112569
110778
  *
@@ -116670,7 +114879,7 @@ var SyntheticTrackMaterializer = class {
116670
114879
  * Like {@link materialize}, but a call inside an open window answers the
116671
114880
  * window's OWN marker (awaiting it while it is still landing) with kind
116672
114881
  * `debounced`. Two state changes of one doorbell press are one event: the
116673
- * second must name the same media owner, not none (2026-09-29, camera 615 —
114882
+ * second must name the same media owner, not none (2026-09-29, camera 101 —
116674
114883
  * the notification that won the rule was the debounced one, and shipped
116675
114884
  * without a still).
116676
114885
  */
@@ -118090,7 +116299,7 @@ var TITLE_LINE_HEIGHT = 1.18;
118090
116299
  * written — so the fit has to be estimated. It is deliberately generous: a
118091
116300
  * title that shrinks slightly more than it had to is invisible, one that
118092
116301
  * over-estimates its fit runs off the edge, which is exactly what the first
118093
- * live preview did (`Timelapse Videocamera ingresso 21:00→07:00` touched the
116302
+ * live preview did (`Timelapse Camera front door 21:00→07:00` touched the
118094
116303
  * frame border at 640 px).
118095
116304
  */
118096
116305
  var TITLE_GLYPH_ADVANCE = .62;
@@ -118827,7 +117036,7 @@ var BuildNotificationPorts = class extends BuildNotificationPortsBase {
118827
117036
  * gates destroy a track before it is written — the confirmation gate
118828
117037
  * retracting a suspected false birth, stationary promotion dropping a
118829
117038
  * parked object, zero-media suppression cascading a thumbnail-less track
118830
- * away — and on 2026-08-13 they left camera 615 with zero persisted tracks
117039
+ * away — and on 2026-08-13 they left camera 101 with zero persisted tracks
118831
117040
  * across a ten-hour night that held a person pass at 23:31. These rows
118832
117041
  * survive all three.
118833
117042
  *
@@ -121294,7 +119503,7 @@ async function streamDataset(deps) {
121294
119503
  //#region src/pipeline-analytics/training-export/training-export-handler.ts
121295
119504
  var TRAINING_EXPORT_PREFIX = "training-export";
121296
119505
  /**
121297
- * Parse `?deviceIds=615,617` into a device list. An absent or unparseable value
119506
+ * Parse `?deviceIds=101,102` into a device list. An absent or unparseable value
121298
119507
  * yields `[]`, which the caller reads as "every device with marked tracks" —
121299
119508
  * stated here rather than left to the reader because the empty array is doing
121300
119509
  * two jobs and only one of them is obvious.
@@ -121660,7 +119869,7 @@ var TRACKER_FACT_LOG_SAMPLE_EVERY = 10;
121660
119869
  * positive spawns (review M1: ~1 750 `new` decisions per camera per hour) —
121661
119870
  * are sampled harder; the per-minute summary carries their exact counts. */
121662
119871
  var TRACKER_PIECE_LOG_SAMPLE_EVERY = 50;
121663
- /** Out-of-order frames (follow-up 617, F1: ~1 % of frames) log the first N,
119872
+ /** Out-of-order frames (follow-up 102, F1: ~1 % of frames) log the first N,
121664
119873
  * then one in this many — every line carries the count; the per-minute
121665
119874
  * summary carries the exact `outOfOrderFrames`. */
121666
119875
  var TRACKER_OUT_OF_ORDER_LOG_SAMPLE_EVERY = 50;
@@ -122410,7 +120619,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
122410
120619
  * The zone catalogue every OCCUPANCY path reads (live frames, snapshot
122411
120620
  * hydration, the parked-object baseline sampler). Mirror-first with a
122412
120621
  * capability fallback — see `device-zone-resolver.ts` for why the mirror
122413
- * alone is not enough (device 617 had a zone the mirror had never heard of).
120622
+ * alone is not enough (device 102 had a zone the mirror had never heard of).
122414
120623
  */
122415
120624
  deviceZones = new DeviceZoneResolver({
122416
120625
  readMirror: (deviceId) => this.proxies.get(deviceId)?.state.zones.value?.zones,
@@ -126661,7 +124870,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
126661
124870
  *
126662
124871
  * The stationary registry answers a different question (is this object parked,
126663
124872
  * and should it be suppressed?). This one raises a spawn bar. The dead
126664
- * ornamental grass on device 615 produced tracks of 3.8 s,
124873
+ * ornamental grass on device 101 produced tracks of 3.8 s,
126665
124874
  * 4.1 s, 6.5 s and 19.0 s with 0-2.5 px of total displacement, roughly
126666
124875
  * fifteen of them in a day, all at the same spot. Each one is individually
126667
124876
  * innocent; the RECURRENCE is the signal, and nothing survives a track death
@@ -128365,8 +126574,8 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
128365
126574
  * read, then goes through the SAME resolver the live frame path uses.
128366
126575
  *
128367
126576
  * `readSliceOnce(proxy.state.zones)` used to be the whole body, and it is
128368
- * exactly what could not answer for device 617: the mirror slice was absent
128369
- * hub-side (`deviceState.getCapSlice {617,'zones'}` → `null`), so the one
126577
+ * exactly what could not answer for device 102: the mirror slice was absent
126578
+ * hub-side (`deviceState.getCapSlice {102,'zones'}` → `null`), so the one
128370
126579
  * permitted refresh brought back nothing and hydration fell to `[]` forever.
128371
126580
  */
128372
126581
  async resolveDeviceZones(deviceId) {
@@ -128877,7 +127086,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
128877
127086
  *
128878
127087
  * - `camera-native-cap` is EVERY camera's `motion` slice. Every provider
128879
127088
  * binds a native `motion` cap on the camera device and motion churns
128880
- * continuously (camera 590 flaps at ~2 Hz), so an `info` here would be a
127089
+ * continuously (camera 104 flaps at ~2 Hz), so an `info` here would be a
128881
127090
  * log flood measured in millions of lines a day — its own outage.
128882
127091
  * - `no-camera` is every sensor in the fleet that no camera links. Since
128883
127092
  * D630 §6 it is still EVALUATED by the notification rules (through
@@ -128886,7 +127095,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends require_clip_m
128886
127095
  *
128887
127096
  * What must never happen again is the branch being INVISIBLE: a doorbell
128888
127097
  * press that ingested nothing produced not one line for months. A debug line
128889
- * carrying `deviceId`, `capName`, `kind` and `reason` answers "why is 615
127098
+ * carrying `deviceId`, `capName`, `kind` and `reason` answers "why is 101
128890
127099
  * dark" the moment anyone asks it.
128891
127100
  */
128892
127101
  logSensorIngestDrop(data, reason, kind) {