instar 1.3.288 → 1.3.289

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 (35) hide show
  1. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  2. package/dist/core/PostUpdateMigrator.js +17 -0
  3. package/dist/core/PostUpdateMigrator.js.map +1 -1
  4. package/dist/feedback-factory/cutoverReadiness.d.ts +45 -0
  5. package/dist/feedback-factory/cutoverReadiness.d.ts.map +1 -1
  6. package/dist/feedback-factory/cutoverReadiness.js +51 -0
  7. package/dist/feedback-factory/cutoverReadiness.js.map +1 -1
  8. package/dist/feedback-factory/dryrun/HttpParitySource.d.ts +14 -0
  9. package/dist/feedback-factory/dryrun/HttpParitySource.d.ts.map +1 -1
  10. package/dist/feedback-factory/dryrun/HttpParitySource.js +67 -4
  11. package/dist/feedback-factory/dryrun/HttpParitySource.js.map +1 -1
  12. package/dist/feedback-factory/migration/importRunner.d.ts +117 -0
  13. package/dist/feedback-factory/migration/importRunner.d.ts.map +1 -0
  14. package/dist/feedback-factory/migration/importRunner.js +162 -0
  15. package/dist/feedback-factory/migration/importRunner.js.map +1 -0
  16. package/dist/scaffold/templates.d.ts.map +1 -1
  17. package/dist/scaffold/templates.js +1 -0
  18. package/dist/scaffold/templates.js.map +1 -1
  19. package/dist/server/AgentServer.d.ts.map +1 -1
  20. package/dist/server/AgentServer.js +25 -0
  21. package/dist/server/AgentServer.js.map +1 -1
  22. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  23. package/dist/server/CapabilityIndex.js +3 -1
  24. package/dist/server/CapabilityIndex.js.map +1 -1
  25. package/dist/server/middleware.d.ts.map +1 -1
  26. package/dist/server/middleware.js +3 -0
  27. package/dist/server/middleware.js.map +1 -1
  28. package/dist/server/routes.d.ts.map +1 -1
  29. package/dist/server/routes.js +35 -0
  30. package/dist/server/routes.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/data/builtin-manifest.json +64 -64
  33. package/src/scaffold/templates.ts +1 -0
  34. package/upgrades/1.3.289.md +50 -0
  35. package/upgrades/side-effects/import-runner.md +66 -0
@@ -24,6 +24,7 @@
24
24
  import type { DurableParityMonitor } from './monitor/parityMonitorStore.js';
25
25
  import type { CutoverGateStatus } from './monitor/parityMonitor.js';
26
26
  import type { IntegrityReport } from './migration/importIntegrity.js';
27
+ import type { ImportRunResult } from './migration/importRunner.js';
27
28
  import type { ParityResult } from './processor/parity.js';
28
29
  export interface IntegrityStatus {
29
30
  /** Has an import integrity report been recorded at all? */
@@ -46,6 +47,19 @@ export interface ParityReadiness extends CutoverGateStatus {
46
47
  * window is NOT readiness (the gate has no max-staleness by design; this layer adds it). */
47
48
  stale: boolean;
48
49
  }
50
+ /** The last import DRY-RUN's verdict — informational only, NEVER a `ready` input. */
51
+ export interface ImportDryRunStatus {
52
+ ran: boolean;
53
+ passed: boolean;
54
+ generatedAt: string | null;
55
+ /** What the rehearsal imported (in-memory; zero durable writes). Null when never ran. */
56
+ imported: {
57
+ clusters: number;
58
+ feedback: number;
59
+ } | null;
60
+ /** Non-null when the rehearsal aborted pre-import (fingerprint collisions to resolve). */
61
+ abortedPreImport: string | null;
62
+ }
49
63
  export interface CutoverReadinessStatus {
50
64
  /** True only when integrity passed AND the parity window is cleared AND fresh.
51
65
  * This is the everything-up-to-the-door signal — it never fires anything. */
@@ -54,6 +68,13 @@ export interface CutoverReadinessStatus {
54
68
  door: 'manual-operator-click';
55
69
  integrity: IntegrityStatus;
56
70
  parity: ParityReadiness;
71
+ /**
72
+ * The import REHEARSAL (dry-run against an in-memory target on live source data).
73
+ * Readiness honesty: this is visibility into whether the import pipeline is
74
+ * proven — it does NOT contribute to `ready`. Only the REAL import's persisted
75
+ * IntegrityReport (the `integrity` leg) can.
76
+ */
77
+ importDryRun: ImportDryRunStatus;
57
78
  }
58
79
  export type ParityPassOutcome = {
59
80
  ok: true;
@@ -68,6 +89,14 @@ export type ParityPassOutcome = {
68
89
  ok: false;
69
90
  reason: string;
70
91
  };
92
+ export type ImportDryRunOutcome = {
93
+ ok: true;
94
+ result: ImportRunResult;
95
+ generatedAt: string;
96
+ } | {
97
+ ok: false;
98
+ reason: string;
99
+ };
71
100
  export interface CutoverReadinessDeps {
72
101
  parityMonitor: DurableParityMonitor;
73
102
  /** Where the import tooling's IntegrityReport persists (JSON envelope). */
@@ -76,6 +105,14 @@ export interface CutoverReadinessDeps {
76
105
  * configured — runParityPass() then refuses, and the parity condition can only
77
106
  * clear via passes recorded by other server-side paths. */
78
107
  runParityCheck: (() => Promise<ParityResult>) | null;
108
+ /** Where the import DRY-RUN envelope persists. MUST differ from
109
+ * `integrityReportPath` — a rehearsal must never be able to green the canonical
110
+ * integrity condition (enforced in the constructor). Optional for callers that
111
+ * never wire the dry-run. */
112
+ importDryRunReportPath?: string;
113
+ /** SERVER-SIDE import rehearsal (live source fetch → in-memory AS-IS import →
114
+ * integrity gate over readback). Null/absent when no source is configured. */
115
+ runImportDryRun?: (() => Promise<ImportRunResult>) | null;
79
116
  /** Freshness bound for the parity window (default 6h). */
80
117
  maxPassStalenessMs?: number;
81
118
  now?: () => number;
@@ -97,6 +134,14 @@ export declare class CutoverReadiness {
97
134
  * divergence — and it cannot extend the clean window either.
98
135
  */
99
136
  runParityPass(): Promise<ParityPassOutcome>;
137
+ /**
138
+ * TRIGGER a server-side import rehearsal (T7: the agent may ask; the server
139
+ * computes — live source fetch, in-memory AS-IS import, integrity gate over the
140
+ * readback). The envelope persists to the SEPARATE dry-run path; the canonical
141
+ * integrity report is structurally out of reach of this method.
142
+ */
143
+ runImportDryRunPass(): Promise<ImportDryRunOutcome>;
144
+ importDryRunStatus(): ImportDryRunStatus;
100
145
  /** The everything-up-to-the-door readiness signal. Read-only; never fires anything. */
101
146
  status(): CutoverReadinessStatus;
102
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cutoverReadiness.d.ts","sourceRoot":"","sources":["../../src/feedback-factory/cutoverReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,GAAG,EAAE,OAAO,CAAC;IACb,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uDAAuD;IACvD,OAAO,EAAE;QACP,qBAAqB,EAAE,MAAM,CAAC;QAC9B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB;IACxD,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;iGAC6F;IAC7F,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC;kFAC8E;IAC9E,KAAK,EAAE,OAAO,CAAC;IACf,mFAAmF;IACnF,IAAI,EAAE,uBAAuB,CAAC;IAC9B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC9H;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,oBAAoB,CAAC;IACpC,2EAA2E;IAC3E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;gEAE4D;IAC5D,cAAc,EAAE,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AASD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,EAAE,oBAAoB;IAKtC,OAAO,CAAC,KAAK;IAIb,2EAA2E;IAC3E,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAS1E,eAAe,IAAI,eAAe;IAuBlC,YAAY,IAAI,eAAe;IAW/B;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAoBjD,uFAAuF;IACvF,MAAM,IAAI,sBAAsB;CAUjC"}
1
+ {"version":3,"file":"cutoverReadiness.d.ts","sourceRoot":"","sources":["../../src/feedback-factory/cutoverReadiness.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,11 @@ export class CutoverReadiness {
28
28
  d;
29
29
  maxStaleMs;
30
30
  constructor(deps) {
31
+ if (deps.importDryRunReportPath && path.resolve(deps.importDryRunReportPath) === path.resolve(deps.integrityReportPath)) {
32
+ // Structural readiness-honesty guard: a rehearsal report aimed at the
33
+ // canonical integrity path WOULD green `ready` — refuse the wiring outright.
34
+ throw new Error('importDryRunReportPath must differ from integrityReportPath — a dry-run must never green the integrity gate');
35
+ }
31
36
  this.d = deps;
32
37
  this.maxStaleMs = deps.maxPassStalenessMs ?? DEFAULT_MAX_PASS_STALENESS_MS;
33
38
  }
@@ -103,15 +108,61 @@ export class CutoverReadiness {
103
108
  gate: this.d.parityMonitor.gate(at),
104
109
  };
105
110
  }
111
+ /**
112
+ * TRIGGER a server-side import rehearsal (T7: the agent may ask; the server
113
+ * computes — live source fetch, in-memory AS-IS import, integrity gate over the
114
+ * readback). The envelope persists to the SEPARATE dry-run path; the canonical
115
+ * integrity report is structurally out of reach of this method.
116
+ */
117
+ async runImportDryRunPass() {
118
+ if (!this.d.runImportDryRun || !this.d.importDryRunReportPath) {
119
+ return { ok: false, reason: 'no import source configured (feedbackMigration.paritySource) — cannot run an import dry-run' };
120
+ }
121
+ let result;
122
+ try {
123
+ result = await this.d.runImportDryRun();
124
+ }
125
+ catch (err) {
126
+ return { ok: false, reason: `import dry-run failed: ${err instanceof Error ? err.message : String(err)}` };
127
+ }
128
+ const generatedAt = new Date(this.nowMs()).toISOString();
129
+ const envelope = { generatedAt, mode: 'dry-run', result };
130
+ fs.mkdirSync(path.dirname(this.d.importDryRunReportPath), { recursive: true });
131
+ fs.writeFileSync(this.d.importDryRunReportPath, JSON.stringify(envelope, null, 2));
132
+ return { ok: true, result, generatedAt };
133
+ }
134
+ importDryRunStatus() {
135
+ const empty = { ran: false, passed: false, generatedAt: null, imported: null, abortedPreImport: null };
136
+ if (!this.d.importDryRunReportPath)
137
+ return empty;
138
+ try {
139
+ const raw = JSON.parse(fs.readFileSync(this.d.importDryRunReportPath, 'utf8'));
140
+ const r = raw?.result;
141
+ if (!r || typeof r.passed !== 'boolean')
142
+ return empty;
143
+ return {
144
+ ran: true,
145
+ passed: r.passed,
146
+ generatedAt: typeof raw.generatedAt === 'string' ? raw.generatedAt : null,
147
+ imported: r.imported ?? null,
148
+ abortedPreImport: r.abortedPreImport ? r.abortedPreImport.reason : null,
149
+ };
150
+ }
151
+ catch { /* @silent-fallback-ok — no dry-run envelope on disk = the rehearsal never ran (informational-only surface) */
152
+ return empty;
153
+ }
154
+ }
106
155
  /** The everything-up-to-the-door readiness signal. Read-only; never fires anything. */
107
156
  status() {
108
157
  const integrity = this.integrityStatus();
109
158
  const parity = this.parityStatus();
110
159
  return {
160
+ // `ready` composes integrity + parity ONLY — the dry-run is visibility, not a gate input.
111
161
  ready: integrity.passed && parity.cleared && !parity.stale,
112
162
  door: 'manual-operator-click',
113
163
  integrity,
114
164
  parity,
165
+ importDryRun: this.importDryRunStatus(),
115
166
  };
116
167
  }
117
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cutoverReadiness.js","sourceRoot":"","sources":["../../src/feedback-factory/cutoverReadiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cutoverReadiness.js","sourceRoot":"","sources":["../../src/feedback-factory/cutoverReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAuF7B,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAazD,MAAM,OAAO,gBAAgB;IACV,CAAC,CAAuB;IACxB,UAAU,CAAS;IAEpC,YAAY,IAA0B;QACpC,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACxH,sEAAsE;YACtE,6EAA6E;YAC7E,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACjI,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,6BAA6B,CAAC;IAC7E,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,2EAA2E;IAC3E,qBAAqB,CAAC,MAAuB,EAAE,WAAoB;QACjE,MAAM,QAAQ,GAA+B;YAC3C,WAAW,EAAE,WAAW,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE;YAChE,MAAM;SACP,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,eAAe;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAA+B,CAAC;YAC1G,MAAM,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACxC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACzE,CAAC;YACD,OAAO;gBACL,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;gBACzE,OAAO,EAAE;oBACP,qBAAqB,EAAE,CAAC,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;oBAC3D,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC;oBACnD,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,EAAE,MAAM,IAAI,CAAC;oBACrD,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;iBAC1C;aACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAC,4FAA4F;YACpG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,MAAM,KAAK,GAAG,UAAU,KAAK,IAAI;YAC/B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5D,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wFAAwF,EAAE,CAAC;QACzH,CAAC;QACD,IAAI,MAAoB,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC3G,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,sBAAsB,CAAC,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC5F,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,GAAG,CAAC,EAAE;YAChG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;SACpC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC;YAC9D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6FAA6F,EAAE,CAAC;QAC9H,CAAC;QACD,IAAI,MAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAC7G,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,QAAQ,GAA4B,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACnF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,kBAAkB;QAChB,MAAM,KAAK,GAAuB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC3H,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAA4B,CAAC;YAC1G,MAAM,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YACtD,OAAO;gBACL,GAAG,EAAE,IAAI;gBACT,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;gBACzE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;gBAC5B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;aACxE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAC,8GAA8G;YACtH,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,MAAM;QACJ,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,OAAO;YACL,0FAA0F;YAC1F,KAAK,EAAE,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YAC1D,IAAI,EAAE,uBAAuB;YAC7B,SAAS;YACT,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE;SACxC,CAAC;IACJ,CAAC;CACF"}
@@ -68,6 +68,12 @@ export interface HttpParitySourceConfig {
68
68
  * has a hard upper duration even at the 200-page safety cap.
69
69
  */
70
70
  totalTimeoutMs?: number;
71
+ /**
72
+ * When true, `prepare()` ALSO captures the raw cluster + feedback rows verbatim
73
+ * (every field as the wire delivered it, no coercion) for the AS-IS import
74
+ * runner. Off by default — parity mode only needs the typed cluster projection.
75
+ */
76
+ captureRaw?: boolean;
71
77
  }
72
78
  /** Error thrown when Portal returns non-OK. The status code is preserved for callers. */
73
79
  export declare class HttpParitySourceError extends Error {
@@ -83,6 +89,10 @@ export declare class HttpParitySourceError extends Error {
83
89
  export declare class HttpParitySource implements ParitySource {
84
90
  private readonly config;
85
91
  private snapshot;
92
+ /** Raw rows verbatim (only populated when `captureRaw` is set). */
93
+ private rawClusters;
94
+ private rawFeedback;
95
+ private rawFeedbackUnkeyed;
86
96
  private readonly pageSize;
87
97
  private readonly maxPages;
88
98
  private readonly fetch;
@@ -94,5 +104,9 @@ export declare class HttpParitySource implements ParitySource {
94
104
  prepare(): Promise<void>;
95
105
  /** Sync ParitySource read — returns the snapshot captured by {@link prepare}. */
96
106
  readPortalClusters(): PortalCluster[];
107
+ /** Raw cluster rows verbatim (requires `captureRaw` + a completed prepare()). */
108
+ readRawClusters(): Record<string, unknown>[];
109
+ /** Raw feedback rows verbatim (requires `captureRaw` + a completed prepare()). */
110
+ readRawFeedback(): Record<string, unknown>[];
97
111
  }
98
112
  //# sourceMappingURL=HttpParitySource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HttpParitySource.d.ts","sourceRoot":"","sources":["../../../src/feedback-factory/dryrun/HttpParitySource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IACpH,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAiBD,yFAAyF;AACzF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAgCD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IASvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IARnC,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAEX,MAAM,EAAE,sBAAsB;IAY3D,mFAAmF;IAC7E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkE9B,iFAAiF;IACjF,kBAAkB,IAAI,aAAa,EAAE;CAMtC"}
1
+ {"version":3,"file":"HttpParitySource.d.ts","sourceRoot":"","sources":["../../../src/feedback-factory/dryrun/HttpParitySource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC;IACpH,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAiBD,yFAAyF;AACzF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAgCD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAavC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZnC,OAAO,CAAC,QAAQ,CAAgC;IAChD,mEAAmE;IACnE,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAEX,MAAM,EAAE,sBAAsB;IAY3D,mFAAmF;IAC7E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8G9B,iFAAiF;IACjF,kBAAkB,IAAI,aAAa,EAAE;IAOrC,iFAAiF;IACjF,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAO5C,kFAAkF;IAClF,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;CAM7C"}
@@ -77,6 +77,10 @@ function coerceCluster(row) {
77
77
  export class HttpParitySource {
78
78
  config;
79
79
  snapshot = null;
80
+ /** Raw rows verbatim (only populated when `captureRaw` is set). */
81
+ rawClusters = null;
82
+ rawFeedback = null;
83
+ rawFeedbackUnkeyed = [];
80
84
  pageSize;
81
85
  maxPages;
82
86
  fetch;
@@ -98,6 +102,9 @@ export class HttpParitySource {
98
102
  /** Pre-fetch and cache the cluster snapshot. Idempotent: re-calling re-fetches. */
99
103
  async prepare() {
100
104
  const byId = new Map();
105
+ const rawClusters = this.config.captureRaw ? new Map() : null;
106
+ const rawFeedback = this.config.captureRaw ? new Map() : null;
107
+ const rawFeedbackUnkeyed = [];
101
108
  const base = this.config.baseUrl.replace(/\/+$/, '');
102
109
  const authHeader = `Bearer ${this.config.token}`;
103
110
  const deadline = Date.now() + this.totalTimeoutMs;
@@ -139,21 +146,63 @@ export class HttpParitySource {
139
146
  catch { /* ignore */ }
140
147
  throw new HttpParitySourceError(res.status, `Portal /api/instar/read failed (page ${page}, status ${res.status} ${res.statusText}): ${detail}`);
141
148
  }
142
- const envelope = (await res.json());
143
- const rawClusters = envelope?.data?.clusters ?? [];
144
- for (const raw of rawClusters) {
149
+ // The abort signal also bounds the BODY read — a page whose headers arrive
150
+ // in time but whose body streams too slowly aborts here, not in fetch().
151
+ // Classify it the same way (live finding, 2026-06-05 11:01Z: a slow page
152
+ // body propagated the raw "operation was aborted" instead of naming the
153
+ // page and budgets).
154
+ let envelope;
155
+ try {
156
+ envelope = (await res.json());
157
+ }
158
+ catch (err) {
159
+ const name = err instanceof Error ? err.name : '';
160
+ if (name === 'TimeoutError' || name === 'AbortError') {
161
+ throw new HttpParitySourceError(504, `Portal /api/instar/read page ${page} body read timed out after ${budgetMs}ms (pageTimeoutMs=${this.pageTimeoutMs}, totalTimeoutMs=${this.totalTimeoutMs})`);
162
+ }
163
+ throw err;
164
+ }
165
+ const pageClusters = envelope?.data?.clusters ?? [];
166
+ for (const raw of pageClusters) {
145
167
  const c = coerceCluster(raw);
146
168
  if (!byId.has(c.clusterId))
147
169
  byId.set(c.clusterId, c);
170
+ // Raw capture: keep the wire row VERBATIM (no coercion) for the AS-IS
171
+ // import. Dedup by the same clusterId (pages repeat clusters).
172
+ if (rawClusters && !rawClusters.has(c.clusterId)) {
173
+ rawClusters.set(c.clusterId, raw);
174
+ }
175
+ }
176
+ if (rawFeedback) {
177
+ for (const raw of envelope?.data?.feedback ?? []) {
178
+ if (!raw || typeof raw !== 'object')
179
+ continue;
180
+ const r = raw;
181
+ const idv = r['feedbackId'] ?? r['feedback_id'] ?? r['id'];
182
+ const id = typeof idv === 'string' ? idv : typeof idv === 'number' ? String(idv) : '';
183
+ // Feedback is the paginated table itself; offset pagination can repeat a
184
+ // row across page boundaries under concurrent writes — dedup by id when
185
+ // one resolves, keep verbatim otherwise (the import will surface it).
186
+ if (id) {
187
+ if (!rawFeedback.has(id))
188
+ rawFeedback.set(id, r);
189
+ }
190
+ else {
191
+ rawFeedbackUnkeyed.push(r);
192
+ }
193
+ }
148
194
  }
149
195
  // Pagination stop signal: returned_count < pageSize means the feedback table
150
196
  // is exhausted (clusters/dispatches per Dawn's contract accompany the feedback
151
197
  // pages and stabilise quickly via the byId dedup above).
152
- const returned = envelope?.meta?.returned_count ?? rawClusters.length;
198
+ const returned = envelope?.meta?.returned_count ?? pageClusters.length;
153
199
  if (returned < this.pageSize)
154
200
  break;
155
201
  }
156
202
  this.snapshot = [...byId.values()];
203
+ this.rawClusters = rawClusters;
204
+ this.rawFeedback = rawFeedback;
205
+ this.rawFeedbackUnkeyed = rawFeedbackUnkeyed;
157
206
  }
158
207
  /** Sync ParitySource read — returns the snapshot captured by {@link prepare}. */
159
208
  readPortalClusters() {
@@ -162,5 +211,19 @@ export class HttpParitySource {
162
211
  }
163
212
  return this.snapshot.map((c) => ({ ...c }));
164
213
  }
214
+ /** Raw cluster rows verbatim (requires `captureRaw` + a completed prepare()). */
215
+ readRawClusters() {
216
+ if (!this.rawClusters) {
217
+ throw new HttpParitySourceError(500, 'raw capture unavailable — construct with captureRaw:true and await prepare() first');
218
+ }
219
+ return [...this.rawClusters.values()].map((r) => ({ ...r }));
220
+ }
221
+ /** Raw feedback rows verbatim (requires `captureRaw` + a completed prepare()). */
222
+ readRawFeedback() {
223
+ if (!this.rawFeedback) {
224
+ throw new HttpParitySourceError(500, 'raw capture unavailable — construct with captureRaw:true and await prepare() first');
225
+ }
226
+ return [...this.rawFeedback.values(), ...this.rawFeedbackUnkeyed].map((r) => ({ ...r }));
227
+ }
165
228
  }
166
229
  //# sourceMappingURL=HttpParitySource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HttpParitySource.js","sourceRoot":"","sources":["../../../src/feedback-factory/dryrun/HttpParitySource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HttpParitySource.js","sourceRoot":"","sources":["../../../src/feedback-factory/dryrun/HttpParitySource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * importRunner.ts — the end-to-end Phase-2/4 AS-IS import executor (spec §2.4).
3
+ *
4
+ * `importIntegrity.ts` ships the pure integrity-gate CORE (checksums, fingerprint
5
+ * scan, schema-equivalence, FK check, sequence plan); this module is the RUNNER
6
+ * that drives a real import through it: read the full source export → pre-import
7
+ * fingerprint-uniqueness scan (abort BEFORE any write on a collision) → import
8
+ * rows AS-IS parent-before-child → read back what actually landed → run the full
9
+ * integrity gate over source-vs-readback. The gate verdict therefore attests what
10
+ * the TARGET stores, never what the runner intended to write.
11
+ *
12
+ * Two execution modes share this one code path:
13
+ * - DRY-RUN (available now): target = {@link InMemoryImportTarget}. Proves the
14
+ * import pipeline on REAL production data with zero durable writes. Its report
15
+ * persists to a SEPARATE dry-run path and NEVER greens the canonical
16
+ * `integrity-gate-pass` readiness condition — readiness honesty: `ready` must
17
+ * mean the real data migration ran, not a rehearsal.
18
+ * - REAL (creds-gated, Phase 0/G1.4): target = the cloud Prisma adapter (a thin
19
+ * {@link ImportTarget} shim wrapping one transaction + the synthetic
20
+ * post-import insert). Only THAT run records to the canonical report path.
21
+ *
22
+ * Rows are handled as raw `Record<string, unknown>` end to end — AS-IS means every
23
+ * field survives verbatim, including fields this codebase has never heard of.
24
+ */
25
+ import { type FingerprintCollision, type IntegrityReport, type SchemaDescriptor } from './importIntegrity.js';
26
+ /** A raw row exactly as the source export delivered it. */
27
+ export type RawRow = Record<string, unknown>;
28
+ /** The full source export the import consumes (clusters + the feedback rows that reference them). */
29
+ export interface ImportSourceData {
30
+ clusters: RawRow[];
31
+ feedback: RawRow[];
32
+ }
33
+ /**
34
+ * The write/readback seam an import target must provide. The REAL adapter wraps a
35
+ * cloud DB transaction; tests and dry-runs use {@link InMemoryImportTarget}. The
36
+ * readback methods are load-bearing: the integrity gate verifies what the target
37
+ * RETURNS, so an adapter that silently mangles a row on write is caught by the
38
+ * per-row checksum comparison — intent is never trusted over observation.
39
+ */
40
+ export interface ImportTarget {
41
+ /** Persist one cluster row AS-IS (every field verbatim). Throws on a duplicate clusterId (PK). */
42
+ importClusterAsIs(row: RawRow): void;
43
+ /** Persist one feedback row AS-IS. Throws on a duplicate feedbackId (PK). */
44
+ importFeedbackAsIs(row: RawRow): void;
45
+ /** Every cluster row as the target now stores it. */
46
+ readBackClusters(): RawRow[];
47
+ /** Every feedback row as the target now stores it. */
48
+ readBackFeedback(): RawRow[];
49
+ /**
50
+ * The target's real schema descriptor, when it has one (the Prisma adapter
51
+ * reports its actual enum + column types). Null → the runner derives a
52
+ * descriptor from the readback rows (dry-run mode).
53
+ */
54
+ schemaDescriptor(): SchemaDescriptor | null;
55
+ }
56
+ /** Duplicate-PK import error (mirrors the DB constraint the real adapter would hit). */
57
+ export declare class DuplicateImportIdError extends Error {
58
+ constructor(kind: 'cluster' | 'feedback', id: string);
59
+ }
60
+ /**
61
+ * In-memory ImportTarget — the dry-run/test implementation. Deep-copies on write
62
+ * AND on readback so neither side can mutate stored state through a shared
63
+ * reference; refuses duplicate ids the way the real PK constraint would.
64
+ */
65
+ export declare class InMemoryImportTarget implements ImportTarget {
66
+ private clusters;
67
+ private feedback;
68
+ importClusterAsIs(row: RawRow): void;
69
+ importFeedbackAsIs(row: RawRow): void;
70
+ readBackClusters(): RawRow[];
71
+ readBackFeedback(): RawRow[];
72
+ /** No real schema — the runner derives one from readback (dry-run mode). */
73
+ schemaDescriptor(): SchemaDescriptor | null;
74
+ }
75
+ /**
76
+ * Every status literal the canonical (Instar) instance accepts on an AS-IS import:
77
+ * the v2 lifecycle states, the full legacy v1 vocabulary (AS-IS preserves the raw
78
+ * literal; the processor normalizes at READ time via `normalizeStatus`), and the
79
+ * terminal-only legacy literal `legacy_closed`.
80
+ */
81
+ export declare function canonicalAcceptedStatusValues(): string[];
82
+ /**
83
+ * Derive a SchemaDescriptor by OBSERVATION: the distinct status literals the rows
84
+ * actually use + a field→typeof map over `fields`. Mixed-type fields surface as
85
+ * 'mixed' (a divergence the equivalence check will flag, by design). null/undefined
86
+ * are skipped — absence is not a type.
87
+ */
88
+ export declare function deriveSchemaDescriptor(rows: RawRow[], fields: readonly string[]): SchemaDescriptor;
89
+ export interface ImportRunResult {
90
+ /** The full integrity-gate verdict over source-vs-readback (null when aborted pre-import). */
91
+ report: IntegrityReport | null;
92
+ /** What the run actually wrote. Zero on a pre-import abort. */
93
+ imported: {
94
+ clusters: number;
95
+ feedback: number;
96
+ };
97
+ /**
98
+ * Non-null when the run aborted BEFORE any write: the pre-import
99
+ * fingerprint-uniqueness scan found collisions a human must resolve first
100
+ * (spec §2.4 — an AS-IS import would abort on @unique mid-transaction or
101
+ * silently collapse the colliding clusters).
102
+ */
103
+ abortedPreImport: {
104
+ reason: 'fingerprint-collision';
105
+ collisions: FingerprintCollision[];
106
+ } | null;
107
+ /** True only when the run imported AND the integrity gate passed. */
108
+ passed: boolean;
109
+ }
110
+ /**
111
+ * Execute the AS-IS import end to end. Parent-before-child (clusters, then the
112
+ * feedback rows that FK onto them); the integrity gate runs over what the target
113
+ * READS BACK, not what was sent. Source schema is derived from the source rows;
114
+ * target schema comes from the adapter when it has one, else from the readback.
115
+ */
116
+ export declare function runImport(source: ImportSourceData, target: ImportTarget): ImportRunResult;
117
+ //# sourceMappingURL=importRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importRunner.d.ts","sourceRoot":"","sources":["../../../src/feedback-factory/migration/importRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,2DAA2D;AAC3D,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,qGAAqG;AACrG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,kGAAkG;IAClG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,6EAA6E;IAC7E,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qDAAqD;IACrD,gBAAgB,IAAI,MAAM,EAAE,CAAC;IAC7B,sDAAsD;IACtD,gBAAgB,IAAI,MAAM,EAAE,CAAC;IAC7B;;;;OAIG;IACH,gBAAgB,IAAI,gBAAgB,GAAG,IAAI,CAAC;CAC7C;AAED,wFAAwF;AACxF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,IAAI,EAAE,SAAS,GAAG,UAAU,EAAE,EAAE,EAAE,MAAM;CAIrD;AAWD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAA6B;IAE7C,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOpC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOrC,gBAAgB,IAAI,MAAM,EAAE;IAI5B,gBAAgB,IAAI,MAAM,EAAE;IAI5B,4EAA4E;IAC5E,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;CAG5C;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,EAAE,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAelG;AAED,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD;;;;;OAKG;IACH,gBAAgB,EAAE;QAAE,MAAM,EAAE,uBAAuB,CAAC;QAAC,UAAU,EAAE,oBAAoB,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACjG,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,CA+CzF"}