Skip to main content

noether_core/stdlib/
mod.rs

1mod 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
18/// Deterministic Ed25519 keypair for stdlib signing.
19/// Derived from SHA-256 of a fixed seed string.
20pub 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
25/// Load all stdlib stages, signed and ready for store insertion.
26pub 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); // 76 existing + 4 process stages
52    }
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}