Rigid bodies fall, slide, roll, bounce, stack and sleep on the map (headless) #17
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "task/3900-rigid-bodies-fall-slide-roll-bounce-stac"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tracker: #3900
Step 1 of plan #3865: the physics core, headless. Nothing changes in the app.
What it delivers
src/physics/shapes.sx: sphere, capsule (along local +Y), box and convex hull shapes.hullOfbuilds a hull deterministically from the points' triples in index order, merges coplanar faces, wraps each face's corners and drops collinear points; it failsFlaton points that span no volume. Least and greatest extents, the core radius, exact inertia about the origin (a hull's by tetrahedra from the origin, so an off-centre hull takes the parallel-axis term),Mat3,Poseand the sweep's lerp/nlerpbetween.src/physics/distance.sx: GJK closest points between cores (point, segment, polytope, map triangle), afterb2ShapeDistance; an interior face point is weighed by its areas, which keeps its precision on the test scene's 600 m ground triangles. A sliver face of the simplex, its corners nearly in a line, whose weights come out off the face, takes its point on the nearest of its edges; a tetrahedron counts a face as one the origin lies outside where the origin lies past the face or past the corner opposite it, as a nearly flat one can round that corner to the origin's side. Conservative advancement (timeOfImpact,planeTimeOfImpact) to a target separation, bounding the turn by nlerp's fastest rate, 4 tan(φ/2).src/physics/contacts.sx: manifolds once the closest points lie withinSPECULATIVE, never otherwise. Polytope pairs take the separating axis over faces and edge pairs and clip the incident face (Gregorius), keeping every clipped point at its own separation, reduced to 4 (the deepest, then the three spanning the largest area). Of edge pairs as far apart, which parallel edges give, the pair whose own edges lie nearest along the axis makes the contact. A capsule's segment is clipped to the reference face whatever its tilt, one point when its clipped part projects to one point. A capsule whose closest points lie on a polytope's edge it runs parallel to (PARALLEL, coreCore's 0.05) has a point at each end of its part along the edge, each at its own separation, as two parallel capsules do. Spheres and capsules between themselves take their cores' closest points, two for parallel capsules. The map's bounds are planes.SLOPbehind its plane: the wedge it reaches into lies in front of its plane, and the triangles bounding that wedge end at the edge's ends.ON_EDGE(0.1 mm) of. It touches the face whose wedge holds the body's side about those edges, or inside the face the side of the plane holding it. The body's side is its core's point nearest the triangle where the two do not overlap and that point lies more thanSLOPoff the plane, and its origin otherwise: a long body's origin can lie across the plane from the part of it the triangle touches, and a point within the slop of the plane can lie on either side. About an edge no other triangle shares both wedges are whole turns, and the body touches the face on whose side of the plane its side lies. A body whose side lies beyond another triangle sharing the edges has no contact with the triangle; where two edges disagree, the contact keeps its features' direction. The task names the side of the plane the contact normal leaves; there an edge pair's axis about a shared edge, turned out of the plane by a body's tilt, picks the face by its sign (the tilted overlap cases), and the side of the plane holding the origin puts a plank leaning on a block's top edge against the top's underside.AS_NEARpast any neighbour's normal, which only a convex or flat edge allows, the triangle whose normal lies nearer that direction than each neighbour's keeps the features' contact, and elsewhere the neighbours' faces hold the body. Nearer is withinAS_NEAR, 1e-4 in the two dot products, and past the neighbour's normal is past it by more thanAS_NEARonturnOf's scale: each triangle rounds a contact on the bisector its own way, and both keep it rather than neither. At a coplanar seam the bisector is the shared normal, the very bound past the neighbour's normal reads, and a ball centred over the seam, which each triangle's clip can round off its own face, was held by neither triangle without that tolerance.src/physics/solver.sx: Box2D v3's constants in one place, soft contacts (30 Hz between bodies, 60 Hz against the map, ζ 10), the biased push of normal impulses, integration, the relax of normals then Coulomb friction across both tangents together, restitution once a tick from the pre-solve velocity (max of the two, the map 0, nothing under 1 m/s), Blender's (1 − d)^dt damping.src/physics/dynamics.sx: bodies andPhysicsWorld(addBody,applyImpulse,setPose,setVelocity,step), the sort-and-sweep pairs, map candidates fromwithin, the bounds as walls, contacts between bodies first and the map's last in every pass, warm starting by key and feature id, points solved in feature-id order, the continuous sweep of every body travelling more thanSPECULATIVEa tick (the core's sweep for a triangle touched at time 0, the lost gravity taken off), islands and sleeping. It imports nothing fromsrc/sim/:inittakes the tick's length.SPECULATIVE. A contact that stops a body late in the tick leaves it with little velocity after it moved several centimetres, through a triangle that had no contact at the tick's start: capsules dropped on the first map's terrain went 8.5 mm into it at0a1c6a5that way.SPECULATIVEcloser to the plane, without passing from in front of it to more than the slop behind, and its centroid ends at least the core radius in front. The middle clause is beyond the task's rule: a body starting a tick just beyondSPECULATIVEof a ramp has no contact with it, and closing on the ramp's plane by less thanSPECULATIVEit sank up to (v·dt −SPECULATIVE)·sin θ, 7.2 mm into 30° at 2.3 m/s and 10.9 mm into 10° at 5 m/s.src/physics/collision.sx: each triangle's six wedges of free space (Wedges, a turn per edge and face onturnOf's scale, a whole turn for an edge no other triangle shares), built bybuildWorldfrom the triangles' corners;inneris unchanged. An edge is smooth from a face where its wedge spans at most 180° + 5°, and concave where it spans less than 180° by more thanFLAT_EDGE, 0.0015 onturnOf's scale (0.086°, over the 0.081°COPLANARallows two normals): the first map's fir trunk proxies are slivers 13.9 m tall whose diagonals round up to 6e-4 short of flat.src/world/world_format.sxcarries the wedges at world file version 4, 24 bytes a triangle, and the bake writes them from both scenes: the first map's world file is 17.4 MB where six bits made it 12.8 MB.Wedges.smooth).tools/bake.sh: the stamp hashes every repository file the stage reaches through@import, resolved beside the importing file and then from the root, instead of the hand-keptSTAGE_MODULES.physics_shapes,physics_distance,physics_contacts,physics_bodies,physics_stack(hand-built ground andbaked/test_scene.hbw),physics_determinism.tests/support/worlds.sxgainsinclineandtessellated;tests/bake_stage.sxchecks the wedges the world file holds.fc21030a box whose front started a tick withinSPECULATIVEshort of the next cell took a horizontal contact from it: 4.343 and 3.868 m of 5 from 0.125 and 0.375 m along, 16.34 m of 20 from 0.125 m.Shapes.floor's does) and facing up, across their diagonal, upright and tilted 0.5° and −2° about x. Upright it rises at 3.62 and 3.13 m/s, under 4 m/s, and rests within 1 cm of the ground from tick 15 on (from tick 14 on both); tilted, every case rests within 6.9 mm from tick 15. At7a250f3an edge pair's axis tilted out of the plane picked its face by its sign: 3 of the 4 tilted cases were 0.40 to 0.45 m off at tick 15.physics_stackadds: a box spinning in place at 2 rad/s with no gravity stays awake; of two boxes resting 4 m apart, an impulse to one leaves the other asleep, its pose bit for bit, for 60 ticks;setVelocityandsetPoseon the sleeping tower's top box, even to the values it has, wake the whole tower.physics_contactsadds an octagonal prism lying on a triangle, tilted 2° toward each of two neighbouring corners in turn: of its 8 clipped corners the 4 kept include that corner, at its gap. It adds a box on the ground 1 cm short of a 30° ramp rising from the ground's edge, which has the ramp's face normal at its bottom face's 4 corners, each at its distance from the ramp's plane, and checks that the box edge-down across a triangle's edge has its contact midway between the two edges (at7a250f3it lay on the box's far edge, 14 cm up). The wedge cases read the wedges: the edge under a wall on a floor's diagonal is concave from above and flat from below, and rewinding a neighbour leaves the first triangle's wedges bit for bit.7a250f3), 4.9 mm into 30° at 2.3 m/s and 3.7 mm into 10° at 5 m/s, the early-out cases (19 and 15 mm at7a250f3). Probes at 5° to 45° and 1.5 to 20 m/s ended at most 4.9 mm in, the slop the early-out allows.7a250f3the top's triangle took the ball as touching its underside: the ball sank 41 mm into the ground and stopped.7a250f3the ball rose 0.13 m; with the top edge's contact kept past the side's normal, the box rose 0.59 m and the ball 1.89 m.7a250f3did, 1.09 m off.7a250f3a sphere got the face's plane point past a smooth edge and rose 3.3 mm.0a1c6a5the yawed and turned capsules sank 25.5, 66.6, 15.2 and 16.5 mm: the earlier claim that no Ridges body goes past 6 mm held only for capsules lying exactly along the ridge's line. Atd8820aea body on a smooth ridge fell through the map (19 m in 2 s), 2 mm off it sank 89 to 107 mm, and the capsule 2 mm off the sharp ridge, its one point see-sawing between its ends, sank 18.4 mm.d8820ae).0a1c6a5, where B gave only the ridge's one point and the capsule's end landed on B with no point of its own.0a1c6a5. The plate's edge under the capsule has the plate's upper face for the capsule above it; with the front face taken always, as 0a1c6a5's wedges did for an edge no other triangle shares, the plate's far end point was dropped.baked/first_map.hbw): capsules of radius 0.15, 1.5 m long, set down on a tree trunk's top tipping off beside it (review run 1782's repro, 91.7 mm into the trunk at0a1c6a5), across a sharp crease of the terrain (17.3 mm), and two turning about a sharp crease onto a strip whose far side rises (0.3 and 8.5 mm at0a1c6a5). None ends a tick more than 6 mm into the map over 2 s: 0.9, 0.7, 0.4 and 0.7 mm. The last two need the sweep's displacement: the contact holding the turning end stops the turn late in the tick after the end has passed into the rising triangle, and without it they go 10.0 and 8.5 mm in.physics_contactsadds three cases for the gap's ends: a capsule lying across a coplanar seam has from each floor triangle points over that triangle alone; a capsule lying along a smooth 4.6° crease, yawed, its end in the gap on A's side of the bisector, has from B no point at that end; and a capsule lying on B of a sharp 30° crease, its end 3 cm past the edge, has from B points over B alone.physics_contactsadds a capsule lying along a triangle's edge, 3 mm past it, its far end 0.01 m higher: 2 points, each at its own end's distance from the edge; and lying along it 45° round from the face, where the edge holds its closest points before any face does: 2 points (1 point each atd8820ae). It adds a ball past a 3° crease, over neither face, its centre a quarter and then three quarters of the way from one normal to the other: the triangle whose normal lies nearer gives the features' contact at the gap, the other none (atd8820aeneither gave one). And a ball on the bisector of a convex crease's normals, over 400 creases of 1° to 5° turned about +Y, has the features' contact from both triangles: withAS_NEAR0, 8 of the 400 had it from neither.physics_contactsadds a ball centred over the diagonal two coplanar triangles share, resting on it and sunk 1 and 10 mm into it, over 4000 quads tilted up to 20° and turned about +Y: one triangle at least gives it a contact. At1ed4462, 31 of the 12,000 had a contact from neither. And a capsule lying along a box's top edge 45° round from its faces, rising 0.025 along it from 1 mm off and running out past the edge's end, the box having three other edges parallel to it: 2 points on that edge, one at its low end at the gap, the other at the edge's end at the capsule's own separation there (0.012249), each with its own feature id.0a1c6a5alike:0a1c6a5(95.9 mm deepest), none at the head (2.3 mm);0a1c6a5(8.5 and 12.0 mm) and never ataa261b9in that sample (3.9 mm), which held for that sample only: review run 1797's seeds found one ataa261b9, 10.0 mm (its finding 1), and the next round's sample one ataa261b9and at the head alike, 8.7 mm, rolling at 14.6 rad/s; the small ones 9 times at both, each rolling at 46 to 50 rad/s (the rolling sink below);0a1c6a5and 10 at the head. One lay inside a trunk at its start. The other nine spin at 16 to 29 rad/s; the three traced spin about their own axis, wedged against a steep face, climbing a fir trunk's proxy or slowing on a slope, their ground end 8.7 to 18.1 mm deep: the rolling sink, deeper under the push. In the deepest of them, a capsule rolling into a fir proxy, part of the depth is another mechanism: the proxy's side quads are slivers 13 m tall, their diagonals read 0.01° concave by rounding, and the side's face then reaches past its diagonal across the neighbour into the next side's region; with concave held to 0.086° past flat the capsule goes 11.5 mm in, not 18.1. Review run 1797 found that mechanism statically, andFLAT_EDGE(below) answers it.1ed4462and none at the head. A ball of 0.15 m sliding at 2 m/s along a coplanar seam over a 3° crease, the world turned 0.37 rad, went 10.6 mm into the map at1ed4462, 4 ticks touching it with no contact, and one of 0.05 m 13.1 mm; at the head 1.9 and 2.8 mm. A ball of 0.15 m sent at 2 m/s down a 20° slope along a seam, turned 1.1 rad, went 17.9 mm in at1ed4462and 3.7 mm at the head, as at every turn, its rolling sink.physics_distanceadds two poses GJK misread atd8820ae. A capsule lying past a triangle's edge, turned off it by under 0.001 rad, met a sliver face whose weights put its closest point 1311 m along the edge, at a distance of 0.001 for 0.05. A capsule lying flat over a tilted triangle, 0.1 m clear of it, read as overlapping it. Over 200,000 poses about the first, GJK misread 140 by more than 1e-4 atd8820ae, by up to 1.47 mm and some short of the true distance, and 4 at the head, by at most 0.12 mm, each over it. Of 100,000 capsules lying flat over random triangles, 20 read as overlapping atd8820aeand none at the head.d8820ae, up to 133 mm, and none at the head, whose deepest, 5.3 mm, are balls rolling down at 30 rad/s (the rolling sink below). Of 49 bodies dropped on a random heightfield of 12 × 12 cells, no sphere went past 1 cm at either; the capsules' cores read as overlapping it 3 times atd8820ae, GJK's flat tetrahedron, and never at the head, which they came within 1.4 mm of.fa141feand ofaa261b9, every line identical but two: the capsule tipping off a trunk's top on the first map goes 0.944 mm in, 1.145 mm ataa261b9, and the capsule across a sharp terrain crease 0.717 mm, 0.712 mm ataa261b9. EitherFLAT_EDGEor the reach bound alone moves them, and with both taken out both read as ataa261b9: a face reaching past a terrain or trunk edge that reads concave by rounding gave those capsules points beside its plane. Arms ofaa261b9and of0a1c6a5printed alike, as did those of0a1c6a5and1ed4462and those of1ed4462andd8820ae: towers 5.6 mm (hand-built) and 9.4 mm (test scene) off their columns, asleep at ticks 46 and 53; pyramids 0.3 and 0.2 mm, asleep at 30; the 100 kg box on the 10 kg one 3.9 and 0.9 mm, asleep at 84 and 63; seams at 5 and 20 m/s from 8 starts, 4.999998 to 5.000000 m and 20.000000 m; the overlap cases on both windings, Ramp, the plank, the ball beside a wall, the box and ball up past a rim, Smooth slope and the balls over creases as above.7a250f3, alone and beside the wall: each contact's anchor turns with the ball during the tick, as in Box2D's relax. Nothing here pins or changes it.0a1c6a5, and keeps out of it with the early-out off; the capsule over a plate goes 6.7 to 13.2 mm into the plate when turning at 6 to 8 rad/s, its surface already under the plate's plane at the ridge. The task names this rule; nothing here changes it.physics_contactsbuilds the first map's trunk proxy at (-48.1, 6.9 to 20.8, -40.6) from its 22 baked triangles, as literals, and sets four bodies at least 1 mm clear of it. No triangle gives any of them a point deeper than the slop. Ataa261b9they get points at:FLAT_EDGE);physics_contactssets a capsule standing with 0.55 m of it in the first map's terrain, at (-31, 24.7, -97), from that terrain cell's 6 triangles, as literals. Its core crosses one triangle and passes under the other, clear of it, across their diagonal, 0.2° concave from above. Each triangle's contact pushes it up, and the cell keeps its buried end at −0.552 m. Taking the over-face side for any body whose core is clear, rather than one clear of the triangle, gives the second triangle's back face, and dropped on the map the capsule then falls through it (y −48.7 after 4 s);aa261b9passes the case.aa261b9:aa261b955 of 15,696 small capsules, 131 of 9,679 large ones and 164 of 8,619 boxes had a point deeper than 5 mm, down to −3.57 m. At the head none did.aa261b9, none at the head; and about every triangle of the map: 3, 15 and 13 ataa261b9, none at the head.aa261b9, none at the head.aa261b9(the kick at tick 110), 7.1 mm at the head. It is wedged against the trunk, spinning up from 12.7 to 14.9 rad/s, and its depth grows with the spin: the rolling sink below.aa261b9, 375 and 100 at the head; with another seed 325 and 106, then 340 and 121. A third of the runs differ between the two, and the deepest roll at 20 to 72 rad/s, some landing at 15 m/s on 27° slopes; the worst at the head, 65 mm, lands so and rolls up to 44 rad/s. WithFLAT_EDGEand the reach bound both taken out the runs are bit for bit aa261b9's: the extra depth comes from the points this round drops, whose push, beside the face's own, held rolling capsules up. The rolling sink is unchanged here, as before.The tuned values are Box2D v3's, unchanged. hulken's own:
FEATURE_TOLERANCE(0.5 mm, a face over an edge pair),SINGLE_POINT(0.1 mm),TOI_TOLERANCE(a quarter of the slop),ON_EDGE(0.1 mm),AS_NEAR(1e-4),PARALLEL(0.05, coreCore's bound, now named) andFLAT_EDGE(0.0015 onturnOf's scale).Mutants
Each mutant was applied alone, as exact text, in a scratch
git archivearm, and the six physics tests (shapes, distance, contacts, bodies, stack, determinism) rerun; each line names the cases that fail. The list ran in an arm of1ed4462, but for the five marked (0a1c6a5). In an arm of0a1c6a5, 21 ran: the five; every mutant below of the branch past smooth edges,AS_NEAR,nearer,alongEdge,polySegment's two sites and GJK's three rules, each failing as its line says; and three more, which fail too:neareragainst the triangle's in-plane direction and against the face's own normal (the ball past a 3° crease: both triangles keep it), and GJK's sliver fallback taking its first edge, not its nearest (the capsule turned a little off a triangle's edge inphysics_distance). 74 of the 77 below fail.SPECULATIVEdropped from every clipped manifold: Tilted landing (49 mm deep after 1 m, 79 mm after 2 m), the contacts test's turned box, its octagonal prism and its box short of a ramp, and Ramp (15 mm).IN_PLANEthe side holding the origin (7a250f3's rule): the tilted overlap cases (0.40 to 0.45 m off).closestOnTriangle(point).edges): A plank leaning on a block's top edge (1.09 m off) and A ball over convex creases (rose 15.4 mm).AS_NEAR0: the ball on the bisector of a convex crease (8 of the 400 creases left it to neither triangle), and the ball centred over a coplanar seam (88 of the 12,000 left to neither).0a1c6a5): the ball centred over a coplanar seam (31 of the 12,000 left to neither triangle).AS_NEAR0.01: the ball past a 3° crease (both triangles keep it).ON_EDGE0: the same edge contact, Sliding across seams (3.34 m of 5), Smooth slope, A plank leaning on a block's top edge and A ball over convex creases.polySegment's sites: the capsules lying along a triangle's edge and along a box's edge, and Ridges (the capsules 2 mm off, 15 to 18 mm deep).polySegment's first site): the capsules lying along a triangle's edge 45° round from its face and along a box's edge.alongEdgetaking any edge the segment runs parallel to, not the one its closest points lie on (0a1c6a5): the capsule lying along a box's edge (both points on the box's opposite lower edge, 0.708 and 0.719 m off).PARALLEL0.01 (0a1c6a5): the capsule lying along a box's edge, turned 0.025 off it (1 point).alongEdge's points not clipped to the edge's extent (0a1c6a5): the capsule lying along a box's edge (its far point at 0.0510 for 0.0122, from the capsule's own end).alongEdge's two points sharing one feature id (0a1c6a5): the capsule lying along a box's edge.setPosewaking nothing: setting the top box's pose wakes the tower.setVelocitywaking nothing: setting the top box's velocity wakes the tower.physics_distance.In an arm of
aa261b9, 42 ran: the previous round's 21, every one of which fails as its line says, and 21 of this round's rules, of which 15 fail:SLOPguard: Smooth slope (stopped at x 0.24) and Ramp (39 and 164 mm into 30° at 5 and 20 m/s, 16.8 mm at 2.3 m/s): review run 1782's "gap.onB everywhere breaks Ramp", which the guard answers about every edge.pastNeighbourclause: the capsule lying across a coplanar seam (each floor triangle reaches to the end over the other).nearer: the capsule lying along a smooth crease, its end on A's side of the bisector (B reaches to it).Six survive:
SMOOTH_EDGEof flat alone, the origin about others, as review run 1782's prototype had it. No figure moves, nor any of Ramp at 5° to 45° and 1.5 to 20 m/s, or boxes sliding into walls of 60° to 90° sharing the ground's edge. With the guard, a point more than the slop off the plane decides the side about any edge; this round keeps the one rule.Three survive from earlier rounds, judged equivalent, as review run 1765 accepted:
SPECULATIVEcloser to the plane while its centroid ends within its core radius of it. That centroid lies a quarter of the least extent from the plane at most, so the body is already three quarters of it deep. Translation moves the centroid as far as the nearest point, so only such a body that is also turning can tell the two rules apart.Past-the-neighbour where an edge is sharp takes no tolerance: there the triangle across the edge reads the same direction as its own normal, far from the bound. Boxes resting over a ridge with their contact on the bound of the edge's normals sleep at the same tick, within microns, whichever side of the bound rounding puts them. No mutant is held to D7's order among contacts between bodies, nor to friction solved in the relax alone, as the task says.
After review run 1797, in an arm of
086b739, the 42 mutants of the earlier rounds ran again, with 15 of that commit's own; in an arm offa141fe, this round's final 15 ran, and the six earlier ones that touch the far end and the side point. Every earlier mutant fails as its line says, but for:aa261b9), now survive: taken by the origin, the trunk's faces have no points there, as the reach bound drops the ones that face gave past the trunk's corner. The side still decides some speculative points: compared with a copy ofcollideTrianglethat takes the origin, over 60,000 poses of the three shapes near the first map's triangles, 5 of 12,769 small capsules and 13 of 4,754 large ones clear of the map have a different manifold, and 16 of 15,544 small capsules near its steep triangles; each a point at a positive separation from one rule and none from the other, never a point deeper than the slop from either.SLOPguard fails the buried capsule now, not Smooth slope or Ramp: the reach bound drops the points past the ramp's foot that pushed the box in.This round's mutants, each failing the case named:
FLAT_EDGE0: the capsule beside the trunk's side, past its corner (−0.139 m).FLAT_EDGE0.2: Ramp at 10° and 5 m/s (14.5 mm in).overFacetaking a polytope's part over the face from the front face's clip alone: the box over the cap.One survives: the far end bounded too, the reach bound applied to the far end a sharp edge's segment takes. No case or probe reads a difference, and this round leaves that end unbounded, as it was.
The bake stamp
In a scratch
git archivearm of7a250f3, a new modulesrc/world/extra.sxthat onlysrc/world/world_format.sximports, with the stamp functions of the head's and of master'stools/bake.shrun there under bash:extra.sx→ 3b84241e…; one byte then added tosrc/sim/player.sx→ 3b84241e…, unchanged;STAGE_MODULESstamp 5e6a351b… → the same byte inextra.sx→ 5e6a351b…, unchanged.The walk from
tools/bake/stage_main.sxreachessrc/physics/collision.sx,src/render/constants.sx,src/scene/baked_format.sx,src/world/world_format.sxand the twotools/bake/files, the old list exactly, andsrc/world/extra.sxonce it is imported.Gates
fullat53c8d23: passed, gate run 840.fullate0dba82: passed, gate run 841.fullat3c0acd8: passed, gate run 842.fullatfc21030: passed, gate run 843.fullat7a250f3: passed, gate run 849 (31 of 31).fastat7c8d2f5: passed, gate run 855 (31 of 31).fullat4f6d30c: passed, gate run 856 (31 of 31).fullatd8820ae: passed, gate run 858 (31 of 31).fullate3cdf79: passed, gate run 862 (31 of 31).fullat1ed4462: passed, gate run 863 (31 of 31).fullat0a1c6a5: passed, gate run 868 (31 of 31).fastata067031: passed, gate run 874 (31 of 31).fullataa261b9: passed, gate run 877 (31 of 31).fullat086b739: passed, gate run 880 (31 of 31).fullatfa141fe: passed, gate run 882 (31 of 31).