hikoutei 0.8.0 → 0.8.2

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 (139) hide show
  1. package/README.md +4 -0
  2. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +23 -11
  3. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -1
  4. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +26 -18
  5. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -1
  6. package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts +24 -5
  7. package/dist/adapter/sheets/providers/google-sheets-api/constants.d.ts.map +1 -1
  8. package/dist/adapter/sheets/providers/google-sheets-api/constants.js +24 -5
  9. package/dist/adapter/sheets/providers/google-sheets-api/constants.js.map +1 -1
  10. package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts +8 -0
  11. package/dist/adapter/sheets/providers/google-sheets-api/errors.d.ts.map +1 -1
  12. package/dist/adapter/sheets/providers/google-sheets-api/errors.js +20 -0
  13. package/dist/adapter/sheets/providers/google-sheets-api/errors.js.map +1 -1
  14. package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts +1 -1
  15. package/dist/adapter/sheets/providers/google-sheets-api/index.d.ts.map +1 -1
  16. package/dist/adapter/sheets/providers/google-sheets-api/index.js +1 -1
  17. package/dist/adapter/sheets/providers/google-sheets-api/index.js.map +1 -1
  18. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.d.ts.map +1 -1
  19. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js +11 -29
  20. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js.map +1 -1
  21. package/dist/adapter/sheets/providers/google-sheets-api/model/rawResponseSchemas.d.ts +20 -0
  22. package/dist/adapter/sheets/providers/google-sheets-api/model/rawResponseSchemas.d.ts.map +1 -0
  23. package/dist/adapter/sheets/providers/google-sheets-api/model/rawResponseSchemas.js +26 -0
  24. package/dist/adapter/sheets/providers/google-sheets-api/model/rawResponseSchemas.js.map +1 -0
  25. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts +11 -1
  26. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.d.ts.map +1 -1
  27. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js +12 -2
  28. package/dist/adapter/sheets/providers/google-sheets-api/model/valueNormalization.js.map +1 -1
  29. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts +19 -6
  30. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts.map +1 -1
  31. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js +61 -14
  32. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js.map +1 -1
  33. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts +13 -0
  34. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.d.ts.map +1 -1
  35. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js +60 -29
  36. package/dist/adapter/sheets/providers/google-sheets-api/transport/googleSheetsApiTransport.js.map +1 -1
  37. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts +40 -4
  38. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.d.ts.map +1 -1
  39. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js +26 -20
  40. package/dist/adapter/sheets/providers/google-sheets-api/transport/rateLimiter.js.map +1 -1
  41. package/dist/adapter/sheets/providers/google-sheets-api/transport/rawErrorSchemas.d.ts +7 -0
  42. package/dist/adapter/sheets/providers/google-sheets-api/transport/rawErrorSchemas.d.ts.map +1 -0
  43. package/dist/adapter/sheets/providers/google-sheets-api/transport/rawErrorSchemas.js +24 -0
  44. package/dist/adapter/sheets/providers/google-sheets-api/transport/rawErrorSchemas.js.map +1 -0
  45. package/dist/api/Hikoutei.d.ts.map +1 -1
  46. package/dist/api/Hikoutei.js +244 -30
  47. package/dist/api/Hikoutei.js.map +1 -1
  48. package/dist/api/internalEntityManager.d.ts.map +1 -1
  49. package/dist/api/internalEntityManager.js +152 -53
  50. package/dist/api/internalEntityManager.js.map +1 -1
  51. package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts +41 -0
  52. package/dist/application/sync/outbound/SheetsEffectDispatcher.d.ts.map +1 -1
  53. package/dist/application/sync/outbound/SheetsEffectDispatcher.js +85 -3
  54. package/dist/application/sync/outbound/SheetsEffectDispatcher.js.map +1 -1
  55. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.d.ts.map +1 -1
  56. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js +39 -5
  57. package/dist/application/sync/outbound/reconciliation/ReconciliationScanner.js.map +1 -1
  58. package/dist/application/sync/outbound/reconciliation/diff.d.ts +19 -1
  59. package/dist/application/sync/outbound/reconciliation/diff.d.ts.map +1 -1
  60. package/dist/application/sync/outbound/reconciliation/diff.js +60 -17
  61. package/dist/application/sync/outbound/reconciliation/diff.js.map +1 -1
  62. package/dist/application/sync/outbound/reconciliation/repair.d.ts +34 -3
  63. package/dist/application/sync/outbound/reconciliation/repair.d.ts.map +1 -1
  64. package/dist/application/sync/outbound/reconciliation/repair.js +120 -47
  65. package/dist/application/sync/outbound/reconciliation/repair.js.map +1 -1
  66. package/dist/application/sync/outbound/reconciliation/shared.d.ts +20 -0
  67. package/dist/application/sync/outbound/reconciliation/shared.d.ts.map +1 -1
  68. package/dist/application/sync/outbound/reconciliation/shared.js +35 -0
  69. package/dist/application/sync/outbound/reconciliation/shared.js.map +1 -1
  70. package/dist/application/sync/service/SyncPollingSupervisor.d.ts +16 -0
  71. package/dist/application/sync/service/SyncPollingSupervisor.d.ts.map +1 -1
  72. package/dist/application/sync/service/SyncPollingSupervisor.js +24 -0
  73. package/dist/application/sync/service/SyncPollingSupervisor.js.map +1 -1
  74. package/dist/application/sync/service/SyncServiceBootstrap.d.ts.map +1 -1
  75. package/dist/application/sync/service/SyncServiceBootstrap.js +26 -1
  76. package/dist/application/sync/service/SyncServiceBootstrap.js.map +1 -1
  77. package/dist/application/sync/service/configSchemas.d.ts +10 -0
  78. package/dist/application/sync/service/configSchemas.d.ts.map +1 -0
  79. package/dist/application/sync/service/configSchemas.js +13 -0
  80. package/dist/application/sync/service/configSchemas.js.map +1 -0
  81. package/dist/application/sync/service/effectSupervisor.d.ts.map +1 -1
  82. package/dist/application/sync/service/effectSupervisor.js +114 -9
  83. package/dist/application/sync/service/effectSupervisor.js.map +1 -1
  84. package/dist/application/sync/service/pollingSupervisor.d.ts +17 -0
  85. package/dist/application/sync/service/pollingSupervisor.d.ts.map +1 -1
  86. package/dist/application/sync/service/pollingSupervisor.js +103 -3
  87. package/dist/application/sync/service/pollingSupervisor.js.map +1 -1
  88. package/dist/application/sync/service/serviceOptionSchemas.d.ts +11 -0
  89. package/dist/application/sync/service/serviceOptionSchemas.d.ts.map +1 -0
  90. package/dist/application/sync/service/serviceOptionSchemas.js +11 -0
  91. package/dist/application/sync/service/serviceOptionSchemas.js.map +1 -0
  92. package/dist/application/sync/service/serviceOptions.d.ts.map +1 -1
  93. package/dist/application/sync/service/serviceOptions.js +20 -6
  94. package/dist/application/sync/service/serviceOptions.js.map +1 -1
  95. package/dist/application/sync/service/shutdown.d.ts.map +1 -1
  96. package/dist/application/sync/service/shutdown.js +6 -2
  97. package/dist/application/sync/service/shutdown.js.map +1 -1
  98. package/dist/application/sync/service/syncAutoStart.d.ts +71 -6
  99. package/dist/application/sync/service/syncAutoStart.d.ts.map +1 -1
  100. package/dist/application/sync/service/syncAutoStart.js +175 -12
  101. package/dist/application/sync/service/syncAutoStart.js.map +1 -1
  102. package/dist/application/sync/service/systemStateReadiness.d.ts +35 -0
  103. package/dist/application/sync/service/systemStateReadiness.d.ts.map +1 -0
  104. package/dist/application/sync/service/systemStateReadiness.js +51 -0
  105. package/dist/application/sync/service/systemStateReadiness.js.map +1 -0
  106. package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.d.ts +37 -1
  107. package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.d.ts.map +1 -1
  108. package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.js +57 -3
  109. package/dist/application/sync/sheetsContract/mutationCoordinator/CoordinatedSheetsProvider.js.map +1 -1
  110. package/dist/application/sync/sheetsContract/payloadSchemas.d.ts +14 -0
  111. package/dist/application/sync/sheetsContract/payloadSchemas.d.ts.map +1 -0
  112. package/dist/application/sync/sheetsContract/payloadSchemas.js +18 -0
  113. package/dist/application/sync/sheetsContract/payloadSchemas.js.map +1 -0
  114. package/dist/application/sync/sheetsContract/syncSheets.d.ts.map +1 -1
  115. package/dist/application/sync/sheetsContract/syncSheets.js +12 -31
  116. package/dist/application/sync/sheetsContract/syncSheets.js.map +1 -1
  117. package/dist/application/sync/sheetsContract/transportOutcome.d.ts +32 -5
  118. package/dist/application/sync/sheetsContract/transportOutcome.d.ts.map +1 -1
  119. package/dist/application/sync/sheetsContract/transportOutcome.js +101 -7
  120. package/dist/application/sync/sheetsContract/transportOutcome.js.map +1 -1
  121. package/dist/internal/syncStatus.js +33 -2
  122. package/dist/internal/syncStatus.js.map +1 -1
  123. package/dist/shared/observability/index.d.ts +9 -0
  124. package/dist/shared/observability/index.d.ts.map +1 -0
  125. package/dist/shared/observability/index.js +9 -0
  126. package/dist/shared/observability/index.js.map +1 -0
  127. package/dist/shared/observability/internalLog.d.ts +175 -0
  128. package/dist/shared/observability/internalLog.d.ts.map +1 -0
  129. package/dist/shared/observability/internalLog.js +471 -0
  130. package/dist/shared/observability/internalLog.js.map +1 -0
  131. package/dist/shared/observability/logEvents.d.ts +96 -0
  132. package/dist/shared/observability/logEvents.d.ts.map +1 -0
  133. package/dist/shared/observability/logEvents.js +247 -0
  134. package/dist/shared/observability/logEvents.js.map +1 -0
  135. package/dist/shared/validation/zodBoundary.d.ts +10 -0
  136. package/dist/shared/validation/zodBoundary.d.ts.map +1 -0
  137. package/dist/shared/validation/zodBoundary.js +24 -0
  138. package/dist/shared/validation/zodBoundary.js.map +1 -0
  139. package/package.json +7 -5
@@ -25,10 +25,10 @@ import { requireRegisteredSyncSheetWithAdapter, } from "../../../../infrastructu
25
25
  import { STORAGE_ERROR_CODES, StorageError } from "../../../../infrastructure/storage/errors.js";
26
26
  import { observeSyncSnapshot, } from "../../sheetsContract/syncSheets.js";
27
27
  import { SYNC_PROJECTIONS, SYNC_SNAPSHOT_READ_MODES, } from "../../sheetsContract/constants.js";
28
- import { DEFAULT_RECONCILIATION_LEASE_MS, DEFAULT_RECONCILIATION_ROLE, DEFAULT_SYSTEM_TOMBSTONE_FIELD, readDesiredSystemState, } from "./shared.js";
29
- import { computeDrifts, countExtraRows, countMatchedRows, } from "./diff.js";
28
+ import { DEFAULT_RECONCILIATION_LEASE_MS, DEFAULT_RECONCILIATION_ROLE, DEFAULT_SYSTEM_TOMBSTONE_FIELD, readDesiredSystemState, readTerminalFailedHeads, } from "./shared.js";
29
+ import { computeDrifts, countExtraRows, countMatchedRows, findObservedRows, } from "./diff.js";
30
30
  import { appendEffectsWithSupersedes, } from "./enqueue.js";
31
- import { buildCorrectionEffects, } from "./repair.js";
31
+ import { buildCorrectionEffects, buildFailedHeadRepairPlan, } from "./repair.js";
32
32
  /**
33
33
  * Runs one reconciliation scan and enqueues correction effects for drift.
34
34
  *
@@ -91,7 +91,12 @@ async function scanAndEnqueue(context) {
91
91
  systemFields: context.systemFields,
92
92
  sheet,
93
93
  });
94
- if (drifts.length === 0) {
94
+ // A terminal failed head on a stream whose Sheet row already matches
95
+ // canonical is invisible to the drift detector, yet it still blocks every
96
+ // follower through the durable predecessor guard. Detect those heads
97
+ // BEFORE the no-drift return so a matching Sheet recovers its stream.
98
+ const wedgedTargets = await findWedgedStreamTargets(context, sheet, snapshot, desired, drifts);
99
+ if (drifts.length === 0 && wedgedTargets.length === 0) {
95
100
  return freezeReport(context.physicalSheetId, snapshot, desired, {
96
101
  matched: countMatchedRows(snapshot, desired, sheet.businessKeyField),
97
102
  drifted: 0,
@@ -112,7 +117,15 @@ async function scanAndEnqueue(context) {
112
117
  fenceClaimed: false,
113
118
  });
114
119
  }
115
- const plans = await buildCorrectionEffects(context, sheet, drifts);
120
+ const driftPlans = await buildCorrectionEffects(context, sheet, drifts);
121
+ const commitId = "reconciliation:" + context.createId();
122
+ const wedgeRepairPlans = [];
123
+ for (const target of wedgedTargets) {
124
+ const plan = await buildFailedHeadRepairPlan(context, sheet, target, commitId);
125
+ if (plan !== null)
126
+ wedgeRepairPlans.push(plan);
127
+ }
128
+ const plans = [...driftPlans, ...wedgeRepairPlans];
116
129
  if (plans.length === 0) {
117
130
  return freezeReport(context.physicalSheetId, snapshot, desired, {
118
131
  matched: countMatchedRows(snapshot, desired, sheet.businessKeyField),
@@ -143,6 +156,27 @@ async function scanAndEnqueue(context) {
143
156
  fenceClaimed: true,
144
157
  });
145
158
  }
159
+ /**
160
+ * Desired rows whose stream is wedged behind a terminal failed head and
161
+ * whose Sheet state already matches canonical (no drift) plus each row's
162
+ * observed snapshot evidence.
163
+ *
164
+ * Drift plans already supersede the failed head of their own stream, so
165
+ * only drift-free rows need a dedicated repair here. The observed row is
166
+ * attached so the repair baseline can guard on the row's current visible
167
+ * hash even when no confirmed visible state exists. Returns an empty list
168
+ * when there is nothing to scan or every desired row already drifted.
169
+ */
170
+ async function findWedgedStreamTargets(context, sheet, snapshot, desired, drifts) {
171
+ if (desired.length === 0)
172
+ return [];
173
+ const driftedEntityIds = new Set(drifts.map((drift) => drift.desired.entityId));
174
+ const terminalFailedHeads = await readTerminalFailedHeads(context);
175
+ const observedRows = findObservedRows(snapshot, desired, sheet.businessKeyField);
176
+ return desired
177
+ .filter((row) => !driftedEntityIds.has(row.entityId) && terminalFailedHeads.has(row.entityId))
178
+ .map((row) => ({ desired: row, observed: observedRows.get(row.entityId) }));
179
+ }
146
180
  /**
147
181
  * Enqueues planned corrections under the reconciler fence.
148
182
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ReconciliationScanner.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/ReconciliationScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReconciliationScanner.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/ReconciliationScanner.ts"],"names":[],"mappings":"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"}
@@ -8,12 +8,20 @@
8
8
  * never prove ownership of a row.
9
9
  */
10
10
  import type { NormalizedCell } from "../../../../shared/encoding/types.js";
11
- import { type SyncSheetsSnapshot } from "../../sheetsContract/syncSheets.js";
11
+ import { type SyncSheetsSnapshot, type SyncSnapshotRow } from "../../sheetsContract/syncSheets.js";
12
12
  import type { DesiredRow } from "./shared.js";
13
13
  export type DriftKind = "drifted" | "missing";
14
14
  export interface DriftTarget {
15
15
  readonly kind: DriftKind;
16
16
  readonly desired: DesiredRow;
17
+ /**
18
+ * The observed snapshot row behind a drifted drift, so a repair planned
19
+ * for an existing row can guard on the row's CURRENT visible hash
20
+ * (computed from the exact System_State fields) instead of assuming an
21
+ * insert when no confirmed visible evidence exists. `undefined` for
22
+ * missing drifts, where the row is not observable.
23
+ */
24
+ readonly observed: SyncSnapshotRow | undefined;
17
25
  }
18
26
  export declare function computeDrifts(args: {
19
27
  readonly snapshot: SyncSheetsSnapshot;
@@ -24,6 +32,16 @@ export declare function computeDrifts(args: {
24
32
  readonly businessKeyField: string;
25
33
  };
26
34
  }): readonly DriftTarget[];
35
+ /**
36
+ * Returns the observed snapshot row owned by each desired row.
37
+ *
38
+ * Honors the same duplication quarantine as drift detection: an ambiguous
39
+ * anchor or duplicated business key never resolves to a row. The failed-head
40
+ * repair path uses this to pass FRESH verified snapshot evidence into a
41
+ * repair baseline for a clean (already matching) row, so a repair never
42
+ * falls back to an unguarded insert for an existing Sheet row.
43
+ */
44
+ export declare function findObservedRows(snapshot: SyncSheetsSnapshot, desired: readonly DesiredRow[], businessKeyField: string): ReadonlyMap<string, SyncSnapshotRow>;
27
45
  /** Reads a business-key value from a snapshot row for unanchored fast appends. */
28
46
  export declare function snapshotIdentity(row: SyncSheetsSnapshot["rows"][number], identityField: string): string | undefined;
29
47
  /** Reads the same visible business-key value from canonical desired state. */
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAG3E,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF,GAAG,SAAS,WAAW,EAAE,CAoDzB;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACvC,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS,CAEpB;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAY3F;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACvC,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAqCR;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAkDR"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAG3E,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;CAChD;AA8ED,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF,GAAG,SAAS,WAAW,EAAE,CAiBzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,gBAAgB,EAAE,MAAM,GACvB,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAQtC;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACvC,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS,CAEpB;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAY3F;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACvC,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAqCR;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,aAAa,EAAE,MAAM,GACpB,MAAM,CAkDR"}
@@ -11,12 +11,19 @@ import { EMPTY_STRING_LENGTH_ZERO, } from "../../../../shared/constants.js";
11
11
  import { PRESENCE_KINDS } from "../../../../shared/state/index.js";
12
12
  import { NORMALIZED_CELL_KINDS } from "../../../../shared/encoding/constants.js";
13
13
  import { computeSyncVisibleHash, } from "../../sheetsContract/syncSheets.js";
14
- export function computeDrifts(args) {
14
+ /**
15
+ * Builds the deduplicated anchor/identity index for one snapshot.
16
+ *
17
+ * A duplicated physical anchor or business key is an anomaly, never a row
18
+ * choice: the affected locators are dropped from the index so neither the
19
+ * drift classifier nor the failed-head matcher can silently pick one row.
20
+ */
21
+ function buildObservedRowIndex(snapshot, businessKeyField) {
15
22
  const rowsByAnchor = new Map();
16
23
  const ambiguousAnchors = new Set();
17
24
  const rowsByIdentity = new Map();
18
25
  const ambiguousIdentities = new Set();
19
- for (const row of args.snapshot.rows) {
26
+ for (const row of snapshot.rows) {
20
27
  if (row.physicalAnchor.kind === PRESENCE_KINDS.PRESENT) {
21
28
  // A duplicated physical anchor is an anomaly, never a row choice: drop
22
29
  // the anchor index entry instead of letting the last row win silently.
@@ -30,7 +37,7 @@ export function computeDrifts(args) {
30
37
  rowsByAnchor.set(row.physicalAnchor.value, row);
31
38
  }
32
39
  }
33
- const identity = snapshotIdentity(row, args.sheet.businessKeyField);
40
+ const identity = snapshotIdentity(row, businessKeyField);
34
41
  if (identity === undefined || ambiguousIdentities.has(identity))
35
42
  continue;
36
43
  if (rowsByIdentity.has(identity)) {
@@ -41,32 +48,68 @@ export function computeDrifts(args) {
41
48
  rowsByIdentity.set(identity, row);
42
49
  }
43
50
  }
51
+ return { rowsByAnchor, ambiguousAnchors, rowsByIdentity, ambiguousIdentities };
52
+ }
53
+ /**
54
+ * Resolves the observed snapshot row owned by one desired row.
55
+ *
56
+ * The primary locator's ambiguity is fatal: when the desired anchor is
57
+ * duplicated, identity fallback would silently pick one of the rows that the
58
+ * corrupted anchor cannot distinguish, so the binding stays unmatched. The
59
+ * same quarantine applies when the desired identity appears in the snapshot's
60
+ * duplicate set. Returns undefined when no row can prove ownership of this
61
+ * binding.
62
+ */
63
+ function resolveObservedRow(index, desiredRow, businessKeyField) {
64
+ const identity = desiredRowIdentity(desiredRow, businessKeyField);
65
+ // The primary locator's ambiguity is fatal: when the desired anchor is
66
+ // duplicated, identity fallback would silently pick one of the rows that
67
+ // the corrupted anchor cannot distinguish, so the binding is unmatched.
68
+ // The same quarantine applies to a desired identity that appears in the
69
+ // snapshot's duplicate set: the duplicated business key cannot prove that
70
+ // this binding owns even its unique anchor, so neither locator may match.
71
+ const identityAmbiguous = identity !== undefined && index.ambiguousIdentities.has(identity);
72
+ return index.ambiguousAnchors.has(desiredRow.anchorReference) || identityAmbiguous
73
+ ? undefined
74
+ : index.rowsByAnchor.get(desiredRow.anchorReference) ??
75
+ (identity === undefined ? undefined : index.rowsByIdentity.get(identity));
76
+ }
77
+ export function computeDrifts(args) {
78
+ const index = buildObservedRowIndex(args.snapshot, args.sheet.businessKeyField);
44
79
  const drifts = [];
45
80
  for (const desiredRow of args.desired) {
46
- const identity = desiredRowIdentity(desiredRow, args.sheet.businessKeyField);
47
- // The primary locator's ambiguity is fatal: when the desired anchor is
48
- // duplicated, identity fallback would silently pick one of the rows that
49
- // the corrupted anchor cannot distinguish, so the binding is unmatched.
50
- // The same quarantine applies to a desired identity that appears in the
51
- // snapshot's duplicate set: the duplicated business key cannot prove that
52
- // this binding owns even its unique anchor, so neither locator may match.
53
- const identityAmbiguous = identity !== undefined && ambiguousIdentities.has(identity);
54
- const observed = ambiguousAnchors.has(desiredRow.anchorReference) || identityAmbiguous
55
- ? undefined
56
- : rowsByAnchor.get(desiredRow.anchorReference) ??
57
- (identity === undefined ? undefined : rowsByIdentity.get(identity));
81
+ const observed = resolveObservedRow(index, desiredRow, args.sheet.businessKeyField);
58
82
  if (observed === undefined) {
59
- drifts.push({ kind: "missing", desired: desiredRow });
83
+ drifts.push({ kind: "missing", desired: desiredRow, observed: undefined });
60
84
  continue;
61
85
  }
62
86
  const observedHash = computeObservedHash(observed, args.systemFields);
63
87
  const desiredHash = computeSyncVisibleHash(desiredRow.fields);
64
88
  if (observedHash !== desiredHash) {
65
- drifts.push({ kind: "drifted", desired: desiredRow });
89
+ drifts.push({ kind: "drifted", desired: desiredRow, observed });
66
90
  }
67
91
  }
68
92
  return drifts;
69
93
  }
94
+ /**
95
+ * Returns the observed snapshot row owned by each desired row.
96
+ *
97
+ * Honors the same duplication quarantine as drift detection: an ambiguous
98
+ * anchor or duplicated business key never resolves to a row. The failed-head
99
+ * repair path uses this to pass FRESH verified snapshot evidence into a
100
+ * repair baseline for a clean (already matching) row, so a repair never
101
+ * falls back to an unguarded insert for an existing Sheet row.
102
+ */
103
+ export function findObservedRows(snapshot, desired, businessKeyField) {
104
+ const index = buildObservedRowIndex(snapshot, businessKeyField);
105
+ const matched = new Map();
106
+ for (const desiredRow of desired) {
107
+ const observed = resolveObservedRow(index, desiredRow, businessKeyField);
108
+ if (observed !== undefined)
109
+ matched.set(desiredRow.entityId, observed);
110
+ }
111
+ return matched;
112
+ }
70
113
  /** Reads a business-key value from a snapshot row for unanchored fast appends. */
71
114
  export function snapshotIdentity(row, identityField) {
72
115
  return normalizedCellIdentity(row.cells[identityField]?.normalizedCell);
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EACL,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAU5C,MAAM,UAAU,aAAa,CAAC,IAK7B;IACC,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC3E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAI,GAAG,EAA8C,CAAC;IAC7E,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;YACvD,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC7D,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/C,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC9C,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC1E,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7E,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,wEAAwE;QACxE,0EAA0E;QAC1E,0EAA0E;QAC1E,MAAM,iBAAiB,GAAG,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,iBAAiB;YACpF,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;gBAC5C,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,sBAAsB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAC9B,GAAuC,EACvC,aAAqB;IAErB,OAAO,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC,CAAC;AAC1E,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,aAAqB;IACvE,OAAO,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAgC;IACrE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC1D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,qBAAqB,CAAC,MAAM;YAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACjF,KAAK,qBAAqB,CAAC,MAAM;YAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,KAAK,qBAAqB,CAAC,OAAO;YAChC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,KAAK,qBAAqB,CAAC,IAAI;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,GAAuC,EACvC,YAA+B;IAE/B,MAAM,MAAM,GAAmC,EAAE,CAAC;IAClD,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;IACtE,CAAC;IACD,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAA4B,EAC5B,OAA8B,EAC9B,aAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;YACvD,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACzC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC1E,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAClE,sEAAsE;QACtE,mEAAmE;QACnE,MAAM,iBAAiB,GAAG,QAAQ,KAAK,SAAS,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC5E,CAAC,CAAC,eAAe,IAAI,CAAC,iBAAiB,IAAI,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACnG,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAA4B,EAC5B,OAA8B,EAC9B,aAAqB;IAErB,qEAAqE;IACrE,4EAA4E;IAC5E,2EAA2E;IAC3E,qCAAqC;IACrC,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,CAAC;QACC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YACtD,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAC7F,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,SAAS;YAAE,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;YAAE,SAAS;QACjE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,0EAA0E;QAC1E,yEAAyE;QACzE,sEAAsE;QACtE,yEAAyE;QACzE,uCAAuC;QACvC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;YAClD,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,eAAe,GAAG,UAAU,KAAK,SAAS;gBAC9C,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAClD,IAAI,UAAU,KAAK,SAAS;gBACxB,CAAC,eAAe,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;gBACjF,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC9G,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/diff.ts"],"names":[],"mappings":"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"}
@@ -10,12 +10,43 @@
10
10
  */
11
11
  import type { NewEffect } from "@hikoutei/ikisaki";
12
12
  import type { SqlExecutor } from "../../../../adapter/persistence/contracts/sql.js";
13
+ import type { SyncSnapshotRow } from "../../sheetsContract/syncSheets.js";
13
14
  import { type DesiredRow, type LatestVisibleSqlShape, type ScanContext } from "./shared.js";
14
15
  import type { DriftTarget } from "./diff.js";
15
16
  export declare function buildCorrectionEffects(context: ScanContext, sheet: {
16
17
  readonly tabName: string;
17
18
  readonly registeredRange: string;
18
19
  }, drifts: readonly DriftTarget[]): Promise<readonly CorrectionPlan[]>;
20
+ /**
21
+ * One desired row awaiting a failed-head repair plus its observed snapshot
22
+ * evidence (a clean row whose Sheet state already matches canonical).
23
+ */
24
+ export interface FailedHeadRepairTarget {
25
+ readonly desired: DesiredRow;
26
+ /**
27
+ * The observed snapshot row for a clean (already matching) row, so the
28
+ * repair plan can guard on the row's current visible hash even when no
29
+ * confirmed visible evidence exists. `undefined` when the row was not
30
+ * observable in the snapshot.
31
+ */
32
+ readonly observed: SyncSnapshotRow | undefined;
33
+ }
34
+ /**
35
+ * Plans the stream repair for one desired row whose Sheet state already
36
+ * matches canonical but whose stream is wedged behind a terminal failed head.
37
+ *
38
+ * The failed head blocks every follower through the durable predecessor
39
+ * guard while the drift path never plans a repair for a row that already
40
+ * matches, so this replans the same correction contract without a drift: an
41
+ * equivalent correction already in flight behind the head produces a
42
+ * supersede-only plan; otherwise a fresh correction effect is returned that
43
+ * supersedes the head when it is appended. Returns null when a concurrent
44
+ * pass already superseded the head.
45
+ */
46
+ export declare function buildFailedHeadRepairPlan(context: ScanContext, sheet: {
47
+ readonly tabName: string;
48
+ readonly registeredRange: string;
49
+ }, target: FailedHeadRepairTarget, commitId: string): Promise<CorrectionPlan | null>;
19
50
  /**
20
51
  * One reconciliation correction and the durable transition it requires.
21
52
  *
@@ -58,8 +89,8 @@ export interface CorrectionBaseline {
58
89
  */
59
90
  readonly supersedeByEffectId: string | null;
60
91
  }
61
- export declare function resolveCorrectionBaseline(context: ScanContext, desired: DesiredRow): Promise<CorrectionBaseline>;
62
- export declare function resolveCorrectionBaselineWithSql(sql: SqlExecutor, context: ScanContext, desired: DesiredRow): Promise<CorrectionBaseline>;
63
- export declare function baselineFromVisible(visible: LatestVisibleSqlShape | undefined, streamSequence: number): CorrectionBaseline;
92
+ export declare function resolveCorrectionBaseline(context: ScanContext, desired: DesiredRow, observed: SyncSnapshotRow | undefined): Promise<CorrectionBaseline>;
93
+ export declare function resolveCorrectionBaselineWithSql(sql: SqlExecutor, context: ScanContext, desired: DesiredRow, observed: SyncSnapshotRow | undefined): Promise<CorrectionBaseline>;
94
+ export declare function baselineFromVisible(visible: LatestVisibleSqlShape | undefined, streamSequence: number, observed: SyncSnapshotRow | undefined, systemFields: readonly string[] | undefined): CorrectionBaseline;
64
95
  export declare function extractTargetVisibleHash(payloadJson: string): string;
65
96
  //# sourceMappingURL=repair.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AAIpF,OAAO,EAIL,KAAK,UAAU,EAGf,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACrE,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAwEpC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmF7B;AA4BD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,GACrB,kBAAkB,CA0BpB;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQpE"}
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../../../../src/application/sync/outbound/reconciliation/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAI1E,OAAO,EAIL,KAAK,UAAU,EAGf,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACrE,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAgDpC;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAC;CAChD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,EACrE,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAehC;AAyCD;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD;;;;;;OAMG;IACH,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAI7B;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,eAAe,GAAG,SAAS,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAyF7B;AA4BD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAC1C,kBAAkB,CA8DpB;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQpE"}
@@ -15,12 +15,13 @@ import { isRecoverableEffectErrorCode, } from "@hikoutei/ikisaki";
15
15
  import { computeSyncVisibleHash } from "../../sheetsContract/syncSheets.js";
16
16
  import { SYNC_PROJECTIONS } from "../../sheetsContract/constants.js";
17
17
  import { createSystemProjectionEffect } from "../projection/ProjectionEffectFactory.js";
18
+ import { computeObservedHash } from "./diff.js";
18
19
  import { READ_FAILED_HEAD_SQL, READ_LATEST_EFFECT_SQL, READ_LATEST_VISIBLE_STATE_SQL, } from "./shared.js";
19
20
  export async function buildCorrectionEffects(context, sheet, drifts) {
20
21
  const effects = [];
21
22
  const commitId = "reconciliation:" + context.createId();
22
23
  for (const drift of drifts) {
23
- const baseline = await resolveCorrectionBaseline(context, drift.desired);
24
+ const baseline = await resolveCorrectionBaseline(context, drift.desired, drift.observed);
24
25
  if (baseline.skip) {
25
26
  // An equivalent correction is already in flight behind a terminal
26
27
  // failed head that blocks the stream. No new effect is appended; the
@@ -48,37 +49,13 @@ export async function buildCorrectionEffects(context, sheet, drifts) {
48
49
  const expectedVisibleHash = drift.kind === "missing"
49
50
  ? ""
50
51
  : baseline.expectedVisibleHash;
51
- const effect = createSystemProjectionEffect({
52
- effectId: "effect:" + context.createId(),
53
- commitId,
54
- logicalSheetId: context.logicalSheetId,
55
- physicalSheetId: context.physicalSheetId,
56
- sheetName: sheet.tabName,
57
- registeredRange: sheet.registeredRange,
58
- projection: SYNC_PROJECTIONS.SYSTEM_STATE,
59
- schemaVersion: context.schemaVersion,
60
- targetKind: "entity",
61
- targetId: drift.desired.entityId,
62
- rowBindingId: { kind: PRESENCE_KINDS.PRESENT, value: drift.desired.rowBindingId },
63
- conflictId: { kind: PRESENCE_KINDS.ABSENT },
64
- targetAnchor: drift.desired.anchorReference,
65
- fields: drift.desired.fields,
66
- createIfMissing,
67
- expectedVisibleRevision,
68
- expectedVisibleHash,
69
- targetEntityRevision: {
70
- kind: APPLICABILITY_KINDS.APPLICABLE,
71
- value: drift.desired.entityRevision,
72
- },
73
- targetFieldRevisionHash: {
74
- kind: APPLICABILITY_KINDS.APPLICABLE,
75
- value: drift.desired.fieldRevisionHash,
76
- },
77
- targetCanonicalCommitId: { kind: APPLICABILITY_KINDS.APPLICABLE, value: commitId },
78
- streamSequence: baseline.streamSequence,
79
- });
80
52
  effects.push({
81
- effect,
53
+ effect: createRepairEffect(context, sheet, drift.desired, commitId, {
54
+ ...baseline,
55
+ createIfMissing,
56
+ expectedVisibleRevision,
57
+ expectedVisibleHash,
58
+ }),
82
59
  // When the stream head is a terminal failed effect, the repair must
83
60
  // supersede that head so it can become the new claimable stream head;
84
61
  // otherwise the durable predecessor guard would block it forever.
@@ -88,10 +65,71 @@ export async function buildCorrectionEffects(context, sheet, drifts) {
88
65
  }
89
66
  return effects;
90
67
  }
91
- export async function resolveCorrectionBaseline(context, desired) {
92
- return context.storage.read(({ sql }) => resolveCorrectionBaselineWithSql(sql, context, desired));
68
+ /**
69
+ * Plans the stream repair for one desired row whose Sheet state already
70
+ * matches canonical but whose stream is wedged behind a terminal failed head.
71
+ *
72
+ * The failed head blocks every follower through the durable predecessor
73
+ * guard while the drift path never plans a repair for a row that already
74
+ * matches, so this replans the same correction contract without a drift: an
75
+ * equivalent correction already in flight behind the head produces a
76
+ * supersede-only plan; otherwise a fresh correction effect is returned that
77
+ * supersedes the head when it is appended. Returns null when a concurrent
78
+ * pass already superseded the head.
79
+ */
80
+ export async function buildFailedHeadRepairPlan(context, sheet, target, commitId) {
81
+ const baseline = await resolveCorrectionBaseline(context, target.desired, target.observed);
82
+ if (baseline.supersedeFailedEffectId === null)
83
+ return null;
84
+ if (baseline.skip) {
85
+ return {
86
+ effect: null,
87
+ supersedeFailedEffectId: baseline.supersedeFailedEffectId,
88
+ supersedeByEffectId: baseline.supersedeByEffectId,
89
+ };
90
+ }
91
+ return {
92
+ effect: createRepairEffect(context, sheet, target.desired, commitId, baseline),
93
+ supersedeFailedEffectId: baseline.supersedeFailedEffectId,
94
+ supersedeByEffectId: baseline.supersedeByEffectId,
95
+ };
96
+ }
97
+ /** Builds one system_projection correction effect from a resolved baseline. */
98
+ function createRepairEffect(context, sheet, desired, commitId, baseline) {
99
+ return createSystemProjectionEffect({
100
+ effectId: "effect:" + context.createId(),
101
+ commitId,
102
+ logicalSheetId: context.logicalSheetId,
103
+ physicalSheetId: context.physicalSheetId,
104
+ sheetName: sheet.tabName,
105
+ registeredRange: sheet.registeredRange,
106
+ projection: SYNC_PROJECTIONS.SYSTEM_STATE,
107
+ schemaVersion: context.schemaVersion,
108
+ targetKind: "entity",
109
+ targetId: desired.entityId,
110
+ rowBindingId: { kind: PRESENCE_KINDS.PRESENT, value: desired.rowBindingId },
111
+ conflictId: { kind: PRESENCE_KINDS.ABSENT },
112
+ targetAnchor: desired.anchorReference,
113
+ fields: desired.fields,
114
+ createIfMissing: baseline.createIfMissing,
115
+ expectedVisibleRevision: baseline.expectedVisibleRevision,
116
+ expectedVisibleHash: baseline.expectedVisibleHash,
117
+ targetEntityRevision: {
118
+ kind: APPLICABILITY_KINDS.APPLICABLE,
119
+ value: desired.entityRevision,
120
+ },
121
+ targetFieldRevisionHash: {
122
+ kind: APPLICABILITY_KINDS.APPLICABLE,
123
+ value: desired.fieldRevisionHash,
124
+ },
125
+ targetCanonicalCommitId: { kind: APPLICABILITY_KINDS.APPLICABLE, value: commitId },
126
+ streamSequence: baseline.streamSequence,
127
+ });
128
+ }
129
+ export async function resolveCorrectionBaseline(context, desired, observed) {
130
+ return context.storage.read(({ sql }) => resolveCorrectionBaselineWithSql(sql, context, desired, observed));
93
131
  }
94
- export async function resolveCorrectionBaselineWithSql(sql, context, desired) {
132
+ export async function resolveCorrectionBaselineWithSql(sql, context, desired, observed) {
95
133
  const latestEffect = await sql.get(READ_LATEST_EFFECT_SQL, [
96
134
  context.logicalSheetId,
97
135
  desired.entityId,
@@ -161,13 +199,13 @@ export async function resolveCorrectionBaselineWithSql(sql, context, desired) {
161
199
  context.physicalSheetId,
162
200
  desired.rowBindingId,
163
201
  ]);
164
- return withSupersede(baselineFromVisible(visible, streamSequence), failedHead);
202
+ return withSupersede(baselineFromVisible(visible, streamSequence, observed, context.systemFields), failedHead);
165
203
  }
166
204
  const visible = await sql.get(READ_LATEST_VISIBLE_STATE_SQL, [
167
205
  context.physicalSheetId,
168
206
  desired.rowBindingId,
169
207
  ]);
170
- return withSupersede(baselineFromVisible(visible, POSITIVE_SAFE_INTEGER_MINIMUM), failedHead);
208
+ return withSupersede(baselineFromVisible(visible, POSITIVE_SAFE_INTEGER_MINIMUM, observed, context.systemFields), failedHead);
171
209
  }
172
210
  /**
173
211
  * Returns the terminal failed head id for one target stream, or null.
@@ -188,26 +226,61 @@ function withSupersede(baseline, failedHead) {
188
226
  return baseline;
189
227
  return { ...baseline, supersedeFailedEffectId: failedHead };
190
228
  }
191
- export function baselineFromVisible(visible, streamSequence) {
192
- if (visible === undefined ||
193
- visible.confirmed_visible_revision === null ||
194
- visible.confirmed_snapshot_hash === null ||
195
- visible.confirmed_snapshot_hash.length === 0) {
229
+ export function baselineFromVisible(visible, streamSequence, observed, systemFields) {
230
+ if (visible !== undefined &&
231
+ visible.confirmed_visible_revision !== null &&
232
+ visible.confirmed_snapshot_hash !== null &&
233
+ visible.confirmed_snapshot_hash.length > 0) {
234
+ // The confirmed revision is the receipt baseline so the confirmation
235
+ // upsert never regresses. The expected hash, however, comes from the
236
+ // FRESH observed row whenever one is available: the provider write CAS
237
+ // is hash-only, so only the row's CURRENT visible hash can pass the
238
+ // guard. Using the stale confirmed hash as the guard would make a repair
239
+ // of an edited/drifted row fail on `visible_guard_mismatch` forever.
240
+ const observedHash = observed !== undefined && systemFields !== undefined
241
+ ? computeObservedHash(observed, systemFields)
242
+ : undefined;
196
243
  return {
197
244
  skip: false,
198
- expectedVisibleRevision: 0,
199
- expectedVisibleHash: "",
200
- createIfMissing: true,
245
+ expectedVisibleRevision: visible.confirmed_visible_revision,
246
+ expectedVisibleHash: observedHash !== undefined && observedHash.length > 0
247
+ ? observedHash
248
+ : visible.confirmed_snapshot_hash,
249
+ createIfMissing: false,
201
250
  streamSequence,
202
251
  supersedeFailedEffectId: null,
203
252
  supersedeByEffectId: null,
204
253
  };
205
254
  }
255
+ // No confirmed visible evidence exists (for example a response-loss
256
+ // restart where the local confirmation was never recorded). If the row is
257
+ // observable in the snapshot, build a guarded regular repair from its
258
+ // CURRENT visible hash instead of the old insert baseline: the row already
259
+ // exists, so a createIfMissing repair would be rejected as an identity/insert
260
+ // failure and repeat forever. Revision 0 is the receipt baseline only — the
261
+ // provider write CAS is hash-only, so the observed hash is the guard that
262
+ // prevents an unguarded overwrite.
263
+ if (observed !== undefined && systemFields !== undefined) {
264
+ const observedHash = computeObservedHash(observed, systemFields);
265
+ if (observedHash.length > 0) {
266
+ return {
267
+ skip: false,
268
+ expectedVisibleRevision: 0,
269
+ expectedVisibleHash: observedHash,
270
+ createIfMissing: false,
271
+ streamSequence,
272
+ supersedeFailedEffectId: null,
273
+ supersedeByEffectId: null,
274
+ };
275
+ }
276
+ }
277
+ // The safe missing-row path: no observed row and no confirmed evidence, so
278
+ // the repair must create the row from the empty visible baseline.
206
279
  return {
207
280
  skip: false,
208
- expectedVisibleRevision: visible.confirmed_visible_revision,
209
- expectedVisibleHash: visible.confirmed_snapshot_hash,
210
- createIfMissing: false,
281
+ expectedVisibleRevision: 0,
282
+ expectedVisibleHash: "",
283
+ createIfMissing: true,
211
284
  streamSequence,
212
285
  supersedeFailedEffectId: null,
213
286
  supersedeByEffectId: null,