diff --git a/.context/agent-context.json b/.context/agent-context.json deleted file mode 100644 index bad1e48..0000000 --- a/.context/agent-context.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "current_phase": "complete", - "active_task": { - "id": "OWNERSHIP-REFACTOR", - "status": "complete", - "description": "Successfully implemented ownership-based model to eliminate all Mutex/OnceLock from task execution" - }, - "completed_tasks": [ - { - "id": "TASK-001", - "desc": "Updated Task trait to take ownership (self instead of &mut self)", - "status": "complete" - }, - { - "id": "TASK-002", - "desc": "Updated #[task] macro to generate new Task trait signature", - "status": "complete" - }, - { - "id": "TASK-003", - "desc": "Removed Mutex from TypedNode - store task directly", - "status": "complete" - }, - { - "id": "TASK-004", - "desc": "Updated ExecutableNode to consume self and return output", - "status": "complete" - }, - { - "id": "TASK-005", - "desc": "Modified DagRunner to store Option>", - "status": "complete" - }, - { - "id": "TASK-006", - "desc": "Updated run() to collect and store outputs from executed nodes", - "status": "complete" - }, - { - "id": "TASK-007", - "desc": "Updated get() to retrieve from centralized output storage", - "status": "complete" - }, - { - "id": "TASK-008", - "desc": "Comprehensive testing - all 307 tests pass", - "status": "complete" - } - ], - "backlog": [], - "next_agent": "code-reviewer", - "context": "Ownership-based refactor complete. Eliminated ALL Mutex/OnceLock from task execution path. All 307 tests pass. Ready for review.", - "technical_decisions": { - "ownership_model": "Task::run(self) takes ownership - IMPLEMENTED", - "execution_model": "ExecutableNode consumes self, returns Box - IMPLEMENTED", - "storage_model": "DagRunner stores ALL outputs in centralized HashMap - IMPLEMENTED", - "synchronization": "ZERO Mutex/OnceLock in task execution (only in DAG builder pattern) - ACHIEVED", - "api_preservation": "Public API unchanged - macro handles delegation transparently - VERIFIED" - }, - "implementation_summary": { - "files_changed": [ - "src/task.rs", - "dagx-macros/src/lib.rs", - "src/node.rs", - "src/runner.rs", - "src/task/tests.rs", - "src/node/tests.rs", - "src/runner/tests.rs" - ], - "lines_changed": "~350 lines modified", - "test_results": { - "total": 307, - "passed": 307, - "failed": 0, - "ignored": 3 - }, - "performance_impact": "Eliminated Mutex contention during task execution - should see improved throughput", - "breaking_changes": "None - public API preserved" - } -} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index ca7aced..030d87d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,33 @@ All notable changes to dagx will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.2.3] - 2025-10-08 + +[View changes](https://github.com/swaits/dagx/compare/v0.2.2...v0.2.3) + +### Added + +- **Optional tracing support** via `tracing` feature flag + - Zero-cost when disabled (literally 0ns overhead - code removed at compile time) + - Structured logging at INFO, DEBUG, TRACE, and ERROR levels + - Instrumentation for DAG construction, execution, and error paths + - New example: `examples/tracing_example.rs` demonstrating usage + - Comprehensive test coverage in `tests/tracing/` for both with/without feature + - Follows same pattern as tokio/hyper for performance-critical libraries + - Updated documentation in README.md and lib.rs + +### Changed + +- Improved `examples/04_parallel_computation.rs` to actually prove parallelism + - Now compares parallel vs sequential execution with timing measurements + - Calculates and displays speedup ratio (e.g., "4.0x faster") + - Clarifies difference from basic fan-in pattern in 03_fan_in.rs + - Added warnings for debug builds with low speedup + +### Fixed + +- Fixed broken ASCII diagram in `examples/04_parallel_computation.rs` + ## [0.2.2] - 2025-10-07 [View changes](https://github.com/swaits/dagx/compare/v0.2.1...v0.2.2) diff --git a/Cargo.lock b/Cargo.lock index fb44ac8..7b59f06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,7 +126,7 @@ dependencies = [ "polling", "rustix", "slab", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -184,7 +184,7 @@ dependencies = [ "rustix", "signal-hook-registry", "slab", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -434,7 +434,7 @@ dependencies = [ [[package]] name = "dagx" -version = "0.2.2" +version = "0.2.3" dependencies = [ "async-executor", "async-std", @@ -454,7 +454,7 @@ dependencies = [ [[package]] name = "dagx-macros" -version = "0.2.2" +version = "0.2.3" dependencies = [ "proc-macro2", "quote", @@ -474,7 +474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -712,11 +712,10 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -821,9 +820,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -831,15 +830,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] @@ -904,7 +903,7 @@ dependencies = [ "hermit-abi", "pin-project-lite", "rustix", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -953,9 +952,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -1005,7 +1004,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -1375,14 +1374,14 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" @@ -1404,9 +1403,9 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.61.1" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ "windows-link", ] diff --git a/Cargo.toml b/Cargo.toml index 1c92052..e88e8e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["dagx-macros"] [package] name = "dagx" -version = "0.2.2" +version = "0.2.3" edition = "2021" rust-version = "1.81" authors = ["Stephen Waits "] @@ -27,7 +27,7 @@ unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin)', 'cfg(tarpauli [dependencies] futures = "0.3" parking_lot = "0.12" -dagx-macros = { version = "0.2.2", path = "./dagx-macros" } +dagx-macros = { version = "0.2.3", path = "./dagx-macros" } tracing = { version = "0.1", optional = true } [dev-dependencies] diff --git a/dagx-macros/Cargo.toml b/dagx-macros/Cargo.toml index e2b7980..e622bc1 100644 --- a/dagx-macros/Cargo.toml +++ b/dagx-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dagx-macros" -version = "0.2.2" +version = "0.2.3" edition = "2021" rust-version = "1.81" authors = ["Stephen Waits "] diff --git a/examples/04_parallel_computation.rs b/examples/04_parallel_computation.rs index 24d0d45..db03e6b 100644 --- a/examples/04_parallel_computation.rs +++ b/examples/04_parallel_computation.rs @@ -180,10 +180,7 @@ async fn main() -> DagResult<()> { let speedup = sequential_time.as_secs_f64() / parallel_time.as_secs_f64(); - println!( - "Speedup: {:.1}x faster with parallel execution!", - speedup - ); + println!("Speedup: {:.1}x faster with parallel execution!", speedup); println!("This proves dagx runs tasks on multiple CPU cores simultaneously."); if speedup > 2.0 { diff --git a/examples/tracing_example.rs b/examples/tracing_example.rs index 14a4006..87924eb 100644 --- a/examples/tracing_example.rs +++ b/examples/tracing_example.rs @@ -72,8 +72,7 @@ async fn main() { // Use RUST_LOG environment variable to control log level fmt() .with_env_filter( - EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("dagx=info")), + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("dagx=info")), ) .init(); diff --git a/scripts/release_check.sh b/scripts/release_check.sh index f9f4cdc..5b3d53d 100755 --- a/scripts/release_check.sh +++ b/scripts/release_check.sh @@ -7,7 +7,7 @@ set -e # ============================================================================= # CONFIGURATION # ============================================================================= -VERSION="0.2.2" +VERSION="0.2.3" echo "==================" echo "dagx Release Check" diff --git a/src/runner.rs b/src/runner.rs index 7088ef6..dcc6ec0 100644 --- a/src/runner.rs +++ b/src/runner.rs @@ -435,14 +435,14 @@ impl DagRunner { .await .unwrap_or_else(|panic_payload| { // Convert panic to error - let panic_message = if let Some(s) = panic_payload.downcast_ref::<&str>() - { - s.to_string() - } else if let Some(s) = panic_payload.downcast_ref::() { - s.clone() - } else { - "unknown panic".to_string() - }; + let panic_message = + if let Some(s) = panic_payload.downcast_ref::<&str>() { + s.to_string() + } else if let Some(s) = panic_payload.downcast_ref::() { + s.clone() + } else { + "unknown panic".to_string() + }; #[cfg(feature = "tracing")] error!( diff --git a/tests/tracing/with_tracing.rs b/tests/tracing/with_tracing.rs index 679fe2e..3cb962e 100644 --- a/tests/tracing/with_tracing.rs +++ b/tests/tracing/with_tracing.rs @@ -114,8 +114,7 @@ async fn test_tracing_multiple_layers() { // Initialize tracing subscriber let _ = fmt() .with_env_filter( - EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("debug")), + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("debug")), ) .with_test_writer() .try_init();