# nucleus-substrate-core
[](https://crates.io/crates/nucleus-substrate-core)
[](https://docs.rs/nucleus-substrate-core)
The **categorical core** of the Nucleus substrate. Three load-bearing
types and one signed envelope:
- [`Session`] — the agent-action object every projection projects from
- [`Projection`] — sealed, adjacently-tagged sum: `Identity`,
`Capability`, `Flow`, `Economic` (`#[non_exhaustive]`)
- [`Receipt`] — Ed25519-signed colimit envelope binding a session to
any subset of its projections
The categorical claim is proved in Lean 4 — see
[`receipt_factors_through_projections`][lean-theorem] in
`formal/Nucleus/Substrate/Colimit.lean`.
## Quick example
```rust
use nucleus_substrate_core::{Session, Receipt, Projection};
use ed25519_dalek::SigningKey;
let sk = SigningKey::from_bytes(&[7u8; 32]);
let session = Session {
session_id: "spiffe://test/agent-x".into(),
issuer_kid: "test-kid".into(),
issued_at_micros: 1_717_000_000_000_000,
parent_chain: vec![],
};
let projection = Projection::Identity(serde_json::json!({
"sub": "spiffe://test/agent-x",
"aud": "nucleus-substrate-test",
}));
let receipt = Receipt::sign(session, vec![projection], &sk);
let vk: [u8; 32] = sk.verifying_key().to_bytes();
receipt.verify(&vk).expect("self-built receipt verifies");
```
## Position in the substrate
This crate is the **only required dependency** for projection-lifter
crates and the SDK. Server-side hub crates depend on it for the
typed VCG wire shapes in `mechanism::vcg`. Everything else in the
substrate stack composes on top of these three types.
| Core | `nucleus-substrate-core` (you are here) | std + serde + ed25519 + blake3 |
| Identity lifter | `nucleus-identity-projection` | core |
| Flow lifter | `nucleus-flow-projection` | core |
| VCG lifter | `nucleus-mechanism-vcg` | core |
| SDK | `nucleus-substrate-sdk` | core + 3 lifters + reqwest |
| CLI | `nucleus-substrate-cli` | sdk |
## License
Dual-licensed under MIT OR Apache-2.0. See
[`LICENSE-MIT`](./LICENSE-MIT) and [`LICENSE-APACHE`](./LICENSE-APACHE).
[`Session`]: https://docs.rs/nucleus-substrate-core/latest/nucleus_substrate_core/struct.Session.html
[`Projection`]: https://docs.rs/nucleus-substrate-core/latest/nucleus_substrate_core/enum.Projection.html
[`Receipt`]: https://docs.rs/nucleus-substrate-core/latest/nucleus_substrate_core/struct.Receipt.html
[lean-theorem]: https://github.com/coproduct-private/spiffy/blob/main/formal/Nucleus/Substrate/Colimit.lean