noether_core/stdlib/
mod.rs1mod collections;
2mod control;
3mod data;
4mod generic;
5mod internal;
6mod io;
7mod kv;
8mod llm;
9mod process;
10mod scalar;
11mod text;
12mod ui;
13mod validation;
14
15use crate::stage::Stage;
16use ed25519_dalek::SigningKey;
17use sha2::{Digest, Sha256};
18
19pub fn stdlib_signing_key() -> SigningKey {
22 let seed = Sha256::digest(b"noether-stdlib-signing-key-v0.1.0");
23 SigningKey::from_bytes(&seed.into())
24}
25
26pub fn load_stdlib() -> Vec<Stage> {
28 let key = stdlib_signing_key();
29 let mut stages = Vec::new();
30 stages.extend(scalar::stages(&key));
31 stages.extend(collections::stages(&key));
32 stages.extend(control::stages(&key));
33 stages.extend(io::stages(&key));
34 stages.extend(llm::stages(&key));
35 stages.extend(data::stages(&key));
36 stages.extend(internal::stages(&key));
37 stages.extend(text::stages(&key));
38 stages.extend(kv::stages(&key));
39 stages.extend(validation::stages(&key));
40 stages.extend(ui::stages(&key));
41 stages.extend(process::stages(&key));
42 stages.extend(generic::stages(&key));
43 stages
44}
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn load_stdlib_returns_expected_stage_count() {
52 let stages = load_stdlib();
53 assert_eq!(stages.len(), 85);
56 }
57
58 #[test]
59 fn stdlib_ids_are_deterministic() {
60 let stages1 = load_stdlib();
61 let stages2 = load_stdlib();
62 for (s1, s2) in stages1.iter().zip(stages2.iter()) {
63 assert_eq!(s1.id, s2.id, "Stage IDs should be deterministic");
64 }
65 }
66
67 #[test]
68 fn all_stdlib_stages_are_active() {
69 let stages = load_stdlib();
70 for s in &stages {
71 assert_eq!(
72 s.lifecycle,
73 crate::stage::StageLifecycle::Active,
74 "Stdlib stage '{}' should be Active",
75 s.description
76 );
77 }
78 }
79
80 #[test]
81 fn all_stdlib_stages_are_signed() {
82 let stages = load_stdlib();
83 for s in &stages {
84 assert!(
85 s.ed25519_signature.is_some(),
86 "Stdlib stage '{}' should be signed",
87 s.description
88 );
89 }
90 }
91
92 #[test]
93 fn no_duplicate_ids() {
94 let stages = load_stdlib();
95 let mut ids: Vec<_> = stages.iter().map(|s| &s.id).collect();
96 let len_before = ids.len();
97 ids.sort();
98 ids.dedup();
99 assert_eq!(ids.len(), len_before, "All stage IDs should be unique");
100 }
101}