instar 1.3.288 → 1.3.290
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/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +17 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/feedback-factory/cutoverReadiness.d.ts +45 -0
- package/dist/feedback-factory/cutoverReadiness.d.ts.map +1 -1
- package/dist/feedback-factory/cutoverReadiness.js +51 -0
- package/dist/feedback-factory/cutoverReadiness.js.map +1 -1
- package/dist/feedback-factory/dryrun/HttpParitySource.d.ts +14 -0
- package/dist/feedback-factory/dryrun/HttpParitySource.d.ts.map +1 -1
- package/dist/feedback-factory/dryrun/HttpParitySource.js +67 -4
- package/dist/feedback-factory/dryrun/HttpParitySource.js.map +1 -1
- package/dist/feedback-factory/migration/importRunner.d.ts +117 -0
- package/dist/feedback-factory/migration/importRunner.d.ts.map +1 -0
- package/dist/feedback-factory/migration/importRunner.js +162 -0
- package/dist/feedback-factory/migration/importRunner.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +25 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +3 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +3 -0
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +35 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/scripts/instar-dev-precommit.js +31 -10
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +1 -0
- package/upgrades/1.3.289.md +50 -0
- package/upgrades/1.3.290.md +21 -0
- package/upgrades/decisions-per-entry.eli16.md +5 -0
- package/upgrades/side-effects/decisions-per-entry.md +44 -0
- 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;
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cutoverReadiness.js","sourceRoot":"","sources":["../../src/feedback-factory/cutoverReadiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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 ??
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
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"}
|