@camstack/addon-ai 0.4.85 → 0.4.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -18675,11 +18675,30 @@ var SensorEventSchema = object({
18675
18675
  value: record(string(), unknown()).nullable(),
18676
18676
  timestamp: number$1()
18677
18677
  });
18678
+ /**
18679
+ * One stored sighting on a track's trajectory.
18680
+ *
18681
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18682
+ * arrival order, and the two detector passes interleave, so a consumer must not
18683
+ * assume the two are the same on a row written by an older build.
18684
+ */
18678
18685
  var TrackPositionSchema = object({
18679
18686
  x: number$1(),
18680
18687
  y: number$1(),
18681
18688
  timestamp: number$1(),
18682
- bbox: BoundingBoxSchema
18689
+ bbox: BoundingBoxSchema,
18690
+ /**
18691
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18692
+ * pass on the analysis raster, `recovery` is the native-resolution
18693
+ * small-subject second pass (D377/D378). Both write into one array, and until
18694
+ * this field existed the only way to tell them apart was that full-frame boxes
18695
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18696
+ * Absent on rows written before D399.
18697
+ */
18698
+ source: _enum(["frame", "recovery"]).optional(),
18699
+ /** Detection score of this box, so a position can be weighed and not only
18700
+ * plotted. Absent on rows written before D399. */
18701
+ score: number$1().optional()
18683
18702
  });
18684
18703
  var TrackSnapshotSchema = object({
18685
18704
  timestamp: number$1(),
@@ -19079,14 +19098,25 @@ var TrackSchema = object({
19079
19098
  */
19080
19099
  hasRider: boolean().optional(),
19081
19100
  /**
19082
- * WHY this track ended without a NATIVE best-shot tile
19083
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19101
+ * WHY this track ended without a NATIVE best-shot FRAME
19102
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19103
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19084
19104
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19085
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19086
- * the late-keyFrame upgrade when a native tile lands after all. The
19087
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19105
+ * `derive-returned-null tile=standin`,
19106
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19107
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19108
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19088
19109
  * tile is a face/plate stand-in, a raster crop, or an icon.
19089
19110
  *
19111
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19112
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19113
+ * while its key frame missed carried no reason at all — three of the four
19114
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19115
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19116
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19117
+ * lastFrame copy source`), so its absence is now on this line whatever the
19118
+ * tile ended up being.
19119
+ *
19090
19120
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19091
19121
  * that predates the field, and every track whose tile landed native all
19092
19122
  * omit it. Render nothing when absent.
package/dist/addon.mjs CHANGED
@@ -18702,11 +18702,30 @@ var SensorEventSchema = object({
18702
18702
  value: record(string(), unknown()).nullable(),
18703
18703
  timestamp: number$1()
18704
18704
  });
18705
+ /**
18706
+ * One stored sighting on a track's trajectory.
18707
+ *
18708
+ * The array these live in is returned in TIME order (D399) — it is APPENDED in
18709
+ * arrival order, and the two detector passes interleave, so a consumer must not
18710
+ * assume the two are the same on a row written by an older build.
18711
+ */
18705
18712
  var TrackPositionSchema = object({
18706
18713
  x: number$1(),
18707
18714
  y: number$1(),
18708
18715
  timestamp: number$1(),
18709
- bbox: BoundingBoxSchema
18716
+ bbox: BoundingBoxSchema,
18717
+ /**
18718
+ * Which detector pass measured this box (D399): `frame` is the full-frame
18719
+ * pass on the analysis raster, `recovery` is the native-resolution
18720
+ * small-subject second pass (D377/D378). Both write into one array, and until
18721
+ * this field existed the only way to tell them apart was that full-frame boxes
18722
+ * are exact multiples of 1.2 while recovery boxes are full-precision floats.
18723
+ * Absent on rows written before D399.
18724
+ */
18725
+ source: _enum(["frame", "recovery"]).optional(),
18726
+ /** Detection score of this box, so a position can be weighed and not only
18727
+ * plotted. Absent on rows written before D399. */
18728
+ score: number$1().optional()
18710
18729
  });
18711
18730
  var TrackSnapshotSchema = object({
18712
18731
  timestamp: number$1(),
@@ -19106,14 +19125,25 @@ var TrackSchema = object({
19106
19125
  */
19107
19126
  hasRider: boolean().optional(),
19108
19127
  /**
19109
- * WHY this track ended without a NATIVE best-shot tile
19110
- * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md)) —
19128
+ * WHY this track ended without a NATIVE best-shot FRAME
19129
+ * ([D276](../decisions/adr-0276-a-stand-in-tile-is-provisional-and-a-close-says-why.md),
19130
+ * widened by [D400](../decisions/adr-0400-the-picture-is-judged-on-what-is-delivered.md)) —
19111
19131
  * a composed token line (`no-key-frame capture=keyframe:native-missx4`,
19112
- * `derive-returned-null tile=standin`, …) written at close and CLEARED by
19113
- * the late-keyFrame upgrade when a native tile lands after all. The
19114
- * operator-facing answer to "perché manca l'immagine?" on a track whose
19132
+ * `derive-returned-null tile=standin`,
19133
+ * `native-tile tile=native no-key-frame-at-close`, …) written at close and
19134
+ * CLEARED by the late-keyFrame upgrade when a native tile lands after all.
19135
+ * The operator-facing answer to "perché manca l'immagine?" on a track whose
19115
19136
  * tile is a face/plate stand-in, a raster crop, or an icon.
19116
19137
  *
19138
+ * **`no-key-frame-at-close` (D400).** The line used to be written ONLY when
19139
+ * the TILE ranked below native, so a track whose thumbnail landed natively
19140
+ * while its key frame missed carried no reason at all — three of the four
19141
+ * `MISSING_KEYFRAME` tracks in the 2026-09-07 operator audit were exactly
19142
+ * that shape, and their "niente ultimo" had no cause anywhere on the row.
19143
+ * The key frame is the head of a cascade (`keyFrame ⇒ keyFrameSmall ⇒ the
19144
+ * lastFrame copy source`), so its absence is now on this line whatever the
19145
+ * tile ended up being.
19146
+ *
19117
19147
  * **Absent ≠ "missed silently"**: a row written before the column, a hub
19118
19148
  * that predates the field, and every track whose tile landed native all
19119
19149
  * omit it. Render nothing when absent.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.85",
3
+ "version": "0.4.86",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",