@principles/pd-cli 1.109.2 → 1.109.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mainline-snapshot-assembler.d.ts","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAEL,sBAAsB,EACtB,sBAAsB,EAGtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAU9B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,+BAA+B;IAC9C,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAieD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CAwBzC;AAGD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"mainline-snapshot-assembler.d.ts","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAEL,sBAAsB,EACtB,sBAAsB,EAGtB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAU9B,MAAM,6BAA6B,CAAC;AAIrC,MAAM,WAAW,+BAA+B;IAC9C,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,SAAS,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAgfD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,8BAA8B,CAAC,CAwBzC;AAGD,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}
@@ -155,13 +155,17 @@ async function buildDiagnosisTaskSnapshot(stateManager, task) {
155
155
  async function findDiagnosticianArtifact(input) {
156
156
  const { stateManager, diagnosisTaskId, painId, warnings } = input;
157
157
  const db = stateManager.connection.getDb();
158
+ // PRI-411: Split pipeline stores the diagnostician artifact under the
159
+ // diag_router child task (e.g. "diag_router-diagnosis_xxx"), not the
160
+ // parent "diagnosis_xxx". Fallback to diag_router-{parentTaskId} when
161
+ // the parent lookup returns no rows.
158
162
  const rows = db
159
163
  .prepare(`SELECT artifact_id, run_id, task_id, artifact_kind, content_json
160
164
  FROM artifacts
161
- WHERE task_id = ? AND artifact_kind = 'diagnostician_output'
165
+ WHERE (task_id = ? OR task_id = 'diag_router-' || ?) AND artifact_kind = 'diagnostician_output'
162
166
  ORDER BY created_at DESC
163
167
  LIMIT 1`)
164
- .all(diagnosisTaskId);
168
+ .all(diagnosisTaskId, diagnosisTaskId);
165
169
  const [raw] = rows;
166
170
  if (!raw)
167
171
  return null;
@@ -170,6 +174,8 @@ async function findDiagnosticianArtifact(input) {
170
174
  warnings.push(`Malformed diagnostician artifact row for task ${diagnosisTaskId}: missing artifact_id or content_json`);
171
175
  return null;
172
176
  }
177
+ // EP-07: If artifact was found via diag_router fallback, verify lineage
178
+ // consistency — the artifact's sourcePainId must match the parent pain.
173
179
  let sourcePainId = painId;
174
180
  const parsed = safeJsonParse(row.contentJson);
175
181
  if (parsed.ok && isObject(parsed.value)) {
@@ -181,6 +187,11 @@ async function findDiagnosticianArtifact(input) {
181
187
  else if (parsed.ok === false) {
182
188
  warnings.push(`Artifact ${row.artifactId} content_json parse failed: ${parsed.reason}`);
183
189
  }
190
+ // EP-07 mismatch guard: warn when artifact lineage doesn't match parent pain
191
+ if (painId && sourcePainId && sourcePainId !== painId) {
192
+ warnings.push(`Artifact ${row.artifactId} (task ${row.taskId}) sourcePainId "${sourcePainId}" ` +
193
+ `mismatches parent painId "${painId}" — lineage may be broken`);
194
+ }
184
195
  return {
185
196
  artifactId: row.artifactId,
186
197
  sourcePainId,
@@ -1 +1 @@
1
- {"version":3,"file":"mainline-snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,0BAA0B,GAY3B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAmBrD,gFAAgF;AAEhF,SAAS,aAAa,CAAC,GAA8B;IACnD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,MAAM,EAAE,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B,EAAE,GAAW;IAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAYD,SAAS,gCAAgC,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,YAAY,EAAE,YAAY,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;AACjH,CAAC;AAMD,SAAS,4BAA4B,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,gFAAgF;AAEhF,SAAS,eAAe,CAAC,WAAqB;IAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,gFAAgF;AAEhF,SAAS,qBAAqB,CAAC,YAAoB,EAAE,QAAkB;IACrE,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IAC/F,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,IAAI,kBAAkB,CAAC;IAE9F,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,iEAAiE;IACjE,mFAAmF;IACnF,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,IAAI,4BAA4B,GAAG,+DAA+D,CAAC;IAEnG,IAAI,gBAAgB,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC9F,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;YACrB,mBAAmB,GAAG,aAAa,CAAC,SAAS,CAAC;YAC9C,mEAAmE;YACnE,kFAAkF;YAClF,kBAAkB,GAAG,IAAI,CAAC;YAC1B,4BAA4B,GAAG,YAAY,aAAa,CAAC,SAAS,2DAA2D,CAAC;QAChI,CAAC;aAAM,CAAC;YACN,4BAA4B,GAAG,aAAa,CAAC,MAAM,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO;QACL,mBAAmB,EAAE,cAAc;QACnC,mBAAmB;QACnB,YAAY,EAAE,iBAAiB;QAC/B,iBAAiB,EAAE,iBAAiB;QACpC,kBAAkB;QAClB,4BAA4B;KAC7B,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,iBAAiB,CAC9B,YAAiC,EACjC,eAAmC,EACnC,QAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC;IAEzE,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QACzG,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,SAAS;YACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtG,IAAI,YAAY,KAAK,eAAe,EAAE,CAAC;gBACrC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC1D,CAAC;IAED,wEAAwE;IACxE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,kCAAkC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACpF,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtG,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,YAAiC,EACjC,IAAgB;IAEhB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,WAAW,CAAC,CAAC;IAC5E,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,eAAe;KAChB,CAAC;AACJ,CAAC;AASD,KAAK,UAAU,yBAAyB,CACtC,KAAqC;IAErC,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClE,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;eAIS,CACV;SACA,GAAG,CAAC,eAAe,CAAC,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,GAAG,GAAG,gCAAgC,CAAC,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC,iDAAiD,eAAe,uCAAuC,CAAC,CAAC;QACvH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,YAAY,GAAkB,MAAM,CAAC;IACzC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,GAAG,cAAc,CAAC;QAChC,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,UAAU,+BAA+B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,YAAiC,EACjC,UAAkB,EAClB,QAAkB;IAElB,MAAM,sBAAsB,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACxF,IAAI,CAAC,sBAAsB,IAAI,sBAAsB,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3F,MAAM,CAAC,SAAS,CAAC,GAAG,sBAAsB,CAAC,UAAU,CAAC;IACtD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1E,QAAQ,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,WAAW,2BAA2B,MAAM,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,OAAO;QACL,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,MAAM;QACN,YAAY,EAAE,SAAS,CAAC,MAAM;QAC9B,gBAAgB,EAAE,SAAS,CAAC,UAAU;QACtC,WAAW,EAAE,SAAS,CAAC,WAAW;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAgB,EAAE,QAAkB;IACpE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,MAAM,0BAA0B,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAA0B,EAAE,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrF,iBAAiB,CAAC,IAAI,CAAC;gBACrB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,GAAG,EAAE,GAAG,CAAC,GAAG;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,YAAiC,EACjC,SAA4B,EAC5B,QAAkB;IAElB,4DAA4D;IAC5D,MAAM,cAAc,GAAG;QACrB,WAAW,SAAS,CAAC,WAAW,SAAS;QACzC,WAAW,SAAS,CAAC,WAAW,iBAAiB;QACjD,WAAW,SAAS,CAAC,WAAW,gBAAgB;KACjD,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,SAAS;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,SAAS;QACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpG,IAAI,WAAW,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,YAAiC,EACjC,WAAgC,EAChC,QAAkB;IAElB,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,gBAAgB,WAAW,CAAC,MAAM,eAAe,KAAK,YAAY,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnD,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,kBAAkB,EAAE,CAAC;YAC9B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAC3C,IAAI,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACrG,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,YAAiC,EACjC,aAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;IAChD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa;YAAE,SAAS;QAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAC9D,IAAI,YAAY,KAAK,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACnE,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,YAAiC,EACjC,iBAAyB;IAEzB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;IAC3F,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC;IAChF,IAAI,CAAC,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,WAA+B,CAAC;IACpC,MAAM,MAAM,GAAG,aAAa,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QACvD,IAAI,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACnD,IAAI,EAAE;gBAAE,WAAW,GAAG,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,WAAW;QACX,UAAU,EAAE,iBAAiB,CAAC,gBAAgB,KAAK,UAAU;KAC9D,CAAC;AACJ,CAAC;AAWD,KAAK,UAAU,aAAa,CAAC,KAAyB;IACpD,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEhE,MAAM,qBAAqB,GAAiC,aAAa;QACvE,CAAC,CAAC,MAAM,0BAA0B,CAAC,YAAY,EAAE,aAAa,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,qBAAqB,GAAyC,aAAa;QAC/E,CAAC,CAAC,MAAM,yBAAyB,CAAC;YAC9B,YAAY;YACZ,eAAe,EAAE,aAAa,CAAC,MAAM;YACrC,MAAM;YACN,QAAQ;SACT,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,SAAS,GAA6B,qBAAqB;QAC/D,CAAC,CAAC,MAAM,aAAa,CAAC,YAAY,EAAE,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC;QAC/E,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,WAAW,GAA+B,SAAS;QACvD,CAAC,CAAC,MAAM,eAAe,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC1D,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,cAAc,GAAkC,WAAW;QAC/D,CAAC,CAAC,MAAM,2BAA2B,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,SAAS,GAA6B,WAAW;QACrD,CAAC,CAAC,MAAM,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,SAAS,GAA4C,SAAS;QAClE,CAAC,CAAC,MAAM,uBAAuB,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,MAAM;QACN,aAAa,EAAE,qBAAqB;QACpC,qBAAqB;QACrB,SAAS;QACT,WAAW;QACX,cAAc;QACd,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,oCAAoC,CACjD,YAAiC,EACjC,QAAkB;IAElB,MAAM,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,yEAAyE,CAC1E;SACA,GAAG,EAAE,CAAC;IAET,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAElE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;QAC5B,MAAM,cAAc,GAAG;YACrB,WAAW,WAAW,SAAS;YAC/B,WAAW,WAAW,iBAAiB;YACvC,WAAW,WAAW,gBAAgB;SACvC,CAAC;QACF,MAAM,kBAAkB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACvE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,OAAO,EAAE,KAAK,WAAW,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC;IAExC,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,qBAAqB,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE7F,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAElG,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrF,MAAM,gCAAgC,GAAG,MAAM,oCAAoC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE5G,MAAM,QAAQ,GAAqB;YACjC,SAAS;YACT,KAAK;YACL,gCAAgC;SACjC,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IACxD,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"mainline-snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/mainline-snapshot-assembler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principles/pd-cli",
3
- "version": "1.109.2",
3
+ "version": "1.109.4",
4
4
  "description": "PD CLI — Pain recording, sample management, and evolution tasks",
5
5
  "type": "module",
6
6
  "bin": {
@@ -235,15 +235,20 @@ async function findDiagnosticianArtifact(
235
235
  ): Promise<DiagnosticianArtifactSnapshot | null> {
236
236
  const { stateManager, diagnosisTaskId, painId, warnings } = input;
237
237
  const db = stateManager.connection.getDb();
238
+
239
+ // PRI-411: Split pipeline stores the diagnostician artifact under the
240
+ // diag_router child task (e.g. "diag_router-diagnosis_xxx"), not the
241
+ // parent "diagnosis_xxx". Fallback to diag_router-{parentTaskId} when
242
+ // the parent lookup returns no rows.
238
243
  const rows = db
239
244
  .prepare(
240
245
  `SELECT artifact_id, run_id, task_id, artifact_kind, content_json
241
246
  FROM artifacts
242
- WHERE task_id = ? AND artifact_kind = 'diagnostician_output'
247
+ WHERE (task_id = ? OR task_id = 'diag_router-' || ?) AND artifact_kind = 'diagnostician_output'
243
248
  ORDER BY created_at DESC
244
249
  LIMIT 1`,
245
250
  )
246
- .all(diagnosisTaskId);
251
+ .all(diagnosisTaskId, diagnosisTaskId);
247
252
 
248
253
  const [raw] = rows;
249
254
  if (!raw) return null;
@@ -254,6 +259,8 @@ async function findDiagnosticianArtifact(
254
259
  return null;
255
260
  }
256
261
 
262
+ // EP-07: If artifact was found via diag_router fallback, verify lineage
263
+ // consistency — the artifact's sourcePainId must match the parent pain.
257
264
  let sourcePainId: string | null = painId;
258
265
  const parsed = safeJsonParse(row.contentJson);
259
266
  if (parsed.ok && isObject(parsed.value)) {
@@ -265,6 +272,14 @@ async function findDiagnosticianArtifact(
265
272
  warnings.push(`Artifact ${row.artifactId} content_json parse failed: ${parsed.reason}`);
266
273
  }
267
274
 
275
+ // EP-07 mismatch guard: warn when artifact lineage doesn't match parent pain
276
+ if (painId && sourcePainId && sourcePainId !== painId) {
277
+ warnings.push(
278
+ `Artifact ${row.artifactId} (task ${row.taskId}) sourcePainId "${sourcePainId}" ` +
279
+ `mismatches parent painId "${painId}" — lineage may be broken`,
280
+ );
281
+ }
282
+
268
283
  return {
269
284
  artifactId: row.artifactId,
270
285
  sourcePainId,
@@ -216,17 +216,20 @@ describe('assembleMainlineSnapshot', () => {
216
216
  rmTmpDir(workspaceDir);
217
217
  });
218
218
 
219
- it('returns a snapshot with degraded readiness when no readiness snapshot is provided', async () => {
219
+ it('returns a snapshot with default readiness when no readiness snapshot is provided', async () => {
220
220
  await sm.initialize();
221
221
  const painId = 'pain-empty';
222
222
  await seedDiagnosisTask(sm, painId);
223
223
 
224
224
  const { snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir, painId });
225
225
 
226
- expect(snapshot.readiness.diagnosticianReady).toBe(false);
226
+ // Default config resolves a diagnostician profile, so readiness is "configured"
227
+ // (actual connectivity is unknown without probe, but config alignment is satisfied)
228
+ expect(snapshot.readiness.diagnosticianReady).toBe(true);
227
229
  expect(warnings.length).toBe(0);
228
230
  const verdict = assertMainlineContract(snapshot);
229
- expect(verdict.stages.some((s) => s.stage === 'diagnostician_readiness' && s.status === 'violation')).toBe(true);
231
+ // diagnosis_task should be a violation since the task has no succeeded run
232
+ expect(verdict.stages.some((s) => s.stage === 'diagnosis_task' && s.status === 'violation')).toBe(true);
230
233
  });
231
234
 
232
235
  it('malformed artifact content_json does not crash; contract reports violation with reason + nextAction', async () => {
@@ -422,4 +425,145 @@ describe('assembleMainlineSnapshot', () => {
422
425
 
423
426
  expect(resolvedPainId).toBe(painId);
424
427
  });
428
+
429
+ // ── PRI-411: Split pipeline artifact fallback ─────────────────────────────
430
+
431
+ it('finds diagnostician artifact stored under diag_router child task (split pipeline layout)', async () => {
432
+ await sm.initialize();
433
+ const painId = 'pain-split-pipeline';
434
+ const parentTaskId = `diagnosis_${painId}`;
435
+ const routerTaskId = `diag_router-${parentTaskId}`;
436
+
437
+ // Create the parent diagnosis task (split pipeline parent)
438
+ await sm.createTask({
439
+ taskId: parentTaskId,
440
+ taskKind: 'diagnostician',
441
+ inputRef: painId,
442
+ status: 'pending',
443
+ attemptCount: 0,
444
+ maxAttempts: 3,
445
+ diagnosticJson: diagnosticianDiagnosticJson(painId),
446
+ });
447
+
448
+ // Create the diag_router child task
449
+ await sm.createTask({
450
+ taskId: routerTaskId,
451
+ taskKind: 'diag_router',
452
+ inputRef: painId,
453
+ status: 'pending',
454
+ attemptCount: 0,
455
+ maxAttempts: 3,
456
+ diagnosticJson: diagnosticianDiagnosticJson(painId),
457
+ });
458
+
459
+ // Commit the artifact under the diag_router child task (not the parent)
460
+ const output = validDiagnosticianOutput(painId);
461
+ const committer = new SqliteDiagnosticianCommitter(sm.connection);
462
+ await sm.acquireLease({ taskId: routerTaskId, owner: 'test-owner', durationMs: 60_000, runtimeKind: 'openclaw' });
463
+ const runs = await sm.getRunsByTask(routerTaskId);
464
+ const runId = runs[0]?.runId;
465
+ if (!runId) throw new Error(`No run created for task ${routerTaskId}`);
466
+ const commitResult = await committer.commit({
467
+ runId,
468
+ taskId: routerTaskId,
469
+ output,
470
+ idempotencyKey: `idem-${routerTaskId}`,
471
+ });
472
+ await sm.markTaskSucceeded(routerTaskId, `artifact://${commitResult.artifactId}`);
473
+ // Also mark parent as succeeded
474
+ await sm.markTaskSucceeded(parentTaskId, `artifact://${commitResult.artifactId}`);
475
+
476
+ const { snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir, painId, readiness: healthyReadiness() });
477
+
478
+ // PRI-411: fallback should find the artifact under diag_router-*
479
+ expect(snapshot.chain.diagnosticianArtifact).not.toBeNull();
480
+ expect(snapshot.chain.diagnosticianArtifact?.artifactId).toBe(commitResult.artifactId);
481
+ expect(snapshot.chain.diagnosticianArtifact?.sourcePainId).toBe(painId);
482
+ // No mismatch warning since lineage is consistent
483
+ expect(warnings.some((w) => w.includes('mismatches'))).toBe(false);
484
+ });
485
+
486
+ it('split pipeline artifact with mismatched sourcePainId emits lineage warning (EP-07)', async () => {
487
+ await sm.initialize();
488
+ const painId = 'pain-split-mismatch';
489
+ const wrongPainId = 'pain-wrong-lineage';
490
+ const parentTaskId = `diagnosis_${painId}`;
491
+ const routerTaskId = `diag_router-${parentTaskId}`;
492
+
493
+ await sm.createTask({
494
+ taskId: parentTaskId,
495
+ taskKind: 'diagnostician',
496
+ inputRef: painId,
497
+ status: 'pending',
498
+ attemptCount: 0,
499
+ maxAttempts: 3,
500
+ diagnosticJson: diagnosticianDiagnosticJson(painId),
501
+ });
502
+
503
+ await sm.createTask({
504
+ taskId: routerTaskId,
505
+ taskKind: 'diag_router',
506
+ inputRef: painId,
507
+ status: 'pending',
508
+ attemptCount: 0,
509
+ maxAttempts: 3,
510
+ diagnosticJson: diagnosticianDiagnosticJson(painId),
511
+ });
512
+
513
+ // Acquire lease + run for the router task (needed for artifact insertion)
514
+ await sm.acquireLease({ taskId: routerTaskId, owner: 'test-owner', durationMs: 60_000, runtimeKind: 'openclaw' });
515
+ const runs = await sm.getRunsByTask(routerTaskId);
516
+ const runId = runs[0]?.runId;
517
+ if (!runId) throw new Error(`No run created for task ${routerTaskId}`);
518
+
519
+ // Directly insert artifact with a DIFFERENT painId in content_json
520
+ // (simulates lineage mismatch — committer stores DiagnosticianOutputV1
521
+ // which doesn't have painId, but the assembler reads it for lineage checks)
522
+ const artifactId = 'mismatch-artifact-001';
523
+ const contentJson = JSON.stringify({
524
+ ...validDiagnosticianOutput(painId),
525
+ painId: wrongPainId, // mismatched lineage
526
+ });
527
+ sm.connection.getDb().prepare(
528
+ `INSERT INTO artifacts (artifact_id, run_id, task_id, artifact_kind, content_json, created_at)
529
+ VALUES (?, ?, ?, ?, ?, ?)`,
530
+ ).run(artifactId, runId, routerTaskId, 'diagnostician_output', contentJson, new Date().toISOString());
531
+
532
+ await sm.markTaskSucceeded(routerTaskId, `artifact://${artifactId}`);
533
+ await sm.markTaskSucceeded(parentTaskId, `artifact://${artifactId}`);
534
+
535
+ const { snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir, painId, readiness: healthyReadiness() });
536
+
537
+ // Artifact should still be found via fallback
538
+ expect(snapshot.chain.diagnosticianArtifact).not.toBeNull();
539
+ // EP-07: lineage mismatch warning must be emitted
540
+ expect(warnings.some((w) => w.includes('mismatches') && w.includes(wrongPainId))).toBe(true);
541
+ });
542
+
543
+ it('monolithic diagnostician artifact lookup still works (no regression)', async () => {
544
+ await sm.initialize();
545
+ const painId = 'pain-monolithic-regression';
546
+ const taskId = `diagnostician-${painId}`;
547
+
548
+ // Monolithic layout: artifact stored directly under the parent task
549
+ await sm.createTask({
550
+ taskId,
551
+ taskKind: 'diagnostician',
552
+ inputRef: painId,
553
+ status: 'pending',
554
+ attemptCount: 0,
555
+ maxAttempts: 3,
556
+ diagnosticJson: diagnosticianDiagnosticJson(painId),
557
+ });
558
+
559
+ const output = validDiagnosticianOutput(painId);
560
+ const { artifactId } = await runDiagnosisToSucceeded(sm, taskId, output);
561
+
562
+ const { snapshot, warnings } = await assembleMainlineSnapshot({ workspaceDir, painId, readiness: healthyReadiness() });
563
+
564
+ expect(snapshot.chain.diagnosticianArtifact).not.toBeNull();
565
+ expect(snapshot.chain.diagnosticianArtifact?.artifactId).toBe(artifactId);
566
+ expect(snapshot.chain.diagnosticianArtifact?.sourcePainId).toBe(painId);
567
+ expect(warnings.some((w) => w.includes('mismatches'))).toBe(false);
568
+ });
425
569
  });
@@ -0,0 +1,424 @@
1
+ /**
2
+ * Tests for resolve-runtime-from-pd-config.ts — PRI-393, PRI-402
3
+ *
4
+ * Covers:
5
+ * - buildProfileLabel: pi-ai and openclaw profile label formatting
6
+ * - resolveRuntimeFromPdConfig: successful config loading, malformed config, legacy warnings
7
+ * - resolveRuntimeWithOverrides: CLI flag overrides on top of config values
8
+ */
9
+
10
+ import { describe, it, expect } from 'vitest';
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import * as os from 'node:os';
14
+ import * as yaml from 'js-yaml';
15
+ import { isRuntimeConfigError } from '@principles/core/runtime-v2';
16
+ import {
17
+ resolveRuntimeFromPdConfig,
18
+ resolveRuntimeWithOverrides,
19
+ } from '../../src/services/resolve-runtime-from-pd-config.js';
20
+
21
+ function mkTmpDir(): string {
22
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'pd-resolve-runtime-test-'));
23
+ }
24
+
25
+ function rmTmpDir(dir: string): void {
26
+ try { fs.rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
27
+ }
28
+
29
+ function writeConfig(workspaceDir: string, content: string): void {
30
+ const configDir = path.join(workspaceDir, '.pd');
31
+ fs.mkdirSync(configDir, { recursive: true });
32
+ fs.writeFileSync(path.join(configDir, 'config.yaml'), content, 'utf8');
33
+ }
34
+
35
+ const mockEnvWithKeys = (name: string): string | undefined => {
36
+ if (name === 'ANTHROPIC_API_KEY') return 'sk-ant-test-key';
37
+ if (name === 'OPENROUTER_API_KEY') return 'sk-or-test-key';
38
+ if (name === 'TEST_API_KEY') return 'sk-test-key';
39
+ return undefined;
40
+ };
41
+
42
+ function makeValidOpenClawConfigYaml(workspaceDir: string): string {
43
+ return yaml.dump({
44
+ version: 1,
45
+ features: {
46
+ prompt: { category: 'core', enabled: true },
47
+ code_tool_hook: { category: 'core', enabled: true },
48
+ defer_archive: { category: 'core', enabled: true },
49
+ },
50
+ workspace: {
51
+ default: workspaceDir,
52
+ },
53
+ runtimeProfiles: {
54
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
55
+ 'openclaw.model.lmstudio.qwen3': { type: 'openclaw', provider: 'lmstudio', model: 'qwen3.6-27b-mtp' },
56
+ },
57
+ internalAgents: {
58
+ defaultRuntime: 'openclaw.default',
59
+ agents: {
60
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.model.lmstudio.qwen3' },
61
+ dreamer: { enabled: true },
62
+ scribe: { enabled: true },
63
+ artificer: { enabled: true },
64
+ },
65
+ },
66
+ });
67
+ }
68
+
69
+ function makeValidPiAiConfigYaml(workspaceDir: string): string {
70
+ return yaml.dump({
71
+ version: 1,
72
+ features: {
73
+ prompt: { category: 'core', enabled: true },
74
+ code_tool_hook: { category: 'core', enabled: true },
75
+ defer_archive: { category: 'core', enabled: true },
76
+ },
77
+ workspace: {
78
+ default: workspaceDir,
79
+ },
80
+ runtimeProfiles: {
81
+ 'pd.anthropic-sonnet': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
82
+ },
83
+ internalAgents: {
84
+ defaultRuntime: 'pd.anthropic-sonnet',
85
+ agents: {
86
+ diagnostician: { enabled: true, runtimeProfile: 'pd.anthropic-sonnet' },
87
+ dreamer: { enabled: true },
88
+ scribe: { enabled: true },
89
+ artificer: { enabled: true },
90
+ },
91
+ },
92
+ });
93
+ }
94
+
95
+ describe('buildProfileLabel', () => {
96
+ it('formats pi-ai profile with provider and model', () => {
97
+ const tmp = mkTmpDir();
98
+ writeConfig(tmp, yaml.dump({
99
+ version: 1,
100
+ features: {
101
+ prompt: { category: 'core', enabled: true },
102
+ code_tool_hook: { category: 'core', enabled: true },
103
+ defer_archive: { category: 'core', enabled: true },
104
+ },
105
+ workspace: { default: tmp },
106
+ runtimeProfiles: {
107
+ 'pi-ai.test': { type: 'pi-ai', provider: 'openrouter', model: 'anthropic/claude-sonnet-4', apiKeyEnv: 'OPENROUTER_API_KEY' },
108
+ },
109
+ internalAgents: {
110
+ defaultRuntime: 'pi-ai.test',
111
+ agents: {
112
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
113
+ },
114
+ },
115
+ }));
116
+ try {
117
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
118
+ expect(result.runtimeProfileId).toBe('pi-ai.test');
119
+ expect(result.runtimeProfileLabel).toBe('pi-ai: openrouter/anthropic/claude-sonnet-4');
120
+ } finally { rmTmpDir(tmp); }
121
+ });
122
+
123
+ it('returns null profile info when pi-ai profile is missing required provider/model', () => {
124
+ const tmp = mkTmpDir();
125
+ writeConfig(tmp, yaml.dump({
126
+ version: 1,
127
+ features: {
128
+ prompt: { category: 'core', enabled: true },
129
+ code_tool_hook: { category: 'core', enabled: true },
130
+ defer_archive: { category: 'core', enabled: true },
131
+ },
132
+ workspace: { default: tmp },
133
+ runtimeProfiles: {
134
+ 'pi-ai.missing': { type: 'pi-ai', apiKeyEnv: 'TEST_API_KEY' },
135
+ },
136
+ internalAgents: {
137
+ defaultRuntime: 'pi-ai.missing',
138
+ agents: {
139
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.missing' },
140
+ },
141
+ },
142
+ }));
143
+ try {
144
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
145
+ expect(result.runtimeProfileId).toBe(null);
146
+ expect(result.runtimeProfileLabel).toBe(null);
147
+ } finally { rmTmpDir(tmp); }
148
+ });
149
+
150
+ it('formats openclaw profile with provider and model', () => {
151
+ const tmp = mkTmpDir();
152
+ writeConfig(tmp, yaml.dump({
153
+ version: 1,
154
+ features: {
155
+ prompt: { category: 'core', enabled: true },
156
+ code_tool_hook: { category: 'core', enabled: true },
157
+ defer_archive: { category: 'core', enabled: true },
158
+ },
159
+ workspace: { default: tmp },
160
+ runtimeProfiles: {
161
+ 'openclaw.model.lmstudio.qwen3': { type: 'openclaw', provider: 'lmstudio', model: 'qwen3.6-27b-mtp' },
162
+ },
163
+ internalAgents: {
164
+ defaultRuntime: 'openclaw.model.lmstudio.qwen3',
165
+ agents: {
166
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.model.lmstudio.qwen3' },
167
+ },
168
+ },
169
+ }));
170
+ try {
171
+ const result = resolveRuntimeFromPdConfig(tmp);
172
+ expect(result.runtimeProfileId).toBe('openclaw.model.lmstudio.qwen3');
173
+ expect(result.runtimeProfileLabel).toBe('openclaw: lmstudio: qwen3.6-27b-mtp');
174
+ } finally { rmTmpDir(tmp); }
175
+ });
176
+
177
+ it('formats openclaw profile with source when no provider/model', () => {
178
+ const tmp = mkTmpDir();
179
+ writeConfig(tmp, yaml.dump({
180
+ version: 1,
181
+ features: {
182
+ prompt: { category: 'core', enabled: true },
183
+ code_tool_hook: { category: 'core', enabled: true },
184
+ defer_archive: { category: 'core', enabled: true },
185
+ },
186
+ workspace: { default: tmp },
187
+ runtimeProfiles: {
188
+ 'openclaw.default': { type: 'openclaw', source: 'default' },
189
+ },
190
+ internalAgents: {
191
+ defaultRuntime: 'openclaw.default',
192
+ agents: {
193
+ diagnostician: { enabled: true, runtimeProfile: 'openclaw.default' },
194
+ },
195
+ },
196
+ }));
197
+ try {
198
+ const result = resolveRuntimeFromPdConfig(tmp);
199
+ expect(result.runtimeProfileId).toBe('openclaw.default');
200
+ expect(result.runtimeProfileLabel).toBe('openclaw: default');
201
+ } finally { rmTmpDir(tmp); }
202
+ });
203
+ });
204
+
205
+ describe('resolveRuntimeFromPdConfig', () => {
206
+ it('returns resolved runtime config from valid openclaw config.yaml', () => {
207
+ const tmp = mkTmpDir();
208
+ writeConfig(tmp, makeValidOpenClawConfigYaml(tmp));
209
+ try {
210
+ const result = resolveRuntimeFromPdConfig(tmp);
211
+ expect(isRuntimeConfigError(result.result)).toBe(false);
212
+ expect(result.configSource).toBe('.pd/config.yaml');
213
+ expect(result.legacyWarnings).toEqual([]);
214
+ } finally { rmTmpDir(tmp); }
215
+ });
216
+
217
+ it('returns resolved runtime config from valid pi-ai config.yaml with env vars', () => {
218
+ const tmp = mkTmpDir();
219
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
220
+ try {
221
+ const result = resolveRuntimeFromPdConfig(tmp, mockEnvWithKeys);
222
+ expect(isRuntimeConfigError(result.result)).toBe(false);
223
+ expect(result.configSource).toBe('.pd/config.yaml');
224
+ } finally { rmTmpDir(tmp); }
225
+ });
226
+
227
+ it('returns legacy warnings when legacy files detected', () => {
228
+ const tmp = mkTmpDir();
229
+ writeConfig(tmp, makeValidOpenClawConfigYaml(tmp));
230
+ const stateDir = path.join(tmp, '.state');
231
+ fs.mkdirSync(stateDir, { recursive: true });
232
+ fs.writeFileSync(path.join(stateDir, 'workflows.yaml'), 'version: 1\n', 'utf8');
233
+ try {
234
+ const result = resolveRuntimeFromPdConfig(tmp);
235
+ expect(result.legacyWarnings.length).toBeGreaterThan(0);
236
+ expect(result.legacyWarnings[0]).toContain('Legacy config files detected');
237
+ expect(result.legacyWarnings[0]).toContain('workflows.yaml');
238
+ } finally { rmTmpDir(tmp); }
239
+ });
240
+
241
+ it('returns error result when config.yaml is malformed', () => {
242
+ const tmp = mkTmpDir();
243
+ writeConfig(tmp, 'version: [unterminated');
244
+ try {
245
+ const result = resolveRuntimeFromPdConfig(tmp);
246
+ expect(isRuntimeConfigError(result.result)).toBe(true);
247
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
248
+ expect(result.result.reason).toContain('config_malformed');
249
+ expect(result.runtimeProfileId).toBe(null);
250
+ expect(result.runtimeProfileLabel).toBe(null);
251
+ } finally { rmTmpDir(tmp); }
252
+ });
253
+
254
+ it('returns error result when config.yaml validation fails', () => {
255
+ const tmp = mkTmpDir();
256
+ writeConfig(tmp, yaml.dump({ version: 99, features: {}, runtimeProfiles: {}, internalAgents: { defaultRuntime: 'x', agents: {} } }));
257
+ try {
258
+ const result = resolveRuntimeFromPdConfig(tmp);
259
+ expect(isRuntimeConfigError(result.result)).toBe(true);
260
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
261
+ expect(result.result.reason).toContain('config_malformed');
262
+ } finally { rmTmpDir(tmp); }
263
+ });
264
+
265
+ it('returns defaults and profile info when config.yaml is missing', () => {
266
+ const tmp = mkTmpDir();
267
+ try {
268
+ const result = resolveRuntimeFromPdConfig(tmp);
269
+ expect(isRuntimeConfigError(result.result)).toBe(false);
270
+ expect(result.configSource).toBe('.pd/config.yaml');
271
+ expect(result.runtimeProfileId).toBe('openclaw.default');
272
+ expect(typeof result.runtimeProfileLabel).toBe('string');
273
+ } finally { rmTmpDir(tmp); }
274
+ });
275
+
276
+ it('includes legacy warnings even when config is malformed', () => {
277
+ const tmp = mkTmpDir();
278
+ writeConfig(tmp, 'version: [unterminated');
279
+ const stateDir = path.join(tmp, '.state');
280
+ fs.mkdirSync(stateDir, { recursive: true });
281
+ fs.writeFileSync(path.join(stateDir, 'workflows.yaml'), 'version: 1\n', 'utf8');
282
+ try {
283
+ const result = resolveRuntimeFromPdConfig(tmp);
284
+ expect(isRuntimeConfigError(result.result)).toBe(true);
285
+ expect(result.legacyWarnings.length).toBeGreaterThan(0);
286
+ } finally { rmTmpDir(tmp); }
287
+ });
288
+
289
+ it('returns not_ready error when pi-ai config is valid but apiKeyEnv not set', () => {
290
+ const tmp = mkTmpDir();
291
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
292
+ try {
293
+ const result = resolveRuntimeFromPdConfig(tmp, () => undefined);
294
+ expect(isRuntimeConfigError(result.result)).toBe(true);
295
+ if (!isRuntimeConfigError(result.result)) throw new Error('Expected RuntimeConfigError');
296
+ expect(result.result.reason).toBe('not_ready');
297
+ } finally { rmTmpDir(tmp); }
298
+ });
299
+ });
300
+
301
+ describe('resolveRuntimeWithOverrides', () => {
302
+ it('returns merged config with CLI overrides applied', () => {
303
+ const tmp = mkTmpDir();
304
+ writeConfig(tmp, makeValidPiAiConfigYaml(tmp));
305
+ try {
306
+ const result = resolveRuntimeWithOverrides(tmp, {
307
+ provider: 'openrouter',
308
+ model: 'anthropic/claude-sonnet-4',
309
+ apiKeyEnv: 'OPENROUTER_API_KEY',
310
+ }, mockEnvWithKeys);
311
+ expect(result.mergedConfig).not.toBeNull();
312
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
313
+ expect(result.mergedConfig.provider).toBe('openrouter');
314
+ expect(result.mergedConfig.model).toBe('anthropic/claude-sonnet-4');
315
+ expect(result.mergedConfig.apiKeyEnv).toBe('OPENROUTER_API_KEY');
316
+ } finally { rmTmpDir(tmp); }
317
+ });
318
+
319
+ it('partial CLI overrides merge with config values', () => {
320
+ const tmp = mkTmpDir();
321
+ writeConfig(tmp, yaml.dump({
322
+ version: 1,
323
+ features: {
324
+ prompt: { category: 'core', enabled: true },
325
+ code_tool_hook: { category: 'core', enabled: true },
326
+ defer_archive: { category: 'core', enabled: true },
327
+ },
328
+ workspace: { default: tmp },
329
+ runtimeProfiles: {
330
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
331
+ },
332
+ internalAgents: {
333
+ defaultRuntime: 'pi-ai.test',
334
+ agents: {
335
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
336
+ },
337
+ },
338
+ }));
339
+ try {
340
+ const result = resolveRuntimeWithOverrides(tmp, {
341
+ model: 'claude-3-opus',
342
+ }, mockEnvWithKeys);
343
+ expect(result.mergedConfig).not.toBeNull();
344
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
345
+ expect(result.mergedConfig.provider).toBe('anthropic');
346
+ expect(result.mergedConfig.model).toBe('claude-3-opus');
347
+ expect(result.mergedConfig.apiKeyEnv).toBe('ANTHROPIC_API_KEY');
348
+ expect(result.mergedConfig.timeoutMs).toBe(300000);
349
+ expect(result.mergedConfig.maxRetries).toBe(3);
350
+ } finally { rmTmpDir(tmp); }
351
+ });
352
+
353
+ it('returns mergedConfig as null when config resolution fails', () => {
354
+ const tmp = mkTmpDir();
355
+ writeConfig(tmp, 'version: [unterminated');
356
+ try {
357
+ const result = resolveRuntimeWithOverrides(tmp, { provider: 'openrouter' });
358
+ expect(isRuntimeConfigError(result.result)).toBe(true);
359
+ expect(result.mergedConfig).toBe(null);
360
+ } finally { rmTmpDir(tmp); }
361
+ });
362
+
363
+ it('merges maxRetries and timeoutMs with nullish coalescing', () => {
364
+ const tmp = mkTmpDir();
365
+ writeConfig(tmp, yaml.dump({
366
+ version: 1,
367
+ features: {
368
+ prompt: { category: 'core', enabled: true },
369
+ code_tool_hook: { category: 'core', enabled: true },
370
+ defer_archive: { category: 'core', enabled: true },
371
+ },
372
+ workspace: { default: tmp },
373
+ runtimeProfiles: {
374
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY', timeoutMs: 300000, maxRetries: 3 },
375
+ },
376
+ internalAgents: {
377
+ defaultRuntime: 'pi-ai.test',
378
+ agents: {
379
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
380
+ },
381
+ },
382
+ }));
383
+ try {
384
+ const result = resolveRuntimeWithOverrides(tmp, {
385
+ maxRetries: 0,
386
+ timeoutMs: 0,
387
+ }, mockEnvWithKeys);
388
+ expect(result.mergedConfig).not.toBeNull();
389
+ if (!result.mergedConfig) throw new Error('Expected mergedConfig');
390
+ expect(result.mergedConfig.maxRetries).toBe(0);
391
+ expect(result.mergedConfig.timeoutMs).toBe(0);
392
+ } finally { rmTmpDir(tmp); }
393
+ });
394
+
395
+ it('returns profile info from config even when CLI overrides are provided', () => {
396
+ const tmp = mkTmpDir();
397
+ writeConfig(tmp, yaml.dump({
398
+ version: 1,
399
+ features: {
400
+ prompt: { category: 'core', enabled: true },
401
+ code_tool_hook: { category: 'core', enabled: true },
402
+ defer_archive: { category: 'core', enabled: true },
403
+ },
404
+ workspace: { default: tmp },
405
+ runtimeProfiles: {
406
+ 'pi-ai.test': { type: 'pi-ai', provider: 'anthropic', model: 'claude-3-5-sonnet', apiKeyEnv: 'ANTHROPIC_API_KEY' },
407
+ },
408
+ internalAgents: {
409
+ defaultRuntime: 'pi-ai.test',
410
+ agents: {
411
+ diagnostician: { enabled: true, runtimeProfile: 'pi-ai.test' },
412
+ },
413
+ },
414
+ }));
415
+ try {
416
+ const result = resolveRuntimeWithOverrides(tmp, {
417
+ provider: 'openrouter',
418
+ model: 'anthropic/claude-sonnet-4',
419
+ }, mockEnvWithKeys);
420
+ expect(result.runtimeProfileId).toBe('pi-ai.test');
421
+ expect(result.runtimeProfileLabel).toBe('pi-ai: anthropic/claude-3-5-sonnet');
422
+ } finally { rmTmpDir(tmp); }
423
+ });
424
+ });