diff --git a/internal/core/eval/closed.go b/internal/core/eval/closed.go
index 61ab1b3..c5a8aa9 100644
--- a/internal/core/eval/closed.go
+++ b/internal/core/eval/closed.go
@@ -718,12 +718,12 @@
 		return false, false
 	}
 	for isRegular := f.IsRegular(); o != nil; o = o.next {
-		if isRegular && (len(o.additional) > 0 || o.isOpen) {
+		if isRegular && (len(o.Additional) > 0 || o.IsOpen) {
 			return true, false
 		}
 
-		for _, g := range o.fields {
-			if f == g.label {
+		for _, g := range o.Fields {
+			if f == g.Label {
 				return true, false
 			}
 		}
@@ -732,7 +732,7 @@
 			continue
 		}
 
-		for _, b := range o.bulk {
+		for _, b := range o.Bulk {
 			if b.check.Match(ctx, o.env, f) {
 				return true, false
 			}
diff --git a/internal/core/eval/closed_test.go b/internal/core/eval/closed_test.go
index 9c1d3d7..a7c9cf4 100644
--- a/internal/core/eval/closed_test.go
+++ b/internal/core/eval/closed_test.go
@@ -361,7 +361,7 @@
 				fs := &fieldSet{}
 				c.Fields = append(c.Fields, fs)
 				for _, id := range f {
-					fs.fields = append(fs.fields, field{label: id})
+					fs.Fields = append(fs.Fields, FieldInfo{Label: id})
 				}
 			}
 
diff --git a/internal/core/eval/optionals.go b/internal/core/eval/optionals.go
index 4c6ae98..ad27e33 100644
--- a/internal/core/eval/optionals.go
+++ b/internal/core/eval/optionals.go
@@ -31,52 +31,52 @@
 	env *adt.Environment
 	id  adt.ID
 
-	// field marks the optional conjuncts of all explicit fields.
-	// Required fields are marked as empty
-	fields []field
+	// field marks the optional conjuncts of all explicit Fields.
+	// Required Fields are marked as empty
+	Fields []FieldInfo
 
 	// excluded are all literal fields that already exist.
-	bulk []bulkField
+	Bulk []bulkField
 
-	additional []adt.Expr
-	isOpen     bool // has a ...
+	Additional []adt.Expr
+	IsOpen     bool // has a ...
 }
 
 func (o *fieldSet) OptionalTypes() (mask adt.OptionalType) {
-	for _, f := range o.fields {
-		if len(f.optional) > 0 {
+	for _, f := range o.Fields {
+		if len(f.Optional) > 0 {
 			mask = adt.HasField
 			break
 		}
 	}
-	for _, b := range o.bulk {
+	for _, b := range o.Bulk {
 		if b.expr == nil {
 			mask |= adt.HasDynamic
 		} else {
 			mask |= adt.HasPattern
 		}
 	}
-	if o.additional != nil {
+	if o.Additional != nil {
 		mask |= adt.HasAdditional
 	}
-	if o.isOpen {
+	if o.IsOpen {
 		mask |= adt.IsOpen
 	}
 	return mask
 }
 
 func (o *fieldSet) IsOptional(label adt.Feature) bool {
-	for _, f := range o.fields {
-		if f.label == label && len(f.optional) > 0 {
+	for _, f := range o.Fields {
+		if f.Label == label && len(f.Optional) > 0 {
 			return true
 		}
 	}
 	return false
 }
 
-type field struct {
-	label    adt.Feature
-	optional []adt.Node
+type FieldInfo struct {
+	Label    adt.Feature
+	Optional []adt.Node
 }
 
 type bulkField struct {
@@ -86,13 +86,13 @@
 }
 
 func (o *fieldSet) Accept(c *adt.OpContext, f adt.Feature) bool {
-	if len(o.additional) > 0 {
+	if len(o.Additional) > 0 {
 		return true
 	}
 	if o.fieldIndex(f) >= 0 {
 		return true
 	}
-	for _, b := range o.bulk {
+	for _, b := range o.Bulk {
 		if b.check.Match(c, o.env, f) {
 			return true
 		}
@@ -109,9 +109,9 @@
 	// Match normal fields
 	matched := false
 outer:
-	for _, f := range o.fields {
-		if f.label == arc.Label {
-			for _, e := range f.optional {
+	for _, f := range o.Fields {
+		if f.Label == arc.Label {
+			for _, e := range f.Optional {
 				arc.AddConjunct(adt.MakeConjunct(env, e, o.id))
 			}
 			matched = true
@@ -129,7 +129,7 @@
 	bulkEnv.Cycles = nil
 
 	// match bulk optional fields / pattern properties
-	for _, f := range o.bulk {
+	for _, f := range o.Bulk {
 		if matched && f.additional {
 			continue
 		}
@@ -149,14 +149,14 @@
 	addEnv.Cycles = nil
 
 	// match others
-	for _, x := range o.additional {
+	for _, x := range o.Additional {
 		arc.AddConjunct(adt.MakeConjunct(&addEnv, x, o.id))
 	}
 }
 
 func (o *fieldSet) fieldIndex(f adt.Feature) int {
-	for i := range o.fields {
-		if o.fields[i].label == f {
+	for i := range o.Fields {
+		if o.Fields[i].Label == f {
 			return i
 		}
 	}
@@ -165,22 +165,22 @@
 
 func (o *fieldSet) MarkField(c *adt.OpContext, f adt.Feature) {
 	if o.fieldIndex(f) < 0 {
-		o.fields = append(o.fields, field{label: f})
+		o.Fields = append(o.Fields, FieldInfo{Label: f})
 	}
 }
 
 func (o *fieldSet) AddOptional(c *adt.OpContext, x *adt.OptionalField) {
 	p := o.fieldIndex(x.Label)
 	if p < 0 {
-		p = len(o.fields)
-		o.fields = append(o.fields, field{label: x.Label})
+		p = len(o.Fields)
+		o.Fields = append(o.Fields, FieldInfo{Label: x.Label})
 	}
-	o.fields[p].optional = append(o.fields[p].optional, x)
+	o.Fields[p].Optional = append(o.Fields[p].Optional, x)
 }
 
 func (o *fieldSet) AddDynamic(c *adt.OpContext, x *adt.DynamicField) {
 	// not in bulk: count as regular field?
-	o.bulk = append(o.bulk, bulkField{dynamicMatcher{x.Key}, nil, false})
+	o.Bulk = append(o.Bulk, bulkField{dynamicMatcher{x.Key}, nil, false})
 }
 
 func (o *fieldSet) AddBulk(c *adt.OpContext, x *adt.BulkOptionalField) {
@@ -191,7 +191,7 @@
 	}
 
 	if m := o.getMatcher(c, v); m != nil {
-		o.bulk = append(o.bulk, bulkField{m, x, false})
+		o.Bulk = append(o.Bulk, bulkField{m, x, false})
 	}
 }
 
@@ -211,10 +211,10 @@
 func (o *fieldSet) AddEllipsis(c *adt.OpContext, x *adt.Ellipsis) {
 	expr := x.Value
 	if x.Value == nil {
-		o.isOpen = true
+		o.IsOpen = true
 		expr = &adt.Top{}
 	}
-	o.additional = append(o.additional, expr)
+	o.Additional = append(o.Additional, expr)
 }
 
 type fieldMatcher interface {
