@prismatic-io/lux 0.0.2-preview.32 → 0.0.2-preview.35

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 (114) hide show
  1. package/lib/assertions/rubric/index.d.ts.map +1 -1
  2. package/lib/assertions/rubric/index.js +10 -1
  3. package/lib/assertions/rubric/index.js.map +1 -1
  4. package/lib/assertions/rubric/internal.d.ts.map +1 -1
  5. package/lib/assertions/rubric/internal.js +22 -13
  6. package/lib/assertions/rubric/internal.js.map +1 -1
  7. package/lib/cli/output-schemas.d.ts +6 -2
  8. package/lib/cli/output-schemas.d.ts.map +1 -1
  9. package/lib/cli/output-schemas.js +5 -2
  10. package/lib/cli/output-schemas.js.map +1 -1
  11. package/lib/cli/render/format.d.ts.map +1 -1
  12. package/lib/cli/render/format.js +1 -1
  13. package/lib/cli/render/format.js.map +1 -1
  14. package/lib/cli/render/reporter.js +2 -2
  15. package/lib/cli/render/reporter.js.map +1 -1
  16. package/lib/core/artifact-evidence.d.ts +6 -1
  17. package/lib/core/artifact-evidence.d.ts.map +1 -1
  18. package/lib/core/artifact-evidence.js +27 -6
  19. package/lib/core/artifact-evidence.js.map +1 -1
  20. package/lib/core/experiment.d.ts +1 -0
  21. package/lib/core/experiment.d.ts.map +1 -1
  22. package/lib/core/experiment.js +5 -1
  23. package/lib/core/experiment.js.map +1 -1
  24. package/lib/drivers/claude-code/index.d.ts +7 -0
  25. package/lib/drivers/claude-code/index.d.ts.map +1 -1
  26. package/lib/drivers/claude-code/index.js +12 -1
  27. package/lib/drivers/claude-code/index.js.map +1 -1
  28. package/lib/drivers/codex/config.d.ts +3 -0
  29. package/lib/drivers/codex/config.d.ts.map +1 -1
  30. package/lib/drivers/codex/config.js +9 -0
  31. package/lib/drivers/codex/config.js.map +1 -1
  32. package/lib/drivers/codex/index.d.ts +4 -0
  33. package/lib/drivers/codex/index.d.ts.map +1 -1
  34. package/lib/drivers/codex/index.js +2 -0
  35. package/lib/drivers/codex/index.js.map +1 -1
  36. package/lib/drivers/shared/experiment-behavior.d.ts +1 -1
  37. package/lib/drivers/shared/experiment-behavior.d.ts.map +1 -1
  38. package/lib/drivers/shared/experiment-behavior.js +3 -0
  39. package/lib/drivers/shared/experiment-behavior.js.map +1 -1
  40. package/lib/drivers/shared/experiment-policy.d.ts.map +1 -1
  41. package/lib/drivers/shared/experiment-policy.js +1 -0
  42. package/lib/drivers/shared/experiment-policy.js.map +1 -1
  43. package/lib/drivers/shared/skills.d.ts +3 -0
  44. package/lib/drivers/shared/skills.d.ts.map +1 -0
  45. package/lib/drivers/shared/skills.js +73 -0
  46. package/lib/drivers/shared/skills.js.map +1 -0
  47. package/lib/orchestrator/compare.d.ts +4 -3
  48. package/lib/orchestrator/compare.d.ts.map +1 -1
  49. package/lib/orchestrator/compare.js +13 -6
  50. package/lib/orchestrator/compare.js.map +1 -1
  51. package/lib/orchestrator/experiment-contracts.d.ts +1 -0
  52. package/lib/orchestrator/experiment-contracts.d.ts.map +1 -1
  53. package/lib/orchestrator/experiment-effects.d.ts.map +1 -1
  54. package/lib/orchestrator/experiment-effects.js +4 -2
  55. package/lib/orchestrator/experiment-effects.js.map +1 -1
  56. package/lib/orchestrator/experiment-evaluation.d.ts.map +1 -1
  57. package/lib/orchestrator/experiment-evaluation.js +15 -2
  58. package/lib/orchestrator/experiment-evaluation.js.map +1 -1
  59. package/lib/orchestrator/experiment-report.d.ts +1 -0
  60. package/lib/orchestrator/experiment-report.d.ts.map +1 -1
  61. package/lib/orchestrator/experiment-runs.d.ts +2 -0
  62. package/lib/orchestrator/experiment-runs.d.ts.map +1 -1
  63. package/lib/orchestrator/experiment-selection.d.ts.map +1 -1
  64. package/lib/orchestrator/experiment-selection.js +99 -43
  65. package/lib/orchestrator/experiment-selection.js.map +1 -1
  66. package/lib/orchestrator/grading.d.ts +1 -0
  67. package/lib/orchestrator/grading.d.ts.map +1 -1
  68. package/lib/orchestrator/grading.js +7 -0
  69. package/lib/orchestrator/grading.js.map +1 -1
  70. package/lib/orchestrator/list-runs.d.ts.map +1 -1
  71. package/lib/orchestrator/list-runs.js +3 -5
  72. package/lib/orchestrator/list-runs.js.map +1 -1
  73. package/lib/orchestrator/paired-effects.d.ts.map +1 -1
  74. package/lib/orchestrator/paired-effects.js +7 -1
  75. package/lib/orchestrator/paired-effects.js.map +1 -1
  76. package/lib/orchestrator/suite-compare.d.ts.map +1 -1
  77. package/lib/orchestrator/suite-compare.js +18 -6
  78. package/lib/orchestrator/suite-compare.js.map +1 -1
  79. package/lib/orchestrator/suite-summary.d.ts +2 -0
  80. package/lib/orchestrator/suite-summary.d.ts.map +1 -1
  81. package/lib/orchestrator/suite-summary.js +6 -2
  82. package/lib/orchestrator/suite-summary.js.map +1 -1
  83. package/lib/previewer/server.d.ts.map +1 -1
  84. package/lib/previewer/server.js +2 -1
  85. package/lib/previewer/server.js.map +1 -1
  86. package/package.json +2 -1
  87. package/skills/lux-answerer/SKILL.md +1 -1
  88. package/src/assertions/rubric/index.ts +10 -1
  89. package/src/assertions/rubric/internal.ts +27 -13
  90. package/src/cli/output-schemas.ts +5 -2
  91. package/src/cli/render/format.ts +1 -1
  92. package/src/cli/render/reporter.ts +2 -2
  93. package/src/core/artifact-evidence.ts +40 -5
  94. package/src/core/experiment.ts +7 -1
  95. package/src/drivers/claude-code/index.ts +12 -1
  96. package/src/drivers/codex/config.ts +9 -0
  97. package/src/drivers/codex/index.ts +2 -0
  98. package/src/drivers/shared/experiment-behavior.ts +5 -2
  99. package/src/drivers/shared/experiment-policy.ts +1 -0
  100. package/src/drivers/shared/skills.ts +74 -0
  101. package/src/orchestrator/compare.ts +23 -9
  102. package/src/orchestrator/experiment-effects.ts +4 -2
  103. package/src/orchestrator/experiment-evaluation.ts +18 -2
  104. package/src/orchestrator/experiment-selection.ts +101 -18
  105. package/src/orchestrator/grading.ts +11 -0
  106. package/src/orchestrator/list-runs.ts +5 -6
  107. package/src/orchestrator/paired-effects.ts +6 -1
  108. package/src/orchestrator/suite-compare.ts +19 -5
  109. package/src/orchestrator/suite-summary.ts +7 -2
  110. package/src/previewer/server.ts +2 -0
  111. package/viewer/app.css +32 -0
  112. package/viewer/charts.js +16 -4
  113. package/viewer/detail.js +26 -8
  114. package/viewer/format.js +2 -2
package/viewer/detail.js CHANGED
@@ -1,10 +1,16 @@
1
+ const assertionScore = (assertion) =>
2
+ assertion.errorMessage !== undefined || assertion.abstention !== undefined
3
+ ? null
4
+ : assertion.score;
5
+
1
6
  const assertionPresentation = (assertion) => {
7
+ if (assertionScore(assertion) === null) return { className: " unavailable", mark: "?", tone: "" };
2
8
  if (assertion.passed === null) return { className: " informational", mark: "ℹ", tone: "" };
3
9
  if (assertion.passed) return { className: " passed", mark: "✓", tone: "tone-positive" };
4
10
  return { className: "", mark: "×", tone: "tone-negative" };
5
11
  };
6
12
 
7
- import { comparisonBars, compositionFigure, quantizedBar } from "./charts.js";
13
+ import { comparisonBars, compositionFigure, quantizedBar, scoreBar } from "./charts.js";
8
14
  import {
9
15
  badge,
10
16
  compactNumber,
@@ -104,6 +110,7 @@ const assertionMeta = (assertion) =>
104
110
  const assertionDiagnostics = (assertion) => {
105
111
  const rows = [
106
112
  assertion.comment ? `<p class="assertion-comment">${escapeHtml(assertion.comment)}</p>` : "",
113
+ assertion.abstention ? `<p class="assertion-comment">Insufficient evidence</p>` : "",
107
114
  assertion.errorMessage
108
115
  ? `<p class="diagnostic-error">${escapeHtml(assertion.errorMessage)}</p>`
109
116
  : "",
@@ -118,6 +125,7 @@ const assertionDiagnostics = (assertion) => {
118
125
 
119
126
  const inferredMetricUnit = (name, unit) => {
120
127
  if (unit) return unit;
128
+ if (name === "score") return "score";
121
129
  if (name.endsWith("Ms")) return "milliseconds";
122
130
  if (name.endsWith(".bytes")) return "bytes";
123
131
  if (name.endsWith(".usd")) return "usd";
@@ -323,18 +331,18 @@ export const renderRunDetail = (item, detail) => {
323
331
  <span class="assertion-content">
324
332
  <strong>${escapeHtml(assertion.name)}</strong>
325
333
  <small>${escapeHtml(assertionMeta(assertion))}</small>
326
- ${quantizedBar(
327
- assertion.score,
334
+ ${scoreBar(
335
+ assertionScore(assertion),
328
336
  assertionPresentation(assertion).tone,
329
337
  `${assertion.name} scored ${percentage(
330
- assertion.score,
338
+ assertionScore(assertion),
331
339
  )}${assertion.passed === null ? " (informational)" : `; threshold ${percentage(assertion.threshold)}`}`,
332
340
  assertion.passed === null ? null : assertion.threshold,
333
341
  )}
334
342
  ${assertionDiagnostics(assertion)}
335
343
  </span>
336
344
  <span class="assertion-score">${escapeHtml(
337
- percentage(assertion.score),
345
+ percentage(assertionScore(assertion)),
338
346
  )}</span>
339
347
  </article>`,
340
348
  )
@@ -899,18 +907,20 @@ export const renderRunComparison = (payload, labels) => {
899
907
  runDelta?.agentUsageAvailable?.b === false ? null : totalTokens(runDelta?.usage?.b?.agent);
900
908
  const tokenDelta = tokenA === null || tokenB === null ? null : tokenB - tokenA;
901
909
  const scoreDelta =
910
+ comparison.grading.caseScoreComparable !== false &&
902
911
  typeof comparison.grading.caseScoreA === "number" &&
903
912
  typeof comparison.grading.caseScoreB === "number"
904
913
  ? comparison.grading.caseScoreB - comparison.grading.caseScoreA
905
914
  : null;
915
+ let comparisonStatus = "ungraded";
916
+ if (payload.regressed === true) comparisonStatus = "failed";
917
+ if (payload.regressed === false) comparisonStatus = "passed";
906
918
  const driverMetrics = driverMetricComparisons(runDelta);
907
919
  const subagentsA = subagentTotals(runDelta?.agentActivity?.a);
908
920
  const subagentsB = subagentTotals(runDelta?.agentActivity?.b);
909
921
  return `
910
922
  <header class="detail-header comparison-header">
911
- <div class="detail-kicker">${badge(
912
- comparison.grading.regressions ? "failed" : "passed",
913
- )}<span>run comparison</span></div>
923
+ <div class="detail-kicker">${badge(comparisonStatus)}<span>run comparison</span></div>
914
924
  <div class="detail-title-row">
915
925
  <div><h2>${escapeHtml(labels.before)} → ${escapeHtml(
916
926
  labels.after,
@@ -926,6 +936,7 @@ export const renderRunComparison = (payload, labels) => {
926
936
  )}. Treat deltas as potentially incomparable.</div>`
927
937
  : '<div class="integrity-banner">✓ Case, evaluator, runtime, and driver identities are comparable</div>'
928
938
  }
939
+ ${comparison.grading.caseScoreComparable === false ? '<div class="attention-banner">Score change unavailable: scored assertions or weights differ, or evidence is missing.</div>' : ""}
929
940
  <dl class="comparison-stats">
930
941
  <div><dt>Case score</dt><dd>${escapeHtml(
931
942
  `${percentage(comparison.grading.caseScoreA)} → ${percentage(
@@ -956,6 +967,7 @@ export const renderRunComparison = (payload, labels) => {
956
967
  <div class="comparison-plot-grid">
957
968
  ${comparisonBars({
958
969
  title: "Case score",
970
+ continuous: true,
959
971
  before: comparison.grading.caseScoreA,
960
972
  after: comparison.grading.caseScoreB,
961
973
  maximum: 1,
@@ -1051,6 +1063,12 @@ export const renderRunComparison = (payload, labels) => {
1051
1063
  value: comparison.grading.deltas.filter((delta) => delta.status === "removed")
1052
1064
  .length,
1053
1065
  },
1066
+ {
1067
+ key: "unavailable",
1068
+ label: "Unavailable",
1069
+ value: comparison.grading.deltas.filter((delta) => delta.status === "unavailable")
1070
+ .length,
1071
+ },
1054
1072
  {
1055
1073
  key: "unchanged",
1056
1074
  label: "Unchanged",
package/viewer/format.js CHANGED
@@ -6,11 +6,11 @@ export const escapeHtml = (value) =>
6
6
  );
7
7
 
8
8
  export const percentage = (value) =>
9
- typeof value === "number" ? `${Math.round(value * 100)}%` : "—";
9
+ typeof value === "number" ? `${Number((value * 100).toPrecision(15))}%` : "—";
10
10
 
11
11
  export const signedPercentage = (value) => {
12
12
  if (typeof value !== "number") return "—";
13
- const rounded = Math.round(value * 1_000) / 10;
13
+ const rounded = Number((value * 100).toPrecision(15));
14
14
  return `${rounded > 0 ? "+" : ""}${rounded}%`;
15
15
  };
16
16