@@ -262,6 +262,104 @@ gremlin> g.inject([Float.MAX_VALUE, Float.MAX_VALUE], [Double.MAX_VALUE, Double.
262262
263263See link:https://issues.apache.org/jira/browse/TINKERPOP-3115[TINKERPOP-3115] 
264264
265+ ==== repeat() Step Global Children Semantics Change 
266+ 
267+ The `repeat()` step has been updated to treat the repeat traversal as a global child in all cases. Previously, the 
268+ repeat traversal behaved as a hybrid between local and global semantics, which could lead to unexpected results in 
269+ certain scenarios. The repeat traversal started off as a local child but as traversers were added back per iteration, 
270+ it behaved more like a global child. 
271+ 
272+ With this change, the repeat traversal now consistently operates with global semantics, meaning that all traversers 
273+ are processed together rather than being processed per traverser. This provides more predictable behavior and aligns 
274+ with the semantics of other steps. 
275+ 
276+ [source,text] 
277+ ---- 
278+ // In 3.7.x and earlier, the order would be local to the first traverser. 
279+ // Notice how the results are grouped by marko, then vadas, then lop 
280+ gremlin> g.withoutStrategies(RepeatUnrollStrategy).V(1, 2, 3). 
281+ ......1> repeat(both().simplePath().order().by("name")).times(2).path().by("name") 
282+ ==>[marko,lop,josh] 
283+ ==>[marko,josh,lop] 
284+ ==>[marko,lop,peter] 
285+ ==>[marko,josh,ripple] 
286+ ==>[vadas,marko,josh] 
287+ ==>[vadas,marko,lop] 
288+ ==>[lop,marko,josh] 
289+ ==>[lop,josh,marko] 
290+ ==>[lop,josh,ripple] 
291+ ==>[lop,marko,vadas] 
292+ 
293+ // In 3.8.0, the repeat now consistently uses global semantics 
294+ // The traversers from the final iteration are ordered first then by the traversers from previous iterations 
295+ gremlin> g.withoutStrategies(RepeatUnrollStrategy).V(1, 2, 3). 
296+ ......1> repeat(both().simplePath().order().by("name")).times(2).path().by("name") 
297+ ==>[marko,lop,josh] 
298+ ==>[vadas,marko,josh] 
299+ ==>[lop,marko,josh] 
300+ ==>[marko,josh,lop] 
301+ ==>[vadas,marko,lop] 
302+ ==>[lop,josh,marko] 
303+ ==>[marko,lop,peter] 
304+ ==>[marko,josh,ripple] 
305+ ==>[lop,josh,ripple] 
306+ ==>[lop,marko,vadas] 
307+ ---- 
308+ 
309+ This change may affect traversals that relied on the previous hybrid behavior, particularly those using side effects 
310+ or barrier steps within `repeat()`. Review any traversals using `repeat()` with steps like `aggregate()`, `store()`, 
311+ or other barrier steps to ensure they produce the expected results.  
312+ 
313+ If you would like `repeat()` to behave similarly to how it did in 3.7.x, then you should wrap the repeat inside a 
314+ `local()`. The following example demonstrates this: 
315+ 
316+ [source,text] 
317+ ---- 
318+ // In 3.7.x 
319+ gremlin> g.V().repeat(both().simplePath().order().by("name")).times(2).path().by("name") 
320+ ==>[marko,lop,josh] 
321+ ==>[marko,josh,lop] 
322+ ==>[marko,lop,peter] 
323+ ==>[marko,josh,ripple] 
324+ ==>[vadas,marko,josh] 
325+ ==>[vadas,marko,lop] 
326+ ==>[lop,marko,josh] 
327+ ==>[lop,josh,marko] 
328+ ==>[lop,josh,ripple] 
329+ ==>[lop,marko,vadas] 
330+ ==>[josh,marko,lop] 
331+ ==>[josh,lop,marko] 
332+ ==>[josh,lop,peter] 
333+ ==>[josh,marko,vadas] 
334+ ==>[ripple,josh,lop] 
335+ ==>[ripple,josh,marko] 
336+ ==>[peter,lop,josh] 
337+ ==>[peter,lop,marko] 
338+ 
339+ // In 3.8.0, placing the repeat inside a local will again cause the repeat traversal to apply per traverser (locally) 
340+ gremlin> g.V().local(repeat(both().simplePath().order().by("name")).times(2)).path().by("name") 
341+ ==>[marko,lop,josh] 
342+ ==>[marko,josh,lop] 
343+ ==>[marko,lop,peter] 
344+ ==>[marko,josh,ripple] 
345+ ==>[vadas,marko,josh] 
346+ ==>[vadas,marko,lop] 
347+ ==>[lop,marko,josh] 
348+ ==>[lop,josh,marko] 
349+ ==>[lop,josh,ripple] 
350+ ==>[lop,marko,vadas] 
351+ ==>[josh,marko,lop] 
352+ ==>[josh,lop,marko] 
353+ ==>[josh,lop,peter] 
354+ ==>[josh,marko,vadas] 
355+ ==>[ripple,josh,lop] 
356+ ==>[ripple,josh,marko] 
357+ ==>[peter,lop,josh] 
358+ ==>[peter,lop,marko] 
359+ ---- 
360+ 
361+ See: link:https://issues.apache.org/jira/browse/TINKERPOP-3200[TINKERPOP-3200] 
362+ 
265363==== Prefer OffsetDateTime 
266364
267365The default implementation for date type in Gremlin is now changed from the `java.util.Date` to the more encompassing 
@@ -1168,6 +1266,62 @@ The `ChooseStep` now provides a `ChooseSemantics` enum which helps indicate if t
11681266
11691267See: link:https://issues.apache.org/jira/browse/TINKERPOP-3178[TINKERPOP-3178] 
11701268
1269+ ===== repeat() Step Global Children Semantics Change 
1270+ 
1271+ The `RepeatStep` has been updated to consistently treat the repeat traversal as a global child rather than using 
1272+ hybrid local/global semantics. This change affects how the repeat traversal processes traversers and interacts with 
1273+ the parent traversal. 
1274+ 
1275+ Previously, `RepeatStep` would start with local semantics for the first iteration and then switch to global semantics 
1276+ for the subsequent iterations, which created inconsistencies in how side effects and barriers behaved within the repeat 
1277+ traversal. The biggest change will be to `Barrier` steps in the repeat traversal as they will now have access to all 
1278+ the starting traversers. 
1279+ 
1280+ [source,text] 
1281+ ---- 
1282+ // In 3.7.x and earlier, the order would be local to the first traverser. 
1283+ // Notice how the results are grouped by marko, then vadas, then lop 
1284+ gremlin> g.withoutStrategies(RepeatUnrollStrategy).V(1, 2, 3). 
1285+ ......1> repeat(both().simplePath().order().by("name")).times(2).path().by("name") 
1286+ ==>[marko,lop,josh] 
1287+ ==>[marko,josh,lop] 
1288+ ==>[marko,lop,peter] 
1289+ ==>[marko,josh,ripple] 
1290+ ==>[vadas,marko,josh] 
1291+ ==>[vadas,marko,lop] 
1292+ ==>[lop,marko,josh] 
1293+ ==>[lop,josh,marko] 
1294+ ==>[lop,josh,ripple] 
1295+ ==>[lop,marko,vadas] 
1296+ 
1297+ // In 3.8.0, the aggregate now consistently uses global semantics 
1298+ // The traversers are now ordered so the traversers from the final iteration are ordered first then by 
1299+ // the traversers from previous iterations 
1300+ gremlin> g.withoutStrategies(RepeatUnrollStrategy).V(1, 2, 3). 
1301+ ......1> repeat(both().simplePath().order().by("name")).times(2).path().by("name") 
1302+ ==>[marko,lop,josh] 
1303+ ==>[vadas,marko,josh] 
1304+ ==>[lop,marko,josh] 
1305+ ==>[marko,josh,lop] 
1306+ ==>[vadas,marko,lop] 
1307+ ==>[lop,josh,marko] 
1308+ ==>[marko,lop,peter] 
1309+ ==>[marko,josh,ripple] 
1310+ ==>[lop,josh,ripple] 
1311+ ==>[lop,marko,vadas] 
1312+ ---- 
1313+ 
1314+ Providers implementing custom optimizations or strategies around `RepeatStep` should verify that their 
1315+ implementations account for the repeat traversal being a global child. This particularly affects: 
1316+ 
1317+ - Strategies that analyze or transform repeat traversals 
1318+ - Optimizations that depend on the scope semantics of child traversals 
1319+ 
1320+ The last point about optimizations may be particularly important for providers that have memory constraints as this 
1321+ change may bring about higher memory usage due to more traversers needing to be held in memory. 
1322+ 
1323+ See: link:https://issues.apache.org/jira/browse/TINKERPOP-3200[TINKERPOP-3200] 
1324+ 
11711325===== Prefer OffsetDateTime 
11721326
11731327The default implementation for date type in Gremlin is now changed from the deprecated `java.util.Date` to the more 
0 commit comments