@harness-engineering/cli 4.0.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +40 -8
  2. package/dist/agents/skills/claude-code/harness-catalog-retrospective/SKILL.md +124 -0
  3. package/dist/agents/skills/claude-code/harness-catalog-retrospective/skill.yaml +48 -0
  4. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +13 -0
  5. package/dist/agents/skills/claude-code/harness-parallel-agents/SKILL.md +3 -0
  6. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +3 -1
  7. package/dist/agents/skills/claude-code/pre-merge-brief/SKILL.md +86 -0
  8. package/dist/agents/skills/claude-code/pre-merge-brief/skill.yaml +67 -0
  9. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +40 -8
  10. package/dist/agents/skills/codex/harness-catalog-retrospective/SKILL.md +124 -0
  11. package/dist/agents/skills/codex/harness-catalog-retrospective/skill.yaml +48 -0
  12. package/dist/agents/skills/codex/harness-execution/SKILL.md +13 -0
  13. package/dist/agents/skills/codex/harness-parallel-agents/SKILL.md +3 -0
  14. package/dist/agents/skills/codex/harness-planning/SKILL.md +3 -1
  15. package/dist/agents/skills/codex/pre-merge-brief/SKILL.md +86 -0
  16. package/dist/agents/skills/codex/pre-merge-brief/skill.yaml +67 -0
  17. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +40 -8
  18. package/dist/agents/skills/cursor/harness-catalog-retrospective/SKILL.md +124 -0
  19. package/dist/agents/skills/cursor/harness-catalog-retrospective/skill.yaml +48 -0
  20. package/dist/agents/skills/cursor/harness-execution/SKILL.md +13 -0
  21. package/dist/agents/skills/cursor/harness-parallel-agents/SKILL.md +3 -0
  22. package/dist/agents/skills/cursor/harness-planning/SKILL.md +3 -1
  23. package/dist/agents/skills/cursor/pre-merge-brief/SKILL.md +86 -0
  24. package/dist/agents/skills/cursor/pre-merge-brief/skill.yaml +67 -0
  25. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +40 -8
  26. package/dist/agents/skills/gemini-cli/harness-catalog-retrospective/SKILL.md +124 -0
  27. package/dist/agents/skills/gemini-cli/harness-catalog-retrospective/skill.yaml +48 -0
  28. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +13 -0
  29. package/dist/agents/skills/gemini-cli/harness-parallel-agents/SKILL.md +3 -0
  30. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +3 -1
  31. package/dist/agents/skills/gemini-cli/pre-merge-brief/SKILL.md +86 -0
  32. package/dist/agents/skills/gemini-cli/pre-merge-brief/skill.yaml +67 -0
  33. package/dist/{agents-md-VJLYEH2S.js → agents-md-BK2UPKUC.js} +4 -4
  34. package/dist/analyzer-XRCV63KC-6T2Z32XC.js +26 -0
  35. package/dist/{architecture-YQH2NYXY.js → architecture-7PNQZOWV.js} +5 -5
  36. package/dist/{assess-project-KOTAPAHD.js → assess-project-2QPCNN7N.js} +5 -3
  37. package/dist/bin/harness-mcp.js +15 -15
  38. package/dist/bin/harness.js +26 -26
  39. package/dist/{check-phase-gate-CHU2E3OU.js → check-phase-gate-RZUSDB3O.js} +5 -5
  40. package/dist/{chunk-MMLQPHZ5.js → chunk-33OU3LYX.js} +380 -15
  41. package/dist/{chunk-XAVMTAUT.js → chunk-6STDKKAM.js} +19 -3
  42. package/dist/{chunk-I3CGCZJF.js → chunk-BJDT3VGQ.js} +6 -6
  43. package/dist/{chunk-M7F2PPN3.js → chunk-D5YCPIK6.js} +2 -2
  44. package/dist/{chunk-SDMV4QHM.js → chunk-DBCC7KIW.js} +25 -7
  45. package/dist/{chunk-E5EW5HVJ.js → chunk-DVG6DDX6.js} +1 -1
  46. package/dist/{chunk-4VXFZSYF.js → chunk-DW6HE5DH.js} +2 -2
  47. package/dist/{chunk-7PJCK7UE.js → chunk-E5KJOUHI.js} +7 -7
  48. package/dist/{chunk-6SCYTIF4.js → chunk-HU7NS7JA.js} +32 -7
  49. package/dist/{chunk-36GQREOE.js → chunk-HUC73DZC.js} +3 -3
  50. package/dist/{chunk-EYMOPFSD.js → chunk-J5MFNKE7.js} +2 -2
  51. package/dist/{chunk-JPVOI7GP.js → chunk-J7H5I4FO.js} +2 -2
  52. package/dist/{chunk-RG3TNIUB.js → chunk-K5R2I37T.js} +208 -97
  53. package/dist/{chunk-AAUY53CC.js → chunk-KHL6WFRL.js} +2 -2
  54. package/dist/{chunk-OQ6KOQEV.js → chunk-KYFXXEK3.js} +3 -3
  55. package/dist/{chunk-5RSXUAMN.js → chunk-MHHISNS2.js} +2 -2
  56. package/dist/{chunk-GHBFNLV2.js → chunk-RRCS27GT.js} +1531 -1175
  57. package/dist/{chunk-6YFHUIGT.js → chunk-RZTLXZHJ.js} +59 -21
  58. package/dist/{chunk-AX5KGRM6.js → chunk-SI4O2W4H.js} +2 -2
  59. package/dist/{chunk-BDGTZRZ6.js → chunk-UEXQMI6K.js} +56 -44
  60. package/dist/{chunk-7TIJXWG3.js → chunk-V2GJE5J5.js} +3 -3
  61. package/dist/{chunk-T746REAE.js → chunk-VC2B275U.js} +2 -2
  62. package/dist/{chunk-SEA2PFVI.js → chunk-XACP5P2J.js} +2 -2
  63. package/dist/{chunk-UWVMJEUJ.js → chunk-YTJIRQON.js} +2 -2
  64. package/dist/{chunk-YANR2RL7.js → chunk-ZIJABBGZ.js} +2 -2
  65. package/dist/{ci-workflow-HO4WKGNG.js → ci-workflow-LGN7LHHO.js} +4 -4
  66. package/dist/{dist-ICW4QUEW.js → dist-FBBADRYS.js} +3 -1
  67. package/dist/{dist-6D2F2J57.js → dist-LE5AU7FR.js} +19 -3
  68. package/dist/{docs-FP47JONV.js → docs-3BTPSHKE.js} +5 -5
  69. package/dist/{engine-YUA6IYOG.js → engine-GWGU4AMH.js} +4 -4
  70. package/dist/{entropy-DBW2INZU.js → entropy-35XURODP.js} +7 -4
  71. package/dist/{feedback-BPHADTRQ.js → feedback-NDGZZ37W.js} +1 -1
  72. package/dist/{generate-agent-definitions-KPVGBGDY.js → generate-agent-definitions-PYZ3E7SP.js} +5 -5
  73. package/dist/hooks/sentinel-pre.js +15 -138
  74. package/dist/index.d.ts +61 -0
  75. package/dist/index.js +25 -25
  76. package/dist/{loader-QOJQ6NZM.js → loader-QK2OJXKB.js} +4 -4
  77. package/dist/{mcp-ZPX6O767.js → mcp-Z5YMV7TA.js} +15 -15
  78. package/dist/{performance-FXYTGJGQ.js → performance-VAYOYPVK.js} +5 -5
  79. package/dist/{review-pipeline-2TFQ5OAE.js → review-pipeline-UETEOWSS.js} +4 -4
  80. package/dist/{runtime-XK6ZCHKE.js → runtime-J7KFACTK.js} +4 -4
  81. package/dist/{security-4W2P5ZGI.js → security-6AIUZXF5.js} +1 -1
  82. package/dist/{state-events-ECQAIZLU.js → state-events-XQPHGLG5.js} +4 -4
  83. package/dist/{validate-64KTEGIE.js → validate-ON7YMVLY.js} +5 -5
  84. package/dist/{validate-cross-check-J5PVGICB.js → validate-cross-check-HKKQA7K5.js} +4 -4
  85. package/package.json +8 -7
  86. package/dist/analyzer-V633GUHY-OV335HGM.js +0 -26
@@ -22,8 +22,8 @@ import {
22
22
  getDefaultRegistry,
23
23
  getOutline,
24
24
  getParser,
25
- init_chunk_MUWJHO2S,
26
- init_chunk_S4DTDJ6J,
25
+ init_chunk_IHRT6II2,
26
+ init_chunk_JZ7UO3OF,
27
27
  parseFile,
28
28
  parseSize,
29
29
  readFileContent,
@@ -31,7 +31,7 @@ import {
31
31
  resetParserCache,
32
32
  resolveFileToLayer,
33
33
  validateDependencies
34
- } from "./chunk-6YFHUIGT.js";
34
+ } from "./chunk-RZTLXZHJ.js";
35
35
  import {
36
36
  AuthAuditEntrySchema,
37
37
  AuthTokenPublicSchema,
@@ -55,6 +55,7 @@ import {
55
55
  OTLPKeyValueSchema,
56
56
  OTLPSpanSchema,
57
57
  Ok,
58
+ PlanTaskSchema,
58
59
  PromptCacheStatsSchema,
59
60
  ProposalContentSchema,
60
61
  ProposalDecisionSchema,
@@ -79,7 +80,7 @@ import {
79
80
  init_dist,
80
81
  isErr,
81
82
  isOk
82
- } from "./chunk-BDGTZRZ6.js";
83
+ } from "./chunk-UEXQMI6K.js";
83
84
  import {
84
85
  DEFAULT_SKIP_DIRS,
85
86
  GraphStore,
@@ -123,7 +124,7 @@ import {
123
124
  __export
124
125
  } from "./chunk-KFQGP6VL.js";
125
126
 
126
- // ../core/dist/chunk-FYTJQ2ZY.mjs
127
+ // ../core/dist/chunk-OFA2AAZK.mjs
127
128
  import { createHash } from "crypto";
128
129
  import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "fs";
129
130
  import { randomBytes } from "crypto";
@@ -759,10 +760,10 @@ async function toHaveMaxDepDepth(received, maxDepth) {
759
760
  };
760
761
  }
761
762
  var CircularDepsCollector, LayerViolationCollector, ArchBaselineManager, ComplexityCollector, CouplingCollector, ForbiddenImportCollector, ModuleSizeCollector, DepDepthCollector, defaultCollectors, archMatchers;
762
- var init_chunk_FYTJQ2ZY = __esm({
763
- "../core/dist/chunk-FYTJQ2ZY.mjs"() {
763
+ var init_chunk_OFA2AAZK = __esm({
764
+ "../core/dist/chunk-OFA2AAZK.mjs"() {
764
765
  "use strict";
765
- init_chunk_MUWJHO2S();
766
+ init_chunk_JZ7UO3OF();
766
767
  init_chunk_IIEDD47I();
767
768
  init_dist2();
768
769
  init_dist2();
@@ -1383,6 +1384,7 @@ __export(dist_exports, {
1383
1384
  PII_LINE_RE: () => PII_LINE_RE,
1384
1385
  PII_TOKENS: () => PII_TOKENS,
1385
1386
  PatternConfigSchema: () => PatternConfigSchema,
1387
+ PlanTaskSchema: () => PlanTaskSchema,
1386
1388
  PredictionEngine: () => PredictionEngine,
1387
1389
  PredictionOptionsSchema: () => PredictionOptionsSchema,
1388
1390
  PredictionRegressionResultSchema: () => RegressionResultSchema,
@@ -1522,6 +1524,7 @@ __export(dist_exports, {
1522
1524
  buildExternalId: () => buildExternalId,
1523
1525
  buildProjectContext: () => buildProjectContext,
1524
1526
  buildSnapshot: () => buildSnapshot,
1527
+ buildTaskGraph: () => buildTaskGraph,
1525
1528
  calculateCacheSavings: () => calculateCacheSavings,
1526
1529
  calculateCost: () => calculateCost,
1527
1530
  calibrateDepth: () => calibrateDepth,
@@ -1633,6 +1636,7 @@ __export(dist_exports, {
1633
1636
  generateRubric: () => generateRubric,
1634
1637
  generateSuggestions: () => generateSuggestions,
1635
1638
  getActionEmitter: () => getActionEmitter,
1639
+ getCatalogRetrospectiveReport: () => getCatalogRetrospectiveReport,
1636
1640
  getExitCode: () => getExitCode,
1637
1641
  getFeedbackConfig: () => getFeedbackConfig,
1638
1642
  getInjectionPatterns: () => getInjectionPatterns,
@@ -1654,6 +1658,7 @@ __export(dist_exports, {
1654
1658
  injectionRules: () => injectionRules,
1655
1659
  insecureDefaultsRules: () => insecureDefaultsRules,
1656
1660
  invalidateCheckState: () => invalidateCheckState,
1661
+ isAbandonedMidWorkflow: () => isAbandonedMidWorkflow,
1657
1662
  isBadPort: () => isBadPort,
1658
1663
  isClaimableBy: () => isClaimableBy,
1659
1664
  isDuplicateFinding: () => isDuplicateFinding,
@@ -1718,6 +1723,7 @@ __export(dist_exports, {
1718
1723
  parseManifest: () => parseManifest,
1719
1724
  parseMeta: () => parseMeta,
1720
1725
  parseProtectedRegions: () => parseProtectedRegions,
1726
+ parseReferencedIssues: () => parseReferencedIssues,
1721
1727
  parseRoadmap: () => parseRoadmap,
1722
1728
  parseSections: () => parseSections,
1723
1729
  parseSecurityConfig: () => parseSecurityConfig,
@@ -1725,6 +1731,7 @@ __export(dist_exports, {
1725
1731
  parseSize: () => parseSize,
1726
1732
  parseStrategyDoc: () => parseStrategyDoc,
1727
1733
  pathTraversalRules: () => pathTraversalRules,
1734
+ planParallelization: () => planParallelization,
1728
1735
  presetKind: () => presetKind,
1729
1736
  previewFix: () => previewFix,
1730
1737
  projectValue: () => projectValue,
@@ -1751,6 +1758,7 @@ __export(dist_exports, {
1751
1758
  release: () => release,
1752
1759
  removeContributions: () => removeContributions,
1753
1760
  removeProvenance: () => removeProvenance,
1761
+ renderRetrospectiveMarkdown: () => renderRetrospectiveMarkdown,
1754
1762
  requestMultiplePeerReviews: () => requestMultiplePeerReviews,
1755
1763
  requestPeerReview: () => requestPeerReview,
1756
1764
  resetFeedbackConfig: () => resetFeedbackConfig,
@@ -1838,6 +1846,7 @@ __export(dist_exports, {
1838
1846
  validateFindings: () => validateFindings,
1839
1847
  validateKnowledgeMap: () => validateKnowledgeMap,
1840
1848
  validatePatternConfig: () => validatePatternConfig,
1849
+ validatePlanTasks: () => validatePlanTasks,
1841
1850
  validatePulseConfig: () => validatePulseConfig,
1842
1851
  validateRoadmapMode: () => validateRoadmapMode,
1843
1852
  validateSolutionsDir: () => validateSolutionsDir,
@@ -8970,10 +8979,12 @@ async function runEntropyCheck(projectRoot, config) {
8970
8979
  const entropyConfig = config.entropy || {};
8971
8980
  const perfConfig = config.performance || {};
8972
8981
  const entryPoints = entropyConfig.entryPoints ?? perfConfig.entryPoints;
8982
+ const driftConfig = entropyConfig.drift;
8973
8983
  const analyzer = new EntropyAnalyzer({
8974
8984
  rootDir: projectRoot,
8975
8985
  ...entryPoints ? { entryPoints } : {},
8976
- analyze: { drift: true, deadCode: true, patterns: false }
8986
+ ...driftConfig?.docPaths ? { docPaths: driftConfig.docPaths } : {},
8987
+ analyze: { drift: driftConfig ?? true, deadCode: true, patterns: false }
8977
8988
  });
8978
8989
  const result = await analyzer.analyze();
8979
8990
  if (!result.ok) {
@@ -12722,6 +12733,20 @@ async function fetchWithRetry(fetchFn, input, init, opts = RETRY_DEFAULTS) {
12722
12733
  }
12723
12734
  return lastResponse;
12724
12735
  }
12736
+ function parseReferencedIssues(text) {
12737
+ if (!text) return [];
12738
+ const re = /(?:[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)?#(\d+)/g;
12739
+ const seen = /* @__PURE__ */ new Set();
12740
+ const out = [];
12741
+ for (const m of text.matchAll(re)) {
12742
+ const n = Number.parseInt(m[1], 10);
12743
+ if (Number.isInteger(n) && n > 0 && !seen.has(n)) {
12744
+ seen.add(n);
12745
+ out.push(n);
12746
+ }
12747
+ }
12748
+ return out;
12749
+ }
12725
12750
  function isValidTrackerShape(tracker) {
12726
12751
  if (!tracker || typeof tracker !== "object") return false;
12727
12752
  const t = tracker;
@@ -14641,6 +14666,157 @@ function aggregateByDay2(records) {
14641
14666
  function topSkills(records, n) {
14642
14667
  return aggregateBySkill(records).slice(0, n);
14643
14668
  }
14669
+ function isAbandonedMidWorkflow(record) {
14670
+ if (record.outcome === "abandoned") return true;
14671
+ return record.outcome !== "completed" && record.phasesReached.length > 0;
14672
+ }
14673
+ function resolveNowMs(records, now) {
14674
+ if (now) return now.getTime();
14675
+ let latest = Number.NEGATIVE_INFINITY;
14676
+ for (const record of records) {
14677
+ const t = Date.parse(record.startedAt);
14678
+ if (!Number.isNaN(t) && t > latest) latest = t;
14679
+ }
14680
+ return latest === Number.NEGATIVE_INFINITY ? Date.now() : latest;
14681
+ }
14682
+ function buildStat(skill, records, nowMs) {
14683
+ const invocations = records.length;
14684
+ const failures = records.filter((r) => r.outcome === "failed").length;
14685
+ const abandoned = records.filter(isAbandonedMidWorkflow).length;
14686
+ const timestamps = records.map((r) => r.startedAt).sort();
14687
+ const lastUsed = timestamps[timestamps.length - 1];
14688
+ const daysSinceLastUse = Math.floor((nowMs - Date.parse(lastUsed)) / DAY_MS);
14689
+ return {
14690
+ skill,
14691
+ invocations,
14692
+ failures,
14693
+ failureRate: failures / invocations,
14694
+ abandonedMidWorkflow: abandoned,
14695
+ lastUsed,
14696
+ daysSinceLastUse
14697
+ };
14698
+ }
14699
+ function groupBySkill(records) {
14700
+ const map = /* @__PURE__ */ new Map();
14701
+ for (const record of records) {
14702
+ const bucket = map.get(record.skill);
14703
+ if (bucket) bucket.push(record);
14704
+ else map.set(record.skill, [record]);
14705
+ }
14706
+ return map;
14707
+ }
14708
+ function computeCoverage(invokedSkills, catalogSkills) {
14709
+ if (!catalogSkills) {
14710
+ return { catalogSize: null, everInvoked: null, neverInvoked: null };
14711
+ }
14712
+ const catalog = new Set(catalogSkills);
14713
+ let everInvoked = 0;
14714
+ for (const skill of catalog) {
14715
+ if (invokedSkills.has(skill)) everInvoked++;
14716
+ }
14717
+ return {
14718
+ catalogSize: catalog.size,
14719
+ everInvoked,
14720
+ neverInvoked: catalog.size - everInvoked
14721
+ };
14722
+ }
14723
+ function getCatalogRetrospectiveReport(records, options = {}) {
14724
+ const inactiveDaysThreshold = options.inactiveDays ?? 90;
14725
+ const topN = options.topN ?? 10;
14726
+ const nowMs = resolveNowMs(records, options.now);
14727
+ const generatedAt = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
14728
+ const bySkill = groupBySkill(records);
14729
+ const stats = Array.from(bySkill.entries()).map(([skill, recs]) => buildStat(skill, recs, nowMs));
14730
+ const topInvoked = [...stats].sort((a, b) => b.invocations - a.invocations || a.skill.localeCompare(b.skill)).slice(0, topN);
14731
+ const topFailing = stats.filter((s) => s.failures > 0).sort(
14732
+ (a, b) => b.failures - a.failures || b.failureRate - a.failureRate || a.skill.localeCompare(b.skill)
14733
+ ).slice(0, topN);
14734
+ const abandonedMidWorkflow = stats.filter((s) => s.abandonedMidWorkflow > 0).sort(
14735
+ (a, b) => b.abandonedMidWorkflow - a.abandonedMidWorkflow || a.skill.localeCompare(b.skill)
14736
+ ).slice(0, topN);
14737
+ const staleSkills = stats.filter((s) => s.daysSinceLastUse >= inactiveDaysThreshold).sort((a, b) => b.daysSinceLastUse - a.daysSinceLastUse || a.skill.localeCompare(b.skill));
14738
+ const timestamps = records.map((r) => r.startedAt).sort();
14739
+ const windowStart = timestamps[0] ?? null;
14740
+ const windowEnd = timestamps[timestamps.length - 1] ?? null;
14741
+ const windowDays = windowStart && windowEnd ? Math.max(0, Math.round((Date.parse(windowEnd) - Date.parse(windowStart)) / DAY_MS)) : 0;
14742
+ return {
14743
+ generatedAt,
14744
+ windowStart,
14745
+ windowEnd,
14746
+ windowDays,
14747
+ totalRecords: records.length,
14748
+ distinctSkills: bySkill.size,
14749
+ inactiveDaysThreshold,
14750
+ topN,
14751
+ topInvoked,
14752
+ topFailing,
14753
+ abandonedMidWorkflow,
14754
+ staleSkills,
14755
+ coverage: computeCoverage(new Set(bySkill.keys()), options.catalogSkills)
14756
+ };
14757
+ }
14758
+ function formatRate(rate) {
14759
+ return `${(rate * 100).toFixed(0)}%`;
14760
+ }
14761
+ function statRow(s) {
14762
+ return `| \`${s.skill}\` | ${s.invocations} | ${s.failures} (${formatRate(s.failureRate)}) | ${s.abandonedMidWorkflow} | ${s.lastUsed.slice(0, 10)} |`;
14763
+ }
14764
+ function renderStatSection(title, rows, emptyNote) {
14765
+ if (rows.length === 0) return `### ${title}
14766
+
14767
+ _${emptyNote}_
14768
+ `;
14769
+ const header = "| Skill | Invocations | Failures | Abandoned mid-workflow | Last used |\n| ----- | ----------- | -------- | ---------------------- | --------- |";
14770
+ return `### ${title}
14771
+
14772
+ ${header}
14773
+ ${rows.map(statRow).join("\n")}
14774
+ `;
14775
+ }
14776
+ function renderOverview(report) {
14777
+ const lines = ["## Overview", "", `- **Generated:** ${report.generatedAt}`];
14778
+ if (report.windowStart && report.windowEnd) {
14779
+ lines.push(
14780
+ `- **Window:** ${report.windowStart.slice(0, 10)} \u2192 ${report.windowEnd.slice(0, 10)} (${report.windowDays} days)`
14781
+ );
14782
+ } else {
14783
+ lines.push("- **Window:** no records");
14784
+ }
14785
+ lines.push(`- **Records:** ${report.totalRecords} across ${report.distinctSkills} skill(s)`);
14786
+ const { catalogSize, everInvoked, neverInvoked } = report.coverage;
14787
+ if (catalogSize != null && everInvoked != null && neverInvoked != null) {
14788
+ lines.push(
14789
+ `- **Telemetry coverage:** ${everInvoked}/${catalogSize} catalog skills have emitted telemetry (${neverInvoked} never invoked)`
14790
+ );
14791
+ }
14792
+ return lines.join("\n");
14793
+ }
14794
+ function staleEmptyNote(report) {
14795
+ const base = `No ever-invoked skill is inactive \u2265${report.inactiveDaysThreshold} days.`;
14796
+ if (report.windowDays < report.inactiveDaysThreshold) {
14797
+ return `${base} Note: the record window (${report.windowDays} days) is shorter than the threshold, so this signal cannot fire yet.`;
14798
+ }
14799
+ return base;
14800
+ }
14801
+ function renderRetrospectiveMarkdown(report) {
14802
+ const sections = [
14803
+ `# Catalog Retrospective \u2014 ${report.generatedAt.slice(0, 10)}`,
14804
+ renderOverview(report),
14805
+ renderStatSection("Top skills by invocations", report.topInvoked, "No invocations recorded."),
14806
+ renderStatSection("Top failing skills", report.topFailing, "No failing skills recorded."),
14807
+ renderStatSection(
14808
+ "Abandoned mid-workflow",
14809
+ report.abandonedMidWorkflow,
14810
+ "No abandoned-mid-workflow runs recorded."
14811
+ ),
14812
+ renderStatSection(
14813
+ `Stale skills (inactive \u2265${report.inactiveDaysThreshold} days)`,
14814
+ report.staleSkills,
14815
+ staleEmptyNote(report)
14816
+ )
14817
+ ];
14818
+ return sections.join("\n\n").trimEnd() + "\n";
14819
+ }
14644
14820
  function isEmptyObject(v) {
14645
14821
  return typeof v === "object" && v !== null && !Array.isArray(v) && Object.keys(v).length === 0;
14646
14822
  }
@@ -15133,7 +15309,7 @@ function arrayLen(arr) {
15133
15309
  return Array.isArray(arr) ? arr.length : 0;
15134
15310
  }
15135
15311
  async function gatherEntropyBlock(projectPath) {
15136
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-V633GUHY-OV335HGM.js");
15312
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-XRCV63KC-6T2Z32XC.js");
15137
15313
  const analyzer = new EntropyAnalyzer2({
15138
15314
  rootDir: projectPath,
15139
15315
  include: ["src/**/*.ts", "src/**/*.tsx", "packages/*/src/**/*.ts"],
@@ -15347,6 +15523,185 @@ ${issues}`));
15347
15523
  }
15348
15524
  return Ok(result.data);
15349
15525
  }
15526
+ function footprintOf(task) {
15527
+ const files = task.files || [];
15528
+ const owns = task.owns || [];
15529
+ return /* @__PURE__ */ new Set([...files, ...owns]);
15530
+ }
15531
+ function shareFootprint(a, b) {
15532
+ if (!a || !b) return false;
15533
+ for (const item of a) {
15534
+ if (b.has(item)) return true;
15535
+ }
15536
+ return false;
15537
+ }
15538
+ function addDependency(deps, consumer, producer) {
15539
+ if (!consumer || !producer) return;
15540
+ const consumerDeps = deps.get(consumer.id);
15541
+ if (consumerDeps) consumerDeps.add(producer.id);
15542
+ }
15543
+ function toGraphNode(task, deps) {
15544
+ const set = deps.get(task.id) || /* @__PURE__ */ new Set();
15545
+ return { id: task.id, dependsOn: [...set].sort() };
15546
+ }
15547
+ function buildTaskGraph(tasks) {
15548
+ const footprints = tasks.map(footprintOf);
15549
+ const deps = /* @__PURE__ */ new Map();
15550
+ for (const task of tasks) {
15551
+ deps.set(task.id, new Set(task.dependsOn || []));
15552
+ }
15553
+ for (let i = 0; i < tasks.length; i++) {
15554
+ for (let j = i + 1; j < tasks.length; j++) {
15555
+ if (shareFootprint(footprints[i], footprints[j])) {
15556
+ addDependency(deps, tasks[j], tasks[i]);
15557
+ }
15558
+ }
15559
+ }
15560
+ return tasks.map((task) => toGraphNode(task, deps));
15561
+ }
15562
+ function validatePlanTasks(tasks) {
15563
+ const errors = [];
15564
+ const warnings = [];
15565
+ const index = /* @__PURE__ */ new Map();
15566
+ tasks.forEach((t, i) => index.set(t.id, i));
15567
+ for (const t of tasks) {
15568
+ for (const dep of t.dependsOn || []) {
15569
+ if (!index.has(dep)) {
15570
+ errors.push(`Task "${t.id}" depends on unknown task id "${dep}".`);
15571
+ continue;
15572
+ }
15573
+ if (index.get(dep) > index.get(t.id)) {
15574
+ warnings.push(
15575
+ `Task "${t.id}" depends on "${dep}" which is declared later (consumer before producer).`
15576
+ );
15577
+ }
15578
+ }
15579
+ }
15580
+ const { cyclic } = findParallelGroups(buildTaskGraph(tasks));
15581
+ if (cyclic.length > 0) {
15582
+ errors.push(`Dependency cycle detected among tasks: ${cyclic.join(", ")}.`);
15583
+ }
15584
+ return { errors, warnings };
15585
+ }
15586
+ function waveSeverity(taskIds, conflicts) {
15587
+ const set = new Set(taskIds);
15588
+ let max = "none";
15589
+ for (const c of conflicts.conflicts) {
15590
+ if (!set.has(c.taskA) || !set.has(c.taskB)) continue;
15591
+ if (SEVERITY_RANK2[c.severity] > SEVERITY_RANK2[max]) max = c.severity;
15592
+ }
15593
+ return max;
15594
+ }
15595
+ function classifyFiring(severity, waveSize, minWaveSize, analysisLevel) {
15596
+ if (severity === "high") {
15597
+ return {
15598
+ firing: "serialize",
15599
+ reason: "high-severity conflicts predicted \u2014 running these tasks sequentially"
15600
+ };
15601
+ }
15602
+ if (waveSize < minWaveSize) {
15603
+ return {
15604
+ firing: "serialize",
15605
+ reason: `only ${waveSize} independent task(s), below minimum wave size ${minWaveSize} \u2014 running serially`
15606
+ };
15607
+ }
15608
+ if (severity === "medium") {
15609
+ return {
15610
+ firing: "confirm",
15611
+ reason: "medium-severity conflicts predicted \u2014 one confirmation before dispatch"
15612
+ };
15613
+ }
15614
+ if (analysisLevel === "file-only") {
15615
+ return {
15616
+ firing: "confirm",
15617
+ reason: "graph unavailable (file-only analysis) \u2014 transitive conflicts unknown, one confirmation before dispatch"
15618
+ };
15619
+ }
15620
+ return {
15621
+ firing: "auto-dispatch",
15622
+ reason: `${waveSize} independent tasks, ${severity === "none" ? "no" : severity} conflict severity, graph-expanded analysis \u2014 dispatching in parallel`
15623
+ };
15624
+ }
15625
+ function narrate(waves, reasons, serialized, cyclic, nodes) {
15626
+ const depMap = /* @__PURE__ */ new Map();
15627
+ for (const node of nodes) depMap.set(node.id, node.dependsOn);
15628
+ const cyclicSet = new Set(cyclic);
15629
+ const serializedSet = new Set(serialized);
15630
+ const labelDep = (id) => {
15631
+ if (cyclicSet.has(id)) return `${id} (cyclic)`;
15632
+ if (serializedSet.has(id)) return `${id} (serialized)`;
15633
+ return id;
15634
+ };
15635
+ const lines = [
15636
+ `Parallelization: ${waves.length} wave(s), ${serialized.length} serialized, ${cyclic.length} cyclic.`
15637
+ ];
15638
+ waves.forEach((w, i) => {
15639
+ const waveSet = new Set(w.tasks);
15640
+ const blocking = [...new Set(w.tasks.flatMap((t) => depMap.get(t) ?? []))].filter((id) => !waveSet.has(id)).sort();
15641
+ const crossBucket = blocking.some((id) => serializedSet.has(id));
15642
+ const waitClause = blocking.length ? `waits on ${blocking.map(labelDep).join(", ")}${crossBucket ? " (cross-bucket prerequisite gates this wave)" : ""}` : "no upstream dependencies (root wave)";
15643
+ lines.push(
15644
+ `Wave ${i + 1} [${w.tasks.join(", ")}]: ${waitClause}; ${w.firing}: ${reasons[i] ?? ""}.`
15645
+ );
15646
+ });
15647
+ if (serialized.length > 0) {
15648
+ lines.push(
15649
+ `Serialized (run sequentially): [${serialized.join(
15650
+ ", "
15651
+ )}] \u2014 high-severity conflict members or dependency-cycle members.`
15652
+ );
15653
+ }
15654
+ if (cyclic.length > 0) {
15655
+ lines.push(
15656
+ `Cyclic (blocked): [${cyclic.join(", ")}] \u2014 dependency cycle; resolve before scheduling.`
15657
+ );
15658
+ }
15659
+ return lines.join("\n");
15660
+ }
15661
+ function highRiskGroupMembers(conflicts) {
15662
+ const members = [];
15663
+ for (const group of conflicts.groups) {
15664
+ if (group.length > 1) members.push(...group);
15665
+ }
15666
+ return members;
15667
+ }
15668
+ function planParallelization(input) {
15669
+ const { tasks, conflicts } = input;
15670
+ const minWaveSize = input.minWaveSize ?? DEFAULT_MIN_WAVE_SIZE;
15671
+ const nodes = buildTaskGraph(tasks);
15672
+ const { waves: rawWaves, cyclic } = findParallelGroups(nodes);
15673
+ const serializedSet = new Set(cyclic);
15674
+ for (const id of highRiskGroupMembers(conflicts)) serializedSet.add(id);
15675
+ const serialized = [...serializedSet].sort();
15676
+ const depMap = /* @__PURE__ */ new Map();
15677
+ for (const node of nodes) depMap.set(node.id, node.dependsOn);
15678
+ const reasons = [];
15679
+ const waves = rawWaves.map((taskIds) => taskIds.filter((id) => !serializedSet.has(id))).filter((taskIds) => taskIds.length > 0).map((taskIds) => {
15680
+ const severity = waveSeverity(taskIds, conflicts);
15681
+ let { firing, reason } = classifyFiring(
15682
+ severity,
15683
+ taskIds.length,
15684
+ minWaveSize,
15685
+ conflicts.analysisLevel
15686
+ );
15687
+ const waveSet = new Set(taskIds);
15688
+ const crossBucketUpstream = [...new Set(taskIds.flatMap((t) => depMap.get(t) ?? []))].filter((id) => !waveSet.has(id) && serializedSet.has(id)).sort();
15689
+ if (crossBucketUpstream.length > 0 && firing === "auto-dispatch") {
15690
+ firing = "confirm";
15691
+ reason = `depends on ${crossBucketUpstream.join(
15692
+ ", "
15693
+ )} running in the serialized/cyclic channel \u2014 cross-bucket prerequisite not parallel-safe, one confirmation before dispatch`;
15694
+ }
15695
+ reasons.push(reason);
15696
+ return { tasks: taskIds, severity, firing, analysisLevel: conflicts.analysisLevel };
15697
+ });
15698
+ return {
15699
+ waves,
15700
+ serialized,
15701
+ cyclic,
15702
+ narration: narrate(waves, reasons, serialized, cyclic, nodes)
15703
+ };
15704
+ }
15350
15705
  function proposalsDir(projectPath) {
15351
15706
  return path51.join(projectPath, ".harness", "proposals");
15352
15707
  }
@@ -16046,12 +16401,12 @@ function writeStrategyDoc(doc, opts) {
16046
16401
  throw e;
16047
16402
  }
16048
16403
  }
16049
- var WHATWG_BAD_PORTS, BAD_PORT_SET, VALID_TYPES, CONVENTIONAL_PATTERN, LOOKBACK_PATTERN, PulseDbSourceSchema, PulseSourcesSchema, PulseConfigSchema, KNOWN_SECTION_NAMES, ISO_DATE, PLACEHOLDER_INLINE, REQUIRED, ALLOWED, StrategyFrontmatterSchema, StrategySectionSchema, StrategyDocSchema, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ALL_SOLUTION_CATEGORIES, ISO_DATE2, BugTrackSchema, KnowledgeTrackSchema, BaseFrontmatter, SolutionDocFrontmatterSchema, TRACK_CATEGORIES, DEFAULT_AGNIX_TIMEOUT_MS, HARNESS_AGNIX_DISABLE, HARNESS_AGNIX_BIN, CLAUDE_MD_WARN_BYTES, CLAUDE_MD_ERROR_BYTES, CONTEXT_FILES, MIN_DESCRIPTION_LENGTH, SETTINGS_PATHS, KNOWN_HOOK_EVENTS, MCP_SETTINGS_FILES, REQUIRED_SECTIONS, SETTINGS_FILES, KNOWN_AGNIX_TOOLS, ROADMAP_READ_ALLOWLIST, ROADMAP_MD, DYNAMIC_ROADMAP_IO, KEBAB_CASE, TICKET_ID, DEFAULT_SECTIONS, DEFAULT_RATIOS, NODE_TYPE_TO_CATEGORY, SECTION_LEVEL_MAP, DEFAULT_LEVEL, DEFAULT_BUDGET, DEFAULT_LOADER_CONFIG, LEVEL_FRACTIONS, PHASE_PRIORITIES, ManifestSchema, BundleConstraintsSchema, BundleSchema, ContributionsSchema, LockfilePackageSchema, LockfileSchema, SharableLayerSchema, SharableForbiddenImportSchema, SharableBoundaryConfigSchema, SharableSecurityRulesSchema, VALID_SCOPES, LINE_PATTERN, START_PATTERN, END_PATTERN, readFile72, writeFile32, unlink22, mkdir22, copyFile2, DEFAULT_FIX_CONFIG, EXPORT_TYPE_KEYWORD, ALWAYS_UNSAFE_TYPES, idCounter, DEAD_CODE_FIX_ACTIONS, MustExportRuleSchema, MustExportDefaultRuleSchema, NoExportRuleSchema, MustImportRuleSchema, NoImportRuleSchema, NamingRuleSchema, MaxExportsRuleSchema, MaxLinesRuleSchema, RequireJSDocRuleSchema, RuleSchema, ConfigPatternSchema, PatternConfigSchema, DriftConfigSchema, DeadCodeConfigSchema, EntropyConfigSchema, BaselineManager, BenchmarkRunner, RegressionDetector, SOURCE_EXTENSIONS, FUNCTION_DECL_RE, CONST_DECL_RE, CriticalPathResolver, NoOpTelemetryAdapter, NoOpExecutor, ConsoleSink, feedbackConfig, ChecklistBuilder, AgentActionEmitter, globalEmitter, FileSink, NoOpSink, ConfidenceTierSchema, RegressionResultSchema, DirectionSchema, CategoryForecastSchema, SpecImpactSignalsSchema, SpecImpactEstimateSchema, ContributingFeatureSchema, AdjustedForecastSchema, PredictionWarningSchema, StabilityForecastSchema, PredictionResultSchema, PredictionOptionsSchema, VALID_STATUSES, EM_DASH, VALID_PRIORITIES, EM_DASH2, H3_NAME, FRONTMATTER, STATUS_RANK, META_FILE, ShardStore, MonolithStore, ALL_CATEGORIES, DIRECTION_THRESHOLD, PredictionEngine, DEFAULT_COEFFICIENTS, SpecImpactEstimator, EMPTY_HISTORY, ViolationHistoryManager, NORMALIZERS, MAX_SAMPLES, DEFAULT_WINDOW_WEEKS, DEFAULT_MIN_OCCURRENCES, FailureEntrySchema, HandoffSchema, GateCheckSchema, GateResultSchema, GateConfigSchema, HarnessStateSchema, DEFAULT_STATE, HARNESS_DIR, STATE_FILE, LEARNINGS_FILE, FAILURES_FILE, HANDOFF_FILE, GATE_CONFIG_FILE, INDEX_FILE, SESSIONS_DIR, SESSION_INDEX_FILE, SUMMARY_FILE, SESSION_STATE_FILE, ARCHIVE_DIR, CONTENT_HASHES_FILE, StreamInfoSchema, StreamIndexSchema, DEFAULT_STREAM_INDEX, EVENT_LOG_FILE, EVENT_BLOBS_DIR, MAX_LINE_BYTES, BLOB_REF_KEY, SNAPSHOT_FILE, STREAMS_DIR, STREAM_NAME_REGEX, branchCache, BRANCH_CACHE_TTL_MS, STATE_FILES, STATE_DIRS, MAX_CACHE_ENTRIES, learningsCacheMap, WEIGHTS, LOCK_RETRIES, LOCK_BACKOFFS, PROMOTABLE_OUTCOMES, failuresCacheMap, FAILURE_LINE_REGEX, SAFE_GATE_COMMAND, event_sourcing_exports, ScopeSchema, envelopeShape, StateImportedPayload, DecisionRecordedPayload, PositionSetPayload, BlockerOpenedPayload, BlockerResolvedPayload, ProgressSetPayload, SessionSummarizedPayload, LANES, LaneSchema, TaskRegisteredPayload, LaneTransitionedPayload, UserInputCapturedPayload, ApprovalRequestedPayload, ApprovalResolvedPayload, EventSchema, BlobRefSchema, StoredEventSchema, cached, localCounters, CORE_HANDLERS, KIND_LABEL, MATERIALIZE_DEBOUNCE_MS, pendingTimers, inflightMaterializes, ensured, TERMINAL_LANES, NON_TERMINAL, TABLE, RuleRegistry, DEFAULT_SECURITY_CONFIG, RuleOverrideSchema, SecurityConfigSchema, secretRules, injectionRules, xssRules, cryptoRules, pathTraversalRules, networkRules, deserializationRules, agentConfigRules, mcpRules, insecureDefaultsRules, sharpEdgesRules, nodeRules, expressRules, reactRules, goRules, SecurityScanner, OSV_ENDPOINT, DEFAULT_CACHE_DIR, DEFAULT_TTL_HOURS, hiddenUnicodePatterns, reRolingPatterns, permissionEscalationPatterns, encodedPayloadPatterns, indirectInjectionPatterns, contextManipulationPatterns, socialEngineeringPatterns, suspiciousPatterns, ALL_PATTERNS, DESTRUCTIVE_BASH, TAINT_DURATION_MS, DEFAULT_SESSION_ID, SecurityCategorySnapshotSchema, SupplyChainSnapshotSchema, SecurityTimelineSnapshotSchema, FindingLifecycleSchema, SecurityTimelineFileSchema, DirectionSchema2, SecurityTrendLineSchema, TrendAttributionSchema, SecurityTrendResultSchema, TimeToFixStatsSchema, TimeToFixResultSchema, EMPTY_SUPPLY_CHAIN, SecurityTimelineManager, ALL_CHECKS, STATUS_ICONS, CINotifier, ExclusionSet, PREFIX_PATTERNS, TEST_FILE_PATTERN, MD_FILE_PATTERN, ALL_DOMAINS, SECURITY_PATTERNS, JS_EXT_FALLBACKS, SEVERITY_RANK, SEVERITY_ORDER, SEVERITY_LABELS, VALIDATED_BY_RANK, VALIDATION_SCORES, DOMAIN_BASELINES, FACTOR_WEIGHTS, EVIDENCE_SATURATION, CORROBORATED_AGREEMENT, STANDALONE_AGREEMENT, AGREEMENT_LINE_GAP, COMPLIANCE_DESCRIPTOR, EXPORT_RE, BUG_DETECTION_DESCRIPTOR, SECURITY_DESCRIPTOR, EVAL_PATTERN, SECRET_PATTERNS, SQL_CONCAT_PATTERN, SHELL_EXEC_PATTERN, ARCHITECTURE_DESCRIPTOR, LARGE_FILE_THRESHOLD, VIOLATION_FILE_RE, LEARNINGS_DESCRIPTOR, RELEVANCE_THRESHOLD, ADVERSARIAL_DESCRIPTOR, UNVERIFIED_INPUT_PATTERN, PROMISE_NO_REJECT_PATTERN, UNGUARDED_OPTIONAL_CALL, COMPOSE_NO_AWAIT, FETCH_NO_TIMEOUT, TYPESCRIPT_STRICT_DESCRIPTOR, EXPLICIT_ANY_PATTERN, TS_IGNORE_PATTERN, UNSAFE_AS_UNKNOWN, NON_NULL_ASSERTION, VAGUE_HELPER_NAME, FRONTEND_RACES_DESCRIPTOR, AGENT_DESCRIPTORS, CONDITIONAL_SUBAGENT_DESCRIPTORS, AGENT_RUNNERS, SUBAGENT_ORDER, RISK_KEYWORDS, EXCLUDED_PATH_PATTERNS, ASYNC_UI_SIGNALS, WORD_BOUNDARY, DOWNGRADE_MAP, DEFAULT_PROVIDER_TIERS, SMALL_SUGGESTION_LINE_LIMIT, FILE_LINE_RANGE_PATTERN, FILE_LINE_PATTERN, FILE_ONLY_PATTERN, SECURITY_SENSITIVE_PATH, MIGRATION_PATH, TEST_PATH, CONFIG_PATH, STAGE_DOMAINS, CI_REVIEW_VERDICT_SCHEMA_VERSION, CI_RUNNERS, CI_ASSESSMENTS, CI_REVIEW_DOMAINS, ReviewFindingSchema, CiReviewVerdictSchema, VERDICT_MAP, RUNNER_PRESETS, VERDICT_MAP2, DEFAULT_EXEC_TIMEOUT_MS, DEFAULT_EXEC_MAX_STDOUT_BYTES, STDERR_CAP_BYTES, STDERR_TAIL_BYTES, defaultExecFile, EMPTY_TIER, EM_DASH3, DEFAULT_MILESTONE, MAX_CLOSEST_MATCHES, MACHINE_ASSIGNEE_PATTERNS, EXTERNAL_ID_RE, RETRY_DEFAULTS, GitHubIssuesSyncAdapter, syncMutex, PRIORITY_RANK, PRIORITY_RANK2, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, ConflictError, DEFAULTS, GitHubHttp, ETagStore, START_MARKER, END_MARKER, SERIALIZER_FIELDS, GitHubIssuesTrackerAdapter, LINEAR_ENDPOINT, EXTERNAL_PREFIX, HISTORY_MARKER, ISSUE_FIELDS, LinearTrackerAdapter, migrate_exports, HASH_RE, DEFAULT_CATCH_ALL, DEFAULT_INTAKE, DEFAULT_MAX_ACTIVE, InteractionTypeSchema, QuestionSchema, ConfirmationSchema, TransitionSchema, EmitInteractionInputSchema, ProjectScanner, SHELL_TEMPLATE, STYLES, SCRIPTS, MockLLMService, llmService, ContentPipeline, BlueprintGenerator, TOKENS_PER_MILLION, fallback_default, LITELLM_PRICING_URL, CACHE_TTL_MS, STALENESS_WARNING_DAYS, MICRODOLLARS_PER_DOLLAR, TOKENS_PER_MILLION2, StructuralStrategy, DEFAULT_TOKEN_BUDGET, CHARS_PER_TOKEN, TRUNCATION_MARKER, TruncationStrategy, CompactionPipeline, STABILITY_LOOKUP, TIER_ORDER, AnthropicCacheAdapter, TIER_ORDER2, OpenAICacheAdapter, TIER_ORDER3, CACHED_CONTENT_MARKER, GeminiCacheAdapter, VERSION, POSTHOG_BATCH_URL, MAX_ATTEMPTS, TIMEOUT_MS, DEFAULT_CAPACITY, CacheMetricsRecorder, RETRY_BACKOFFS_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_BATCH_SIZE, defaultFetch, defaultWarn, OTLPExporter, SERVICE_NAME_ATTR, SpanKind, ModeSchema, SeveritySchema, TierSchema, StrengthFindingSchema, HarnessConfigSubsetSchema, HookFileSchema, ProjectContextSchema, AuditSummarySchema, AuditResultSchema, SEVERITY_WEIGHTS, clamp, HOOK_SCRIPT_TOKEN, NEVER_BLOCKS, ALWAYS_EXIT_ZERO, EXIT_ZERO_LINE, NONZERO_EXIT, GATE, ERREXIT, strength001NonblockingHooks, BASELINE_REWRITE, strength002Autobaseline, SKIP_RE, strength003SkipList, strength004EmptyThresholds, INIT_SKILL_PATH, DEFAULT_BASIC, strength005LowestTier, AUTO_PATTERN, COMMENT_LINE, NAME_VALUE_LINE, PAT_GATING, REVIEW_SIGNAL, strength006AutoapproveBaseline, CHECK_KEYS, SIGNAL_REGISTRY, HEALTH_SIGNAL_NAMES, CHECK_SIGNAL_MAP, SIGNAL_CATEGORY_MAP, strength007SnapshotSignalMismatch, ALL_RULES, HarnessStrengthAuditor, MAX_TOP_AFFECTED, CompoundLockHeldError, KNOWN_CATEGORIES, ProposalNotFoundError, ProposalConflictError, ALLOWED_FIELD_KEYS, PII_TOKENS, PII_FIELD_DENYLIST, PII_LINE_RE, ALLOWED_SET, PulseAdapterAlreadyRegisteredError, REGISTRY, MOCK_ADAPTER_NAME, ALLOWED_FIELD_SET, adapter, LOOKBACK_RE, MAX_LINES, INLINE_TEMPLATE, TRUNCATION_MARKER2, execFileAsync, FIX_RE, EMPTY_REPO_RE, execFileAsync2, TRACK_CATEGORIES2, STOPWORDS, KEYWORD_TO_CATEGORY, SECTION_ORDER, FILENAME;
16404
+ var WHATWG_BAD_PORTS, BAD_PORT_SET, VALID_TYPES, CONVENTIONAL_PATTERN, LOOKBACK_PATTERN, PulseDbSourceSchema, PulseSourcesSchema, PulseConfigSchema, KNOWN_SECTION_NAMES, ISO_DATE, PLACEHOLDER_INLINE, REQUIRED, ALLOWED, StrategyFrontmatterSchema, StrategySectionSchema, StrategyDocSchema, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ALL_SOLUTION_CATEGORIES, ISO_DATE2, BugTrackSchema, KnowledgeTrackSchema, BaseFrontmatter, SolutionDocFrontmatterSchema, TRACK_CATEGORIES, DEFAULT_AGNIX_TIMEOUT_MS, HARNESS_AGNIX_DISABLE, HARNESS_AGNIX_BIN, CLAUDE_MD_WARN_BYTES, CLAUDE_MD_ERROR_BYTES, CONTEXT_FILES, MIN_DESCRIPTION_LENGTH, SETTINGS_PATHS, KNOWN_HOOK_EVENTS, MCP_SETTINGS_FILES, REQUIRED_SECTIONS, SETTINGS_FILES, KNOWN_AGNIX_TOOLS, ROADMAP_READ_ALLOWLIST, ROADMAP_MD, DYNAMIC_ROADMAP_IO, KEBAB_CASE, TICKET_ID, DEFAULT_SECTIONS, DEFAULT_RATIOS, NODE_TYPE_TO_CATEGORY, SECTION_LEVEL_MAP, DEFAULT_LEVEL, DEFAULT_BUDGET, DEFAULT_LOADER_CONFIG, LEVEL_FRACTIONS, PHASE_PRIORITIES, ManifestSchema, BundleConstraintsSchema, BundleSchema, ContributionsSchema, LockfilePackageSchema, LockfileSchema, SharableLayerSchema, SharableForbiddenImportSchema, SharableBoundaryConfigSchema, SharableSecurityRulesSchema, VALID_SCOPES, LINE_PATTERN, START_PATTERN, END_PATTERN, readFile72, writeFile32, unlink22, mkdir22, copyFile2, DEFAULT_FIX_CONFIG, EXPORT_TYPE_KEYWORD, ALWAYS_UNSAFE_TYPES, idCounter, DEAD_CODE_FIX_ACTIONS, MustExportRuleSchema, MustExportDefaultRuleSchema, NoExportRuleSchema, MustImportRuleSchema, NoImportRuleSchema, NamingRuleSchema, MaxExportsRuleSchema, MaxLinesRuleSchema, RequireJSDocRuleSchema, RuleSchema, ConfigPatternSchema, PatternConfigSchema, DriftConfigSchema, DeadCodeConfigSchema, EntropyConfigSchema, BaselineManager, BenchmarkRunner, RegressionDetector, SOURCE_EXTENSIONS, FUNCTION_DECL_RE, CONST_DECL_RE, CriticalPathResolver, NoOpTelemetryAdapter, NoOpExecutor, ConsoleSink, feedbackConfig, ChecklistBuilder, AgentActionEmitter, globalEmitter, FileSink, NoOpSink, ConfidenceTierSchema, RegressionResultSchema, DirectionSchema, CategoryForecastSchema, SpecImpactSignalsSchema, SpecImpactEstimateSchema, ContributingFeatureSchema, AdjustedForecastSchema, PredictionWarningSchema, StabilityForecastSchema, PredictionResultSchema, PredictionOptionsSchema, VALID_STATUSES, EM_DASH, VALID_PRIORITIES, EM_DASH2, H3_NAME, FRONTMATTER, STATUS_RANK, META_FILE, ShardStore, MonolithStore, ALL_CATEGORIES, DIRECTION_THRESHOLD, PredictionEngine, DEFAULT_COEFFICIENTS, SpecImpactEstimator, EMPTY_HISTORY, ViolationHistoryManager, NORMALIZERS, MAX_SAMPLES, DEFAULT_WINDOW_WEEKS, DEFAULT_MIN_OCCURRENCES, FailureEntrySchema, HandoffSchema, GateCheckSchema, GateResultSchema, GateConfigSchema, HarnessStateSchema, DEFAULT_STATE, HARNESS_DIR, STATE_FILE, LEARNINGS_FILE, FAILURES_FILE, HANDOFF_FILE, GATE_CONFIG_FILE, INDEX_FILE, SESSIONS_DIR, SESSION_INDEX_FILE, SUMMARY_FILE, SESSION_STATE_FILE, ARCHIVE_DIR, CONTENT_HASHES_FILE, StreamInfoSchema, StreamIndexSchema, DEFAULT_STREAM_INDEX, EVENT_LOG_FILE, EVENT_BLOBS_DIR, MAX_LINE_BYTES, BLOB_REF_KEY, SNAPSHOT_FILE, STREAMS_DIR, STREAM_NAME_REGEX, branchCache, BRANCH_CACHE_TTL_MS, STATE_FILES, STATE_DIRS, MAX_CACHE_ENTRIES, learningsCacheMap, WEIGHTS, LOCK_RETRIES, LOCK_BACKOFFS, PROMOTABLE_OUTCOMES, failuresCacheMap, FAILURE_LINE_REGEX, SAFE_GATE_COMMAND, event_sourcing_exports, ScopeSchema, envelopeShape, StateImportedPayload, DecisionRecordedPayload, PositionSetPayload, BlockerOpenedPayload, BlockerResolvedPayload, ProgressSetPayload, SessionSummarizedPayload, LANES, LaneSchema, TaskRegisteredPayload, LaneTransitionedPayload, UserInputCapturedPayload, ApprovalRequestedPayload, ApprovalResolvedPayload, EventSchema, BlobRefSchema, StoredEventSchema, cached, localCounters, CORE_HANDLERS, KIND_LABEL, MATERIALIZE_DEBOUNCE_MS, pendingTimers, inflightMaterializes, ensured, TERMINAL_LANES, NON_TERMINAL, TABLE, RuleRegistry, DEFAULT_SECURITY_CONFIG, RuleOverrideSchema, SecurityConfigSchema, secretRules, injectionRules, xssRules, cryptoRules, pathTraversalRules, networkRules, deserializationRules, agentConfigRules, mcpRules, insecureDefaultsRules, sharpEdgesRules, nodeRules, expressRules, reactRules, goRules, SecurityScanner, OSV_ENDPOINT, DEFAULT_CACHE_DIR, DEFAULT_TTL_HOURS, hiddenUnicodePatterns, reRolingPatterns, permissionEscalationPatterns, encodedPayloadPatterns, indirectInjectionPatterns, contextManipulationPatterns, socialEngineeringPatterns, suspiciousPatterns, ALL_PATTERNS, DESTRUCTIVE_BASH, TAINT_DURATION_MS, DEFAULT_SESSION_ID, SecurityCategorySnapshotSchema, SupplyChainSnapshotSchema, SecurityTimelineSnapshotSchema, FindingLifecycleSchema, SecurityTimelineFileSchema, DirectionSchema2, SecurityTrendLineSchema, TrendAttributionSchema, SecurityTrendResultSchema, TimeToFixStatsSchema, TimeToFixResultSchema, EMPTY_SUPPLY_CHAIN, SecurityTimelineManager, ALL_CHECKS, STATUS_ICONS, CINotifier, ExclusionSet, PREFIX_PATTERNS, TEST_FILE_PATTERN, MD_FILE_PATTERN, ALL_DOMAINS, SECURITY_PATTERNS, JS_EXT_FALLBACKS, SEVERITY_RANK, SEVERITY_ORDER, SEVERITY_LABELS, VALIDATED_BY_RANK, VALIDATION_SCORES, DOMAIN_BASELINES, FACTOR_WEIGHTS, EVIDENCE_SATURATION, CORROBORATED_AGREEMENT, STANDALONE_AGREEMENT, AGREEMENT_LINE_GAP, COMPLIANCE_DESCRIPTOR, EXPORT_RE, BUG_DETECTION_DESCRIPTOR, SECURITY_DESCRIPTOR, EVAL_PATTERN, SECRET_PATTERNS, SQL_CONCAT_PATTERN, SHELL_EXEC_PATTERN, ARCHITECTURE_DESCRIPTOR, LARGE_FILE_THRESHOLD, VIOLATION_FILE_RE, LEARNINGS_DESCRIPTOR, RELEVANCE_THRESHOLD, ADVERSARIAL_DESCRIPTOR, UNVERIFIED_INPUT_PATTERN, PROMISE_NO_REJECT_PATTERN, UNGUARDED_OPTIONAL_CALL, COMPOSE_NO_AWAIT, FETCH_NO_TIMEOUT, TYPESCRIPT_STRICT_DESCRIPTOR, EXPLICIT_ANY_PATTERN, TS_IGNORE_PATTERN, UNSAFE_AS_UNKNOWN, NON_NULL_ASSERTION, VAGUE_HELPER_NAME, FRONTEND_RACES_DESCRIPTOR, AGENT_DESCRIPTORS, CONDITIONAL_SUBAGENT_DESCRIPTORS, AGENT_RUNNERS, SUBAGENT_ORDER, RISK_KEYWORDS, EXCLUDED_PATH_PATTERNS, ASYNC_UI_SIGNALS, WORD_BOUNDARY, DOWNGRADE_MAP, DEFAULT_PROVIDER_TIERS, SMALL_SUGGESTION_LINE_LIMIT, FILE_LINE_RANGE_PATTERN, FILE_LINE_PATTERN, FILE_ONLY_PATTERN, SECURITY_SENSITIVE_PATH, MIGRATION_PATH, TEST_PATH, CONFIG_PATH, STAGE_DOMAINS, CI_REVIEW_VERDICT_SCHEMA_VERSION, CI_RUNNERS, CI_ASSESSMENTS, CI_REVIEW_DOMAINS, ReviewFindingSchema, CiReviewVerdictSchema, VERDICT_MAP, RUNNER_PRESETS, VERDICT_MAP2, DEFAULT_EXEC_TIMEOUT_MS, DEFAULT_EXEC_MAX_STDOUT_BYTES, STDERR_CAP_BYTES, STDERR_TAIL_BYTES, defaultExecFile, EMPTY_TIER, EM_DASH3, DEFAULT_MILESTONE, MAX_CLOSEST_MATCHES, MACHINE_ASSIGNEE_PATTERNS, EXTERNAL_ID_RE, RETRY_DEFAULTS, GitHubIssuesSyncAdapter, syncMutex, PRIORITY_RANK, PRIORITY_RANK2, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, ConflictError, DEFAULTS, GitHubHttp, ETagStore, START_MARKER, END_MARKER, SERIALIZER_FIELDS, GitHubIssuesTrackerAdapter, LINEAR_ENDPOINT, EXTERNAL_PREFIX, HISTORY_MARKER, ISSUE_FIELDS, LinearTrackerAdapter, migrate_exports, HASH_RE, DEFAULT_CATCH_ALL, DEFAULT_INTAKE, DEFAULT_MAX_ACTIVE, InteractionTypeSchema, QuestionSchema, ConfirmationSchema, TransitionSchema, EmitInteractionInputSchema, ProjectScanner, SHELL_TEMPLATE, STYLES, SCRIPTS, MockLLMService, llmService, ContentPipeline, BlueprintGenerator, TOKENS_PER_MILLION, fallback_default, LITELLM_PRICING_URL, CACHE_TTL_MS, STALENESS_WARNING_DAYS, MICRODOLLARS_PER_DOLLAR, TOKENS_PER_MILLION2, DAY_MS, StructuralStrategy, DEFAULT_TOKEN_BUDGET, CHARS_PER_TOKEN, TRUNCATION_MARKER, TruncationStrategy, CompactionPipeline, STABILITY_LOOKUP, TIER_ORDER, AnthropicCacheAdapter, TIER_ORDER2, OpenAICacheAdapter, TIER_ORDER3, CACHED_CONTENT_MARKER, GeminiCacheAdapter, VERSION, POSTHOG_BATCH_URL, MAX_ATTEMPTS, TIMEOUT_MS, DEFAULT_CAPACITY, CacheMetricsRecorder, RETRY_BACKOFFS_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_BATCH_SIZE, defaultFetch, defaultWarn, OTLPExporter, SERVICE_NAME_ATTR, SpanKind, ModeSchema, SeveritySchema, TierSchema, StrengthFindingSchema, HarnessConfigSubsetSchema, HookFileSchema, ProjectContextSchema, AuditSummarySchema, AuditResultSchema, SEVERITY_WEIGHTS, clamp, HOOK_SCRIPT_TOKEN, NEVER_BLOCKS, ALWAYS_EXIT_ZERO, EXIT_ZERO_LINE, NONZERO_EXIT, GATE, ERREXIT, strength001NonblockingHooks, BASELINE_REWRITE, strength002Autobaseline, SKIP_RE, strength003SkipList, strength004EmptyThresholds, INIT_SKILL_PATH, DEFAULT_BASIC, strength005LowestTier, AUTO_PATTERN, COMMENT_LINE, NAME_VALUE_LINE, PAT_GATING, REVIEW_SIGNAL, strength006AutoapproveBaseline, CHECK_KEYS, SIGNAL_REGISTRY, HEALTH_SIGNAL_NAMES, CHECK_SIGNAL_MAP, SIGNAL_CATEGORY_MAP, strength007SnapshotSignalMismatch, ALL_RULES, HarnessStrengthAuditor, MAX_TOP_AFFECTED, CompoundLockHeldError, KNOWN_CATEGORIES, SEVERITY_RANK2, DEFAULT_MIN_WAVE_SIZE, ProposalNotFoundError, ProposalConflictError, ALLOWED_FIELD_KEYS, PII_TOKENS, PII_FIELD_DENYLIST, PII_LINE_RE, ALLOWED_SET, PulseAdapterAlreadyRegisteredError, REGISTRY, MOCK_ADAPTER_NAME, ALLOWED_FIELD_SET, adapter, LOOKBACK_RE, MAX_LINES, INLINE_TEMPLATE, TRUNCATION_MARKER2, execFileAsync, FIX_RE, EMPTY_REPO_RE, execFileAsync2, TRACK_CATEGORIES2, STOPWORDS, KEYWORD_TO_CATEGORY, SECTION_ORDER, FILENAME;
16050
16405
  var init_dist3 = __esm({
16051
16406
  "../core/dist/index.mjs"() {
16052
- init_chunk_FYTJQ2ZY();
16053
- init_chunk_S4DTDJ6J();
16054
- init_chunk_MUWJHO2S();
16407
+ init_chunk_OFA2AAZK();
16408
+ init_chunk_IHRT6II2();
16409
+ init_chunk_JZ7UO3OF();
16055
16410
  init_chunk_XKLVJIPL();
16056
16411
  init_chunk_IIEDD47I();
16057
16412
  init_chunk_7P6ASYW6();
@@ -17179,7 +17534,7 @@ var init_dist3 = __esm({
17179
17534
  check: "Context validation",
17180
17535
  passed: graphData.graphExists && graphData.nodeCount > 0,
17181
17536
  severity: "info",
17182
- details: graphData.graphExists ? `Graph loaded: ${graphData.nodeCount} nodes, ${graphData.edgeCount} edges` : "No graph available \u2014 run harness scan to build the knowledge graph"
17537
+ details: graphData.graphExists ? `Graph loaded: ${graphData.nodeCount} nodes, ${graphData.edgeCount} edges` : "No graph available \u2014 run harness graph scan to build the knowledge graph"
17183
17538
  }) : void 0
17184
17539
  )
17185
17540
  );
@@ -22321,6 +22676,7 @@ console.log('Blueprint player initialized.');
22321
22676
  STALENESS_WARNING_DAYS = 7;
22322
22677
  MICRODOLLARS_PER_DOLLAR = 1e6;
22323
22678
  TOKENS_PER_MILLION2 = 1e6;
22679
+ DAY_MS = 24 * 60 * 60 * 1e3;
22324
22680
  StructuralStrategy = class {
22325
22681
  name = "structural";
22326
22682
  lossy = false;
@@ -23035,6 +23391,8 @@ console.log('Blueprint player initialized.');
23035
23391
  lockPath;
23036
23392
  };
23037
23393
  KNOWN_CATEGORIES = new Set(ALL_SOLUTION_CATEGORIES);
23394
+ SEVERITY_RANK2 = { none: 0, low: 1, medium: 2, high: 3 };
23395
+ DEFAULT_MIN_WAVE_SIZE = 3;
23038
23396
  ProposalNotFoundError = class extends Error {
23039
23397
  constructor(id) {
23040
23398
  super(`proposal not found: ${id}`);
@@ -23565,6 +23923,7 @@ export {
23565
23923
  parseExternalId,
23566
23924
  buildExternalId,
23567
23925
  GitHubIssuesSyncAdapter,
23926
+ parseReferencedIssues,
23568
23927
  loadTrackerSyncConfig,
23569
23928
  reconcileDoneFromClosedIssues,
23570
23929
  syncToExternal,
@@ -23616,6 +23975,9 @@ export {
23616
23975
  aggregateBySkill,
23617
23976
  aggregateByDay2,
23618
23977
  topSkills,
23978
+ isAbandonedMidWorkflow,
23979
+ getCatalogRetrospectiveReport,
23980
+ renderRetrospectiveMarkdown,
23619
23981
  StructuralStrategy,
23620
23982
  DEFAULT_TOKEN_BUDGET,
23621
23983
  TruncationStrategy,
@@ -23658,6 +24020,9 @@ export {
23658
24020
  CompoundLockHeldError,
23659
24021
  acquireCompoundLock,
23660
24022
  loadNotificationsConfig,
24023
+ buildTaskGraph,
24024
+ validatePlanTasks,
24025
+ planParallelization,
23661
24026
  proposalsDir,
23662
24027
  ProposalNotFoundError,
23663
24028
  ProposalConflictError,
@@ -7,11 +7,11 @@ import {
7
7
  } from "./chunk-3WGJMBKH.js";
8
8
  import {
9
9
  init_dist as init_dist2
10
- } from "./chunk-MMLQPHZ5.js";
10
+ } from "./chunk-33OU3LYX.js";
11
11
  import {
12
12
  Err,
13
13
  Ok
14
- } from "./chunk-BDGTZRZ6.js";
14
+ } from "./chunk-UEXQMI6K.js";
15
15
  import {
16
16
  init_dist,
17
17
  skipDirGlobs
@@ -72,13 +72,29 @@ var AgentConfigSchema = z.object({
72
72
  /** Routing rules for orchestrator agent dispatch. */
73
73
  routing: RoutingConfigSchema.optional()
74
74
  });
75
+ var DriftConfigSchema = z.object({
76
+ /** Glob patterns for docs to scan for drift (default: docs/**, README) */
77
+ docPaths: z.array(z.string()).optional(),
78
+ /** Flag doc references to code symbols that no longer exist (default: true) */
79
+ checkApiSignatures: z.boolean().optional(),
80
+ /** Check fenced code examples against the codebase (default: true) */
81
+ checkExamples: z.boolean().optional(),
82
+ /** Check documented structure against the filesystem (default: true) */
83
+ checkStructure: z.boolean().optional(),
84
+ /** Regexes matched against a reference to exclude it from drift reporting */
85
+ ignorePatterns: z.array(z.string()).optional(),
86
+ /** Doc-path prefixes whose symbols describe intended future code (ADRs, proposals) */
87
+ forwardLookingPaths: z.array(z.string()).optional()
88
+ });
75
89
  var EntropyConfigSchema = z.object({
76
90
  /** Explicit entry points for reachability analysis (overrides auto-detection) */
77
91
  entryPoints: z.array(z.string()).optional(),
78
92
  /** Patterns to exclude from entropy analysis */
79
93
  excludePatterns: z.array(z.string()).default([...skipDirGlobs(), "**/*.test.ts"]),
80
94
  /** Whether to automatically attempt to fix simple entropy issues */
81
- autoFix: z.boolean().default(false)
95
+ autoFix: z.boolean().default(false),
96
+ /** Documentation-drift detection tuning (scope/disable individual checks) */
97
+ drift: DriftConfigSchema.optional()
82
98
  });
83
99
  var PhaseGateMappingSchema = z.object({
84
100
  /** Pattern for implementation files */