@camstack/addon-provider-rademacher 0.2.44 → 0.2.45

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
@@ -8988,6 +8988,21 @@ var RelocateJobSchema = object({
8988
8988
  bytesMoved: number().int(),
8989
8989
  /** Total files discovered up front; null while (or when) unknown. */
8990
8990
  filesTotal: number().int().nullable(),
8991
+ /**
8992
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8993
+ * made that nobody asked for, so it is reported where the operator reads the
8994
+ * job rather than only in a log line.
8995
+ *
8996
+ * A footage segment records its byte count in its own NAME, and the durable
8997
+ * hour row derives its aggregates from those names. A file that does not
8998
+ * match its name therefore makes the ledger's sums — and with them quota and
8999
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
9000
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
9001
+ *
9002
+ * Absent on lanes where the question has no meaning: a media blob's size is
9003
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9004
+ */
9005
+ rowsReconciled: number().int().nonnegative().optional(),
8991
9006
  startedAt: number(),
8992
9007
  finishedAt: number().nullable(),
8993
9008
  error: string().nullable()
@@ -9056,14 +9071,42 @@ var RelocateMediaInputSchema = object({
9056
9071
  /** Omitted = `move`, the pre-existing behaviour. */
9057
9072
  mode: MediaRelocateModeSchema.optional()
9058
9073
  });
9059
- /** How many rows still carry NO `locationId` — the population a repoint would
9060
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
9061
- * value that permits a non-blocking `eventMedia` cutover. */
9062
- var UnstampedEventMediaCountSchema = object({
9063
- media: number().int().nonnegative(),
9064
- retrainFrames: number().int().nonnegative(),
9065
- total: number().int().nonnegative()
9074
+ /**
9075
+ * The unstamped population of ONE collection split, because the gate and the
9076
+ * operator ask two different questions and only one of them has to be cheap.
9077
+ *
9078
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
9079
+ * repoint". It is a single indexed seek to the first matching row, so it stays
9080
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
9081
+ * that matters — after a seal, when the population is empty.
9082
+ *
9083
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
9084
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
9085
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
9086
+ * and useful answer: "there are some, and this read could not say how many"
9087
+ * still refuses the cutover, which is the whole job.
9088
+ */
9089
+ var UnstampedRowsSchema = object({
9090
+ present: boolean(),
9091
+ rows: number().int().nonnegative().nullable()
9066
9092
  });
9093
+ /**
9094
+ * How many rows still carry NO `locationId` — the population a repoint would
9095
+ * silently re-aim at a disk that does not hold their bytes.
9096
+ *
9097
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
9098
+ * over. The gate opens on a measured absence and on nothing else; an unread
9099
+ * collection and an empty one are different facts, and this repo has already
9100
+ * paid for conflating them (`RelocateResidueSchema`, D295).
9101
+ */
9102
+ var UnstampedEventMediaCountSchema = object({
9103
+ media: UnstampedRowsSchema,
9104
+ retrainFrames: UnstampedRowsSchema,
9105
+ /** True when EITHER collection holds one. The refusal reads this. */
9106
+ anyPresent: boolean(),
9107
+ /** Sum across both, or `null` when either lane could not be counted. */
9108
+ total: number().int().nonnegative().nullable()
9109
+ }).nullable();
9067
9110
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9068
9111
  /** The independently selectable logical storage classes — every class
9069
9112
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -9174,6 +9217,10 @@ var StorageMigrationMoveProgressSchema = object({
9174
9217
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
9175
9218
  filesTotal: number().int().nonnegative().nullable(),
9176
9219
  bytesMoved: number().int().nonnegative(),
9220
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
9221
+ * a lane that cannot reconcile. A migration that silently rewrote durable
9222
+ * rows would be the same failure as one that silently skipped them. */
9223
+ rowsReconciled: number().int().nonnegative().optional(),
9177
9224
  /** The MOVER's start, not the migration's: a drain restarted after an addon
9178
9225
  * crash gets a new mover, and a rate computed from the migration's start
9179
9226
  * would silently average in the time nothing was running. */
package/dist/addon.mjs CHANGED
@@ -8987,6 +8987,21 @@ var RelocateJobSchema = object({
8987
8987
  bytesMoved: number().int(),
8988
8988
  /** Total files discovered up front; null while (or when) unknown. */
8989
8989
  filesTotal: number().int().nullable(),
8990
+ /**
8991
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8992
+ * made that nobody asked for, so it is reported where the operator reads the
8993
+ * job rather than only in a log line.
8994
+ *
8995
+ * A footage segment records its byte count in its own NAME, and the durable
8996
+ * hour row derives its aggregates from those names. A file that does not
8997
+ * match its name therefore makes the ledger's sums — and with them quota and
8998
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8999
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
9000
+ *
9001
+ * Absent on lanes where the question has no meaning: a media blob's size is
9002
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9003
+ */
9004
+ rowsReconciled: number().int().nonnegative().optional(),
8990
9005
  startedAt: number(),
8991
9006
  finishedAt: number().nullable(),
8992
9007
  error: string().nullable()
@@ -9055,14 +9070,42 @@ var RelocateMediaInputSchema = object({
9055
9070
  /** Omitted = `move`, the pre-existing behaviour. */
9056
9071
  mode: MediaRelocateModeSchema.optional()
9057
9072
  });
9058
- /** How many rows still carry NO `locationId` — the population a repoint would
9059
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
9060
- * value that permits a non-blocking `eventMedia` cutover. */
9061
- var UnstampedEventMediaCountSchema = object({
9062
- media: number().int().nonnegative(),
9063
- retrainFrames: number().int().nonnegative(),
9064
- total: number().int().nonnegative()
9073
+ /**
9074
+ * The unstamped population of ONE collection split, because the gate and the
9075
+ * operator ask two different questions and only one of them has to be cheap.
9076
+ *
9077
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
9078
+ * repoint". It is a single indexed seek to the first matching row, so it stays
9079
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
9080
+ * that matters — after a seal, when the population is empty.
9081
+ *
9082
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
9083
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
9084
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
9085
+ * and useful answer: "there are some, and this read could not say how many"
9086
+ * still refuses the cutover, which is the whole job.
9087
+ */
9088
+ var UnstampedRowsSchema = object({
9089
+ present: boolean(),
9090
+ rows: number().int().nonnegative().nullable()
9065
9091
  });
9092
+ /**
9093
+ * How many rows still carry NO `locationId` — the population a repoint would
9094
+ * silently re-aim at a disk that does not hold their bytes.
9095
+ *
9096
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
9097
+ * over. The gate opens on a measured absence and on nothing else; an unread
9098
+ * collection and an empty one are different facts, and this repo has already
9099
+ * paid for conflating them (`RelocateResidueSchema`, D295).
9100
+ */
9101
+ var UnstampedEventMediaCountSchema = object({
9102
+ media: UnstampedRowsSchema,
9103
+ retrainFrames: UnstampedRowsSchema,
9104
+ /** True when EITHER collection holds one. The refusal reads this. */
9105
+ anyPresent: boolean(),
9106
+ /** Sum across both, or `null` when either lane could not be counted. */
9107
+ total: number().int().nonnegative().nullable()
9108
+ }).nullable();
9066
9109
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
9067
9110
  /** The independently selectable logical storage classes — every class
9068
9111
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -9173,6 +9216,10 @@ var StorageMigrationMoveProgressSchema = object({
9173
9216
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
9174
9217
  filesTotal: number().int().nonnegative().nullable(),
9175
9218
  bytesMoved: number().int().nonnegative(),
9219
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
9220
+ * a lane that cannot reconcile. A migration that silently rewrote durable
9221
+ * rows would be the same failure as one that silently skipped them. */
9222
+ rowsReconciled: number().int().nonnegative().optional(),
9176
9223
  /** The MOVER's start, not the migration's: a drain restarted after an addon
9177
9224
  * crash gets a new mover, and a rate computed from the migration's start
9178
9225
  * would silently average in the time nothing was running. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.44",
3
+ "version": "0.2.45",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",