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