@jaggerxtrm/specialists 3.18.1 → 3.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -21617,6 +21617,14 @@ class SpecialistLoader {
21617
21617
  this.cache.set(name, merged.spec);
21618
21618
  return merged.spec;
21619
21619
  }
21620
+ async getEffective(name) {
21621
+ const merged = await this.buildMergedSpec(name);
21622
+ if (!merged)
21623
+ return null;
21624
+ if (merged.warnings.length)
21625
+ this.blockedFieldWarnings.set(name, merged.warnings);
21626
+ return merged.spec;
21627
+ }
21620
21628
  getBlockedFieldWarnings(name) {
21621
21629
  if (name)
21622
21630
  return this.blockedFieldWarnings.get(name) ?? [];
@@ -27612,7 +27620,7 @@ ${appendError}
27612
27620
  writeFileSync5(this.resultPath(id), lastTurnSummaryTextContent || output, "utf-8");
27613
27621
  }
27614
27622
  try {
27615
- this.withSqliteOperation("upsertResult:resume_turn", (client) => client.upsertResult(id, output));
27623
+ this.withSqliteOperation("upsertResult:resume_turn", (client) => client.upsertResult(id, lastTurnSummaryTextContent || output));
27616
27624
  } catch (error2) {
27617
27625
  console.warn(`[supervisor] SQLite upsertResult failed during resume turn: ${String(error2)}`);
27618
27626
  }
@@ -27620,7 +27628,7 @@ ${appendError}
27620
27628
  model: statusSnapshot.model ?? "unknown",
27621
27629
  backend: statusSnapshot.backend ?? "unknown",
27622
27630
  beadId: statusSnapshot.bead_id,
27623
- output
27631
+ output: lastTurnSummaryTextContent || output
27624
27632
  });
27625
27633
  const passFinalize = shouldAutoFinalizeKeepAlive(output);
27626
27634
  const readOnlyClose = shouldAutoCloseReadOnlyKeepAlive(output);
@@ -28163,14 +28171,15 @@ ${appendError}
28163
28171
  });
28164
28172
  isReadOnlySpecialist = finalResult.permissionRequired === "READ_ONLY";
28165
28173
  autoCommitPolicy = finalResult.autoCommit;
28174
+ const reportedOutput = lastTurnSummaryTextContent || finalResult.output;
28166
28175
  emitRunCompleteForTurn({
28167
28176
  model: finalResult.model,
28168
28177
  backend: finalResult.backend,
28169
28178
  beadId: finalResult.beadId,
28170
- output: finalResult.output
28179
+ output: reportedOutput
28171
28180
  });
28172
28181
  try {
28173
- this.withSqliteOperation("upsertResult:initial_turn", (client) => client.upsertResult(id, finalResult.output));
28182
+ this.withSqliteOperation("upsertResult:initial_turn", (client) => client.upsertResult(id, reportedOutput));
28174
28183
  } catch (error2) {
28175
28184
  console.warn(`[supervisor] SQLite upsertResult failed during initial turn: ${String(error2)}`);
28176
28185
  }
@@ -28305,7 +28314,7 @@ ${appendError}
28305
28314
  exit_reason: runMetrics.exit_reason,
28306
28315
  metrics: enrichedRunMetrics,
28307
28316
  ...gitnexusSummary ? { gitnexus_summary: gitnexusSummary } : {}
28308
- }), latestOutput);
28317
+ }), reportedOutput);
28309
28318
  return true;
28310
28319
  });
28311
28320
  if (completePersisted === undefined) {
@@ -28942,7 +28951,6 @@ var exports_view = {};
28942
28951
  __export(exports_view, {
28943
28952
  run: () => run5
28944
28953
  });
28945
- import { readFile as readFile2 } from "fs/promises";
28946
28954
  import readline2 from "readline/promises";
28947
28955
  import { stdin as input, stdout as output } from "process";
28948
28956
  function permissionBadge2(permission) {
@@ -29107,9 +29115,13 @@ function printFullSpecialist(spec) {
29107
29115
  printBySection(spec, "stall_detection");
29108
29116
  printBySection(spec, "beads");
29109
29117
  }
29110
- async function printRaw(summary) {
29111
- const content = await readFile2(summary.filePath, "utf-8");
29112
- console.log(content);
29118
+ async function printRaw(summary, loader) {
29119
+ const spec = await loader.getEffective(summary.name);
29120
+ if (!spec) {
29121
+ console.error(`Specialist not found: ${summary.name}`);
29122
+ process.exit(1);
29123
+ }
29124
+ console.log(JSON.stringify(spec, null, 2));
29113
29125
  }
29114
29126
  async function run5() {
29115
29127
  let args;
@@ -29147,7 +29159,7 @@ async function run5() {
29147
29159
  selectedSummary = chosen;
29148
29160
  }
29149
29161
  if (args.raw) {
29150
- await printRaw(selectedSummary);
29162
+ await printRaw(selectedSummary, loader);
29151
29163
  return;
29152
29164
  }
29153
29165
  const specialist = await loader.get(selectedSummary.name);
@@ -29293,7 +29305,7 @@ __export(exports_init, {
29293
29305
  runGlobal: () => runGlobal,
29294
29306
  run: () => run7
29295
29307
  });
29296
- import { copyFileSync, cpSync, existsSync as existsSync15, lstatSync, mkdirSync as mkdirSync8, readdirSync as readdirSync4, readFileSync as readFileSync13, readlinkSync, renameSync as renameSync3, symlinkSync, unlinkSync, writeFileSync as writeFileSync7 } from "fs";
29308
+ import { copyFileSync, cpSync, existsSync as existsSync15, lstatSync, mkdirSync as mkdirSync8, readdirSync as readdirSync4, readFileSync as readFileSync13, readlinkSync, renameSync as renameSync3, rmSync as rmSync3, symlinkSync, unlinkSync, writeFileSync as writeFileSync7 } from "fs";
29297
29309
  import { spawnSync as spawnSync10 } from "child_process";
29298
29310
  import { basename as basename4, dirname as dirname8, join as join15, relative, resolve as resolve6 } from "path";
29299
29311
  function ok(msg) {
@@ -29678,6 +29690,23 @@ function installProjectSkills(cwd, syncSkills) {
29678
29690
  ensureRootSymlink(join15(cwd, ".pi", "skills"), activeRoot);
29679
29691
  let copied = 0;
29680
29692
  let refreshed = 0;
29693
+ let pruned = 0;
29694
+ if (syncSkills) {
29695
+ const currentSkills = new Set(skills);
29696
+ for (const entry of readdirSync4(defaultRoot, { withFileTypes: true })) {
29697
+ if (!entry.isDirectory() || currentSkills.has(entry.name))
29698
+ continue;
29699
+ const retiredDefaultPath = join15(defaultRoot, entry.name);
29700
+ const retiredActivePath = join15(activeRoot, entry.name);
29701
+ try {
29702
+ if (lstatSync(retiredActivePath).isSymbolicLink() && resolve6(dirname8(retiredActivePath), readlinkSync(retiredActivePath)) === resolve6(retiredDefaultPath)) {
29703
+ unlinkSync(retiredActivePath);
29704
+ }
29705
+ } catch {}
29706
+ rmSync3(retiredDefaultPath, { recursive: true, force: true });
29707
+ pruned++;
29708
+ }
29709
+ }
29681
29710
  for (const skill of skills) {
29682
29711
  const src = join15(sourceDir, skill);
29683
29712
  const defaultSkillPath = join15(defaultRoot, skill);
@@ -29696,6 +29725,8 @@ function installProjectSkills(cwd, syncSkills) {
29696
29725
  ok(`copied ${copied} skill${copied === 1 ? "" : "s"} to .xtrm/skills/default/`);
29697
29726
  if (refreshed > 0)
29698
29727
  ok(`re-synced ${refreshed} skill${refreshed === 1 ? "" : "s"} in .xtrm/skills/default/`);
29728
+ if (pruned > 0)
29729
+ ok(`pruned ${pruned} retired managed skill${pruned === 1 ? "" : "s"}`);
29699
29730
  ok("verified active skill symlinks in .xtrm/skills/active/");
29700
29731
  }
29701
29732
  function createSpecialistsDirs(cwd) {
@@ -31948,7 +31979,7 @@ __export(exports_validate, {
31948
31979
  parseArgs: () => parseArgs5,
31949
31980
  ArgParseError: () => ArgParseError3
31950
31981
  });
31951
- import { readFile as readFile3 } from "fs/promises";
31982
+ import { readFile as readFile2 } from "fs/promises";
31952
31983
  import { existsSync as existsSync18 } from "fs";
31953
31984
  function parseArgs5(argv) {
31954
31985
  const value = argv[0];
@@ -31971,7 +32002,7 @@ async function findSpecialist(name) {
31971
32002
  return list.find((item) => item.name === name);
31972
32003
  }
31973
32004
  async function loadSpecFromFile(filePath) {
31974
- const content = await readFile3(filePath, "utf-8");
32005
+ const content = await readFile2(filePath, "utf-8");
31975
32006
  const raw = filePath.endsWith(".yaml") || filePath.endsWith(".yml") ? $parse(content) : JSON.parse(content);
31976
32007
  return SpecialistSchema.parseAsync(raw);
31977
32008
  }
@@ -32033,7 +32064,7 @@ async function run10() {
32033
32064
  }
32034
32065
  process.exit(1);
32035
32066
  }
32036
- const content = await readFile3(summary.filePath, "utf-8");
32067
+ const content = await readFile2(summary.filePath, "utf-8");
32037
32068
  const result = await validateSpecialist(content);
32038
32069
  if (args.json) {
32039
32070
  console.log(JSON.stringify({
@@ -32833,7 +32864,7 @@ var init_edit = __esm(() => {
32833
32864
  });
32834
32865
 
32835
32866
  // src/specialist/resolution-diagnostics.ts
32836
- import { readFile as readFile4 } from "fs/promises";
32867
+ import { readFile as readFile3 } from "fs/promises";
32837
32868
  import { createRequire as createRequire3 } from "module";
32838
32869
  import { execSync as execSync3 } from "child_process";
32839
32870
  import { join as join19 } from "path";
@@ -32930,7 +32961,7 @@ function probeHealth(catalog) {
32930
32961
  }
32931
32962
  async function loadResolvedConfigReport(args) {
32932
32963
  const manifest = readJsonFile3(join19(args.projectDir, "config", "specialists", `${args.specialistName}.specialist.json`));
32933
- const index = loadToolCatalogIndex(await readFile4(args.catalogsPath, "utf-8"));
32964
+ const index = loadToolCatalogIndex(await readFile3(args.catalogsPath, "utf-8"));
32934
32965
  const catalogs = index.catalogs;
32935
32966
  const probes = catalogs.map(probeHealth);
32936
32967
  const extensionState = Object.fromEntries(probes.map((probe) => [probe.name, { health: probe.health, catalogCompatible: probe.drift === "none" }]));
@@ -43921,6 +43952,39 @@ async function stopJob(jobId, opts = {}) {
43921
43952
  if (!status)
43922
43953
  throw new Error(`No job found: ${jobId}`);
43923
43954
  if (status.status === "done" || status.status === "error" || status.status === "cancelled") {
43955
+ const pid2 = status.pid;
43956
+ if (typeof pid2 === "number" && Number.isInteger(pid2) && pid2 > 0 && isProcessAlive(pid2, status.started_at_ms)) {
43957
+ supervisor.emitControlEvent(jobId, "stop_terminal_alive_reaped", {
43958
+ source: "cli",
43959
+ pid: pid2,
43960
+ previous_status: status.status,
43961
+ reason: "registry_terminal_process_alive",
43962
+ signal: "SIGTERM/SIGKILL",
43963
+ tmux_session: status.tmux_session
43964
+ });
43965
+ try {
43966
+ process.kill(-pid2, "SIGTERM");
43967
+ } catch (err) {
43968
+ if (err?.code !== "ESRCH") {
43969
+ try {
43970
+ process.kill(pid2, "SIGTERM");
43971
+ } catch {}
43972
+ }
43973
+ }
43974
+ const exited = await waitForProcessExit(pid2, 3000);
43975
+ if (!exited) {
43976
+ try {
43977
+ process.kill(-pid2, "SIGKILL");
43978
+ } catch {
43979
+ tryKillProcessGroup(pid2);
43980
+ }
43981
+ }
43982
+ if (status.tmux_session)
43983
+ killTmuxSession(status.tmux_session);
43984
+ process.stdout.write(`${green10("\u2713")} Reaped orphaned PID ${pid2} for job ${jobId} (registry was ${status.status}).
43985
+ `);
43986
+ return;
43987
+ }
43924
43988
  process.stderr.write(`${dim10(`Job ${jobId} already finalized (${status.status}).`)}
43925
43989
  `);
43926
43990
  return;
@@ -45161,9 +45225,11 @@ function collectStaleSpecialistJobs(options2 = {}) {
45161
45225
  const procRoot = options2.procRoot ?? "/proc";
45162
45226
  const nowMs = options2.nowMs ?? Date.now();
45163
45227
  const minKeepAliveAgeMs = options2.minKeepAliveAgeMs ?? 30 * 60 * 1000;
45228
+ const minTerminalAliveAgeMs = options2.minTerminalAliveAgeMs ?? 60 * 1000;
45164
45229
  const observabilityClient = options2.observabilityClient ?? createObservabilitySqliteClient();
45165
45230
  const statuses = observabilityClient?.listStatuses() ?? [];
45166
45231
  const staleStatuses = statuses.filter((status) => ["starting", "running", "waiting"].includes(status.status));
45232
+ const terminalStatuses = statuses.filter((status) => ["done", "error", "cancelled"].includes(status.status));
45167
45233
  const uptimeSeconds = readProcUptimeSecondsOrNull(procRoot) ?? nowMs / 1000;
45168
45234
  const candidates = [];
45169
45235
  for (const status of staleStatuses) {
@@ -45199,6 +45265,39 @@ function collectStaleSpecialistJobs(options2 = {}) {
45199
45265
  continue;
45200
45266
  candidates.push({ jobId: status.id, pid, beadId: status.bead_id ?? null, specialist: status.specialist, cwd: snapshot.cwd, ageMs, reason: "dead-toolchain" });
45201
45267
  }
45268
+ for (const status of terminalStatuses) {
45269
+ const pid = status.pid;
45270
+ if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0)
45271
+ continue;
45272
+ const updatedAtMs = status.updated_at_ms ?? nowMs;
45273
+ const ageMs = Math.max(0, nowMs - updatedAtMs);
45274
+ if (ageMs < minTerminalAliveAgeMs)
45275
+ continue;
45276
+ const snapshot = readProcessSnapshot(pid, procRoot, uptimeSeconds);
45277
+ if (!snapshot) {
45278
+ if (readProcessLiveness(pid, procRoot) !== "alive")
45279
+ continue;
45280
+ candidates.push({
45281
+ jobId: status.id,
45282
+ pid,
45283
+ beadId: status.bead_id ?? null,
45284
+ specialist: status.specialist,
45285
+ cwd: readProcCwdOrNull(pid, procRoot),
45286
+ ageMs,
45287
+ reason: "terminal-alive"
45288
+ });
45289
+ continue;
45290
+ }
45291
+ candidates.push({
45292
+ jobId: status.id,
45293
+ pid,
45294
+ beadId: status.bead_id ?? null,
45295
+ specialist: status.specialist,
45296
+ cwd: snapshot.cwd,
45297
+ ageMs,
45298
+ reason: "terminal-alive"
45299
+ });
45300
+ }
45202
45301
  return candidates.sort((left, right) => left.pid - right.pid);
45203
45302
  }
45204
45303
  var DEFAULT_WARN_PCT = 70, DEFAULT_REFUSE_PCT = 85, CLOCK_TICKS_PER_SECOND = 100;
@@ -46017,7 +46116,7 @@ import {
46017
46116
  mkdirSync as mkdirSync12,
46018
46117
  readFileSync as readFileSync21,
46019
46118
  renameSync as renameSync4,
46020
- rmSync as rmSync3,
46119
+ rmSync as rmSync4,
46021
46120
  statSync as statSync5,
46022
46121
  writeFileSync as writeFileSync13
46023
46122
  } from "fs";
@@ -46086,7 +46185,7 @@ function writeConsoleConfig(config2, cookie = `${process.pid}.${Math.floor(perfo
46086
46185
  renameSync4(tmpPath, location.path);
46087
46186
  } catch (renameError) {
46088
46187
  try {
46089
- rmSync3(tmpPath, { force: true });
46188
+ rmSync4(tmpPath, { force: true });
46090
46189
  } catch {}
46091
46190
  logError("ps", "write_global_config", {
46092
46191
  step: "console_json",
@@ -49540,7 +49639,7 @@ var init_console = __esm(() => {
49540
49639
  });
49541
49640
 
49542
49641
  // src/specialist/worktree.ts
49543
- import { existsSync as existsSync26, symlinkSync as symlinkSync2, mkdirSync as mkdirSync13, rmSync as rmSync4 } from "fs";
49642
+ import { existsSync as existsSync26, symlinkSync as symlinkSync2, mkdirSync as mkdirSync13, rmSync as rmSync5 } from "fs";
49544
49643
  import { join as join30, resolve as resolve9 } from "path";
49545
49644
  import { spawnSync as spawnSync15, execFileSync as execFileSync3 } from "child_process";
49546
49645
  function deriveBranchName(beadId, specialistName) {
@@ -49582,7 +49681,7 @@ function provisionWorktree(options2) {
49582
49681
  createWorktreeViaBd(worktreePath, branch, commonRoot);
49583
49682
  normalizeParentHooksPath(commonRoot);
49584
49683
  try {
49585
- rmSync4(join30(worktreePath, ".beads"), { recursive: true, force: true });
49684
+ rmSync5(join30(worktreePath, ".beads"), { recursive: true, force: true });
49586
49685
  markBeadsSkipWorktree(worktreePath);
49587
49686
  } catch {}
49588
49687
  symlinkPiNpmCache(commonRoot, worktreePath);
@@ -49672,7 +49771,7 @@ var init_worktree = __esm(() => {
49672
49771
  });
49673
49772
 
49674
49773
  // src/specialist/epic-reconciler.ts
49675
- import { mkdirSync as mkdirSync14, openSync as openSync2, readFileSync as readFileSync24, rmSync as rmSync5, writeFileSync as writeFileSync14 } from "fs";
49774
+ import { mkdirSync as mkdirSync14, openSync as openSync2, readFileSync as readFileSync24, rmSync as rmSync6, writeFileSync as writeFileSync14 } from "fs";
49676
49775
  import { join as join31 } from "path";
49677
49776
  function buildEpicLockPath(epicId) {
49678
49777
  const location = resolveObservabilityDbLocation();
@@ -49700,7 +49799,7 @@ function withEpicAdvisoryLock(epicId, action) {
49700
49799
  } finally {
49701
49800
  if (lockFd !== null) {
49702
49801
  try {
49703
- rmSync5(lockPath, { force: true });
49802
+ rmSync6(lockPath, { force: true });
49704
49803
  } catch {}
49705
49804
  }
49706
49805
  }
@@ -60060,7 +60159,7 @@ var exports_clean = {};
60060
60159
  __export(exports_clean, {
60061
60160
  run: () => run27
60062
60161
  });
60063
- import { existsSync as existsSync37, readFileSync as readFileSync34, readdirSync as readdirSync18, rmSync as rmSync6, statSync as statSync12 } from "fs";
60162
+ import { existsSync as existsSync37, readFileSync as readFileSync34, readdirSync as readdirSync18, rmSync as rmSync7, statSync as statSync12 } from "fs";
60064
60163
  import { join as join42 } from "path";
60065
60164
  function parseDuration2(raw) {
60066
60165
  const match = /^(\d+)(ms|s|m|h|d)$/i.exec(raw.trim());
@@ -60470,6 +60569,30 @@ async function reapStaleSpecialistJobs(jobs, dryRun) {
60470
60569
  } catch {}
60471
60570
  } catch {}
60472
60571
  }
60572
+ if (job.reason === "terminal-alive") {
60573
+ try {
60574
+ process.kill(-job.pid, "SIGTERM");
60575
+ } catch (err) {
60576
+ if (err?.code !== "ESRCH") {
60577
+ try {
60578
+ process.kill(job.pid, "SIGTERM");
60579
+ } catch {}
60580
+ }
60581
+ }
60582
+ await new Promise((resolve11) => setTimeout(resolve11, 500));
60583
+ try {
60584
+ process.kill(job.pid, 0);
60585
+ try {
60586
+ process.kill(-job.pid, "SIGKILL");
60587
+ } catch {
60588
+ try {
60589
+ process.kill(job.pid, "SIGKILL");
60590
+ } catch {}
60591
+ }
60592
+ } catch {}
60593
+ reapedCount += 1;
60594
+ continue;
60595
+ }
60473
60596
  sqliteClient.markSpecialistJobCancelled(job.jobId, `cleanup: stale-reaper:${job.reason}`);
60474
60597
  reapedCount += 1;
60475
60598
  }
@@ -60487,7 +60610,7 @@ function printStaleJobSummary(reapedCount) {
60487
60610
  }
60488
60611
  function deleteJobDirectories(jobs) {
60489
60612
  for (const job of jobs) {
60490
- rmSync6(job.directoryPath, { recursive: true, force: true });
60613
+ rmSync7(job.directoryPath, { recursive: true, force: true });
60491
60614
  }
60492
60615
  return jobs.length;
60493
60616
  }
@@ -61120,7 +61243,7 @@ var init_attach = __esm(() => {
61120
61243
  });
61121
61244
 
61122
61245
  // src/specialist/drift-detector.ts
61123
- import { existsSync as existsSync38, readFileSync as readFileSync35, readdirSync as readdirSync19, rmSync as rmSync7 } from "fs";
61246
+ import { existsSync as existsSync38, readFileSync as readFileSync35, readdirSync as readdirSync19, rmSync as rmSync8 } from "fs";
61124
61247
  import { join as join43, resolve as resolve11, relative as relative3 } from "path";
61125
61248
  function listFiles(root) {
61126
61249
  if (!existsSync38(root))
@@ -61216,7 +61339,7 @@ function pruneStaleDefaults(repoRoot, dryRun, keepDiverged = false) {
61216
61339
  const targets = detectDriftForRepo(repoRoot).filter((f) => f.scope === "default" && (keepDiverged ? f.bytes_equal === true : true)).map((f) => f.path);
61217
61340
  if (!dryRun) {
61218
61341
  for (const target of targets)
61219
- rmSync7(target, { recursive: true, force: true });
61342
+ rmSync8(target, { recursive: true, force: true });
61220
61343
  }
61221
61344
  return targets;
61222
61345
  }
@@ -63660,7 +63783,7 @@ import { createServer } from "http";
63660
63783
  import { randomUUID as randomUUID7 } from "crypto";
63661
63784
  import { once } from "events";
63662
63785
  import { spawnSync as spawnSync25 } from "child_process";
63663
- import { access, readdir as readdir2, readFile as readFile5, constants } from "fs/promises";
63786
+ import { access, readdir as readdir2, readFile as readFile4, constants } from "fs/promises";
63664
63787
  import { existsSync as existsSync42 } from "fs";
63665
63788
  import { homedir as homedir12 } from "os";
63666
63789
  import { join as join48 } from "path";
@@ -63688,7 +63811,7 @@ async function checkUserDirSpecs(userDir) {
63688
63811
  let validCount = 0;
63689
63812
  for (const file of specFiles) {
63690
63813
  try {
63691
- const content = await readFile5(join48(userDir, file), "utf-8");
63814
+ const content = await readFile4(join48(userDir, file), "utf-8");
63692
63815
  const json = file.endsWith(".json") ? content : null;
63693
63816
  if (!json)
63694
63817
  continue;
package/dist/lib.js CHANGED
@@ -17574,6 +17574,14 @@ class SpecialistLoader {
17574
17574
  this.cache.set(name, merged.spec);
17575
17575
  return merged.spec;
17576
17576
  }
17577
+ async getEffective(name) {
17578
+ const merged = await this.buildMergedSpec(name);
17579
+ if (!merged)
17580
+ return null;
17581
+ if (merged.warnings.length)
17582
+ this.blockedFieldWarnings.set(name, merged.warnings);
17583
+ return merged.spec;
17584
+ }
17577
17585
  getBlockedFieldWarnings(name) {
17578
17586
  if (name)
17579
17587
  return this.blockedFieldWarnings.get(name) ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../../src/cli/clean.ts"],"names":[],"mappings":"AAwlBA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAsGzC"}
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../../src/cli/clean.ts"],"names":[],"mappings":"AA8mBA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAsGzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AAu3BA,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uGAAuG;IACvG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sHAAsH;IACtH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD/C;AAED,wBAAsB,GAAG,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G/D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"AA64BA,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uGAAuG;IACvG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sHAAsH;IACtH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAsD/C;AAED,wBAAsB,GAAG,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/cli/view.ts"],"names":[],"mappings":"AAyOA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDzC"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/cli/view.ts"],"names":[],"mappings":"AAsPA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../src/specialist/control.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GrF;AAED,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDrG"}
1
+ {"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../../src/specialist/control.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwIrF;AAED,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDrG"}
@@ -85,6 +85,18 @@ export declare class SpecialistLoader {
85
85
  private resolveCanonicalPresetReferences;
86
86
  list(category?: string): Promise<SpecialistSummary[]>;
87
87
  get(name: string): Promise<Specialist>;
88
+ /**
89
+ * Return the merged (effective) spec for `name`: package canonical + global
90
+ * user.json + repo overrides, in the same precedence as get().
91
+ *
92
+ * Unlike get(), does NOT enforce the "model must be set" gate — this method
93
+ * exists precisely so tooling (sp view --raw, launchers, doctors) can inspect
94
+ * the effective config even when it isn't yet runnable. Callers that need
95
+ * runtime enforcement should still use get().
96
+ *
97
+ * Returns null if the specialist has no package canonical (unknown name).
98
+ */
99
+ getEffective(name: string): Promise<Specialist | null>;
88
100
  /**
89
101
  * Blocked-field warnings collected during the most recent list() or get() calls.
90
102
  * Returns all warnings when called without a name; filters to one specialist otherwise.
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/specialist/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,oBAAoB;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACzE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yBAAyB,EAAE,MAAM,EAAE,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,cAAc,GAAG,QAAQ,CAAC;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED,mGAAmG;AACnG,qBAAa,2BAA4B,SAAQ,KAAK;aACxB,cAAc,EAAE,MAAM;gBAAtB,cAAc,EAAE,MAAM;CAQnD;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,CAClC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC,CAiBlC;AAED,UAAU,aAAa;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,GAAE,aAAkB;IAIvC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,qBAAqB;IAc7B,wFAAwF;IACxF,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA2F3B,OAAO,CAAC,oBAAoB;IAU5B;;;;;;;OAOG;YACW,eAAe;IAoE7B,OAAO,CAAC,gCAAgC;IAelC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgDrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkB5C;;;OAGG;IACH,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAO7D,kHAAkH;IAClH,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;IAQjD,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CASrC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/specialist/loader.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,16 @@ export interface StaleSpecialistJobCandidate {
30
30
  specialist: string;
31
31
  cwd: string | null;
32
32
  ageMs: number;
33
- reason: 'dead-pid' | 'orphaned-keep-alive' | 'dead-toolchain';
33
+ /**
34
+ * - dead-pid: registry active, PID gone (existing container-restart-orphan class).
35
+ * - orphaned-keep-alive: registry waiting, ppid==1, edit-capable keep-alive reparented after wrapper died.
36
+ * - dead-toolchain: registry active, PID alive but no tool/think activity in the window.
37
+ * - terminal-alive: registry done/error/cancelled but PID (and its detached pi child) still running.
38
+ * Class introduced for unitAI-yme9q — pi keep-alive sessions dispatched via bare `sp run ... &`
39
+ * (no console/daemon driving the FIFO, waiting_auto_close_ms unset) never receive a close signal;
40
+ * the job's SQLite row is marked terminal for chain bookkeeping while the OS process leaks indefinitely.
41
+ */
42
+ reason: 'dead-pid' | 'orphaned-keep-alive' | 'dead-toolchain' | 'terminal-alive';
34
43
  }
35
44
  export type ProcessHealthStatus = 'OK' | 'WARN' | 'REFUSE';
36
45
  export interface ProcessHealthReport {
@@ -71,6 +80,12 @@ export declare function collectStaleSpecialistJobs(options?: {
71
80
  procRoot?: string;
72
81
  nowMs?: number;
73
82
  minKeepAliveAgeMs?: number;
83
+ /**
84
+ * Minimum ms since the last update on a terminal-status job before its still-alive PID
85
+ * is treated as a leak. pi's session close-path has an 8s group-SIGKILL backstop, so any
86
+ * process still alive well past that has failed to receive a close signal. Default 60s.
87
+ */
88
+ minTerminalAliveAgeMs?: number;
74
89
  observabilityClient?: StaleSpecialistJobSource;
75
90
  }): StaleSpecialistJobCandidate[];
76
91
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"process-health.d.ts","sourceRoot":"","sources":["../../../src/specialist/process-health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-health.d.ts","sourceRoot":"","sources":["../../../src/specialist/process-health.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/specialist/supervisor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/specialist/supervisor.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAkBhC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAsB,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,KAAK,eAAe,GAAG;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CAC5B,CAAC;AACF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAWxD,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,oBAAoB,CAMnE,CAAC;AAIF,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAEtG,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAClC,iCAAiC,CAAC,EAAE,OAAO,CAAC;QAC5C,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,gBAAgB,CAAC,EAAE;YACjB,aAAa,EAAE,MAAM,CAAC;YACtB,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,MAAM,CAAC;YACxB,YAAY,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,yBAAyB,CAAC,EAAE;YAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;YACtB,WAAW,EAAE,MAAM,CAAC;YACpB,kBAAkB,EAAE,MAAM,CAAC;YAC3B,gBAAgB,EAAE,OAAO,CAAC;YAC1B,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC;QACF,MAAM,CAAC,EAAE;YACP,KAAK,EAAE,MAAM,CAAC;YACd,SAAS,EAAE,MAAM,EAAE,CAAC;SACrB,CAAC;KACH,CAAC;IACF,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAMhC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChF,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7C,wEAAwE;IACxE,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAkBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CA2BnT;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,GAAG,YAAY,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAIrI;AASD,KAAK,aAAa,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AA+G5D,eAAO,MAAM,0BAA0B,wEAAyE,CAAC;AAyGjH;;kFAEkF;AAClF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAS1D;AA4JD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAU3D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,KAAK,GAAG,cAAc,CAAC,GAAG,OAAO,CAKpG;AAED,qBAAa,UAAU;IAUT,OAAO,CAAC,IAAI;IATxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmC;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAyB;IACrE,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAU;gBAE7B,IAAI,EAAE,iBAAiB;IAS3C,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,mBAAmB;YAmBb,8BAA8B;IAQ5C,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBhB,kBAAkB;IAchC,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IA2C3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAuBnD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAY7C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAY1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsBrC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAkC3D,OAAO,CAAC,qBAAqB;IAe7B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlE,gBAAgB,CACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,0BAA0B,EAAE,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,GACjE,IAAI;IAKP,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAK5D,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAsBnL,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQlD,yCAAyC;IACzC,QAAQ,IAAI,oBAAoB,EAAE;IA8BlC,OAAO,CAAC,yBAAyB;IA+BjC,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,eAAe;IAyDvB,mDAAmD;IACnD,OAAO,CAAC,EAAE;IAaV,yFAAyF;IACzF,OAAO,CAAC,aAAa;IA2FrB;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;CAu+C7B"}
@@ -34,7 +34,7 @@ Catalog table (for full per-template detail with mermaid step diagrams, severity
34
34
 
35
35
  **Canonical pipeline.** The Layer-1 shapes above are what the formula files declare. On top of Layer-1, every production-diff chain runs the **canonical pipeline** described in [canon §2](../../chain-templates.md#2-the-canonical-pipeline) — `seconder → test-engineer → test-runner → security-auditor (if sensitive) → obligations-scanner → reviewer` with Release Checklist. The canonical pipeline is not opt-in; severity (`SCRUTINY: low|medium|high|critical`) modulates which steps fire. Each template's resolved canonical chain is in [canon §3](../../chain-templates.md#3-the-template-catalog).
36
36
 
37
- **Status today.** The Iron portion of the canonical pipeline (seconder gate + obligations-scanner + reviewer + auto-escalation) is **in production** via `config/skills/using-specialists-v3/SKILL.md`. The QA portion (`test-engineer` + upgraded `test-runner`) is now **wired in formula files** via epic `unitAI-f9kku` (blocked on sfwe1.1/.2 at specialist layer). Once shipped, both are canonical pipeline behavior — not "overlays." The one currently-pending piece is **DevOps gates** for operational validation ([canon §4](../../chain-templates.md#4-devops-gates--design-pending)); design fill follows in a separate session segment.
37
+ **Status today.** The Iron portion of the canonical pipeline (seconder gate + obligations-scanner + reviewer + auto-escalation) is **in production** via `config/skills/using-specialists/SKILL.md`. The QA portion (`test-engineer` + upgraded `test-runner`) is now **wired in formula files** via epic `unitAI-f9kku` (blocked on sfwe1.1/.2 at specialist layer). Once shipped, both are canonical pipeline behavior — not "overlays." The one currently-pending piece is **DevOps gates** for operational validation ([canon §4](../../chain-templates.md#4-devops-gates--design-pending)); design fill follows in a separate session segment.
38
38
 
39
39
  ## Shipping path
40
40