@validation-os/dashboard 0.16.1 → 0.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -586,6 +586,9 @@ interface PipelineRow {
586
586
  nextMove: string;
587
587
  /** The assumption's Question Type (DEV-5890) — kind of claim. */
588
588
  questionType: string | null;
589
+ /** The max ceiling for this question type (highest anchor across all
590
+ * rungs) — the Known meter fills relative to this, not the absolute 100. */
591
+ questionTypeCeiling: number | null;
589
592
  /** The assumption's Stage (DEV-5890) — kind of response / threshold. */
590
593
  stage: string | null;
591
594
  /** The stage's Risk threshold (DEV-5890) — the stopping bar. */
package/dist/index.js CHANGED
@@ -1802,10 +1802,7 @@ function ThresholdBar({
1802
1802
  stage,
1803
1803
  cleared
1804
1804
  }) {
1805
- const riskTrackMax = Math.max(risk, threshold) * 1.25;
1806
- const riskPct = Math.min(100, risk / riskTrackMax * 100);
1807
- const thresholdPct = Math.min(100, threshold / riskTrackMax * 100);
1808
- const confPct = Math.min(100, Math.abs(confidence2));
1805
+ const confPct = Math.min(100, Math.max(0, Math.abs(confidence2)));
1809
1806
  const confFloorPct = Math.min(100, confFloor);
1810
1807
  const riskBelow = risk <= threshold;
1811
1808
  const confAbove = confidence2 >= confFloor;
@@ -1813,49 +1810,30 @@ function ThresholdBar({
1813
1810
  return /* @__PURE__ */ jsxs4("div", { className: "vos-card vos-threshold-bar-card", children: [
1814
1811
  /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-header", children: [
1815
1812
  /* @__PURE__ */ jsxs4("span", { className: "vos-threshold-bar-title", children: [
1816
- stage,
1817
- " evidence bar",
1813
+ "Evidence needed",
1818
1814
  /* @__PURE__ */ jsx4("span", { className: "vos-threshold-bar-stage-tag", children: stage })
1819
1815
  ] }),
1820
1816
  /* @__PURE__ */ jsx4("span", { className: `vos-threshold-bar-status vos-threshold-bar-${tone}`, children: cleared ? "Cleared" : "Needs evidence" })
1821
1817
  ] }),
1822
1818
  /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-section", children: [
1823
1819
  /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-section-label", children: [
1824
- /* @__PURE__ */ jsx4("span", { children: "Risk" }),
1825
- /* @__PURE__ */ jsx4("span", { className: "vos-num vos-threshold-bar-section-val", children: Math.round(risk) }),
1820
+ /* @__PURE__ */ jsx4("span", { children: "Confidence" }),
1821
+ /* @__PURE__ */ jsx4("span", { className: "vos-num vos-threshold-bar-section-val", children: formatSigned(confidence2) }),
1826
1822
  /* @__PURE__ */ jsxs4("span", { className: "vos-threshold-bar-section-target", children: [
1827
- "bar \u2264 ",
1828
- threshold
1823
+ "need \u2265 ",
1824
+ confFloor,
1825
+ " ",
1826
+ cleared ? "\u2713" : ""
1829
1827
  ] })
1830
1828
  ] }),
1831
- /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-track", children: [
1829
+ /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-track vos-threshold-bar-track-tall", children: [
1832
1830
  /* @__PURE__ */ jsx4(
1833
1831
  "div",
1834
1832
  {
1835
- className: `vos-threshold-bar-fill vos-fill-${riskBelow ? "good" : tone}`,
1836
- style: { width: `${riskPct}%` }
1833
+ className: "vos-threshold-bar-target-zone",
1834
+ style: { left: `${confFloorPct}%` }
1837
1835
  }
1838
1836
  ),
1839
- /* @__PURE__ */ jsx4(
1840
- "div",
1841
- {
1842
- className: "vos-threshold-bar-marker",
1843
- style: { left: `${thresholdPct}%` },
1844
- title: `Risk threshold: ${threshold}`
1845
- }
1846
- )
1847
- ] })
1848
- ] }),
1849
- /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-section", children: [
1850
- /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-section-label", children: [
1851
- /* @__PURE__ */ jsx4("span", { children: "Confidence" }),
1852
- /* @__PURE__ */ jsx4("span", { className: "vos-num vos-threshold-bar-section-val", children: formatSigned(confidence2) }),
1853
- /* @__PURE__ */ jsxs4("span", { className: "vos-threshold-bar-section-target", children: [
1854
- "floor \u2265 ",
1855
- confFloor
1856
- ] })
1857
- ] }),
1858
- /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-track vos-threshold-bar-track-conf", children: [
1859
1837
  /* @__PURE__ */ jsx4(
1860
1838
  "div",
1861
1839
  {
@@ -1866,14 +1844,32 @@ function ThresholdBar({
1866
1844
  /* @__PURE__ */ jsx4(
1867
1845
  "div",
1868
1846
  {
1869
- className: "vos-threshold-bar-marker vos-threshold-bar-marker-conf",
1847
+ className: "vos-threshold-bar-marker",
1870
1848
  style: { left: `${confFloorPct}%` },
1871
- title: `Confidence floor: ${confFloor}`
1849
+ title: `Need Confidence \u2265 ${confFloor} for ${stage}`,
1850
+ children: /* @__PURE__ */ jsx4("span", { className: "vos-threshold-bar-marker-label vos-num", children: confFloor })
1872
1851
  }
1873
1852
  )
1853
+ ] }),
1854
+ /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-scale", children: [
1855
+ /* @__PURE__ */ jsx4("span", { className: "vos-num", children: "0" }),
1856
+ /* @__PURE__ */ jsx4("span", { className: "vos-num vos-threshold-bar-scale-mid", children: "50" }),
1857
+ /* @__PURE__ */ jsx4("span", { className: "vos-num", children: "100" })
1874
1858
  ] })
1875
1859
  ] }),
1876
- /* @__PURE__ */ jsx4("div", { className: "vos-threshold-bar-hint", children: cleared ? `Risk ${Math.round(risk)} \u2264 ${threshold} and Confidence ${formatSigned(confidence2)} \u2265 ${confFloor} \u2014 cleared for ${stage}.` : `Risk ${Math.round(risk)} ${riskBelow ? "\u2264" : ">"} ${threshold}, Confidence ${formatSigned(confidence2)} ${confAbove ? "\u2265" : "<"} ${confFloor} \u2014 needs ${!riskBelow ? "lower Risk" : ""}${!riskBelow && !confAbove ? " + " : ""}${!confAbove ? "higher Confidence" : ""}.` })
1860
+ /* @__PURE__ */ jsxs4("div", { className: "vos-threshold-bar-risk-summary", children: [
1861
+ /* @__PURE__ */ jsxs4("span", { className: `vos-threshold-bar-risk-val vos-text-${riskBelow ? "good" : "crit"}`, children: [
1862
+ "Risk ",
1863
+ Math.round(risk)
1864
+ ] }),
1865
+ /* @__PURE__ */ jsxs4("span", { className: "vos-threshold-bar-risk-cap", children: [
1866
+ "max ",
1867
+ threshold,
1868
+ " for ",
1869
+ stage
1870
+ ] })
1871
+ ] }),
1872
+ /* @__PURE__ */ jsx4("div", { className: "vos-threshold-bar-hint", children: cleared ? `Confidence ${formatSigned(confidence2)} \u2265 ${confFloor} and Risk ${Math.round(risk)} \u2264 ${threshold} \u2014 cleared for ${stage}.` : `Need Confidence \u2265 ${confFloor}${!confAbove ? ` (now ${formatSigned(confidence2)})` : " \u2713"} and Risk \u2264 ${threshold}${!riskBelow ? ` (now ${Math.round(risk)})` : " \u2713"}.` })
1877
1873
  ] });
1878
1874
  }
1879
1875
  function riskTone(risk) {
@@ -2210,7 +2206,11 @@ import {
2210
2206
  assumptionCompleteness,
2211
2207
  readingBeliefInputs
2212
2208
  } from "@validation-os/core";
2213
- import { confidenceFloorForStage as confidenceFloorForStage2, riskThresholdForStage as riskThresholdForStage2 } from "@validation-os/core/derivation";
2209
+ import {
2210
+ confidenceFloorForStage as confidenceFloorForStage2,
2211
+ riskThresholdForStage as riskThresholdForStage2,
2212
+ RUNG_ANCHOR as RUNG_ANCHOR3
2213
+ } from "@validation-os/core/derivation";
2214
2214
 
2215
2215
  // src/stage-grid-model.ts
2216
2216
  var STAGE_ORDER = [
@@ -2407,6 +2407,13 @@ function buildPipeline(assumptions, experiments) {
2407
2407
  const framed = assumptionCompleteness(a);
2408
2408
  const stage = deriveBeliefStage({ framed, confidence: d.confidence, test });
2409
2409
  const questionType = str3(a["Question Type"]);
2410
+ let questionTypeCeiling = null;
2411
+ if (questionType && questionType in RUNG_ANCHOR3) {
2412
+ const subLadder = RUNG_ANCHOR3[questionType];
2413
+ questionTypeCeiling = Math.max(
2414
+ ...Object.values(subLadder).map((r) => r.High)
2415
+ );
2416
+ }
2410
2417
  const stageName = str3(a.Stage);
2411
2418
  const stageKey = stageName && STAGE_ORDER.includes(stageName) ? stageName : null;
2412
2419
  const riskThreshold = stageKey ? riskThresholdForStage2(stageKey) : null;
@@ -2425,6 +2432,7 @@ function buildPipeline(assumptions, experiments) {
2425
2432
  tested: stage.tested,
2426
2433
  nextMove: nextMove(stage.stage, stage.killZone),
2427
2434
  questionType,
2435
+ questionTypeCeiling,
2428
2436
  stage: stageName,
2429
2437
  riskThreshold,
2430
2438
  clearedThreshold: riskThreshold != null ? d.risk <= riskThreshold && (confFloor == null || stage.confidence >= confFloor) : null
@@ -2919,7 +2927,8 @@ function PipelineBoard({
2919
2927
  }
2920
2928
  function PipelineRowView({ row, onOpen }) {
2921
2929
  const stripeTone = row.riskTone;
2922
- const knownPct = Math.max(0, Math.min(100, Math.abs(row.confidence)));
2930
+ const ceiling = row.questionTypeCeiling ?? 99;
2931
+ const knownPct = Math.max(0, Math.min(100, Math.abs(row.confidence) / ceiling * 100));
2923
2932
  const knownSign = row.confSign;
2924
2933
  return /* @__PURE__ */ jsxs5("div", { className: "vos-pipe-row vos-pipe-row-2seg", children: [
2925
2934
  /* @__PURE__ */ jsx5("div", { className: `vos-pipe-stripe vos-fill-${stripeTone}` }),