@rotifer/playground 0.31.0 → 0.32.1
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 +23 -0
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/dist/cloud/client.d.ts.map +1 -1
- package/dist/cloud/client.js +9 -0
- package/dist/cloud/client.js.map +1 -1
- package/dist/cloud/types.d.ts +7 -0
- package/dist/cloud/types.d.ts.map +1 -1
- package/dist/cloud/types.js.map +1 -1
- package/dist/commands/arena-submit.d.ts.map +1 -1
- package/dist/commands/arena-submit.js +36 -23
- package/dist/commands/arena-submit.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +2 -0
- package/dist/commands/test.js.map +1 -1
- package/dist/runtime/network-gateway.d.ts +24 -4
- package/dist/runtime/network-gateway.d.ts.map +1 -1
- package/dist/runtime/network-gateway.js +86 -12
- package/dist/runtime/network-gateway.js.map +1 -1
- package/dist/testsuite/gate.d.ts.map +1 -1
- package/dist/testsuite/gate.js +5 -1
- package/dist/testsuite/gate.js.map +1 -1
- package/dist/testsuite/run.d.ts +6 -11
- package/dist/testsuite/run.d.ts.map +1 -1
- package/dist/testsuite/run.js +29 -4
- package/dist/testsuite/run.js.map +1 -1
- package/dist/utils/fitness-formula.d.ts +20 -4
- package/dist/utils/fitness-formula.d.ts.map +1 -1
- package/dist/utils/fitness-formula.js +24 -6
- package/dist/utils/fitness-formula.js.map +1 -1
- package/package.json +5 -5
|
@@ -4,7 +4,14 @@
|
|
|
4
4
|
* Enforces domain whitelist, per-request timeout, response size cap,
|
|
5
5
|
* and per-minute rate limiting. Genes call `gatewayFetch()` instead
|
|
6
6
|
* of raw `fetch()`.
|
|
7
|
+
*
|
|
8
|
+
* SSRF hardening, the same as the WASM path (rotifer-core hybrid.rs
|
|
9
|
+
* `check_url` / `perform_fetch`, Hybrid Binding API §2.1): https only, no IP
|
|
10
|
+
* literals, and redirects followed by hand, at most MAX_REDIRECT_HOPS, each
|
|
11
|
+
* hop checked against the whitelist before it is requested.
|
|
7
12
|
*/
|
|
13
|
+
/** Same as rotifer-core `constants::MAX_REDIRECT_HOPS`. */
|
|
14
|
+
export declare const MAX_REDIRECT_HOPS = 5;
|
|
8
15
|
export interface NetworkConfig {
|
|
9
16
|
allowedDomains: string[];
|
|
10
17
|
maxTimeoutMs: number;
|
|
@@ -23,22 +30,35 @@ export interface GatewayResponse {
|
|
|
23
30
|
isTruncated: boolean;
|
|
24
31
|
}
|
|
25
32
|
export declare class NetworkGatewayError extends Error {
|
|
26
|
-
readonly code: "DOMAIN_BLOCKED" | "RATE_LIMITED" | "TIMEOUT" | "RESPONSE_TOO_LARGE" | "NETWORK_ERROR";
|
|
27
|
-
constructor(code: "DOMAIN_BLOCKED" | "RATE_LIMITED" | "TIMEOUT" | "RESPONSE_TOO_LARGE" | "NETWORK_ERROR", message: string);
|
|
33
|
+
readonly code: "DOMAIN_BLOCKED" | "INVALID_REQUEST" | "RATE_LIMITED" | "TIMEOUT" | "RESPONSE_TOO_LARGE" | "NETWORK_ERROR";
|
|
34
|
+
constructor(code: "DOMAIN_BLOCKED" | "INVALID_REQUEST" | "RATE_LIMITED" | "TIMEOUT" | "RESPONSE_TOO_LARGE" | "NETWORK_ERROR", message: string);
|
|
35
|
+
}
|
|
36
|
+
/** Binding-internal options, never read from a phenotype. */
|
|
37
|
+
export interface GatewayTestOptions {
|
|
38
|
+
/** Test hook, as rotifer-core's `allow_insecure_loopback`: permit plain
|
|
39
|
+
* http to loopback hosts and loopback IP literals. Off in every production
|
|
40
|
+
* path — `createGatewayFetch`, which the CLI uses, never sets it. */
|
|
41
|
+
allowInsecureLoopbackForTests?: boolean;
|
|
28
42
|
}
|
|
29
43
|
export declare class NetworkGateway {
|
|
30
44
|
private config;
|
|
45
|
+
private allowInsecureLoopback;
|
|
31
46
|
private requestTimestamps;
|
|
32
47
|
private totalRequests;
|
|
33
48
|
private totalBytes;
|
|
34
|
-
constructor(config?: Partial<NetworkConfig
|
|
49
|
+
constructor(config?: Partial<NetworkConfig>, testOptions?: GatewayTestOptions);
|
|
35
50
|
get stats(): {
|
|
36
51
|
totalRequests: number;
|
|
37
52
|
totalBytes: number;
|
|
38
53
|
windowRequests: number;
|
|
39
54
|
};
|
|
40
55
|
fetch(url: string, options?: GatewayFetchOptions): Promise<GatewayResponse>;
|
|
41
|
-
|
|
56
|
+
/** Whitelist first, then scheme and host shape. Runs for the first request
|
|
57
|
+
* and for every redirect hop. rotifer-core's `check_url` checks shape first;
|
|
58
|
+
* here a URL off the whitelist keeps the DOMAIN_BLOCKED callers have always
|
|
59
|
+
* had, and INVALID_REQUEST is what a whitelisted host gets over http or as
|
|
60
|
+
* an IP literal. Either way nothing is sent. */
|
|
61
|
+
private validateUrl;
|
|
42
62
|
private enforceRateLimit;
|
|
43
63
|
private readBodyCapped;
|
|
44
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-gateway.d.ts","sourceRoot":"","sources":["../../src/runtime/network-gateway.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"network-gateway.d.ts","sourceRoot":"","sources":["../../src/runtime/network-gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAChB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,SAAS,GACT,oBAAoB,GACpB,eAAe;gBANH,IAAI,EAChB,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,SAAS,GACT,oBAAoB,GACpB,eAAe,EACnB,OAAO,EAAE,MAAM;CAKlB;AAkBD,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC;;yEAEqE;IACrE,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,qBAAqB,CAAU;IACvC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAK;gBAEX,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,WAAW,GAAE,kBAAuB;IAKjF,IAAI,KAAK;;;;MAMR;IAEK,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IA0FjF;;;;oDAIgD;IAChD,OAAO,CAAC,WAAW;IA6CnB,OAAO,CAAC,gBAAgB;YAiBV,cAAc;CAmC7B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAC7B;IACD,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACvF,OAAO,EAAE,cAAc,CAAC;CACzB,CAMA"}
|
|
@@ -5,10 +5,17 @@
|
|
|
5
5
|
* Enforces domain whitelist, per-request timeout, response size cap,
|
|
6
6
|
* and per-minute rate limiting. Genes call `gatewayFetch()` instead
|
|
7
7
|
* of raw `fetch()`.
|
|
8
|
+
*
|
|
9
|
+
* SSRF hardening, the same as the WASM path (rotifer-core hybrid.rs
|
|
10
|
+
* `check_url` / `perform_fetch`, Hybrid Binding API §2.1): https only, no IP
|
|
11
|
+
* literals, and redirects followed by hand, at most MAX_REDIRECT_HOPS, each
|
|
12
|
+
* hop checked against the whitelist before it is requested.
|
|
8
13
|
*/
|
|
9
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.NetworkGateway = exports.NetworkGatewayError = void 0;
|
|
15
|
+
exports.NetworkGateway = exports.NetworkGatewayError = exports.MAX_REDIRECT_HOPS = void 0;
|
|
11
16
|
exports.createGatewayFetch = createGatewayFetch;
|
|
17
|
+
/** Same as rotifer-core `constants::MAX_REDIRECT_HOPS`. */
|
|
18
|
+
exports.MAX_REDIRECT_HOPS = 5;
|
|
12
19
|
class NetworkGatewayError extends Error {
|
|
13
20
|
code;
|
|
14
21
|
constructor(code, message) {
|
|
@@ -24,13 +31,23 @@ const DEFAULT_CONFIG = {
|
|
|
24
31
|
maxResponseBytes: 1_048_576, // 1 MiB
|
|
25
32
|
maxRequestsPerMin: 10,
|
|
26
33
|
};
|
|
34
|
+
/** Headers that describe a request body (fetch's "request-body-header names"),
|
|
35
|
+
* dropped when a redirect turns the request into a body-less GET. */
|
|
36
|
+
const BODY_HEADERS = new Set(["content-encoding", "content-language", "content-location", "content-type", "content-length"]);
|
|
37
|
+
function withoutBodyHeaders(headers) {
|
|
38
|
+
if (!headers)
|
|
39
|
+
return headers;
|
|
40
|
+
return Object.fromEntries(Object.entries(headers).filter(([k]) => !BODY_HEADERS.has(k.toLowerCase())));
|
|
41
|
+
}
|
|
27
42
|
class NetworkGateway {
|
|
28
43
|
config;
|
|
44
|
+
allowInsecureLoopback;
|
|
29
45
|
requestTimestamps = [];
|
|
30
46
|
totalRequests = 0;
|
|
31
47
|
totalBytes = 0;
|
|
32
|
-
constructor(config) {
|
|
48
|
+
constructor(config, testOptions = {}) {
|
|
33
49
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
50
|
+
this.allowInsecureLoopback = testOptions.allowInsecureLoopbackForTests === true;
|
|
34
51
|
}
|
|
35
52
|
get stats() {
|
|
36
53
|
return {
|
|
@@ -40,17 +57,57 @@ class NetworkGateway {
|
|
|
40
57
|
};
|
|
41
58
|
}
|
|
42
59
|
async fetch(url, options) {
|
|
43
|
-
this.
|
|
60
|
+
this.validateUrl(url);
|
|
44
61
|
this.enforceRateLimit();
|
|
45
62
|
const controller = new AbortController();
|
|
46
63
|
const timeout = setTimeout(() => controller.abort(), this.config.maxTimeoutMs);
|
|
47
64
|
try {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
65
|
+
// Redirects are followed here, not by fetch: fetch would follow a
|
|
66
|
+
// whitelisted host's 302 to anywhere. Every hop is checked before it
|
|
67
|
+
// is requested; the timeout covers the whole chain.
|
|
68
|
+
//
|
|
69
|
+
// What a hop carries follows fetch's own redirect rules, made stricter:
|
|
70
|
+
// - 301/302/303 turn a request that is not GET/HEAD into a GET with no
|
|
71
|
+
// body (and no body headers); 307/308 keep the method and body.
|
|
72
|
+
// - Moving to another origin (scheme, host or port) drops every header
|
|
73
|
+
// the gene set, not only Authorization: a key travels just as well in
|
|
74
|
+
// X-Api-Key or apikey, and the next host is someone else even when
|
|
75
|
+
// it matches the same *.domain wildcard.
|
|
76
|
+
let current = url;
|
|
77
|
+
let method = options?.method || "POST";
|
|
78
|
+
let requestHeaders = options?.headers;
|
|
79
|
+
let body = options?.body;
|
|
80
|
+
let response;
|
|
81
|
+
for (let hop = 0; hop <= exports.MAX_REDIRECT_HOPS; hop++) {
|
|
82
|
+
if (hop > 0)
|
|
83
|
+
this.validateUrl(current);
|
|
84
|
+
response = await fetch(current, {
|
|
85
|
+
method,
|
|
86
|
+
headers: requestHeaders,
|
|
87
|
+
body,
|
|
88
|
+
signal: controller.signal,
|
|
89
|
+
redirect: "manual",
|
|
90
|
+
});
|
|
91
|
+
const location = response.headers.get("location");
|
|
92
|
+
if (response.status < 300 || response.status >= 400 || !location)
|
|
93
|
+
break;
|
|
94
|
+
if (hop === exports.MAX_REDIRECT_HOPS) {
|
|
95
|
+
await response.body?.cancel();
|
|
96
|
+
throw new NetworkGatewayError("NETWORK_ERROR", `Request to ${url} failed: more than ${exports.MAX_REDIRECT_HOPS} redirects`);
|
|
97
|
+
}
|
|
98
|
+
await response.body?.cancel();
|
|
99
|
+
const next = new URL(location, current);
|
|
100
|
+
if ([301, 302, 303].includes(response.status) && method !== "GET" && method !== "HEAD") {
|
|
101
|
+
method = "GET";
|
|
102
|
+
body = undefined;
|
|
103
|
+
requestHeaders = withoutBodyHeaders(requestHeaders);
|
|
104
|
+
}
|
|
105
|
+
if (next.origin !== new URL(current).origin)
|
|
106
|
+
requestHeaders = undefined;
|
|
107
|
+
current = next.toString();
|
|
108
|
+
}
|
|
109
|
+
if (!response)
|
|
110
|
+
throw new Error("no response");
|
|
54
111
|
const { text, isTruncated } = await this.readBodyCapped(response);
|
|
55
112
|
this.totalRequests++;
|
|
56
113
|
this.totalBytes += text.length;
|
|
@@ -66,6 +123,8 @@ class NetworkGateway {
|
|
|
66
123
|
};
|
|
67
124
|
}
|
|
68
125
|
catch (err) {
|
|
126
|
+
if (err instanceof NetworkGatewayError)
|
|
127
|
+
throw err;
|
|
69
128
|
if (err.name === "AbortError") {
|
|
70
129
|
throw new NetworkGatewayError("TIMEOUT", `Request to ${url} timed out after ${this.config.maxTimeoutMs}ms`);
|
|
71
130
|
}
|
|
@@ -75,14 +134,20 @@ class NetworkGateway {
|
|
|
75
134
|
clearTimeout(timeout);
|
|
76
135
|
}
|
|
77
136
|
}
|
|
78
|
-
|
|
79
|
-
|
|
137
|
+
/** Whitelist first, then scheme and host shape. Runs for the first request
|
|
138
|
+
* and for every redirect hop. rotifer-core's `check_url` checks shape first;
|
|
139
|
+
* here a URL off the whitelist keeps the DOMAIN_BLOCKED callers have always
|
|
140
|
+
* had, and INVALID_REQUEST is what a whitelisted host gets over http or as
|
|
141
|
+
* an IP literal. Either way nothing is sent. */
|
|
142
|
+
validateUrl(url) {
|
|
143
|
+
let parsed;
|
|
80
144
|
try {
|
|
81
|
-
|
|
145
|
+
parsed = new URL(url);
|
|
82
146
|
}
|
|
83
147
|
catch {
|
|
84
148
|
throw new NetworkGatewayError("DOMAIN_BLOCKED", `Invalid URL: ${url}`);
|
|
85
149
|
}
|
|
150
|
+
const hostname = parsed.hostname;
|
|
86
151
|
const isAllowed = this.config.allowedDomains.some((d) => {
|
|
87
152
|
if (d.startsWith("*.")) {
|
|
88
153
|
return hostname.endsWith(d.slice(1)) || hostname === d.slice(2);
|
|
@@ -92,6 +157,15 @@ class NetworkGateway {
|
|
|
92
157
|
if (!isAllowed) {
|
|
93
158
|
throw new NetworkGatewayError("DOMAIN_BLOCKED", `Domain "${hostname}" is not in the allowed list: [${this.config.allowedDomains.join(", ")}]`);
|
|
94
159
|
}
|
|
160
|
+
const isIpLiteral = /^\d{1,3}(\.\d{1,3}){3}$/.test(hostname) || hostname.startsWith("[");
|
|
161
|
+
const isLoopback = hostname === "localhost" || hostname === "[::1]" || /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(hostname);
|
|
162
|
+
const isLoopbackAdmitted = this.allowInsecureLoopback && isLoopback;
|
|
163
|
+
if (parsed.protocol !== "https:" && !(parsed.protocol === "http:" && isLoopbackAdmitted)) {
|
|
164
|
+
throw new NetworkGatewayError("INVALID_REQUEST", `Only https is allowed: ${parsed.protocol}//${hostname}`);
|
|
165
|
+
}
|
|
166
|
+
if (isIpLiteral && !isLoopbackAdmitted) {
|
|
167
|
+
throw new NetworkGatewayError("INVALID_REQUEST", `IP addresses are not allowed, use a host name: ${hostname}`);
|
|
168
|
+
}
|
|
95
169
|
}
|
|
96
170
|
enforceRateLimit() {
|
|
97
171
|
const now = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-gateway.js","sourceRoot":"","sources":["../../src/runtime/network-gateway.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"network-gateway.js","sourceRoot":"","sources":["../../src/runtime/network-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D;oDACgD;IAChD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEvD;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBjD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC7D;oDACgD;IAChD,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAyEjE;AAMD;;;;;kBAKkB;AAClB,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAMb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CvD"}
|
package/dist/testsuite/gate.js
CHANGED
|
@@ -57,11 +57,15 @@ function evaluatePublishGate(input) {
|
|
|
57
57
|
inputSchema: input.phenotype.inputSchema ?? null,
|
|
58
58
|
outputSchema: input.phenotype.outputSchema ?? null,
|
|
59
59
|
run: input.run,
|
|
60
|
+
fidelity: input.fidelity,
|
|
60
61
|
});
|
|
61
62
|
if (report.gatePassed) {
|
|
63
|
+
// A retried property iteration is part of the verdict: say so.
|
|
64
|
+
const retried = report.results.find((r) => r.testId === "t1-property-schema-legality" && r.details?.includes("retried"));
|
|
62
65
|
return {
|
|
63
66
|
status: "passed",
|
|
64
|
-
details: `T1 satisfied — ${report.results.filter((r) => r.passed).length}/${report.results.length} checks
|
|
67
|
+
details: `T1 satisfied — ${report.results.filter((r) => r.passed).length}/${report.results.length} checks` +
|
|
68
|
+
(retried ? ` (${retried.details})` : ""),
|
|
65
69
|
};
|
|
66
70
|
}
|
|
67
71
|
const req = report.requirements;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":";;AAgDA,
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/testsuite/gate.ts"],"names":[],"mappings":"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"}
|
package/dist/testsuite/run.d.ts
CHANGED
|
@@ -76,17 +76,9 @@ export declare function runPositive(c: ClassifiedCase, run: GeneRunner, outputVa
|
|
|
76
76
|
* source-linker through.
|
|
77
77
|
*/
|
|
78
78
|
export declare function runNegative(c: ClassifiedCase, run: GeneRunner, ajv: Ajv): TestResult;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
*
|
|
83
|
-
* The seed is what makes a failure actionable — the same seed replays the same
|
|
84
|
-
* inputs, so a property failure can be reproduced rather than merely observed.
|
|
85
|
-
* When the suite gives no seed one is derived from nothing but a constant, so
|
|
86
|
-
* two runs of an unseeded suite still agree; randomness across runs would make
|
|
87
|
-
* the gate flaky and the flake would be blamed on the Gene.
|
|
88
|
-
*/
|
|
89
|
-
export declare function runProperty(suite: TestSuite, inputSchema: Record<string, unknown> | null, run: GeneRunner, outputValidator: ValidateFunction | null): TestResult;
|
|
79
|
+
export declare function runProperty(suite: TestSuite, inputSchema: Record<string, unknown> | null, run: GeneRunner, outputValidator: ValidateFunction | null, options?: {
|
|
80
|
+
retryNetworkFailures?: boolean;
|
|
81
|
+
}): TestResult;
|
|
90
82
|
export interface T1Report {
|
|
91
83
|
results: TestResult[];
|
|
92
84
|
classified: ClassifiedCase[];
|
|
@@ -103,6 +95,9 @@ export declare function runT1(suite: TestSuite, opts: {
|
|
|
103
95
|
inputSchema: Record<string, unknown> | null;
|
|
104
96
|
outputSchema: Record<string, unknown> | null;
|
|
105
97
|
run: GeneRunner;
|
|
98
|
+
/** The Gene's declared fidelity. A Hybrid Gene's property iterations may
|
|
99
|
+
* be retried once after a network failure (see runProperty). */
|
|
100
|
+
fidelity?: string;
|
|
106
101
|
}): T1Report;
|
|
107
102
|
/** Stable id for a report, for callers that persist results. */
|
|
108
103
|
export declare function newTestRunId(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/testsuite/run.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;oDAEgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;AAE5E;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,QAAQ,EAAE,EACrB,cAAc,EAAE,gBAAgB,GAAG,IAAI,GACtC,cAAc,EAAE,CA2BlB;AA4CD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,cAAc,EACjB,GAAG,EAAE,UAAU,EACf,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,GAAG,EAAE,GAAG,GACP,UAAU,CA2CZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,cAAc,EACjB,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,GAAG,GACP,UAAU,CAmDZ;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/testsuite/run.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AAGpB,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;oDAEgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;AAE5E;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,QAAQ,EAAE,EACrB,cAAc,EAAE,gBAAgB,GAAG,IAAI,GACtC,cAAc,EAAE,CA2BlB;AA4CD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,cAAc,EACjB,GAAG,EAAE,UAAU,EACf,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,GAAG,EAAE,GAAG,GACP,UAAU,CA2CZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,cAAc,EACjB,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,GAAG,GACP,UAAU,CAmDZ;AAmBD,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC3C,GAAG,EAAE,UAAU,EACf,eAAe,EAAE,gBAAgB,GAAG,IAAI,EACxC,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,UAAU,CAwDZ;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,8DAA8D;IAC9D,YAAY,EAAE;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,gFAAgF;IAChF,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,KAAK,CACnB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7C,GAAG,EAAE,UAAU,CAAC;IAChB;oEACgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,QAAQ,CA6DV;AAED,gEAAgE;AAChE,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
package/dist/testsuite/run.js
CHANGED
|
@@ -218,7 +218,13 @@ function runNegative(c, run, ajv) {
|
|
|
218
218
|
* two runs of an unseeded suite still agree; randomness across runs would make
|
|
219
219
|
* the gate flaky and the flake would be blamed on the Gene.
|
|
220
220
|
*/
|
|
221
|
-
|
|
221
|
+
/**
|
|
222
|
+
* Host codes that mean the network failed, not the Gene: -4 timeout, -5
|
|
223
|
+
* network, -7 the run's request limit (Hybrid Binding API §5). Matched on the
|
|
224
|
+
* code the sandbox reports, so -50 or a Gene's own -201 never count.
|
|
225
|
+
*/
|
|
226
|
+
const NETWORK_FAILURE = /gene returned error code: (-4|-5|-7)(?![0-9])/;
|
|
227
|
+
function runProperty(suite, inputSchema, run, outputValidator, options = {}) {
|
|
222
228
|
const started = Date.now();
|
|
223
229
|
const id = "t1-property-schema-legality";
|
|
224
230
|
const iterations = suite.config?.fuzzIterations ?? exports.DEFAULT_FUZZ_ITERATIONS;
|
|
@@ -229,9 +235,25 @@ function runProperty(suite, inputSchema, run, outputValidator) {
|
|
|
229
235
|
if (!outputValidator) {
|
|
230
236
|
return fail(id, started, "Gene declares no outputSchema, so schema legality cannot be asserted");
|
|
231
237
|
}
|
|
238
|
+
const retries = [];
|
|
232
239
|
for (let i = 0; i < iterations; i++) {
|
|
233
240
|
const input = (0, generate_js_1.generateTestInput)(inputSchema, seed + i);
|
|
234
|
-
|
|
241
|
+
let outcome = run(input);
|
|
242
|
+
// A Hybrid Gene's request can fail on the network alone, and a run with
|
|
243
|
+
// no output says nothing about schema legality. Such an iteration gets
|
|
244
|
+
// one more run with the same input; everything else is final.
|
|
245
|
+
const network = !outcome.success && options.retryNetworkFailures
|
|
246
|
+
? NETWORK_FAILURE.exec(outcome.errorMessage ?? "")
|
|
247
|
+
: null;
|
|
248
|
+
if (network) {
|
|
249
|
+
const first = outcome.errorMessage;
|
|
250
|
+
outcome = run(input);
|
|
251
|
+
if (!outcome.success) {
|
|
252
|
+
return fail(id, started, `iteration ${i + 1}/${iterations} did not produce output after one retry: ` +
|
|
253
|
+
`first ${first}; then ${outcome.errorMessage ?? "no message"}`, `reproduce with seed ${seed}, input ${JSON.stringify(input).slice(0, 200)}`);
|
|
254
|
+
}
|
|
255
|
+
retries.push(`iteration ${i + 1} was retried once after ${network[1]} (${first})`);
|
|
256
|
+
}
|
|
235
257
|
if (!outcome.success) {
|
|
236
258
|
return fail(id, started, `iteration ${i + 1}/${iterations} did not produce output: ${outcome.errorMessage ?? "no message"}`, `reproduce with seed ${seed}, input ${JSON.stringify(input).slice(0, 200)}`);
|
|
237
259
|
}
|
|
@@ -239,7 +261,8 @@ function runProperty(suite, inputSchema, run, outputValidator) {
|
|
|
239
261
|
return fail(id, started, `iteration ${i + 1}/${iterations} produced output violating outputSchema`, `reproduce with seed ${seed}, input ${JSON.stringify(input).slice(0, 200)}`);
|
|
240
262
|
}
|
|
241
263
|
}
|
|
242
|
-
|
|
264
|
+
const retried = retries.length > 0 ? `; ${retries.join("; ")}` : "";
|
|
265
|
+
return pass(id, started, `${iterations} generated inputs all produced schema-legal output (seed ${seed})${retried}`);
|
|
243
266
|
}
|
|
244
267
|
function runT1(suite, opts) {
|
|
245
268
|
const ajv = new ajv_1.default({ allErrors: true, strict: false });
|
|
@@ -266,7 +289,9 @@ function runT1(suite, opts) {
|
|
|
266
289
|
? runPositive(c, opts.run, outputValidator, ajv)
|
|
267
290
|
: runNegative(c, opts.run, ajv));
|
|
268
291
|
}
|
|
269
|
-
const property = runProperty(suite, opts.inputSchema, opts.run, outputValidator
|
|
292
|
+
const property = runProperty(suite, opts.inputSchema, opts.run, outputValidator, {
|
|
293
|
+
retryNetworkFailures: opts.fidelity === "Hybrid",
|
|
294
|
+
});
|
|
270
295
|
results.push(property);
|
|
271
296
|
const hasPassingPositive = classified.some((c, i) => c.kind === "positive" && results[i].passed);
|
|
272
297
|
const hasPassingNegative = classified.some((c, i) => c.kind === "negative" && results[i].passed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/testsuite/run.ts"],"names":[],"mappings":";;;;;;AAgDA,4BA8BC;AAqDD,kCAgDC;AA+BD,kCAuDC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/testsuite/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The §5.1 fitness formula, in one place
|
|
2
|
+
* The §5.1 fitness formula, in one place, normalized to [0, 1] (ADR-346):
|
|
3
|
+
*
|
|
4
|
+
* F(g) = S_r · log₂(1 + C_util) · (1 + R_rob)/2 · L_score · Cost_score
|
|
5
|
+
*
|
|
6
|
+
* Five factors, each in [0, 1], so F(g) is in [0, 1] with no cap; the maximum,
|
|
7
|
+
* exactly 1, is S_r = C_util = R_rob = 1 at zero latency and cost. This equals
|
|
8
|
+
* the ADR-318 D2 form divided by 2·ln 2, but is written as the product so the
|
|
9
|
+
* maximum comes out as exactly 1 rather than as a quotient that could round
|
|
10
|
+
* past it. The spec's original statement was
|
|
3
11
|
*
|
|
4
12
|
* F(g) = [S_r · ln(1 + C_util) · (1 + R_rob)] / [L · Resource_Cost]
|
|
5
13
|
*
|
|
@@ -25,6 +33,14 @@
|
|
|
25
33
|
* and every gene slower than a second pinned at the 1.0 cap. The regression
|
|
26
34
|
* tests in `tests/unit/fitness-formula.test.ts` hold the direction.
|
|
27
35
|
*/
|
|
36
|
+
/**
|
|
37
|
+
* Which formula `computeBaseFitness` implements, numbered as rotifer-core's
|
|
38
|
+
* `fitness::FORMULA_VERSION`: 1 additive, 2 multiplicative in (0, 2·ln 2]
|
|
39
|
+
* (ADR-318 D2), 3 multiplicative normalized to [0, 1] (ADR-346). Sent with
|
|
40
|
+
* every Arena upload as `formula_version`, so the registry can tell the scales
|
|
41
|
+
* apart.
|
|
42
|
+
*/
|
|
43
|
+
export declare const FITNESS_FORMULA_VERSION = 3;
|
|
28
44
|
/**
|
|
29
45
|
* Fallback L_ref: latency at which L_score halves when no season median is
|
|
30
46
|
* available. `[N]` — provisional, uncalibrated.
|
|
@@ -46,8 +62,8 @@ export declare const LATENCY_SCALE_MS = 1000;
|
|
|
46
62
|
* sandbox runs each over the bundled Native corpus burn 1.2M–83M fuel
|
|
47
63
|
* (url-extractor 1.22M, debugger 1.44M, citation-manager 1.80M,
|
|
48
64
|
* particle-spatial 83.3M), so at a 10k scale every real gene lands at a
|
|
49
|
-
* Cost_score of 0.008 or below and F(g) collapses to ~0.
|
|
50
|
-
*
|
|
65
|
+
* Cost_score of 0.008 or below and F(g) collapses to ~0.002 — far under
|
|
66
|
+
* any admission threshold. While it divided, the same mismatch was invisible: it inflated F(g)
|
|
51
67
|
* past the 1.0 cap instead. This is why `arena submit` does not gate on F(g)
|
|
52
68
|
* while `hasCompleteFitnessInputs` is false: a threshold comparison against a
|
|
53
69
|
* provisional scale is not an admission decision. Picking new values is a
|
|
@@ -117,7 +133,7 @@ export interface FitnessInputs {
|
|
|
117
133
|
}
|
|
118
134
|
export interface FitnessBreakdown {
|
|
119
135
|
/**
|
|
120
|
-
* F(g), in
|
|
136
|
+
* F(g), in [0, 1] (ADR-346).
|
|
121
137
|
*
|
|
122
138
|
* Not capped. The old `min(1.0)` was there because dividing by the
|
|
123
139
|
* efficiency scores made the value unbounded — with them multiplied the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fitness-formula.d.ts","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;;;;;;;;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,CAalB"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* The §5.1 fitness formula, in one place
|
|
3
|
+
* The §5.1 fitness formula, in one place, normalized to [0, 1] (ADR-346):
|
|
4
|
+
*
|
|
5
|
+
* F(g) = S_r · log₂(1 + C_util) · (1 + R_rob)/2 · L_score · Cost_score
|
|
6
|
+
*
|
|
7
|
+
* Five factors, each in [0, 1], so F(g) is in [0, 1] with no cap; the maximum,
|
|
8
|
+
* exactly 1, is S_r = C_util = R_rob = 1 at zero latency and cost. This equals
|
|
9
|
+
* the ADR-318 D2 form divided by 2·ln 2, but is written as the product so the
|
|
10
|
+
* maximum comes out as exactly 1 rather than as a quotient that could round
|
|
11
|
+
* past it. The spec's original statement was
|
|
4
12
|
*
|
|
5
13
|
* F(g) = [S_r · ln(1 + C_util) · (1 + R_rob)] / [L · Resource_Cost]
|
|
6
14
|
*
|
|
@@ -27,12 +35,20 @@
|
|
|
27
35
|
* tests in `tests/unit/fitness-formula.test.ts` hold the direction.
|
|
28
36
|
*/
|
|
29
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.REFERENCE_FUNCTION_MISSING = exports.FALLBACK_REFERENCE = exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = void 0;
|
|
38
|
+
exports.REFERENCE_FUNCTION_MISSING = exports.FALLBACK_REFERENCE = exports.RESOURCE_SCALE_UNITS = exports.LATENCY_SCALE_MS = exports.FITNESS_FORMULA_VERSION = void 0;
|
|
31
39
|
exports.isUsableReference = isUsableReference;
|
|
32
40
|
exports.resolveFitnessReference = resolveFitnessReference;
|
|
33
41
|
exports.latencyScoreFor = latencyScoreFor;
|
|
34
42
|
exports.resourceEfficiencyFor = resourceEfficiencyFor;
|
|
35
43
|
exports.computeBaseFitness = computeBaseFitness;
|
|
44
|
+
/**
|
|
45
|
+
* Which formula `computeBaseFitness` implements, numbered as rotifer-core's
|
|
46
|
+
* `fitness::FORMULA_VERSION`: 1 additive, 2 multiplicative in (0, 2·ln 2]
|
|
47
|
+
* (ADR-318 D2), 3 multiplicative normalized to [0, 1] (ADR-346). Sent with
|
|
48
|
+
* every Arena upload as `formula_version`, so the registry can tell the scales
|
|
49
|
+
* apart.
|
|
50
|
+
*/
|
|
51
|
+
exports.FITNESS_FORMULA_VERSION = 3;
|
|
36
52
|
/**
|
|
37
53
|
* Fallback L_ref: latency at which L_score halves when no season median is
|
|
38
54
|
* available. `[N]` — provisional, uncalibrated.
|
|
@@ -54,8 +70,8 @@ exports.LATENCY_SCALE_MS = 1000;
|
|
|
54
70
|
* sandbox runs each over the bundled Native corpus burn 1.2M–83M fuel
|
|
55
71
|
* (url-extractor 1.22M, debugger 1.44M, citation-manager 1.80M,
|
|
56
72
|
* particle-spatial 83.3M), so at a 10k scale every real gene lands at a
|
|
57
|
-
* Cost_score of 0.008 or below and F(g) collapses to ~0.
|
|
58
|
-
*
|
|
73
|
+
* Cost_score of 0.008 or below and F(g) collapses to ~0.002 — far under
|
|
74
|
+
* any admission threshold. While it divided, the same mismatch was invisible: it inflated F(g)
|
|
59
75
|
* past the 1.0 cap instead. This is why `arena submit` does not gate on F(g)
|
|
60
76
|
* while `hasCompleteFitnessInputs` is false: a threshold comparison against a
|
|
61
77
|
* provisional scale is not an admission decision. Picking new values is a
|
|
@@ -144,10 +160,12 @@ function computeBaseFitness(inputs, reference = exports.FALLBACK_REFERENCE) {
|
|
|
144
160
|
const scale = isUsableReference(reference) ? reference : exports.FALLBACK_REFERENCE;
|
|
145
161
|
const latencyScore = latencyScoreFor(inputs.avgLatencyMs, scale.latencyMs);
|
|
146
162
|
const resourceEfficiency = resourceEfficiencyFor(inputs.avgResourceCost, scale.resourceCost);
|
|
147
|
-
|
|
163
|
+
// Each factor is in [0, 1]: log₂(1 + C) is 1 at C = 1 and (1 + R)/2 is 1 at
|
|
164
|
+
// R = 1 — exactly, which keeps the product's maximum at exactly 1.
|
|
165
|
+
const quality = inputs.successRate * Math.log2(1 + inputs.coverage) * ((1 + inputs.robustness) / 2);
|
|
148
166
|
// Multiplied, not divided: L_score and Cost_score are already inverted, so
|
|
149
167
|
// multiplying by them is what makes slower and costlier score lower. No cap —
|
|
150
|
-
// every factor is
|
|
168
|
+
// every factor is in [0, 1], so the product is too.
|
|
151
169
|
const value = quality * latencyScore * resourceEfficiency;
|
|
152
170
|
return { value, latencyScore, resourceEfficiency };
|
|
153
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"fitness-formula.js","sourceRoot":"","sources":["../../src/utils/fitness-formula.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rotifer/playground",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.1",
|
|
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.
|
|
96
|
-
"@rotifer/playground-darwin-x64": "0.
|
|
97
|
-
"@rotifer/playground-linux-x64-gnu": "0.
|
|
98
|
-
"@rotifer/playground-win32-x64-msvc": "0.
|
|
95
|
+
"@rotifer/playground-darwin-arm64": "0.32.1",
|
|
96
|
+
"@rotifer/playground-darwin-x64": "0.32.1",
|
|
97
|
+
"@rotifer/playground-linux-x64-gnu": "0.32.1",
|
|
98
|
+
"@rotifer/playground-win32-x64-msvc": "0.32.1"
|
|
99
99
|
},
|
|
100
100
|
"engines": {
|
|
101
101
|
"node": ">=22.18.0"
|