@harness-engineering/cli 4.1.0 → 4.3.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 (75) hide show
  1. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +31 -0
  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/codex/harness-autopilot/SKILL.md +31 -0
  8. package/dist/agents/skills/codex/harness-catalog-retrospective/SKILL.md +124 -0
  9. package/dist/agents/skills/codex/harness-catalog-retrospective/skill.yaml +48 -0
  10. package/dist/agents/skills/codex/harness-execution/SKILL.md +13 -0
  11. package/dist/agents/skills/codex/harness-parallel-agents/SKILL.md +3 -0
  12. package/dist/agents/skills/codex/harness-planning/SKILL.md +3 -1
  13. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +31 -0
  14. package/dist/agents/skills/cursor/harness-catalog-retrospective/SKILL.md +124 -0
  15. package/dist/agents/skills/cursor/harness-catalog-retrospective/skill.yaml +48 -0
  16. package/dist/agents/skills/cursor/harness-execution/SKILL.md +13 -0
  17. package/dist/agents/skills/cursor/harness-parallel-agents/SKILL.md +3 -0
  18. package/dist/agents/skills/cursor/harness-planning/SKILL.md +3 -1
  19. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +31 -0
  20. package/dist/agents/skills/gemini-cli/harness-catalog-retrospective/SKILL.md +124 -0
  21. package/dist/agents/skills/gemini-cli/harness-catalog-retrospective/skill.yaml +48 -0
  22. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +13 -0
  23. package/dist/agents/skills/gemini-cli/harness-parallel-agents/SKILL.md +3 -0
  24. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +3 -1
  25. package/dist/{agents-md-7L4PKKOM.js → agents-md-N4ULMUAK.js} +4 -4
  26. package/dist/{analyzer-XRCV63KC-HLTEIKAJ.js → analyzer-XRCV63KC-WGRHW2ZM.js} +2 -2
  27. package/dist/{architecture-RCHFDI7E.js → architecture-OIMIBDJC.js} +5 -5
  28. package/dist/{assess-project-YUDPNRS6.js → assess-project-ITSB6W4L.js} +1 -1
  29. package/dist/bin/harness-mcp.js +15 -15
  30. package/dist/bin/harness.js +26 -26
  31. package/dist/{check-phase-gate-56GS3A72.js → check-phase-gate-GN4X7HT6.js} +5 -5
  32. package/dist/{chunk-N4AI2WFH.js → chunk-574JCBYH.js} +2 -2
  33. package/dist/{chunk-RY2U77OY.js → chunk-5BUHPOCP.js} +7 -7
  34. package/dist/{chunk-IGWJRAJT.js → chunk-6NEJPS7W.js} +2 -2
  35. package/dist/{chunk-NCMJXBEO.js → chunk-73QZ43DF.js} +2 -2
  36. package/dist/{chunk-YJYUJSWK.js → chunk-7RH2NTLA.js} +1 -1
  37. package/dist/{chunk-XZNCONFG.js → chunk-CMU4DNLY.js} +1 -1
  38. package/dist/{chunk-UACYZCW4.js → chunk-CRHQYBDA.js} +396 -13
  39. package/dist/{chunk-4SKWGVYD.js → chunk-D7A5JR7M.js} +2 -2
  40. package/dist/{chunk-P4NA5OQX.js → chunk-GTHL3TRZ.js} +2 -2
  41. package/dist/{chunk-ZU6T7W3U.js → chunk-H5GN7R43.js} +2 -2
  42. package/dist/{chunk-YXOPQEFZ.js → chunk-HJYAXAYQ.js} +2 -2
  43. package/dist/{chunk-Z4XWWNYX.js → chunk-HSYU3RUW.js} +203 -92
  44. package/dist/{chunk-Y33P35U3.js → chunk-JZL2O3RC.js} +5 -5
  45. package/dist/{chunk-XW5XVVMI.js → chunk-LP764MGR.js} +3 -3
  46. package/dist/{chunk-Y5HPJMTM.js → chunk-LTYVAKWK.js} +2 -2
  47. package/dist/{chunk-DGVT4DBI.js → chunk-MEDRUIRO.js} +3 -3
  48. package/dist/{chunk-GSYBGOY3.js → chunk-MIZQY35D.js} +2 -2
  49. package/dist/{chunk-YWRPQZL7.js → chunk-NEMB36N4.js} +2 -2
  50. package/dist/{chunk-GLHLXTKC.js → chunk-PT65VY4S.js} +6 -6
  51. package/dist/{chunk-AU4YPEIE.js → chunk-T46G6YNI.js} +3 -3
  52. package/dist/{chunk-ABRYIEWJ.js → chunk-TDPQZAEE.js} +1069 -853
  53. package/dist/{chunk-VG4G3R2V.js → chunk-TKPAOB2T.js} +2 -2
  54. package/dist/{chunk-RZQZXWEL.js → chunk-U2NOOATF.js} +6 -6
  55. package/dist/{chunk-BDGTZRZ6.js → chunk-VJDSB7CI.js} +159 -85
  56. package/dist/{chunk-OZSKLJQW.js → chunk-XKILFNRK.js} +2 -2
  57. package/dist/{ci-workflow-TFAA5BK7.js → ci-workflow-PA3WL6WK.js} +4 -4
  58. package/dist/{dist-MCTEX5QH.js → dist-BWFFVKEW.js} +34 -4
  59. package/dist/{dist-ICW4QUEW.js → dist-ISDDHDOR.js} +19 -3
  60. package/dist/{docs-BBMAN3CY.js → docs-HOTWQJQF.js} +5 -5
  61. package/dist/{engine-R2YH74AL.js → engine-MVG2SPGD.js} +4 -4
  62. package/dist/{entropy-5UP5N6AF.js → entropy-3B4U2BTF.js} +5 -5
  63. package/dist/{feedback-6MDCCFZL.js → feedback-WIWWDVUC.js} +1 -1
  64. package/dist/{generate-agent-definitions-KKAN5DB5.js → generate-agent-definitions-KPRHY6X3.js} +5 -5
  65. package/dist/index.js +25 -25
  66. package/dist/{loader-2WT2ZE2T.js → loader-SPJ2ZGYW.js} +4 -4
  67. package/dist/{mcp-5V4LPMB3.js → mcp-RIPEYDMU.js} +15 -15
  68. package/dist/{performance-2N3CFXLR.js → performance-JYFS27B3.js} +5 -5
  69. package/dist/{review-pipeline-XZIGBU3Q.js → review-pipeline-BDT6Y6QV.js} +4 -4
  70. package/dist/{runtime-POME3GTR.js → runtime-ZEPHPPQJ.js} +4 -4
  71. package/dist/{security-QLJLMSIW.js → security-FWSDTTEW.js} +1 -1
  72. package/dist/{state-events-YY5KBZTC.js → state-events-PBDNQPXT.js} +4 -4
  73. package/dist/{validate-VZORVK43.js → validate-XIMNCIKR.js} +5 -5
  74. package/dist/{validate-cross-check-OYKEDCST.js → validate-cross-check-H2OUHTID.js} +4 -4
  75. package/package.json +8 -8
@@ -31,7 +31,7 @@ import {
31
31
  resetParserCache,
32
32
  resolveFileToLayer,
33
33
  validateDependencies
34
- } from "./chunk-YJYUJSWK.js";
34
+ } from "./chunk-7RH2NTLA.js";
35
35
  import {
36
36
  AuthAuditEntrySchema,
37
37
  AuthTokenPublicSchema,
@@ -44,6 +44,9 @@ import {
44
44
  GatewayEventSchema,
45
45
  INDEXED_FILE_KINDS,
46
46
  INSIGHTS_KEYS,
47
+ ModelProposalActionSchema,
48
+ ModelProposalContentSchema,
49
+ ModelProposalStatusSchema,
47
50
  NotificationActionSchema,
48
51
  NotificationDeliveryResultSchema,
49
52
  NotificationEnvelopeSchema,
@@ -55,19 +58,23 @@ import {
55
58
  OTLPKeyValueSchema,
56
59
  OTLPSpanSchema,
57
60
  Ok,
61
+ PlanTaskSchema,
58
62
  PromptCacheStatsSchema,
59
63
  ProposalContentSchema,
60
64
  ProposalDecisionSchema,
61
65
  ProposalGateFindingSchema,
62
66
  ProposalGateSchema,
63
67
  ProposalKindSchema,
68
+ ProposalSchema,
64
69
  ProposalSourceSchema,
65
70
  ProposalStatusSchema,
71
+ ProposalTypeSchema,
66
72
  REQUIRED_STRATEGY_SECTIONS,
67
73
  SESSIONS_DEFAULTS,
68
74
  SESSION_SECTION_NAMES,
69
75
  STANDARD_COGNITIVE_MODES,
70
76
  SessionSummarySchema,
77
+ SkillKindSchema,
71
78
  SkillProposalSchema,
72
79
  SkillProvenanceSchema,
73
80
  TokenScopeSchema,
@@ -78,8 +85,9 @@ import {
78
85
  WebhookSubscriptionSchema,
79
86
  init_dist,
80
87
  isErr,
81
- isOk
82
- } from "./chunk-BDGTZRZ6.js";
88
+ isOk,
89
+ migrateProposalRecord
90
+ } from "./chunk-VJDSB7CI.js";
83
91
  import {
84
92
  DEFAULT_SKIP_DIRS,
85
93
  GraphStore,
@@ -1361,6 +1369,9 @@ __export(dist_exports, {
1361
1369
  ManifestSchema: () => ManifestSchema,
1362
1370
  MetricResultSchema: () => MetricResultSchema,
1363
1371
  ModeSchema: () => ModeSchema,
1372
+ ModelProposalActionSchema: () => ModelProposalActionSchema,
1373
+ ModelProposalContentSchema: () => ModelProposalContentSchema,
1374
+ ModelProposalStatusSchema: () => ModelProposalStatusSchema,
1364
1375
  ModuleSizeCollector: () => ModuleSizeCollector,
1365
1376
  MonolithStore: () => MonolithStore,
1366
1377
  NoOpExecutor: () => NoOpExecutor,
@@ -1383,6 +1394,7 @@ __export(dist_exports, {
1383
1394
  PII_LINE_RE: () => PII_LINE_RE,
1384
1395
  PII_TOKENS: () => PII_TOKENS,
1385
1396
  PatternConfigSchema: () => PatternConfigSchema,
1397
+ PlanTaskSchema: () => PlanTaskSchema,
1386
1398
  PredictionEngine: () => PredictionEngine,
1387
1399
  PredictionOptionsSchema: () => PredictionOptionsSchema,
1388
1400
  PredictionRegressionResultSchema: () => RegressionResultSchema,
@@ -1398,8 +1410,10 @@ __export(dist_exports, {
1398
1410
  ProposalGateSchema: () => ProposalGateSchema,
1399
1411
  ProposalKindSchema: () => ProposalKindSchema,
1400
1412
  ProposalNotFoundError: () => ProposalNotFoundError,
1413
+ ProposalSchema: () => ProposalSchema,
1401
1414
  ProposalSourceSchema: () => ProposalSourceSchema,
1402
1415
  ProposalStatusSchema: () => ProposalStatusSchema,
1416
+ ProposalTypeSchema: () => ProposalTypeSchema,
1403
1417
  PulseAdapterAlreadyRegisteredError: () => PulseAdapterAlreadyRegisteredError,
1404
1418
  PulseConfigSchema: () => PulseConfigSchema,
1405
1419
  PulseDbSourceSchema: () => PulseDbSourceSchema,
@@ -1439,6 +1453,7 @@ __export(dist_exports, {
1439
1453
  SharableLayerSchema: () => SharableLayerSchema,
1440
1454
  SharableSecurityRulesSchema: () => SharableSecurityRulesSchema,
1441
1455
  ShardStore: () => ShardStore,
1456
+ SkillKindSchema: () => SkillKindSchema,
1442
1457
  SkillProposalSchema: () => SkillProposalSchema,
1443
1458
  SkillProvenanceSchema: () => SkillProvenanceSchema,
1444
1459
  SolutionDocFrontmatterSchema: () => SolutionDocFrontmatterSchema,
@@ -1522,6 +1537,7 @@ __export(dist_exports, {
1522
1537
  buildExternalId: () => buildExternalId,
1523
1538
  buildProjectContext: () => buildProjectContext,
1524
1539
  buildSnapshot: () => buildSnapshot,
1540
+ buildTaskGraph: () => buildTaskGraph,
1525
1541
  calculateCacheSavings: () => calculateCacheSavings,
1526
1542
  calculateCost: () => calculateCost,
1527
1543
  calibrateDepth: () => calibrateDepth,
@@ -1564,6 +1580,7 @@ __export(dist_exports, {
1564
1580
  createError: () => createError,
1565
1581
  createFixes: () => createFixes,
1566
1582
  createForbiddenImportFixes: () => createForbiddenImportFixes,
1583
+ createModelProposal: () => createModelProposal,
1567
1584
  createNodeRoadmapIO: () => createNodeRoadmapIO,
1568
1585
  createOrphanedDepFixes: () => createOrphanedDepFixes,
1569
1586
  createOsvClient: () => createOsvClient,
@@ -1633,6 +1650,7 @@ __export(dist_exports, {
1633
1650
  generateRubric: () => generateRubric,
1634
1651
  generateSuggestions: () => generateSuggestions,
1635
1652
  getActionEmitter: () => getActionEmitter,
1653
+ getCatalogRetrospectiveReport: () => getCatalogRetrospectiveReport,
1636
1654
  getExitCode: () => getExitCode,
1637
1655
  getFeedbackConfig: () => getFeedbackConfig,
1638
1656
  getInjectionPatterns: () => getInjectionPatterns,
@@ -1654,6 +1672,7 @@ __export(dist_exports, {
1654
1672
  injectionRules: () => injectionRules,
1655
1673
  insecureDefaultsRules: () => insecureDefaultsRules,
1656
1674
  invalidateCheckState: () => invalidateCheckState,
1675
+ isAbandonedMidWorkflow: () => isAbandonedMidWorkflow,
1657
1676
  isBadPort: () => isBadPort,
1658
1677
  isClaimableBy: () => isClaimableBy,
1659
1678
  isDuplicateFinding: () => isDuplicateFinding,
@@ -1692,6 +1711,7 @@ __export(dist_exports, {
1692
1711
  markProtectedFindings: () => markProtectedFindings,
1693
1712
  mcpRules: () => mcpRules,
1694
1713
  migrate: () => migrate_exports,
1714
+ migrateProposalRecord: () => migrateProposalRecord,
1695
1715
  migrateToStreams: () => migrateToStreams,
1696
1716
  needsMergeOursDriverWarning: () => needsMergeOursDriverWarning,
1697
1717
  networkRules: () => networkRules,
@@ -1726,6 +1746,7 @@ __export(dist_exports, {
1726
1746
  parseSize: () => parseSize,
1727
1747
  parseStrategyDoc: () => parseStrategyDoc,
1728
1748
  pathTraversalRules: () => pathTraversalRules,
1749
+ planParallelization: () => planParallelization,
1729
1750
  presetKind: () => presetKind,
1730
1751
  previewFix: () => previewFix,
1731
1752
  projectValue: () => projectValue,
@@ -1752,6 +1773,7 @@ __export(dist_exports, {
1752
1773
  release: () => release,
1753
1774
  removeContributions: () => removeContributions,
1754
1775
  removeProvenance: () => removeProvenance,
1776
+ renderRetrospectiveMarkdown: () => renderRetrospectiveMarkdown,
1755
1777
  requestMultiplePeerReviews: () => requestMultiplePeerReviews,
1756
1778
  requestPeerReview: () => requestPeerReview,
1757
1779
  resetFeedbackConfig: () => resetFeedbackConfig,
@@ -1839,6 +1861,7 @@ __export(dist_exports, {
1839
1861
  validateFindings: () => validateFindings,
1840
1862
  validateKnowledgeMap: () => validateKnowledgeMap,
1841
1863
  validatePatternConfig: () => validatePatternConfig,
1864
+ validatePlanTasks: () => validatePlanTasks,
1842
1865
  validatePulseConfig: () => validatePulseConfig,
1843
1866
  validateRoadmapMode: () => validateRoadmapMode,
1844
1867
  validateSolutionsDir: () => validateSolutionsDir,
@@ -14658,6 +14681,157 @@ function aggregateByDay2(records) {
14658
14681
  function topSkills(records, n) {
14659
14682
  return aggregateBySkill(records).slice(0, n);
14660
14683
  }
14684
+ function isAbandonedMidWorkflow(record) {
14685
+ if (record.outcome === "abandoned") return true;
14686
+ return record.outcome !== "completed" && record.phasesReached.length > 0;
14687
+ }
14688
+ function resolveNowMs(records, now) {
14689
+ if (now) return now.getTime();
14690
+ let latest = Number.NEGATIVE_INFINITY;
14691
+ for (const record of records) {
14692
+ const t = Date.parse(record.startedAt);
14693
+ if (!Number.isNaN(t) && t > latest) latest = t;
14694
+ }
14695
+ return latest === Number.NEGATIVE_INFINITY ? Date.now() : latest;
14696
+ }
14697
+ function buildStat(skill, records, nowMs) {
14698
+ const invocations = records.length;
14699
+ const failures = records.filter((r) => r.outcome === "failed").length;
14700
+ const abandoned = records.filter(isAbandonedMidWorkflow).length;
14701
+ const timestamps = records.map((r) => r.startedAt).sort();
14702
+ const lastUsed = timestamps[timestamps.length - 1];
14703
+ const daysSinceLastUse = Math.floor((nowMs - Date.parse(lastUsed)) / DAY_MS);
14704
+ return {
14705
+ skill,
14706
+ invocations,
14707
+ failures,
14708
+ failureRate: failures / invocations,
14709
+ abandonedMidWorkflow: abandoned,
14710
+ lastUsed,
14711
+ daysSinceLastUse
14712
+ };
14713
+ }
14714
+ function groupBySkill(records) {
14715
+ const map = /* @__PURE__ */ new Map();
14716
+ for (const record of records) {
14717
+ const bucket = map.get(record.skill);
14718
+ if (bucket) bucket.push(record);
14719
+ else map.set(record.skill, [record]);
14720
+ }
14721
+ return map;
14722
+ }
14723
+ function computeCoverage(invokedSkills, catalogSkills) {
14724
+ if (!catalogSkills) {
14725
+ return { catalogSize: null, everInvoked: null, neverInvoked: null };
14726
+ }
14727
+ const catalog = new Set(catalogSkills);
14728
+ let everInvoked = 0;
14729
+ for (const skill of catalog) {
14730
+ if (invokedSkills.has(skill)) everInvoked++;
14731
+ }
14732
+ return {
14733
+ catalogSize: catalog.size,
14734
+ everInvoked,
14735
+ neverInvoked: catalog.size - everInvoked
14736
+ };
14737
+ }
14738
+ function getCatalogRetrospectiveReport(records, options = {}) {
14739
+ const inactiveDaysThreshold = options.inactiveDays ?? 90;
14740
+ const topN = options.topN ?? 10;
14741
+ const nowMs = resolveNowMs(records, options.now);
14742
+ const generatedAt = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
14743
+ const bySkill = groupBySkill(records);
14744
+ const stats = Array.from(bySkill.entries()).map(([skill, recs]) => buildStat(skill, recs, nowMs));
14745
+ const topInvoked = [...stats].sort((a, b) => b.invocations - a.invocations || a.skill.localeCompare(b.skill)).slice(0, topN);
14746
+ const topFailing = stats.filter((s) => s.failures > 0).sort(
14747
+ (a, b) => b.failures - a.failures || b.failureRate - a.failureRate || a.skill.localeCompare(b.skill)
14748
+ ).slice(0, topN);
14749
+ const abandonedMidWorkflow = stats.filter((s) => s.abandonedMidWorkflow > 0).sort(
14750
+ (a, b) => b.abandonedMidWorkflow - a.abandonedMidWorkflow || a.skill.localeCompare(b.skill)
14751
+ ).slice(0, topN);
14752
+ const staleSkills = stats.filter((s) => s.daysSinceLastUse >= inactiveDaysThreshold).sort((a, b) => b.daysSinceLastUse - a.daysSinceLastUse || a.skill.localeCompare(b.skill));
14753
+ const timestamps = records.map((r) => r.startedAt).sort();
14754
+ const windowStart = timestamps[0] ?? null;
14755
+ const windowEnd = timestamps[timestamps.length - 1] ?? null;
14756
+ const windowDays = windowStart && windowEnd ? Math.max(0, Math.round((Date.parse(windowEnd) - Date.parse(windowStart)) / DAY_MS)) : 0;
14757
+ return {
14758
+ generatedAt,
14759
+ windowStart,
14760
+ windowEnd,
14761
+ windowDays,
14762
+ totalRecords: records.length,
14763
+ distinctSkills: bySkill.size,
14764
+ inactiveDaysThreshold,
14765
+ topN,
14766
+ topInvoked,
14767
+ topFailing,
14768
+ abandonedMidWorkflow,
14769
+ staleSkills,
14770
+ coverage: computeCoverage(new Set(bySkill.keys()), options.catalogSkills)
14771
+ };
14772
+ }
14773
+ function formatRate(rate) {
14774
+ return `${(rate * 100).toFixed(0)}%`;
14775
+ }
14776
+ function statRow(s) {
14777
+ return `| \`${s.skill}\` | ${s.invocations} | ${s.failures} (${formatRate(s.failureRate)}) | ${s.abandonedMidWorkflow} | ${s.lastUsed.slice(0, 10)} |`;
14778
+ }
14779
+ function renderStatSection(title, rows, emptyNote) {
14780
+ if (rows.length === 0) return `### ${title}
14781
+
14782
+ _${emptyNote}_
14783
+ `;
14784
+ const header = "| Skill | Invocations | Failures | Abandoned mid-workflow | Last used |\n| ----- | ----------- | -------- | ---------------------- | --------- |";
14785
+ return `### ${title}
14786
+
14787
+ ${header}
14788
+ ${rows.map(statRow).join("\n")}
14789
+ `;
14790
+ }
14791
+ function renderOverview(report) {
14792
+ const lines = ["## Overview", "", `- **Generated:** ${report.generatedAt}`];
14793
+ if (report.windowStart && report.windowEnd) {
14794
+ lines.push(
14795
+ `- **Window:** ${report.windowStart.slice(0, 10)} \u2192 ${report.windowEnd.slice(0, 10)} (${report.windowDays} days)`
14796
+ );
14797
+ } else {
14798
+ lines.push("- **Window:** no records");
14799
+ }
14800
+ lines.push(`- **Records:** ${report.totalRecords} across ${report.distinctSkills} skill(s)`);
14801
+ const { catalogSize, everInvoked, neverInvoked } = report.coverage;
14802
+ if (catalogSize != null && everInvoked != null && neverInvoked != null) {
14803
+ lines.push(
14804
+ `- **Telemetry coverage:** ${everInvoked}/${catalogSize} catalog skills have emitted telemetry (${neverInvoked} never invoked)`
14805
+ );
14806
+ }
14807
+ return lines.join("\n");
14808
+ }
14809
+ function staleEmptyNote(report) {
14810
+ const base = `No ever-invoked skill is inactive \u2265${report.inactiveDaysThreshold} days.`;
14811
+ if (report.windowDays < report.inactiveDaysThreshold) {
14812
+ return `${base} Note: the record window (${report.windowDays} days) is shorter than the threshold, so this signal cannot fire yet.`;
14813
+ }
14814
+ return base;
14815
+ }
14816
+ function renderRetrospectiveMarkdown(report) {
14817
+ const sections = [
14818
+ `# Catalog Retrospective \u2014 ${report.generatedAt.slice(0, 10)}`,
14819
+ renderOverview(report),
14820
+ renderStatSection("Top skills by invocations", report.topInvoked, "No invocations recorded."),
14821
+ renderStatSection("Top failing skills", report.topFailing, "No failing skills recorded."),
14822
+ renderStatSection(
14823
+ "Abandoned mid-workflow",
14824
+ report.abandonedMidWorkflow,
14825
+ "No abandoned-mid-workflow runs recorded."
14826
+ ),
14827
+ renderStatSection(
14828
+ `Stale skills (inactive \u2265${report.inactiveDaysThreshold} days)`,
14829
+ report.staleSkills,
14830
+ staleEmptyNote(report)
14831
+ )
14832
+ ];
14833
+ return sections.join("\n\n").trimEnd() + "\n";
14834
+ }
14661
14835
  function isEmptyObject(v) {
14662
14836
  return typeof v === "object" && v !== null && !Array.isArray(v) && Object.keys(v).length === 0;
14663
14837
  }
@@ -15150,7 +15324,7 @@ function arrayLen(arr) {
15150
15324
  return Array.isArray(arr) ? arr.length : 0;
15151
15325
  }
15152
15326
  async function gatherEntropyBlock(projectPath) {
15153
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-XRCV63KC-HLTEIKAJ.js");
15327
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-XRCV63KC-WGRHW2ZM.js");
15154
15328
  const analyzer = new EntropyAnalyzer2({
15155
15329
  rootDir: projectPath,
15156
15330
  include: ["src/**/*.ts", "src/**/*.tsx", "packages/*/src/**/*.ts"],
@@ -15364,6 +15538,185 @@ ${issues}`));
15364
15538
  }
15365
15539
  return Ok(result.data);
15366
15540
  }
15541
+ function footprintOf(task) {
15542
+ const files = task.files || [];
15543
+ const owns = task.owns || [];
15544
+ return /* @__PURE__ */ new Set([...files, ...owns]);
15545
+ }
15546
+ function shareFootprint(a, b) {
15547
+ if (!a || !b) return false;
15548
+ for (const item of a) {
15549
+ if (b.has(item)) return true;
15550
+ }
15551
+ return false;
15552
+ }
15553
+ function addDependency(deps, consumer, producer) {
15554
+ if (!consumer || !producer) return;
15555
+ const consumerDeps = deps.get(consumer.id);
15556
+ if (consumerDeps) consumerDeps.add(producer.id);
15557
+ }
15558
+ function toGraphNode(task, deps) {
15559
+ const set = deps.get(task.id) || /* @__PURE__ */ new Set();
15560
+ return { id: task.id, dependsOn: [...set].sort() };
15561
+ }
15562
+ function buildTaskGraph(tasks) {
15563
+ const footprints = tasks.map(footprintOf);
15564
+ const deps = /* @__PURE__ */ new Map();
15565
+ for (const task of tasks) {
15566
+ deps.set(task.id, new Set(task.dependsOn || []));
15567
+ }
15568
+ for (let i = 0; i < tasks.length; i++) {
15569
+ for (let j = i + 1; j < tasks.length; j++) {
15570
+ if (shareFootprint(footprints[i], footprints[j])) {
15571
+ addDependency(deps, tasks[j], tasks[i]);
15572
+ }
15573
+ }
15574
+ }
15575
+ return tasks.map((task) => toGraphNode(task, deps));
15576
+ }
15577
+ function validatePlanTasks(tasks) {
15578
+ const errors = [];
15579
+ const warnings = [];
15580
+ const index = /* @__PURE__ */ new Map();
15581
+ tasks.forEach((t, i) => index.set(t.id, i));
15582
+ for (const t of tasks) {
15583
+ for (const dep of t.dependsOn || []) {
15584
+ if (!index.has(dep)) {
15585
+ errors.push(`Task "${t.id}" depends on unknown task id "${dep}".`);
15586
+ continue;
15587
+ }
15588
+ if (index.get(dep) > index.get(t.id)) {
15589
+ warnings.push(
15590
+ `Task "${t.id}" depends on "${dep}" which is declared later (consumer before producer).`
15591
+ );
15592
+ }
15593
+ }
15594
+ }
15595
+ const { cyclic } = findParallelGroups(buildTaskGraph(tasks));
15596
+ if (cyclic.length > 0) {
15597
+ errors.push(`Dependency cycle detected among tasks: ${cyclic.join(", ")}.`);
15598
+ }
15599
+ return { errors, warnings };
15600
+ }
15601
+ function waveSeverity(taskIds, conflicts) {
15602
+ const set = new Set(taskIds);
15603
+ let max = "none";
15604
+ for (const c of conflicts.conflicts) {
15605
+ if (!set.has(c.taskA) || !set.has(c.taskB)) continue;
15606
+ if (SEVERITY_RANK2[c.severity] > SEVERITY_RANK2[max]) max = c.severity;
15607
+ }
15608
+ return max;
15609
+ }
15610
+ function classifyFiring(severity, waveSize, minWaveSize, analysisLevel) {
15611
+ if (severity === "high") {
15612
+ return {
15613
+ firing: "serialize",
15614
+ reason: "high-severity conflicts predicted \u2014 running these tasks sequentially"
15615
+ };
15616
+ }
15617
+ if (waveSize < minWaveSize) {
15618
+ return {
15619
+ firing: "serialize",
15620
+ reason: `only ${waveSize} independent task(s), below minimum wave size ${minWaveSize} \u2014 running serially`
15621
+ };
15622
+ }
15623
+ if (severity === "medium") {
15624
+ return {
15625
+ firing: "confirm",
15626
+ reason: "medium-severity conflicts predicted \u2014 one confirmation before dispatch"
15627
+ };
15628
+ }
15629
+ if (analysisLevel === "file-only") {
15630
+ return {
15631
+ firing: "confirm",
15632
+ reason: "graph unavailable (file-only analysis) \u2014 transitive conflicts unknown, one confirmation before dispatch"
15633
+ };
15634
+ }
15635
+ return {
15636
+ firing: "auto-dispatch",
15637
+ reason: `${waveSize} independent tasks, ${severity === "none" ? "no" : severity} conflict severity, graph-expanded analysis \u2014 dispatching in parallel`
15638
+ };
15639
+ }
15640
+ function narrate(waves, reasons, serialized, cyclic, nodes) {
15641
+ const depMap = /* @__PURE__ */ new Map();
15642
+ for (const node of nodes) depMap.set(node.id, node.dependsOn);
15643
+ const cyclicSet = new Set(cyclic);
15644
+ const serializedSet = new Set(serialized);
15645
+ const labelDep = (id) => {
15646
+ if (cyclicSet.has(id)) return `${id} (cyclic)`;
15647
+ if (serializedSet.has(id)) return `${id} (serialized)`;
15648
+ return id;
15649
+ };
15650
+ const lines = [
15651
+ `Parallelization: ${waves.length} wave(s), ${serialized.length} serialized, ${cyclic.length} cyclic.`
15652
+ ];
15653
+ waves.forEach((w, i) => {
15654
+ const waveSet = new Set(w.tasks);
15655
+ const blocking = [...new Set(w.tasks.flatMap((t) => depMap.get(t) ?? []))].filter((id) => !waveSet.has(id)).sort();
15656
+ const crossBucket = blocking.some((id) => serializedSet.has(id));
15657
+ const waitClause = blocking.length ? `waits on ${blocking.map(labelDep).join(", ")}${crossBucket ? " (cross-bucket prerequisite gates this wave)" : ""}` : "no upstream dependencies (root wave)";
15658
+ lines.push(
15659
+ `Wave ${i + 1} [${w.tasks.join(", ")}]: ${waitClause}; ${w.firing}: ${reasons[i] ?? ""}.`
15660
+ );
15661
+ });
15662
+ if (serialized.length > 0) {
15663
+ lines.push(
15664
+ `Serialized (run sequentially): [${serialized.join(
15665
+ ", "
15666
+ )}] \u2014 high-severity conflict members or dependency-cycle members.`
15667
+ );
15668
+ }
15669
+ if (cyclic.length > 0) {
15670
+ lines.push(
15671
+ `Cyclic (blocked): [${cyclic.join(", ")}] \u2014 dependency cycle; resolve before scheduling.`
15672
+ );
15673
+ }
15674
+ return lines.join("\n");
15675
+ }
15676
+ function highRiskGroupMembers(conflicts) {
15677
+ const members = [];
15678
+ for (const group of conflicts.groups) {
15679
+ if (group.length > 1) members.push(...group);
15680
+ }
15681
+ return members;
15682
+ }
15683
+ function planParallelization(input) {
15684
+ const { tasks, conflicts } = input;
15685
+ const minWaveSize = input.minWaveSize ?? DEFAULT_MIN_WAVE_SIZE;
15686
+ const nodes = buildTaskGraph(tasks);
15687
+ const { waves: rawWaves, cyclic } = findParallelGroups(nodes);
15688
+ const serializedSet = new Set(cyclic);
15689
+ for (const id of highRiskGroupMembers(conflicts)) serializedSet.add(id);
15690
+ const serialized = [...serializedSet].sort();
15691
+ const depMap = /* @__PURE__ */ new Map();
15692
+ for (const node of nodes) depMap.set(node.id, node.dependsOn);
15693
+ const reasons = [];
15694
+ const waves = rawWaves.map((taskIds) => taskIds.filter((id) => !serializedSet.has(id))).filter((taskIds) => taskIds.length > 0).map((taskIds) => {
15695
+ const severity = waveSeverity(taskIds, conflicts);
15696
+ let { firing, reason } = classifyFiring(
15697
+ severity,
15698
+ taskIds.length,
15699
+ minWaveSize,
15700
+ conflicts.analysisLevel
15701
+ );
15702
+ const waveSet = new Set(taskIds);
15703
+ const crossBucketUpstream = [...new Set(taskIds.flatMap((t) => depMap.get(t) ?? []))].filter((id) => !waveSet.has(id) && serializedSet.has(id)).sort();
15704
+ if (crossBucketUpstream.length > 0 && firing === "auto-dispatch") {
15705
+ firing = "confirm";
15706
+ reason = `depends on ${crossBucketUpstream.join(
15707
+ ", "
15708
+ )} running in the serialized/cyclic channel \u2014 cross-bucket prerequisite not parallel-safe, one confirmation before dispatch`;
15709
+ }
15710
+ reasons.push(reason);
15711
+ return { tasks: taskIds, severity, firing, analysisLevel: conflicts.analysisLevel };
15712
+ });
15713
+ return {
15714
+ waves,
15715
+ serialized,
15716
+ cyclic,
15717
+ narration: narrate(waves, reasons, serialized, cyclic, nodes)
15718
+ };
15719
+ }
15367
15720
  function proposalsDir(projectPath) {
15368
15721
  return path51.join(projectPath, ".harness", "proposals");
15369
15722
  }
@@ -15384,7 +15737,8 @@ async function createProposal(projectPath, input) {
15384
15737
  const proposal = SkillProposalSchema.parse({
15385
15738
  id,
15386
15739
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
15387
- kind: validated.kind,
15740
+ kind: "skill",
15741
+ skillKind: validated.kind,
15388
15742
  targetSkill: validated.targetSkill,
15389
15743
  proposedBy: validated.proposedBy,
15390
15744
  source: {
@@ -15395,11 +15749,9 @@ async function createProposal(projectPath, input) {
15395
15749
  content: validated.content,
15396
15750
  status: "open"
15397
15751
  });
15398
- if (proposal.kind === "refinement" && proposal.targetSkill) {
15752
+ if (proposal.skillKind === "refinement" && proposal.targetSkill) {
15399
15753
  const existing = await listProposals(projectPath, { status: "open" });
15400
- const clash = existing.find(
15401
- (p) => p.kind === "refinement" && p.targetSkill === proposal.targetSkill
15402
- );
15754
+ const clash = existing.filter((p) => p.kind === "skill").find((p) => p.skillKind === "refinement" && p.targetSkill === proposal.targetSkill);
15403
15755
  if (clash) {
15404
15756
  throw new ProposalConflictError(
15405
15757
  `An open refinement proposal already exists for skill "${proposal.targetSkill}" (id: ${clash.id})`
@@ -15411,11 +15763,27 @@ async function createProposal(projectPath, input) {
15411
15763
  writeAtomic(proposalPath(projectPath, id), JSON.stringify(proposal, null, 2));
15412
15764
  return proposal;
15413
15765
  }
15766
+ async function createModelProposal(projectPath, content, opts = {}) {
15767
+ const id = `proposal_${randomUUID2().replace(/-/g, "")}`;
15768
+ const record = ProposalSchema.parse({
15769
+ id,
15770
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
15771
+ kind: "model",
15772
+ proposedBy: opts.proposedBy ?? "orchestrator",
15773
+ source: opts.source ?? { justification: content.justification.summary },
15774
+ model: content,
15775
+ status: "open"
15776
+ });
15777
+ const dir = proposalsDir(projectPath);
15778
+ ensureDir(dir);
15779
+ writeAtomic(proposalPath(projectPath, id), JSON.stringify(record, null, 2));
15780
+ return record;
15781
+ }
15414
15782
  async function getProposal(projectPath, id) {
15415
15783
  const file = proposalPath(projectPath, id);
15416
15784
  try {
15417
15785
  const raw = fs49.readFileSync(file, "utf-8");
15418
- const parsed = SkillProposalSchema.safeParse(JSON.parse(raw));
15786
+ const parsed = ProposalSchema.safeParse(JSON.parse(raw));
15419
15787
  return parsed.success ? parsed.data : null;
15420
15788
  } catch {
15421
15789
  return null;
@@ -15436,6 +15804,7 @@ async function listProposals(projectPath, opts = {}) {
15436
15804
  const proposal = await getProposal(projectPath, id);
15437
15805
  if (!proposal) continue;
15438
15806
  if (opts.status && opts.status !== "all" && proposal.status !== opts.status) continue;
15807
+ if (opts.kind && proposal.kind !== opts.kind) continue;
15439
15808
  out.push(proposal);
15440
15809
  }
15441
15810
  out.sort((a, b) => a.createdAt > b.createdAt ? -1 : a.createdAt < b.createdAt ? 1 : 0);
@@ -15444,13 +15813,16 @@ async function listProposals(projectPath, opts = {}) {
15444
15813
  async function updateProposal(projectPath, id, patch) {
15445
15814
  const current = await getProposal(projectPath, id);
15446
15815
  if (!current) throw new ProposalNotFoundError(id);
15447
- const next = SkillProposalSchema.parse({
15816
+ const base = {
15448
15817
  ...current,
15449
15818
  ...patch,
15450
15819
  id: current.id,
15451
15820
  createdAt: current.createdAt,
15452
15821
  kind: current.kind
15453
- });
15822
+ };
15823
+ const next = ProposalSchema.parse(
15824
+ current.kind === "skill" ? { ...base, skillKind: current.skillKind } : base
15825
+ );
15454
15826
  writeAtomic(proposalPath(projectPath, id), JSON.stringify(next, null, 2));
15455
15827
  return next;
15456
15828
  }
@@ -16063,7 +16435,7 @@ function writeStrategyDoc(doc, opts) {
16063
16435
  throw e;
16064
16436
  }
16065
16437
  }
16066
- 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;
16438
+ 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;
16067
16439
  var init_dist3 = __esm({
16068
16440
  "../core/dist/index.mjs"() {
16069
16441
  init_chunk_OFA2AAZK();
@@ -16103,6 +16475,7 @@ var init_dist3 = __esm({
16103
16475
  init_dist();
16104
16476
  init_dist();
16105
16477
  init_dist();
16478
+ init_dist();
16106
16479
  WHATWG_BAD_PORTS = Object.freeze([
16107
16480
  1,
16108
16481
  7,
@@ -22338,6 +22711,7 @@ console.log('Blueprint player initialized.');
22338
22711
  STALENESS_WARNING_DAYS = 7;
22339
22712
  MICRODOLLARS_PER_DOLLAR = 1e6;
22340
22713
  TOKENS_PER_MILLION2 = 1e6;
22714
+ DAY_MS = 24 * 60 * 60 * 1e3;
22341
22715
  StructuralStrategy = class {
22342
22716
  name = "structural";
22343
22717
  lossy = false;
@@ -23052,6 +23426,8 @@ console.log('Blueprint player initialized.');
23052
23426
  lockPath;
23053
23427
  };
23054
23428
  KNOWN_CATEGORIES = new Set(ALL_SOLUTION_CATEGORIES);
23429
+ SEVERITY_RANK2 = { none: 0, low: 1, medium: 2, high: 3 };
23430
+ DEFAULT_MIN_WAVE_SIZE = 3;
23055
23431
  ProposalNotFoundError = class extends Error {
23056
23432
  constructor(id) {
23057
23433
  super(`proposal not found: ${id}`);
@@ -23634,6 +24010,9 @@ export {
23634
24010
  aggregateBySkill,
23635
24011
  aggregateByDay2,
23636
24012
  topSkills,
24013
+ isAbandonedMidWorkflow,
24014
+ getCatalogRetrospectiveReport,
24015
+ renderRetrospectiveMarkdown,
23637
24016
  StructuralStrategy,
23638
24017
  DEFAULT_TOKEN_BUDGET,
23639
24018
  TruncationStrategy,
@@ -23676,10 +24055,14 @@ export {
23676
24055
  CompoundLockHeldError,
23677
24056
  acquireCompoundLock,
23678
24057
  loadNotificationsConfig,
24058
+ buildTaskGraph,
24059
+ validatePlanTasks,
24060
+ planParallelization,
23679
24061
  proposalsDir,
23680
24062
  ProposalNotFoundError,
23681
24063
  ProposalConflictError,
23682
24064
  createProposal,
24065
+ createModelProposal,
23683
24066
  getProposal,
23684
24067
  listProposals,
23685
24068
  updateProposal,