diff --git a/grudge/eager.py b/grudge/eager.py
index 3bacbc2b28ef59a00fabdd2e257e3a8153a07698..4079cdd0f8be6f5f8b4275623ca39bff0a694850 100644
--- a/grudge/eager.py
+++ b/grudge/eager.py
@@ -340,6 +340,9 @@ class EagerDGDiscretization(DGDiscretizationWithBoundaries):
 
 
 def interior_trace_pair(discrwb, vec):
+    """Return a :class:`grudge.sym.TracePair` for the interior faces of
+    *discrwb*.
+    """
     i = discrwb.project("vol", "int_faces", vec)
     e = obj_array_vectorize(lambda el: discrwb.opposite_face_connection()(el), i)
     return TracePair("int_faces", interior=i, exterior=e)
diff --git a/grudge/symbolic/primitives.py b/grudge/symbolic/primitives.py
index b106de1cb2b67eceb916e4031d3d3f7462b0f081..6e57bcf41757011d1a78e4b020dd411a0dcf41d3 100644
--- a/grudge/symbolic/primitives.py
+++ b/grudge/symbolic/primitives.py
@@ -116,6 +116,14 @@ Geometry data
 .. autofunction:: surface_normal
 .. autofunction:: summed_curvature
 .. autofunction:: mean_curvature
+
+Trace Pair
+^^^^^^^^^^
+
+.. autoclass:: TracePair
+.. autofunction:: int_tpair
+.. autofunction:: bv_tpair
+.. autofunction:: bdry_tpair
 """
 
 
@@ -857,13 +865,20 @@ class TracePair:
 
     .. attribute:: interior
 
-        an expression representing the interior value to
+        a value (symbolic expression or :class:`~meshmode.dof_array.DOFArray`
+        or object array of either) representing the interior value to
         be used for the flux.
 
     .. attribute:: exterior
 
-        an expression representing the exterior value to
+        a value (symbolic expression or :class:`~meshmode.dof_array.DOFArray`
+        or object array of either) representing the exterior value to
         be used for the flux.
+
+    .. note::
+
+        :class:`TracePair` is used both by the symbolic and the eager interface,
+        with symbolic information or concrete data.
     """
     def __init__(self, dd, *, interior, exterior):
         """