Skip to main content

sim_lib_lang_javascript/
fidelity.rs

1//! Frozen, inspectable fidelity and regression evidence for the JavaScript profile.
2
3/// Independent fidelity dimension.
4#[derive(Clone, Copy, Debug, Eq, PartialEq)]
5pub struct JavascriptFidelityDimension {
6    /// Stable dimension name.
7    pub name: &'static str,
8    /// Exact evidence boundary.
9    pub evidence: &'static str,
10}
11
12/// Regression obligation tied to a concrete checked behavior.
13#[derive(Clone, Copy, Debug, Eq, PartialEq)]
14pub struct JavascriptRegressionCase {
15    /// Stable case id.
16    pub id: &'static str,
17    /// Source module whose tests prove the behavior.
18    pub evidence: &'static str,
19}
20
21/// Frozen specification authority; an oracle citation, never an implementation.
22pub const ECMA262_ORACLE: &str = "ECMA-262, 17th edition (ECMAScript 2026), frozen 2026-08-01";
23/// Frozen Test262 observation. No Test262 code is compiled or shipped.
24pub const TEST262_ORACLE: &str = "tc39/test262@main as observed 2026-08-01";
25
26/// Separately scored profile dimensions.
27pub const fn javascript_fidelity_dimensions() -> &'static [JavascriptFidelityDimension] {
28    &[
29        JavascriptFidelityDimension {
30            name: "syntax",
31            evidence: "codec/javascript lossless Script and Module trees",
32        },
33        JavascriptFidelityDimension {
34            name: "lowering",
35            evidence: "canonical javascript/* expressions",
36        },
37        JavascriptFidelityDimension {
38            name: "direct-evaluation",
39            evidence: "bounded direct evaluator; no compiler or VM",
40        },
41        JavascriptFidelityDimension {
42            name: "objects",
43            evidence: "ordinary properties, descriptors, prototypes, and callable policy",
44        },
45        JavascriptFidelityDimension {
46            name: "intrinsics",
47            evidence: "generated intrinsics.tsv manifest with named shared backing",
48        },
49        JavascriptFidelityDimension {
50            name: "jobs-modules",
51            evidence: "explicit drain-to-empty microtasks and authorized source modules",
52        },
53        JavascriptFidelityDimension {
54            name: "boundedness",
55            evidence: "source, evaluation, arena, collection, pattern, job, and module limits",
56        },
57        JavascriptFidelityDimension {
58            name: "expected-gaps",
59            evidence: "profile and RegExp gap catalogs; Node and ambient hosts excluded",
60        },
61    ]
62}
63
64/// Generated regression inventory. Each named module contains its executable test.
65pub const fn javascript_regression_cases() -> &'static [JavascriptRegressionCase] {
66    &[
67        JavascriptRegressionCase {
68            id: "descriptors",
69            evidence: "objects::tests",
70        },
71        JavascriptRegressionCase {
72            id: "cycles",
73            evidence: "managed::tests::shared_collector_reclaims_cycles",
74        },
75        JavascriptRegressionCase {
76            id: "completion",
77            evidence: "runtime::tests",
78        },
79        JavascriptRegressionCase {
80            id: "collection",
81            evidence: "managed::tests",
82        },
83        JavascriptRegressionCase {
84            id: "drain-to-empty-jobs",
85            evidence: "jobs::tests::checkpoint_drains_reentrant_microtasks_and_isolates_finalization",
86        },
87        JavascriptRegressionCase {
88            id: "modules",
89            evidence: "modules::tests",
90        },
91        JavascriptRegressionCase {
92            id: "regexp-subset",
93            evidence: "regexp::tests",
94        },
95        JavascriptRegressionCase {
96            id: "utf16-code-unit-laws",
97            evidence: "text::tests",
98        },
99        JavascriptRegressionCase {
100            id: "capability-refusal",
101            evidence: "modules::tests",
102        },
103    ]
104}
105
106#[cfg(test)]
107mod tests {
108    use super::*;
109
110    #[test]
111    fn fidelity_dimensions_and_regressions_are_frozen_separately() {
112        assert_eq!(javascript_fidelity_dimensions().len(), 8);
113        assert_eq!(javascript_regression_cases().len(), 9);
114        assert!(
115            javascript_fidelity_dimensions()
116                .iter()
117                .all(|x| !x.evidence.is_empty())
118        );
119        assert!(
120            javascript_regression_cases()
121                .iter()
122                .all(|x| !x.evidence.is_empty())
123        );
124    }
125
126    #[test]
127    fn oracle_is_evidence_not_a_dependency() {
128        let manifest = include_str!("../Cargo.toml").to_ascii_lowercase();
129        for forbidden in [
130            "test262",
131            "swc",
132            "boa_engine",
133            "deno_core",
134            "nodejs",
135            "quickjs",
136            "v8",
137        ] {
138            assert!(
139                !manifest.contains(forbidden),
140                "forbidden dependency {forbidden}"
141            );
142        }
143        assert!(ECMA262_ORACLE.contains("frozen"));
144        assert!(TEST262_ORACLE.contains("observed"));
145    }
146
147    #[test]
148    fn sources_have_no_private_engine_fallback() {
149        let sources = [
150            include_str!("runtime.rs"),
151            include_str!("objects.rs"),
152            include_str!("jobs.rs"),
153            include_str!("modules.rs"),
154            include_str!("managed.rs"),
155            include_str!("profile.rs"),
156        ]
157        .join("\n")
158        .to_ascii_lowercase();
159        for forbidden in [
160            "compilerir",
161            "bytecodeop",
162            "optimizerpass",
163            "jitcompile",
164            "privateheap",
165            "privatescheduler",
166            "modulecache",
167            "nodefallback",
168        ] {
169            assert!(
170                !sources.contains(forbidden),
171                "forbidden engine seam {forbidden}"
172            );
173        }
174    }
175}