diff --git a/ast/ast.go b/ast/ast.go
index 918a8cd..b944824 100644
--- a/ast/ast.go
+++ b/ast/ast.go
@@ -101,8 +101,10 @@
 	}
 }
 
-// MarshalJSON implements custom JSON marshaling to ensure clean output
-func (r *Rewrite) MarshalJSON() ([]byte, error) {
+// MarshalJSON implements custom JSON marshaling to ensure clean output.
+// Uses a value receiver so both json.Marshal(rw) and json.Marshal(&rw)
+// produce identical output including the @type field.
+func (r Rewrite) MarshalJSON() ([]byte, error) {
 	// Create a map with only the modern field names
 	result := make(map[string]any)
 
@@ -131,6 +133,34 @@
 	return json.Marshal(result)
 }
 
+// ToMap converts the Rewrite to a map[string]any suitable for direct
+// injection into map-based JSON structures. The output is identical to
+// what MarshalJSON produces.
+func (r *Rewrite) ToMap() map[string]any {
+	result := map[string]any{
+		"@type": "koral:rewrite",
+	}
+	if r.Editor != "" {
+		result["editor"] = r.Editor
+	}
+	if r.Operation != "" {
+		result["operation"] = r.Operation
+	}
+	if r.Scope != "" {
+		result["scope"] = r.Scope
+	}
+	if r.Src != "" {
+		result["src"] = r.Src
+	}
+	if r.Comment != "" {
+		result["_comment"] = r.Comment
+	}
+	if r.Original != nil {
+		result["original"] = r.Original
+	}
+	return result
+}
+
 // Token represents a koral:token
 type Token struct {
 	Wrap     Node      `json:"wrap"`
diff --git a/ast/rewrite_test.go b/ast/rewrite_test.go
index 4fe0ffb..6aa524d 100644
--- a/ast/rewrite_test.go
+++ b/ast/rewrite_test.go
@@ -386,6 +386,7 @@
 	err = json.Unmarshal(data, &result)
 	require.NoError(t, err)
 
+	assert.Equal(t, "koral:rewrite", result["@type"])
 	assert.Equal(t, "termMapper", result["editor"])
 	assert.Equal(t, "operation:mapping", result["operation"])
 	assert.Equal(t, "foundry", result["scope"])
@@ -397,3 +398,90 @@
 	assert.NotContains(t, result, "source")
 	assert.NotContains(t, result, "origin")
 }
+
+func TestRewriteMarshalJSONValueAndPointerConsistent(t *testing.T) {
+	rw := Rewrite{
+		Editor:   "Koral-Mapper",
+		Scope:    "key",
+		Original: "textClass",
+	}
+
+	valueBytes, err := json.Marshal(rw)
+	require.NoError(t, err)
+
+	pointerBytes, err := json.Marshal(&rw)
+	require.NoError(t, err)
+
+	assert.JSONEq(t, string(pointerBytes), string(valueBytes))
+}
+
+func TestRewriteToMap(t *testing.T) {
+	t.Run("All fields set", func(t *testing.T) {
+		rw := Rewrite{
+			Editor:    "termMapper",
+			Operation: "operation:mapping",
+			Scope:     "foundry",
+			Src:       "source-value",
+			Comment:   "Test comment",
+			Original:  "original-value",
+		}
+
+		m := rw.ToMap()
+		assert.Equal(t, "koral:rewrite", m["@type"])
+		assert.Equal(t, "termMapper", m["editor"])
+		assert.Equal(t, "operation:mapping", m["operation"])
+		assert.Equal(t, "foundry", m["scope"])
+		assert.Equal(t, "source-value", m["src"])
+		assert.Equal(t, "Test comment", m["_comment"])
+		assert.Equal(t, "original-value", m["original"])
+	})
+
+	t.Run("Only editor and scope", func(t *testing.T) {
+		rw := Rewrite{
+			Editor: "Koral-Mapper",
+			Scope:  "key",
+		}
+
+		m := rw.ToMap()
+		assert.Equal(t, "koral:rewrite", m["@type"])
+		assert.Equal(t, "Koral-Mapper", m["editor"])
+		assert.Equal(t, "key", m["scope"])
+		assert.NotContains(t, m, "operation")
+		assert.NotContains(t, m, "src")
+		assert.NotContains(t, m, "_comment")
+		assert.NotContains(t, m, "original")
+	})
+
+	t.Run("With complex original", func(t *testing.T) {
+		original := map[string]any{
+			"@type":     "koral:docGroup",
+			"operation": "operation:and",
+		}
+		rw := Rewrite{
+			Editor:   "Koral-Mapper",
+			Original: original,
+		}
+
+		m := rw.ToMap()
+		assert.Equal(t, "koral:rewrite", m["@type"])
+		assert.Equal(t, "Koral-Mapper", m["editor"])
+		assert.Equal(t, original, m["original"])
+	})
+
+	t.Run("Matches MarshalJSON output", func(t *testing.T) {
+		rw := Rewrite{
+			Editor:   "Koral-Mapper",
+			Scope:    "key",
+			Original: "textClass",
+		}
+
+		toMapResult := rw.ToMap()
+
+		data, err := json.Marshal(&rw)
+		require.NoError(t, err)
+		var fromJSON map[string]any
+		require.NoError(t, json.Unmarshal(data, &fromJSON))
+
+		assert.Equal(t, fromJSON, toMapResult)
+	})
+}
