@rotifer/playground 0.28.0 → 0.30.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 (41) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +2 -2
  3. package/README.zh.md +2 -2
  4. package/dist/cloud/capability-candidates.d.ts +2 -0
  5. package/dist/cloud/capability-candidates.d.ts.map +1 -1
  6. package/dist/cloud/capability-candidates.js +83 -31
  7. package/dist/cloud/capability-candidates.js.map +1 -1
  8. package/dist/cloud/client.d.ts +10 -0
  9. package/dist/cloud/client.d.ts.map +1 -1
  10. package/dist/cloud/client.js +41 -2
  11. package/dist/cloud/client.js.map +1 -1
  12. package/dist/cloud/types.d.ts +10 -0
  13. package/dist/cloud/types.d.ts.map +1 -1
  14. package/dist/cloud/types.js.map +1 -1
  15. package/dist/commands/agent-run.d.ts.map +1 -1
  16. package/dist/commands/agent-run.js +13 -4
  17. package/dist/commands/agent-run.js.map +1 -1
  18. package/dist/commands/arena-submit.d.ts.map +1 -1
  19. package/dist/commands/arena-submit.js +48 -10
  20. package/dist/commands/arena-submit.js.map +1 -1
  21. package/dist/commands/genome-format.d.ts +180 -0
  22. package/dist/commands/genome-format.d.ts.map +1 -0
  23. package/dist/commands/genome-format.js +774 -0
  24. package/dist/commands/genome-format.js.map +1 -0
  25. package/dist/commands/genome-import.d.ts +23 -27
  26. package/dist/commands/genome-import.d.ts.map +1 -1
  27. package/dist/commands/genome-import.js +91 -250
  28. package/dist/commands/genome-import.js.map +1 -1
  29. package/dist/commands/genome.d.ts +7 -138
  30. package/dist/commands/genome.d.ts.map +1 -1
  31. package/dist/commands/genome.js +31 -245
  32. package/dist/commands/genome.js.map +1 -1
  33. package/dist/utils/fitness-formula.d.ts +75 -17
  34. package/dist/utils/fitness-formula.d.ts.map +1 -1
  35. package/dist/utils/fitness-formula.js +97 -22
  36. package/dist/utils/fitness-formula.js.map +1 -1
  37. package/dist/utils/run-fuel-ladder.d.ts +6 -3
  38. package/dist/utils/run-fuel-ladder.d.ts.map +1 -1
  39. package/dist/utils/run-fuel-ladder.js +6 -3
  40. package/dist/utils/run-fuel-ladder.js.map +1 -1
  41. package/package.json +5 -5
@@ -7,10 +7,17 @@
7
7
  * sit in the denominator and a slower, costlier gene scores lower. The
8
8
  * implementation does not divide by raw values — an unbounded denominator
9
9
  * drives F(g) to zero for any gene with a realistic latency, which is what
10
- * ADR-215 P1 set out to avoid. It normalizes each into a (0, 1] score first:
10
+ * ADR-215 P1 set out to avoid. It normalizes each into a (0, 1] score first,
11
+ * against a reference scale (ADR-318 D2):
11
12
  *
12
- * L_score = 1 / (1 + avg_latency_ms / LATENCY_SCALE_MS)
13
- * Cost_score = 1 / (1 + avg_cost / RESOURCE_SCALE_UNITS)
13
+ * L_score = 1 / (1 + avg_latency_ms / L_ref)
14
+ * Cost_score = 1 / (1 + avg_cost / Cost_ref)
15
+ *
16
+ * L_ref / Cost_ref are the current-season median of the gene's own domain and
17
+ * fidelity, computed by the registry (`get_fitness_reference`); a gene exactly
18
+ * at its peers' median scores 1/2 on each. While the season has too few
19
+ * measured genes, or the registry cannot be reached, the fixed constants below
20
+ * stand in (FALLBACK_REFERENCE).
14
21
  *
15
22
  * Those scores are already *inverted* — lower latency means a score nearer 1 —
16
23
  * so they belong in the numerator. Dividing by them, as this code did until
@@ -19,18 +26,19 @@
19
26
  * tests in `tests/unit/fitness-formula.test.ts` hold the direction.
20
27
  */
21
28
  /**
22
- * Latency at which L_score halves. `[N]` — provisional, uncalibrated.
29
+ * Fallback L_ref: latency at which L_score halves when no season median is
30
+ * available. `[N]` — provisional, uncalibrated.
23
31
  *
24
- * ADR-318 D2 replaces both constants with `L_ref` / `Cost_ref` — the season
25
- * median for the gene's own domain and fidelity, which is what makes F(g)
26
- * dimensionless and comparable across bindings — and marks their values `[N]`
27
- * pending ABM / measured calibration under RFC-001 §0. That reference scale
28
- * needs a season-median pipeline that does not exist yet (v0.9.3 #6); these two
29
- * fixed constants are the stand-ins until it does.
32
+ * ADR-318 D2 defines `L_ref` / `Cost_ref` as the season median for the gene's
33
+ * own domain and fidelity, which is what makes F(g) dimensionless and
34
+ * comparable across bindings. The registry computes it (v0.9.3 #6); these two
35
+ * fixed constants are used only while that median does not exist for a group
36
+ * — too few measured genes this season — or cannot be fetched.
30
37
  */
31
38
  export declare const LATENCY_SCALE_MS = 1000;
32
39
  /**
33
- * Resource cost (fuel units) at which Cost_score halves. `[N]` — provisional.
40
+ * Fallback Cost_ref: resource cost (fuel units) at which Cost_score halves
41
+ * when no season median is available. `[N]` — provisional.
34
42
  *
35
43
  * Badly out of scale, and known to be: ADR-318 recorded both constants as
36
44
  * guesses, and measured 7.7e9 fuel on a leaderboard gene from its reported
@@ -46,6 +54,55 @@ export declare const LATENCY_SCALE_MS = 1000;
46
54
  * protocol-parameter change under RFC-001 §0, not a code cleanup.
47
55
  */
48
56
  export declare const RESOURCE_SCALE_UNITS = 10000;
57
+ /** The scale the two efficiency terms are measured against (ADR-318 D2). */
58
+ export interface ReferenceScale {
59
+ /** L_ref, in milliseconds. */
60
+ latencyMs: number;
61
+ /** Cost_ref, in fuel units. */
62
+ resourceCost: number;
63
+ }
64
+ /** The fixed constants, used whenever no season median is available. */
65
+ export declare const FALLBACK_REFERENCE: Readonly<ReferenceScale>;
66
+ /** Both values finite and positive; anything else would divide by zero or flip a sign. */
67
+ export declare function isUsableReference(reference: ReferenceScale): boolean;
68
+ /** One row of `get_fitness_reference`: the season median for a (domain, fidelity) group. */
69
+ export interface SeasonReferenceRow {
70
+ l_ref_ms: number;
71
+ cost_ref: number;
72
+ sample_genes: number;
73
+ season_number: number;
74
+ }
75
+ /**
76
+ * `code` on the error a reference fetcher throws when the registry has no
77
+ * `get_fitness_reference` (HTTP 404): a registry from before the migration,
78
+ * whose arena_entries has no reference columns either. A code rather than an
79
+ * error class, so the check survives two copies of this module.
80
+ */
81
+ export declare const REFERENCE_FUNCTION_MISSING = "REFERENCE_FUNCTION_MISSING";
82
+ export interface ResolvedReference {
83
+ scale: ReferenceScale;
84
+ source: "season-median" | "fallback";
85
+ /**
86
+ * Whether a submission may record this reference in the row. False only
87
+ * when the registry said it has no `get_fitness_reference` (404): the
88
+ * columns ship in the same migration as the function, so that registry
89
+ * would reject them. Any other failure — a timeout, a 500 — still records
90
+ * the fallback with its constants: the upsert keeps columns it is not sent,
91
+ * so leaving them out would leave an older median on a row whose F(g) used
92
+ * the constants, and the row could no longer be recomputed on its own.
93
+ */
94
+ isRecordable: boolean;
95
+ /** Why the fallback was used; absent for a season median. */
96
+ reason?: string;
97
+ sampleGenes?: number;
98
+ seasonNumber?: number;
99
+ }
100
+ /**
101
+ * The reference scale for one gene's F(g): its group's season median when the
102
+ * registry has one, the fixed constants otherwise. Never throws — a missing
103
+ * median is a reason to fall back, not to fail the evaluation.
104
+ */
105
+ export declare function resolveFitnessReference(domain: string, fidelity: string, fetchReference: (domain: string, fidelity: string) => Promise<SeasonReferenceRow | null>): Promise<ResolvedReference>;
49
106
  export interface FitnessInputs {
50
107
  /** S_r — fraction of evaluation runs that passed, in [0, 1]. */
51
108
  successRate: number;
@@ -74,15 +131,16 @@ export interface FitnessBreakdown {
74
131
  /** Cost_score — 1 at zero cost, falling monotonically as cost rises. */
75
132
  resourceEfficiency: number;
76
133
  }
77
- /** L_score: 1 at zero latency, strictly decreasing, never zero. */
78
- export declare function latencyScoreFor(avgLatencyMs: number): number;
79
- /** Cost_score: 1 at zero cost, strictly decreasing, never zero. */
80
- export declare function resourceEfficiencyFor(avgResourceCost: number): number;
134
+ /** L_score: 1 at zero latency, 1/2 at L_ref, strictly decreasing, never zero. */
135
+ export declare function latencyScoreFor(avgLatencyMs: number, latencyRefMs?: number): number;
136
+ /** Cost_score: 1 at zero cost, 1/2 at Cost_ref, strictly decreasing, never zero. */
137
+ export declare function resourceEfficiencyFor(avgResourceCost: number, costRef?: number): number;
81
138
  /**
82
- * F(g) from one batch of evaluation measurements.
139
+ * F(g) from one batch of evaluation measurements, against `reference` (the
140
+ * fixed constants when omitted, or when the given scale is not usable).
83
141
  *
84
142
  * Multiplicative throughout: a zero in any factor collapses the score, with no
85
143
  * mutual compensation between a gene's strengths and its weaknesses.
86
144
  */
87
- export declare function computeBaseFitness(inputs: FitnessInputs): FitnessBreakdown;
145
+ export declare function computeBaseFitness(inputs: FitnessInputs, reference?: ReferenceScale): FitnessBreakdown;
88
146
  //# sourceMappingURL=fitness-formula.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,CAU1E"}
1
+ {"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,cAAc,CAGtD,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAKpE;AAED,4FAA4F;AAC5F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,UAAU,CAAC;IACrC;;;;;;;;OAQG;IACH,YAAY,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GACvF,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,eAAe,EAAE,MAAM,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,GAAE,MAAyB,GAAG,MAAM,CAErG;AAED,oFAAoF;AACpF,wBAAgB,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,GAAE,MAA6B,GAAG,MAAM,CAE7G;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,cAAmC,GAC7C,gBAAgB,CAWlB"}
@@ -8,10 +8,17 @@
8
8
  * sit in the denominator and a slower, costlier gene scores lower. The
9
9
  * implementation does not divide by raw values — an unbounded denominator
10
10
  * drives F(g) to zero for any gene with a realistic latency, which is what
11
- * ADR-215 P1 set out to avoid. It normalizes each into a (0, 1] score first:
11
+ * ADR-215 P1 set out to avoid. It normalizes each into a (0, 1] score first,
12
+ * against a reference scale (ADR-318 D2):
12
13
  *
13
- * L_score = 1 / (1 + avg_latency_ms / LATENCY_SCALE_MS)
14
- * Cost_score = 1 / (1 + avg_cost / RESOURCE_SCALE_UNITS)
14
+ * L_score = 1 / (1 + avg_latency_ms / L_ref)
15
+ * Cost_score = 1 / (1 + avg_cost / Cost_ref)
16
+ *
17
+ * L_ref / Cost_ref are the current-season median of the gene's own domain and
18
+ * fidelity, computed by the registry (`get_fitness_reference`); a gene exactly
19
+ * at its peers' median scores 1/2 on each. While the season has too few
20
+ * measured genes, or the registry cannot be reached, the fixed constants below
21
+ * stand in (FALLBACK_REFERENCE).
15
22
  *
16
23
  * Those scores are already *inverted* — lower latency means a score nearer 1 —
17
24
  * so they belong in the numerator. Dividing by them, as this code did until
@@ -20,23 +27,26 @@
20
27
  * tests in `tests/unit/fitness-formula.test.ts` hold the direction.
21
28
  */
22
29
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = void 0;
30
+ exports.REFERENCE_FUNCTION_MISSING = exports.FALLBACK_REFERENCE = exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = void 0;
31
+ exports.isUsableReference = isUsableReference;
32
+ exports.resolveFitnessReference = resolveFitnessReference;
24
33
  exports.latencyScoreFor = latencyScoreFor;
25
34
  exports.resourceEfficiencyFor = resourceEfficiencyFor;
26
35
  exports.computeBaseFitness = computeBaseFitness;
27
36
  /**
28
- * Latency at which L_score halves. `[N]` — provisional, uncalibrated.
37
+ * Fallback L_ref: latency at which L_score halves when no season median is
38
+ * available. `[N]` — provisional, uncalibrated.
29
39
  *
30
- * ADR-318 D2 replaces both constants with `L_ref` / `Cost_ref` — the season
31
- * median for the gene's own domain and fidelity, which is what makes F(g)
32
- * dimensionless and comparable across bindings — and marks their values `[N]`
33
- * pending ABM / measured calibration under RFC-001 §0. That reference scale
34
- * needs a season-median pipeline that does not exist yet (v0.9.3 #6); these two
35
- * fixed constants are the stand-ins until it does.
40
+ * ADR-318 D2 defines `L_ref` / `Cost_ref` as the season median for the gene's
41
+ * own domain and fidelity, which is what makes F(g) dimensionless and
42
+ * comparable across bindings. The registry computes it (v0.9.3 #6); these two
43
+ * fixed constants are used only while that median does not exist for a group
44
+ * — too few measured genes this season — or cannot be fetched.
36
45
  */
37
46
  exports.LATENCY_SCALE_MS = 1000;
38
47
  /**
39
- * Resource cost (fuel units) at which Cost_score halves. `[N]` — provisional.
48
+ * Fallback Cost_ref: resource cost (fuel units) at which Cost_score halves
49
+ * when no season median is available. `[N]` — provisional.
40
50
  *
41
51
  * Badly out of scale, and known to be: ADR-318 recorded both constants as
42
52
  * guesses, and measured 7.7e9 fuel on a leaderboard gene from its reported
@@ -52,23 +62,88 @@ exports.LATENCY_SCALE_MS = 1000;
52
62
  * protocol-parameter change under RFC-001 §0, not a code cleanup.
53
63
  */
54
64
  exports.RESOURCE_SCALE_UNITS = 10_000;
55
- /** L_score: 1 at zero latency, strictly decreasing, never zero. */
56
- function latencyScoreFor(avgLatencyMs) {
57
- return 1.0 / (1.0 + Math.max(avgLatencyMs, 0) / exports.LATENCY_SCALE_MS);
65
+ /** The fixed constants, used whenever no season median is available. */
66
+ exports.FALLBACK_REFERENCE = Object.freeze({
67
+ latencyMs: exports.LATENCY_SCALE_MS,
68
+ resourceCost: exports.RESOURCE_SCALE_UNITS,
69
+ });
70
+ /** Both values finite and positive; anything else would divide by zero or flip a sign. */
71
+ function isUsableReference(reference) {
72
+ return (Number.isFinite(reference.latencyMs) && reference.latencyMs > 0 &&
73
+ Number.isFinite(reference.resourceCost) && reference.resourceCost > 0);
74
+ }
75
+ /**
76
+ * `code` on the error a reference fetcher throws when the registry has no
77
+ * `get_fitness_reference` (HTTP 404): a registry from before the migration,
78
+ * whose arena_entries has no reference columns either. A code rather than an
79
+ * error class, so the check survives two copies of this module.
80
+ */
81
+ exports.REFERENCE_FUNCTION_MISSING = "REFERENCE_FUNCTION_MISSING";
82
+ /**
83
+ * The reference scale for one gene's F(g): its group's season median when the
84
+ * registry has one, the fixed constants otherwise. Never throws — a missing
85
+ * median is a reason to fall back, not to fail the evaluation.
86
+ */
87
+ async function resolveFitnessReference(domain, fidelity, fetchReference) {
88
+ let row;
89
+ try {
90
+ row = await fetchReference(domain, fidelity);
91
+ }
92
+ catch (err) {
93
+ const isFunctionMissing = err?.code === exports.REFERENCE_FUNCTION_MISSING;
94
+ return {
95
+ scale: { ...exports.FALLBACK_REFERENCE },
96
+ source: "fallback",
97
+ isRecordable: !isFunctionMissing,
98
+ reason: isFunctionMissing
99
+ ? "the registry has no season median yet (get_fitness_reference is not deployed)"
100
+ : `the registry's season median could not be read (${err.message})`,
101
+ };
102
+ }
103
+ if (row === null) {
104
+ return {
105
+ scale: { ...exports.FALLBACK_REFERENCE },
106
+ source: "fallback",
107
+ isRecordable: true,
108
+ reason: `too few measured ${domain} / ${fidelity} genes this season for a median`,
109
+ };
110
+ }
111
+ const scale = { latencyMs: Number(row.l_ref_ms), resourceCost: Number(row.cost_ref) };
112
+ if (!isUsableReference(scale)) {
113
+ return {
114
+ scale: { ...exports.FALLBACK_REFERENCE },
115
+ source: "fallback",
116
+ isRecordable: true,
117
+ reason: "the registry returned a median that is not a positive number",
118
+ };
119
+ }
120
+ return {
121
+ scale,
122
+ source: "season-median",
123
+ isRecordable: true,
124
+ sampleGenes: row.sample_genes,
125
+ seasonNumber: row.season_number,
126
+ };
127
+ }
128
+ /** L_score: 1 at zero latency, 1/2 at L_ref, strictly decreasing, never zero. */
129
+ function latencyScoreFor(avgLatencyMs, latencyRefMs = exports.LATENCY_SCALE_MS) {
130
+ return 1.0 / (1.0 + Math.max(avgLatencyMs, 0) / latencyRefMs);
58
131
  }
59
- /** Cost_score: 1 at zero cost, strictly decreasing, never zero. */
60
- function resourceEfficiencyFor(avgResourceCost) {
61
- return 1.0 / (1.0 + Math.max(avgResourceCost, 0) / exports.RESOURCE_SCALE_UNITS);
132
+ /** Cost_score: 1 at zero cost, 1/2 at Cost_ref, strictly decreasing, never zero. */
133
+ function resourceEfficiencyFor(avgResourceCost, costRef = exports.RESOURCE_SCALE_UNITS) {
134
+ return 1.0 / (1.0 + Math.max(avgResourceCost, 0) / costRef);
62
135
  }
63
136
  /**
64
- * F(g) from one batch of evaluation measurements.
137
+ * F(g) from one batch of evaluation measurements, against `reference` (the
138
+ * fixed constants when omitted, or when the given scale is not usable).
65
139
  *
66
140
  * Multiplicative throughout: a zero in any factor collapses the score, with no
67
141
  * mutual compensation between a gene's strengths and its weaknesses.
68
142
  */
69
- function computeBaseFitness(inputs) {
70
- const latencyScore = latencyScoreFor(inputs.avgLatencyMs);
71
- const resourceEfficiency = resourceEfficiencyFor(inputs.avgResourceCost);
143
+ function computeBaseFitness(inputs, reference = exports.FALLBACK_REFERENCE) {
144
+ const scale = isUsableReference(reference) ? reference : exports.FALLBACK_REFERENCE;
145
+ const latencyScore = latencyScoreFor(inputs.avgLatencyMs, scale.latencyMs);
146
+ const resourceEfficiency = resourceEfficiencyFor(inputs.avgResourceCost, scale.resourceCost);
72
147
  const quality = inputs.successRate * Math.log1p(inputs.coverage) * (1 + inputs.robustness);
73
148
  // Multiplied, not divided: L_score and Cost_score are already inverted, so
74
149
  // multiplying by them is what makes slower and costlier score lower. No cap —
@@ -1 +1 @@
1
- {"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AA8DH,0CAEC;AAGD,sDAEC;AAQD,gDAUC;AArFD;;;;;;;;;GASG;AACU,QAAA,gBAAgB,GAAG,IAAI,CAAC;AACrC;;;;;;;;;;;;;;;GAeG;AACU,QAAA,oBAAoB,GAAG,MAAM,CAAC;AAgC3C,mEAAmE;AACnE,SAAgB,eAAe,CAAC,YAAoB;IAClD,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,wBAAgB,CAAC,CAAC;AACpE,CAAC;AAED,mEAAmE;AACnE,SAAgB,qBAAqB,CAAC,eAAuB;IAC3D,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,4BAAoB,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,MAAqB;IACtD,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACzE,MAAM,OAAO,GACX,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7E,2EAA2E;IAC3E,8EAA8E;IAC9E,kDAAkD;IAClD,MAAM,KAAK,GAAG,OAAO,GAAG,YAAY,GAAG,kBAAkB,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"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"}
@@ -10,9 +10,12 @@
10
10
  * A ladder keeps both properties we care about:
11
11
  * - completion: a run that dies of fuel alone is retried with more, up to a
12
12
  * hard cap, so "expensive" stops reading as "broken";
13
- * - honesty: the fuel actually burned is what lands in resource_cost, and
14
- * F(g)'s efficiency term already prices it — a Gene that needs 8e9 fuel
15
- * pays for 8e9 fuel. Nothing here makes an expensive Gene look cheap.
13
+ * - honesty: what lands in resource_cost is the fuel actually burned plus
14
+ * any host-call surcharges (ADR-327 D4, billed on top, not drawn from the
15
+ * budget), and F(g)'s efficiency term prices all of it — a Gene that
16
+ * needs 8e9 fuel pays for 8e9 fuel. Nothing here makes an expensive Gene
17
+ * look cheap. A rung's budget bounds guest computation only, so
18
+ * resource_cost can exceed it; that is not a fuel-exhausted failure.
16
19
  *
17
20
  * The cap is finite on purpose: a Gene that exhausts the top rung records a
18
21
  * fuel-exhausted failure, because at some point "needs more fuel" is the
@@ -1 +1 @@
1
- {"version":3,"file":"run-fuel-ladder.d.ts","sourceRoot":"","sources":["../../src/utils/run-fuel-ladder.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAQxC,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,iBAAiB,GACjB,SAAS,GACT,OAAO,CAAC;AAEZ;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,cAAc,GAAG,IAAI,CAWvB;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D"}
1
+ {"version":3,"file":"run-fuel-ladder.d.ts","sourceRoot":"","sources":["../../src/utils/run-fuel-ladder.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAQxC,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,iBAAiB,GACjB,SAAS,GACT,OAAO,CAAC;AAEZ;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACtC,cAAc,GAAG,IAAI,CAWvB;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -16,9 +16,12 @@ const sandbox_defaults_js_1 = require("./sandbox-defaults.js");
16
16
  * A ladder keeps both properties we care about:
17
17
  * - completion: a run that dies of fuel alone is retried with more, up to a
18
18
  * hard cap, so "expensive" stops reading as "broken";
19
- * - honesty: the fuel actually burned is what lands in resource_cost, and
20
- * F(g)'s efficiency term already prices it — a Gene that needs 8e9 fuel
21
- * pays for 8e9 fuel. Nothing here makes an expensive Gene look cheap.
19
+ * - honesty: what lands in resource_cost is the fuel actually burned plus
20
+ * any host-call surcharges (ADR-327 D4, billed on top, not drawn from the
21
+ * budget), and F(g)'s efficiency term prices all of it — a Gene that
22
+ * needs 8e9 fuel pays for 8e9 fuel. Nothing here makes an expensive Gene
23
+ * look cheap. A rung's budget bounds guest computation only, so
24
+ * resource_cost can exceed it; that is not a fuel-exhausted failure.
22
25
  *
23
26
  * The cap is finite on purpose: a Gene that exhausts the top rung records a
24
27
  * fuel-exhausted failure, because at some point "needs more fuel" is the
@@ -1 +1 @@
1
- {"version":3,"file":"run-fuel-ladder.js","sourceRoot":"","sources":["../../src/utils/run-fuel-ladder.ts"],"names":[],"mappings":";;;AA6CA,gDAaC;AAGD,gDAEC;AA/DD,+DAAoE;AAEpE;;;;;;;;;;;;;;;;;;;;GAoBG;AACU,QAAA,WAAW,GAAsB;IAC5C,iDAA2B,CAAC,QAAQ,EAAE,+BAA+B;IACrE,aAAa;IACb,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,2EAA2E;IAC3E,cAAc;CACf,CAAC;AAQF;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,YAAuC;IAEvC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACrD,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,iDAA2B,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"run-fuel-ladder.js","sourceRoot":"","sources":["../../src/utils/run-fuel-ladder.ts"],"names":[],"mappings":";;;AAgDA,gDAaC;AAGD,gDAEC;AAlED,+DAAoE;AAEpE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACU,QAAA,WAAW,GAAsB;IAC5C,iDAA2B,CAAC,QAAQ,EAAE,+BAA+B;IACrE,aAAa;IACb,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,2EAA2E;IAC3E,cAAc;CACf,CAAC;AAQF;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,YAAuC;IAEvC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACrD,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uDAAuD;AACvD,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,iDAA2B,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC/E,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rotifer/playground",
3
- "version": "0.28.0",
3
+ "version": "0.30.0",
4
4
  "description": "Rotifer Protocol Playground — local development environment for gene development, Arena competition, and protocol simulation",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Rotifer Protocol Contributors",
@@ -92,10 +92,10 @@
92
92
  },
93
93
  "optionalDependencies": {
94
94
  "@rolldown/binding-linux-x64-gnu": "1.1.1",
95
- "@rotifer/playground-darwin-arm64": "0.28.0",
96
- "@rotifer/playground-darwin-x64": "0.28.0",
97
- "@rotifer/playground-linux-x64-gnu": "0.28.0",
98
- "@rotifer/playground-win32-x64-msvc": "0.28.0"
95
+ "@rotifer/playground-darwin-arm64": "0.30.0",
96
+ "@rotifer/playground-darwin-x64": "0.30.0",
97
+ "@rotifer/playground-linux-x64-gnu": "0.30.0",
98
+ "@rotifer/playground-win32-x64-msvc": "0.30.0"
99
99
  },
100
100
  "engines": {
101
101
  "node": ">=22.18.0"