Skip to content

Commit 1bbae14

Browse files
southgatesouthgate
authored andcommitted
v0.9.4: cross-ecosystem absorption — pathway learner, manifest discovery, proptest
- is_timeout_likely() + is_application_error(): IpcPhase helpers (sweetGrass) - OrExit wired into main.rs startup validation (bind address, lifecycle) - operation_dependencies + cost_estimates in capability.list (Pathway Learner) - extract_capabilities(): parse partner capability.list (4 formats) - Manifest discovery: $XDG_RUNTIME_DIR/ecoPrimals/*.json fallback (rhizoCrypt S16) - Proptest: 4 property-based tests for IpcPhase, extract_rpc_error, DispatchOutcome - deny.toml wildcards=deny (ecosystem standard) - NeuralAPI IPC evolved to structured Ipc { phase, message } - Docs: 123 files, 1221 tests, 90.89% function coverage Made-with: Cursor
1 parent b93e0fc commit 1bbae14

21 files changed

Lines changed: 648 additions & 92 deletions

File tree

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.9.4] - 2026-03-16
9+
10+
### Added
11+
- **`is_timeout_likely()`**: IpcPhase helper for timeout detection (sweetGrass alignment).
12+
- **`is_application_error()`**: IpcPhase helper for JSON-RPC error classification.
13+
- **`OrExit` wired into main.rs**: Startup validation uses zero-panic `or_exit()` for bind address and lifecycle init.
14+
- **`operation_dependencies` + `cost_estimates`**: Top-level DAG and cost metadata in `capability.list` for Pathway Learner.
15+
- **`extract_capabilities()`**: Parse partner primals' `capability.list` responses (4 formats: flat, object, nested, combined).
16+
- **Manifest discovery**: `$XDG_RUNTIME_DIR/ecoPrimals/*.json` fallback for local primal discovery (rhizoCrypt S16 pattern).
17+
- **Proptest**: Property-based tests for `IpcPhase`, `extract_rpc_error`, `DispatchOutcome`, JSON-RPC types (4 property tests).
18+
19+
### Changed
20+
- **`deny.toml wildcards = "deny"`**: Tightened from `"warn"` to match groundSpring/wetSpring/healthSpring standard.
21+
- **NeuralAPI IPC errors**: `register_with_neural_api()` and `deregister_from_neural_api()` evolved from `Network(format!(...))` to structured `Ipc { phase, message }`.
22+
- **Attestation provider IPC**: `DiscoveredAttestationProvider::jsonrpc_call()` evolved to structured IPC errors with `extract_rpc_error()`.
23+
- **Stale "stubbed call" doc**: `waypoint.rs` comment corrected to "requests attestation from the capability registry".
24+
25+
### Metrics
26+
- Tests: 1,221 passing (up from 1,206)
27+
- Coverage: 88.74% line / 84.51% region / 90.89% function
28+
- Clippy: 0 warnings (pedantic + nursery, all features)
29+
- Doc warnings: 0
30+
- Unsafe in production: 0
31+
- Max file size: 955 lines (all 123 files under 1,000)
32+
- Source files: 123 `.rs` files (up from 122)
33+
- deny.toml: wildcards = "deny" (ecosystem standard)
34+
- License: AGPL-3.0-or-later
35+
836
## [0.9.3] - 2026-03-16
937

1038
### Added
@@ -732,6 +760,7 @@ spine.append(entry)?;
732760

733761
---
734762

763+
[0.9.4]: https://github.com/ecoPrimals/loamSpine/compare/v0.9.3...v0.9.4
735764
[0.9.3]: https://github.com/ecoPrimals/loamSpine/compare/v0.9.2...v0.9.3
736765
[0.9.2]: https://github.com/ecoPrimals/loamSpine/compare/v0.9.1...v0.9.2
737766
[0.9.1]: https://github.com/ecoPrimals/loamSpine/compare/v0.9.0...v0.9.1

CONTRIBUTING.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Thank you for your interest in contributing to LoamSpine! This document provides
1515
### Code Quality
1616
- **Zero Unsafe in Production**: `#![deny(unsafe_code)]` on production code; test modules prefer `temp-env` over raw `unsafe` env mutations, with `#[expect(unsafe_code, reason)]` where needed (migrated from `#[allow(unsafe_code)]`)
1717
- **Pedantic Linting**: `clippy::pedantic` and `clippy::nursery` must pass
18-
- **High Coverage**: Aim for 90%+ function coverage (current: 91.03%, 1,206 tests)
18+
- **High Coverage**: Aim for 90%+ function coverage (current: 90.89%, 1,221 tests)
1919
- **File Size**: Keep files under 1000 lines; refactor smartly, not just split
2020
- **Modular Design**: Use domain-specific modules (see `service/` pattern)
2121
- **Zero-Copy**: Use `bytes::Bytes` for network buffers when possible
@@ -43,7 +43,7 @@ Thank you for your interest in contributing to LoamSpine! This document provides
4343
# Build
4444
cargo build
4545

46-
# Test (1,206 tests)
46+
# Test (1,221 tests)
4747
cargo test --workspace
4848

4949
# Linting (must pass, zero warnings)
@@ -293,16 +293,16 @@ Look for issues labeled `good-first-issue`:
293293

294294
| Metric | Value |
295295
|--------|-------|
296-
| Version | 0.9.3 |
296+
| Version | 0.9.4 |
297297
| Edition | 2024 |
298-
| Tests | 1,206 |
299-
| Coverage | 91.03% function / 88.91% line (llvm-cov) |
298+
| Tests | 1,221 |
299+
| Coverage | 90.89% function / 88.74% line / 84.51% region (llvm-cov) |
300300
| Max File Size | 955 lines (all < 1000) |
301301
| Clippy | pedantic + nursery (0 warnings) |
302302
| Unsafe Code | 0 in production (`#![deny(unsafe_code)]`) |
303303
| Lint Exceptions | 0 `#[allow]` in production (all `#[expect(reason)]`) |
304304
| License | AGPL-3.0-or-later |
305-
| SPDX Headers | All 121 source files |
305+
| SPDX Headers | All 123 source files |
306306
| ecoBin | Zero C dependencies (pure Rust) |
307307
| cargo deny | bans, licenses, sources pass |
308308
| UniBin | `loamspine server` subcommand |

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ members = [
77
]
88

99
[workspace.package]
10-
version = "0.9.3"
10+
version = "0.9.4"
1111
edition = "2024"
1212
license = "AGPL-3.0-or-later"
1313
repository = "https://github.com/ecoPrimals/loamSpine"

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
**Permanence Layer -- Selective Memory & Loam Certificates**
44

55
[![License](https://img.shields.io/badge/license-AGPL--3.0--or--later-blue)]()
6-
[![Version](https://img.shields.io/badge/version-0.9.3-blue)]()
7-
[![Tests](https://img.shields.io/badge/tests-1%2C206%20passing-brightgreen)]()
8-
[![Coverage](https://img.shields.io/badge/coverage-91.03%25%20function-brightgreen)]()
6+
[![Version](https://img.shields.io/badge/version-0.9.4-blue)]()
7+
[![Tests](https://img.shields.io/badge/tests-1%2C221%20passing-brightgreen)]()
8+
[![Coverage](https://img.shields.io/badge/coverage-90.89%25%20function-brightgreen)]()
99
[![Unsafe](https://img.shields.io/badge/unsafe-ZERO%20production-red)]()
1010
[![Edition](https://img.shields.io/badge/edition-2024-blue)]()
1111
[![ecoBin](https://img.shields.io/badge/ecoBin-compliant-green)]()
@@ -167,15 +167,15 @@ LoamSpine discovers services at runtime via **infant discovery** (zero knowledge
167167

168168
| Metric | Value |
169169
|--------|-------|
170-
| **Version** | 0.9.3 |
170+
| **Version** | 0.9.4 |
171171
| **Edition** | 2024 |
172-
| **Tests** | 1,206 passing |
173-
| **Coverage** | 91.03% function / 88.91% line (llvm-cov) |
172+
| **Tests** | 1,221 passing |
173+
| **Coverage** | 90.89% function / 88.74% line / 84.51% region (llvm-cov) |
174174
| **Clippy** | 0 warnings (pedantic + nursery, `-D warnings`) |
175175
| **Unsafe Code** | 0 in production (`#![deny(unsafe_code)]`) |
176176
| **Lint Exceptions** | 0 `#[allow]` in production (all `#[expect(reason)]`) |
177-
| **Max File Size** | 955 lines (all 122 files < 1000) |
178-
| **Source Files** | 122 `.rs` files across 2 crates + binary |
177+
| **Max File Size** | 955 lines (all 123 files < 1000) |
178+
| **Source Files** | 123 `.rs` files across 2 crates + binary |
179179
| **License** | AGPL-3.0-or-later |
180180
| **SPDX Headers** | All source files |
181181
| **ecoBin** | Zero C dependencies (pure Rust) |

STATUS.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Implementation Status
44

5-
**Current Version**: 0.9.3
5+
**Current Version**: 0.9.4
66
**Last Updated**: March 16, 2026
77

88
---
@@ -46,13 +46,13 @@ This document tracks implementation progress against the specification suite in
4646

4747
| Metric | Target | Current |
4848
|--------|--------|---------|
49-
| Tests || 1,206 |
50-
| Coverage (llvm-cov) | 90%+ | 88.91% line / 84.61% region / 91.03% function |
49+
| Tests || 1,221 |
50+
| Coverage (llvm-cov) | 90%+ | 88.74% line / 84.51% region / 90.89% function |
5151
| `unsafe` in production | 0 | 0 (`#![deny(unsafe_code)]`) |
5252
| Clippy pedantic+nursery | 0 | 0 |
5353
| Doc warnings | 0 | 0 |
54-
| Max file size | < 1000 lines | 955 max (all 122 files under 1000) |
55-
| Source files || 122 `.rs` files |
54+
| Max file size | < 1000 lines | 955 max (all 123 files under 1000) |
55+
| Source files || 123 `.rs` files |
5656
| Edition | 2024 | 2024 |
5757
| `#[allow]` in production | 0 | 0 (all migrated to `#[expect(reason)]`) |
5858

@@ -64,12 +64,12 @@ This document tracks implementation progress against the specification suite in
6464
|----------|--------|-------|
6565
| UniBin | PASS | `loamspine server`, `capabilities`, `socket` subcommands |
6666
| ecoBin | PASS | Zero C deps in default features; blake3 `pure` mode; musl cross-compile CI |
67-
| AGPL-3.0-or-later | PASS | SPDX headers on all 122 source files |
67+
| AGPL-3.0-or-later | PASS | SPDX headers on all 123 source files |
6868
| Scyborg license | PASS | `CertificateType::scyborg_license()`, metadata builders, schema constants |
6969
| Semantic naming | PASS | `{domain}.{operation}` per wateringHole standard |
7070
| Zero-copy | PASS | `Did``Arc<str>`, `Bytes` for payloads, `Cow<'static, str>` for config, zero-alloc JSON-RPC dispatch, `[u8; 24]` stack keys for storage, `entry.clone()` eliminated — `tip_entry()` zero-copy persistence |
7171
| MockTransport | PASS | `cfg(test|testing)` gated — no mock code in production binary |
72-
| File size limit | PASS | All 122 files under 1000 lines (max: 955). Certificate service smart-refactored (906 → 380+367+193). |
72+
| File size limit | PASS | All 123 files under 1000 lines (max: 955). Certificate service smart-refactored (906 → 380+367+193). |
7373

7474
---
7575

WHATS_NEXT.md

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Development Roadmap
44

5-
**Current Version**: 0.9.3
5+
**Current Version**: 0.9.4
66
**Last Updated**: March 16, 2026
77

88
---
@@ -117,11 +117,25 @@
117117

118118
---
119119

120-
## v0.9.4 Targets
120+
## v0.9.4 Completed (March 16, 2026)
121+
122+
- **`is_timeout_likely()` + `is_application_error()`** — IpcPhase helpers matching sweetGrass pattern
123+
- **`OrExit` wired into main.rs** — Zero-panic startup validation for bind address and lifecycle init
124+
- **`operation_dependencies` + `cost_estimates`** — Top-level DAG/cost metadata in capability.list for Pathway Learner
125+
- **`extract_capabilities()`** — Parse partner capability.list responses (4 formats: flat, object, nested, combined)
126+
- **Manifest discovery**`$XDG_RUNTIME_DIR/ecoPrimals/*.json` fallback (rhizoCrypt S16 pattern)
127+
- **Proptest** — 4 property-based tests for IpcPhase, extract_rpc_error, DispatchOutcome
128+
- **`deny.toml wildcards = "deny"`** — Tightened to match ecosystem standard
129+
- **NeuralAPI IPC evolution** — Registration/deregistration/attestation evolved to structured `Ipc { phase, message }`
130+
- **Coverage**: 90.89% function / 88.74% line / 84.51% region (1,221 tests)
131+
- **Source files**: 122 → 123 (added `discovery/manifest.rs`). All under 1000 lines (max: 955).
132+
133+
---
134+
135+
## v0.9.5 Targets
121136

122-
- **Wire `DispatchOutcome`** into JSON-RPC dispatch (currently defined but not yet used in handler)
123-
- **Wire `OrExit`** into `main.rs` startup validation
124137
- **Wire `StreamItem`** into provenance trio pipeline coordination
138+
- **Wire `DispatchOutcome`** into JSON-RPC server dispatch
125139
- **90%+ line coverage** — Storage backend error-path tests (redb 73.6%, sled 76.9%, sqlite 77-79%, cli_signer 74.6%)
126140
- **Signing capability middleware** — Signature verification on RPC layer (capability-discovered)
127141
- **Showcase demos** — Expand from ~10% to full coverage

bin/loamspine-service/main.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use loam_spine_api::{LoamSpineRpcService, run_jsonrpc_server, run_tarpc_server};
3434
use loam_spine_core::LoamSpineService;
3535
use loam_spine_core::config::LoamSpineConfig;
3636
use loam_spine_core::constants::network;
37+
use loam_spine_core::error::OrExit;
3738
use loam_spine_core::service::LifecycleManager;
3839
use tracing::{error, info};
3940

@@ -132,11 +133,14 @@ async fn run_server(
132133
let service = LoamSpineService::new();
133134
let config = LoamSpineConfig::default();
134135
let mut lifecycle = LifecycleManager::new(service.clone(), config);
135-
lifecycle.start().await?;
136+
lifecycle
137+
.start()
138+
.await
139+
.or_exit("Failed to start lifecycle manager");
136140

137141
let rpc_service = LoamSpineRpcService::new(service);
138142

139-
let ip: IpAddr = resolved_bind.parse()?;
143+
let ip: IpAddr = resolved_bind.parse().or_exit("Invalid bind address");
140144
let tarpc_addr = SocketAddr::new(ip, resolved_tarpc_port);
141145
let jsonrpc_addr = SocketAddr::new(ip, resolved_jsonrpc_port);
142146

0 commit comments

Comments
 (0)