- The cargo target folder is <cache>/cargo-target, next to Wasmtime's cache, which moves to <cache>/wasmtime: Wasmtime's cleanup worker deletes unknown entries in its folder, also Cargo's artifacts. - Builds use the SDK at <cache>/sdk/<content hash>/, so cargo reuses the compiled SDK in every world. /plugins/cargo/sdk/ stays for agents. - Tests run in the release profile and share compiled crates with the release build. - The cargo and cli tests use a persistent cache in CARGO_TARGET_TMPDIR: warm, the cargo suite takes 11 s (was 235 s) and the cli suite 6 s (was 149 s). - nix flake check runs ignored stress tests. AGENTS.md: rules for fast tests.
2.2 KiB
2.2 KiB
Working on Sausage
Sausage is meant to be read and changed by agents, including its own agent. Keep it that way.
Priorities
- Correct. Every behavior in
PROTOCOL.mdhas a test incli/tests/. - Simple and short. Prefer the obvious code. No abstraction for one caller. No configuration that nobody asked for.
- Readable. A new reader must understand a file without the others. Each module starts with a doc comment that says what it owns.
- Efficient on the paths that run per call.
- Raw and minimal. Sausage has no permissions, sandboxing beyond WASI, limits, or authentication. Do not add them to the core. Add nothing to the host that a plugin (or the agent, by changing itself) could do.
Layout
cli/: the host (sausagebinary and library): the core, the nativecargoplugin, the WASI test runner, and the console.vfs/:sausage-vfs, the virtual filesystem for WASI guests. It knows nothing about Sausage.interface/:sausage-interface: OpenRPC documents, the compatibility check, and the generator of client code.sdk/:sausage-plugin, the SDK for Rust plugins, andsdk/macros/, its macros. Never published:cargopointssausage-plugin = "0.1"at its local copy.agent/: the agent plugin.sausage initembeds and builds it.examples/: small plugins. They are not workspace members.PROTOCOL.md: the contract between the core and the plugins. Change it in the same commit as the behavior.DECISIONS.mdsays why; when the two disagree,PROTOCOL.mdand the code win.
Checks
nix flake check -L # everything below, plus the stress tests; CI runs this on every push
nix develop -c cargo test --workspace # fast with a warm cache: run it during development
nix develop -c cargo build --release -p agent --target wasm32-wasip2
nix develop -c cargo clippy --workspace
nix run -- init and nix run -- run must keep working without other
setup.
Tests must stay fast. Only a few tests may wait for a timing (grace periods,
deadlines). Poll for a condition with a deadline, do not sleep. #[ignore] is
only for stress tests: nix flake check runs them with --include-ignored.
Tests that build plugins use the persistent cache in
env!("CARGO_TARGET_TMPDIR").