@cardenelabs/cdl 0.80.0 → 0.81.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,39 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.81.0] - 2026-09-27
9
+
10
+ ### Fixed
11
+
12
+ - **速さの判定が機械の混み具合で動かなくなった** (#897 / #898)
13
+
14
+ 軸 `validate-performance-budget` は検査に掛かった時間を壁時計 (`Date.now()`) で測っていた。
15
+ 壁時計は待たされた分も足すため、値が図の性質ではなく機械の混み具合で動く。
16
+
17
+ | 測り方 | 累計の幅 (使う側の図 599 枚を 3 周) |
18
+ |---|---|
19
+ | その検査だけを回す (5 回) | 335..1739ms |
20
+ | 検査を一式回す (5 回) | 806..2468ms |
21
+
22
+ 同じ入力で 7.4 倍ぶれていた。 境の 5000ms に対して最悪 49% なので超えてはいないが、図の
23
+ 枚数は 0.41.1 で軸を作った時の 444 枚から 599 枚に増えており、余裕は枚数の増加だけで減る。
24
+
25
+ CPU 時間で測る形にした。 待っている間は増えないため、同時に他の検査が走っても値が動かない。
26
+ `Date.now()` の 1ms 刻みでは 1 枚あたりがほとんど 0ms に丸まるが、CPU 時間はマイクロ秒で
27
+ 返るため超過時の「重い順」 の内訳も読める。 読む上乗せは 1 回 0.0008ms。
28
+
29
+ ### Added
30
+
31
+ - **掃き出しの返り値が速さの測り方を持つようになった** (#897 / #898)
32
+
33
+ `visualValidateAll` の返り値に `perfClock` (`"cpu"` または `"wall"`) が入る。
34
+ CPU 時間が読めない環境では壁時計に落ちるため、**どちらで測ったかを返り値と超過の文面の
35
+ 2 箇所に出す**。 測り方が変わったのに同じ顔で報告すると、読み手が 2 つの値を同じものとして
36
+ 並べる。
37
+
38
+ 返り値にも出すのは、超過していない周では文面が出ないため。 呼ぶ側が「CPU 時間で測れて
39
+ いるか」 を超過の有無と切り離して確かめられる。
40
+
8
41
  ## [0.80.0] - 2026-09-27
9
42
 
10
43
  ### Fixed
@@ -3279,7 +3312,8 @@ Initial OSS release.
3279
3312
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
3280
3313
  行き止まりになる。
3281
3314
 
3282
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.80.0...HEAD
3315
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.81.0...HEAD
3316
+ [0.81.0]: https://github.com/cardene777/cdl/compare/v0.80.0...v0.81.0
3283
3317
  [0.80.0]: https://github.com/cardene777/cdl/compare/v0.79.0...v0.80.0
3284
3318
  [0.79.0]: https://github.com/cardene777/cdl/compare/v0.78.0...v0.79.0
3285
3319
  [0.78.0]: https://github.com/cardene777/cdl/compare/v0.77.0...v0.78.0
package/dist/index.cjs CHANGED
@@ -18411,11 +18411,12 @@ function runAxes(laid, diag, violations, counts, push, profile, skippedAxes, \u5
18411
18411
  }
18412
18412
  function visualValidateAll(diagrams, opts) {
18413
18413
  \u5668\u3092\u78BA\u304B\u3081\u308B(opts?.container);
18414
+ const \u6642\u8A08 = perfClock();
18414
18415
  const durations = [];
18415
18416
  const reports = diagrams.map((d) => {
18416
- const start = Date.now();
18417
+ const \u6B62\u3081\u308B = \u6642\u8A08.\u6E2C\u308B();
18417
18418
  const r = visualValidate(d, opts);
18418
- durations.push(Date.now() - start);
18419
+ durations.push(\u6B62\u3081\u308B());
18419
18420
  return r;
18420
18421
  });
18421
18422
  const fail = reports.filter((r) => !r.ok).length;
@@ -18425,7 +18426,7 @@ function visualValidateAll(diagrams, opts) {
18425
18426
  totalCounts[axis] += r.counts[axis];
18426
18427
  }
18427
18428
  }
18428
- const metaViolations = validateMetaAxes(totalCounts, diagrams, durations, reports);
18429
+ const metaViolations = validateMetaAxes(totalCounts, diagrams, durations, reports, \u6642\u8A08.kind);
18429
18430
  return {
18430
18431
  total: reports.length,
18431
18432
  pass: reports.length - fail,
@@ -18434,12 +18435,35 @@ function visualValidateAll(diagrams, opts) {
18434
18435
  totalCounts,
18435
18436
  profile: opts?.profile ?? "production",
18436
18437
  skippedAxes: [...SKIPPED_AXES[opts?.profile ?? "production"]],
18437
- metaViolations
18438
+ metaViolations,
18439
+ perfClock: \u6642\u8A08.kind
18438
18440
  };
18439
18441
  }
18440
18442
  var PERF_BUDGET_TOTAL_MS = 5e3;
18443
+ function perfClock() {
18444
+ const cpu = globalThis.process?.cpuUsage;
18445
+ if (typeof cpu === "function") {
18446
+ return {
18447
+ kind: "cpu",
18448
+ \u6E2C\u308B: () => {
18449
+ const \u59CB\u3081 = cpu();
18450
+ return () => {
18451
+ const \u5DEE = cpu(\u59CB\u3081);
18452
+ return (\u5DEE.user + \u5DEE.system) / 1e3;
18453
+ };
18454
+ }
18455
+ };
18456
+ }
18457
+ return {
18458
+ kind: "wall",
18459
+ \u6E2C\u308B: () => {
18460
+ const \u59CB\u3081 = Date.now();
18461
+ return () => Date.now() - \u59CB\u3081;
18462
+ }
18463
+ };
18464
+ }
18441
18465
  var PERF_SLOWEST_SAMPLE = 5;
18442
- function perfBudgetViolations(durations, diagrams = []) {
18466
+ function perfBudgetViolations(durations, diagrams = [], clock) {
18443
18467
  const total = durations.reduce((s, d) => s + d, 0);
18444
18468
  if (total <= PERF_BUDGET_TOTAL_MS) return [];
18445
18469
  const \u91CD\u3044\u9806 = durations.map((ms, i) => ({ id: diagrams[i]?.id ?? "?", ms })).sort((a, b) => b.ms - a.ms);
@@ -18450,12 +18474,13 @@ function perfBudgetViolations(durations, diagrams = []) {
18450
18474
  {
18451
18475
  axis: "validate-performance-budget",
18452
18476
  diagramId: "__meta__",
18453
- detail: `visualValidateAll \u5168 ${durations.length} \u56F3\u306E\u7D2F\u8A08 ${total}ms > ${PERF_BUDGET_TOTAL_MS}ms budget (\u91CD\u3044\u9806 ${\u5185\u8A33})`,
18477
+ detail: `visualValidateAll \u5168 ${durations.length} \u56F3\u306E\u7D2F\u8A08 ${total}ms > ${PERF_BUDGET_TOTAL_MS}ms budget (\u91CD\u3044\u9806 ${\u5185\u8A33})` + // 測り方が変わったのに同じ顔で報告すると、読み手が 2 つの値を同じものとして並べる
18478
+ (clock === void 0 ? "" : `\u3001 \u6E2C\u308A\u65B9 ${clock === "cpu" ? "CPU \u6642\u9593" : "\u58C1\u6642\u8A08 (CPU \u6642\u9593\u304C\u8AAD\u3081\u306A\u3044)"}`),
18454
18479
  severity: "warn"
18455
18480
  }
18456
18481
  ];
18457
18482
  }
18458
- function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports = []) {
18483
+ function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports = [], clock) {
18459
18484
  const out = [];
18460
18485
  const totalErrors = reports.reduce(
18461
18486
  (sum, r) => sum + r.violations.filter((v) => v.severity === "error").length,
@@ -18470,7 +18495,7 @@ function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports =
18470
18495
  severity: "warn"
18471
18496
  });
18472
18497
  }
18473
- out.push(...perfBudgetViolations(durations, diagrams));
18498
+ out.push(...perfBudgetViolations(durations, diagrams, clock));
18474
18499
  const DEAD_ALLOWLIST = [
18475
18500
  // catalog で自然発火なしを許容する security / migration / performance / meta / dev-quality axis 群。
18476
18501
  // 実 diagram に該当データ (XSS / migration list / oversized / broken doc) が混入するのが稀なため。