termgrid-core 1.5.5

Deterministic terminal grid state engine with invariant enforcement and backend decoupling.
Documentation
diff --git a/tests/wire_format_v1.rs b/tests/wire_format_v1.rs
index 0000000..0000000 100644
--- a/tests/wire_format_v1.rs
+++ b/tests/wire_format_v1.rs
@@ -120,29 +120,23 @@
 #[test]
 fn wrap_defaults_are_canonicalized_on_text_block_styled_op() {
     let op = RenderOp::TextBlockStyled {
         x: 0,
         y: 0,
         w: 10,
         h: u16::MAX,
         spans: vec![termgrid_core::Span::new("Hi", Style::plain())],
         wrap: WrapOpts::default(),
     };
     let v = serde_json::to_value(op).expect("serialize RenderOp");
-    // Canonical v1 includes explicit defaults for wrap opts (stable roundtrip).
-    assert_eq!(
-        v,
-        json!({
-            "op":"text_block_styled",
-            "x":0,"y":0,"w":10,"h":65535,
-            "spans":[{"text":"Hi"}],
-            "wrap":{
-                "hard_break_long_tokens": true,
-                "preserve_spaces": false,
-                "trim_end": true
-            }
-        })
-    );
+    // Canonical v1 omits wrap when it is all-default.
+    assert_eq!(v.get("op").and_then(|x| x.as_str()), Some("text_block_styled"));
+    assert_eq!(v.get("x").and_then(|x| x.as_u64()), Some(0));
+    assert_eq!(v.get("y").and_then(|x| x.as_u64()), Some(0));
+    assert_eq!(v.get("w").and_then(|x| x.as_u64()), Some(10));
+    assert_eq!(v.get("h").and_then(|x| x.as_u64()), Some(65535));
+    assert!(v.get("wrap").is_none(), "wrap should be omitted when default");
 }