diff --git a/src/core/debug.rs b/src/core/debug.rs
index 5e52f399a8bf6e7b92b954498aa5792c239ce6f4..63f25d472c068cdab984b23b444fc6c57106f8ed 100644
--- a/src/core/debug.rs
+++ b/src/core/debug.rs
@@ -1,5 +1,8 @@
 use std::{any::Any, panic};
 
+/// Export debug proc_macros
+pub use conduit_macros::recursion_depth;
+
 /// Export all of the ancillary tools from here as well.
 pub use crate::utils::debug::*;
 
diff --git a/src/macros/debug.rs b/src/macros/debug.rs
new file mode 100644
index 0000000000000000000000000000000000000000..5251fa1795a6fdc464741ba0b9392301ac2702c3
--- /dev/null
+++ b/src/macros/debug.rs
@@ -0,0 +1,28 @@
+use std::cmp;
+
+use proc_macro::TokenStream;
+use syn::{parse_macro_input, AttributeArgs, Item};
+
+pub(super) fn recursion_depth(args: TokenStream, item_: TokenStream) -> TokenStream {
+	let item = item_.clone();
+	let item = parse_macro_input!(item as Item);
+	let _args = parse_macro_input!(args as AttributeArgs);
+
+	let mut best: usize = 0;
+	let mut count: usize = 0;
+	// think you'd find a fancy recursive ast visitor? think again
+	let tree = format!("{item:#?}");
+	for line in tree.lines() {
+		let trim = line.trim_start_matches(' ');
+		let diff = line.len().saturating_sub(trim.len());
+		let level = diff / 4;
+		best = cmp::max(level, best);
+		count = count.saturating_add(1);
+	}
+
+	println!("--- Recursion Diagnostic ---");
+	println!("DEPTH: {best}");
+	println!("LENGTH: {count}");
+
+	item_
+}
diff --git a/src/macros/mod.rs b/src/macros/mod.rs
index 94ea781e317a14524642489478232f6c7661c3f8..b01e5275aceca50710d88ec7942b71f479eb438a 100644
--- a/src/macros/mod.rs
+++ b/src/macros/mod.rs
@@ -1,5 +1,6 @@
 mod admin;
 mod cargo;
+mod debug;
 mod rustc;
 mod utils;
 
@@ -13,5 +14,8 @@ pub fn admin_command_dispatch(args: TokenStream, input: TokenStream) -> TokenStr
 #[proc_macro_attribute]
 pub fn cargo_manifest(args: TokenStream, input: TokenStream) -> TokenStream { cargo::manifest(args, input) }
 
+#[proc_macro_attribute]
+pub fn recursion_depth(args: TokenStream, input: TokenStream) -> TokenStream { debug::recursion_depth(args, input) }
+
 #[proc_macro]
 pub fn rustc_flags_capture(args: TokenStream) -> TokenStream { rustc::flags_capture(args) }