ucn 5.5.3 → 5.6.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 (71) hide show
  1. package/.claude/skills/ucn/SKILL.md +35 -12
  2. package/.claude/skills/ucn/references/commands.md +18 -14
  3. package/.claude/skills/ucn/references/resolution-rules.md +4 -0
  4. package/.claude/skills/ucn/references/trust-contract.md +4 -4
  5. package/CHANGELOG.md +474 -0
  6. package/README.md +69 -29
  7. package/cli/flags.js +184 -0
  8. package/cli/index.js +137 -324
  9. package/core/account.js +44 -87
  10. package/core/analysis.js +273 -107
  11. package/core/ast-analysis.js +2 -0
  12. package/core/bridge.js +14 -0
  13. package/core/cache.js +101 -16
  14. package/core/callers.js +352 -70
  15. package/core/capture.js +331 -0
  16. package/core/change-kinds.js +888 -0
  17. package/core/check.js +1117 -139
  18. package/core/command-contracts.js +7 -6
  19. package/core/constructed-class.js +1195 -0
  20. package/core/contract-membership.js +142 -0
  21. package/core/deadcode.js +362 -84
  22. package/core/deletion.js +401 -0
  23. package/core/discovery.js +104 -9
  24. package/core/entrypoints.js +12 -6
  25. package/core/evidence-bands.js +68 -0
  26. package/core/evidence-bands.json +44 -0
  27. package/core/execute.js +172 -161
  28. package/core/hot-summary.js +241 -0
  29. package/core/index-ir.js +3 -1
  30. package/core/ir.js +5 -1
  31. package/core/member-signatures.js +789 -0
  32. package/core/output/analysis-ext.js +20 -10
  33. package/core/output/analysis.js +98 -60
  34. package/core/output/check.js +98 -37
  35. package/core/output/doctor.js +34 -1
  36. package/core/output/find.js +2 -1
  37. package/core/output/lines.js +63 -3
  38. package/core/output/public.js +29 -11
  39. package/core/output/refactoring.js +32 -0
  40. package/core/output/reporting.js +15 -2
  41. package/core/output/search.js +11 -2
  42. package/core/output/tracing.js +35 -7
  43. package/core/output-budget.js +124 -57
  44. package/core/parallel-build.js +3 -3
  45. package/core/project.js +106 -23
  46. package/core/provenance-type.js +12 -5
  47. package/core/public-command.js +35 -9
  48. package/core/python-modules.js +6 -0
  49. package/core/reflection.js +151 -23
  50. package/core/registry.js +623 -72
  51. package/core/reporting.js +69 -34
  52. package/core/review-items.js +75 -0
  53. package/core/search.js +89 -128
  54. package/core/shared.js +0 -45
  55. package/core/snapshot.js +350 -0
  56. package/core/source-universe.js +707 -0
  57. package/core/test-units.js +3624 -0
  58. package/core/tracing.js +150 -96
  59. package/core/verify.js +27 -11
  60. package/languages/adapter.js +8 -3
  61. package/languages/c-family.js +12 -0
  62. package/languages/csharp.js +634 -0
  63. package/languages/go.js +120 -0
  64. package/languages/index.js +422 -4
  65. package/languages/java.js +712 -0
  66. package/languages/javascript.js +1460 -2
  67. package/languages/lexical-scope.js +68 -0
  68. package/languages/python.js +1672 -1
  69. package/languages/rust.js +91 -0
  70. package/mcp/server.js +44 -110
  71. package/package.json +10 -5
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * How often an unverified reason was a real edge on the release board.
5
+ *
6
+ * Display only. The table labels the per-reason summary line of an
7
+ * unverified section and orders that line; it decides no tier, filter,
8
+ * score or account, and nothing outside the output layer reads it (guarded
9
+ * by test/evidence-bands.test.js). Entries of a section keep their own
10
+ * order.
11
+ *
12
+ * The table (core/evidence-bands.json) is written by
13
+ * `node eval/run-unverified-census.js --bands` from the release board's
14
+ * oracle reports: per reason, the candidates the language's own tool scored
15
+ * and how many of them were real edges. A reason scored fewer times than
16
+ * the table's minimum has no row and is labelled "not measured".
17
+ */
18
+
19
+ const DEFAULT_TABLE = require('./evidence-bands.json');
20
+
21
+ const BAND_RANK = Object.freeze({ often: 0, sometimes: 1, rarely: 2 });
22
+ const UNMEASURED_RANK = 3;
23
+
24
+ const codeUnitCompare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
25
+
26
+ /** The measured row of a reason: { band, scored, real }, or null. */
27
+ function evidenceBand(reason, table = DEFAULT_TABLE) {
28
+ const row = table?.reasons?.[reason];
29
+ if (!row || BAND_RANK[row.band] === undefined) return null;
30
+ return { band: row.band, scored: row.scored, real: row.real };
31
+ }
32
+
33
+ /**
34
+ * The reasons of a list of unverified entries (or a `{ reason: count }`
35
+ * map) with their counts and bands: most often real first, then the larger
36
+ * count, then the name.
37
+ */
38
+ function summarizeReasons(entries, table = DEFAULT_TABLE) {
39
+ const counts = new Map();
40
+ if (Array.isArray(entries)) {
41
+ for (const entry of entries) {
42
+ const reason = entry?.reason || 'unknown';
43
+ counts.set(reason, (counts.get(reason) || 0) + 1);
44
+ }
45
+ } else {
46
+ for (const [reason, count] of Object.entries(entries || {})) {
47
+ if (count > 0) counts.set(reason, count);
48
+ }
49
+ }
50
+ const rows = [...counts].map(([reason, count]) => ({ reason, count, ...evidenceBand(reason, table) }));
51
+ const rank = row => (row.band ? BAND_RANK[row.band] : UNMEASURED_RANK);
52
+ return rows.sort((a, b) => rank(a) - rank(b) || b.count - a.count || codeUnitCompare(a.reason, b.reason));
53
+ }
54
+
55
+ /**
56
+ * The summary line of an unverified section, or null when it would add
57
+ * nothing: one reason that is not measured.
58
+ */
59
+ function reasonSummaryLine(entries, table = DEFAULT_TABLE) {
60
+ const rows = summarizeReasons(entries, table);
61
+ if (rows.length === 0 || (rows.length === 1 && !rows[0].band)) return null;
62
+ const parts = rows.map(row => (row.band
63
+ ? `${row.reason} ${row.count} (${row.band}, ${row.real}/${row.scored})`
64
+ : `${row.reason} ${row.count} (not measured)`));
65
+ return ` by reason, with how often each was a real call on the release board: ${parts.join('; ')}`;
66
+ }
67
+
68
+ module.exports = { evidenceBand, summarizeReasons, reasonSummaryLine };
@@ -0,0 +1,44 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "source": "unverified candidates of the release oracle board, scored by each language's own tool",
4
+ "boardDate": "2026-11-13",
5
+ "repositories": [
6
+ "cjson",
7
+ "clap",
8
+ "cobra",
9
+ "fmt",
10
+ "httpx",
11
+ "javapoet",
12
+ "newtonsoft-json",
13
+ "preact-signals",
14
+ "ripgrep",
15
+ "viper"
16
+ ],
17
+ "minimumScored": 30,
18
+ "thresholds": {
19
+ "often": 0.5,
20
+ "sometimes": 0.15
21
+ },
22
+ "reasons": {
23
+ "method-ambiguous": {
24
+ "scored": 62,
25
+ "real": 21,
26
+ "band": "sometimes"
27
+ },
28
+ "overload-ambiguous": {
29
+ "scored": 591,
30
+ "real": 393,
31
+ "band": "often"
32
+ },
33
+ "possible-dispatch": {
34
+ "scored": 782,
35
+ "real": 59,
36
+ "band": "rarely"
37
+ },
38
+ "single-owner": {
39
+ "scored": 45,
40
+ "real": 45,
41
+ "band": "often"
42
+ }
43
+ }
44
+ }