Skip to main content

noether_core/stdlib/
mod.rs

1mod 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
19/// Deterministic Ed25519 keypair for stdlib signing.
20/// Derived from SHA-256 of a fixed seed string.
21pub 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
26/// Load all stdlib stages, signed and ready for store insertion.
27pub 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        // 76 existing + 4 process + 5 generic (slice 3 identity/head/tail
54        // + row-poly mark_done + refinement clamp_percent)
55        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}