Gamma: Grounded Multi-Agent Memory with Mechanical Audit for Memory-Intensive Manipulation
Organizations: Duke University · Qualcomm AI Research · University of Florida
Abstract
Pretrained vision-language-action (VLA) policies fail on memory tasks, behaviour that depends on events observed long before the current frame, because their training data is overwhelmingly Markov and mapping episodic memory directly to action chunks is hard. Yet the same policy, finetuned once to follow a privileged oracle's grounded-subgoal text, nearly solves these tasks: the difficulty lies entirely in mapping memory to a grounded symbolic subgoal. Existing work entrusts this stage to a single VLM that selects keyframes and reasons over raw frames, and falls far short of the oracle: key identities and dynamics are buried in noisy pixels, the reasoning spans hundreds of frames in an unbounded context, and hallucination corrupts the memory itself. We instead present GAMMA (Grounded multi-Agent Memory with Mechanical Audit), which builds the stage as a collaborating two-agent memory system: a detector tool (SAM-3) for spatial grounding, a VLM writer that distils each replan window into one grounded text line, an append-only text memory bank, and a VLM reasoner that reads the bank and emits the next grounded subgoal at the oracle's cadence, wrapped in a propose-verify harness that admits, defers, corrects, or rejects every agent claim against mechanical visual evidence, at training-corpus construction and at deployment alike. On a sixteen-task memory-manipulation suite GAMMA recovers a large fraction of the oracle ceiling with the policy held fixed, reaching the ceiling on several tasks, and transfers with unchanged contracts to a second benchmark.
Figures & tables
| Configuration | Memory mechanism | Success |
|---|---|---|
| end-to-end | none | |
| + memory module (FrameSamp+Modul) | latent frame memory | |
| MemER-style keyframe pipeline | VLM keyframe selection | |
| + oracle ungrounded subgoals | privileged, no coordinates | |
| + oracle grounded subgoals | privileged |
| Temporal | Spatial | Object | Procedural | |||||||||||||||
| Method | PickX | BinF | SwingX | StopC | VU | BU | VUS | BUS | PH | VRP | VPB | VPO | MC | IP | PL | RS | Avg | |
| e2e | 42.9 | 30.0 | 35.6 | 6.7 | 20.4 | 22.2 | 18.7 | 6.7 | 11.3 | 0.4 | 31.1 | 25.8 | 26.0 | 1.6 | 2.9 | 4.7 | 17.9 | |
| SAM2Act+ | 76.0 | 40.0 | 25.3 | 0.0 | 27.3 | 32.0 | 18.0 | 26.7 | 17.3 | 5.3 | 24.7 | 20.0 | 29.3 | 0.0 | 0.0 | 0.0 | 21.4 | |
| mem-VLA | TokenDrop+Modul | 83.6 | 34.4 | 86.0 | 5.3 | 28.2 | 29.3 | 28.4 | 21.3 | 21.3 | 22.0 | 59.6 | 36.0 | 62.0 | 7.1 | 32.4 | 51.6 | 38.0 |
| FrameSamp+Modul | 87.3 | 39.6 | 92.0 | 42.0 | 32.7 | 25.1 | 24.4 | 18.2 | 22.9 | 30.4 | 60.0 | 32.0 | 77.8 | 7.6 | 53.6 | 66.7 | 44.5 | |
| VLM-mem | MemER | 79.3 | 56.7 | 59.3 | 0.0 | 81.3 | 72.0 | 38.0 | 21.3 | 70.7 | 25.3 | 30.0 | 26.0 | 82.7 | 6.7 | 16.7 | 12.0 | 42.4 |
| Temporal | Spatial | Object | Procedural | ||||||||||||||
| Configuration | PickX | BinF | SwingX | StopC | VU | BU | VUS | BUS | PH | VRP | VPB | VPO | MC | IP | PL | RS | Avg |
| Writer / reasoner base: Qwen3.5-9B | |||||||||||||||||
| Gamma (full harness) | 98.9 | 71.1 | 68.9 | 35.5 | 86.7 | 84.4 | 75.6 | 35.6 | 71.1 | 65.6 | 75.5 | 66.7 | 62.2 | 3.3 | 98.9 | 56.7 | 66.0 |
| w/o defer (press-verify gate) | 95.9 | 70.1 | 67.2 | 36.8 | 86.1 | 56.7 | 75.4 | 13.1 | 71.6 | 67.9 | 73.2 | 65.6 | 64.4 | 6.5 | 97.8 | 55.3 | 62.7 |
| w/o reject (extractor-owned claims, duplicates) | 95.6 | 71.3 | 66.7 | 13.5 | 85.7 | 83.2 | 76.1 | 36.1 | 70.4 | 65.3 | 74.8 | 63.1 | 67.2 | 3.3 | 3.3 | 6.7 | 55.1 |
| w/o correct (grounding rebinding) | 98.3 | 72.3 | 66.7 | 36.1 | 85.9 | 86.2 | 76.4 | 35.1 | 70.9 | 61.3 | 71.4 | 60.2 | 61.2 | 3.3 | 97.5 | 57.3 | 65.0 |
| RoboMemArena, task / subtask success (%) | Transferring | Occlusion | Counting | Sequence | Average |
|---|---|---|---|---|---|
| (no subgoals) | 20.0 / 42.8 | 12.7 / 17.2 | 14.3 / 50.9 | 60.0 / 71.6 | 21.5 / 38.7 |
| MemoryVLA ( Shi et al., 2025 ) | 15.0 / 37.2 | 7.3 / 13.1 | 14.3 / 55.1 | 37.5 / 65.2 | 15.0 / 35.3 |
| MemER ( Sridhar et al., 2025 ) | 20.0 / 36.1 | 16.4 / 33.2 | 27.1 / 65.1 | 65.0 / 79.1 | 27.3 / 49.1 |
| PrediMem ( Lei et al., 2026 ) | 22.5 / 45.2 | 27.3 / 38.4 | 45.7 / 69.3 | 72.5 / 89.5 | 38.5 / 55.2 |
| Gamma (ours) | 27.4 / 37.6 | 19.2 / 50.1 | 52.3 / 67.5 | 80.7 / 90.3 | 38.8 / 59.0 |
| ground-truth subtask feed (privileged) | 32.5 / 54.8 | 33.6 / 49.8 | 51.4 / 75.6 | 85.0 / 92.3 | 46.1 / 64.8 |
Appendix figures & tables22 assets
Supplementary material from the paper’s appendix.
Appendix
| Task (seed 7, 30 episodes) | strokes reached | sense correct | side correct | both | episodes fully correct |
|---|---|---|---|---|---|
| RouteStick | 79 | 69 | 73 | 66 | 23/30 |
| PatternLock | 85 | – | – | 80 | 27/30 |
| Guard | Claim type | Evidence | Verdict | Triggers (seed 7) |
|---|---|---|---|---|
| Press-verify gate | progress (press) | pressed object still detected in the window | defer | not logged |
| Press latch | progress (press) | object occluded under the arm for consecutive frames | admit | not logged |
| Arrival-timed press (StopCube) | progress (press) | counted arrivals + predicted period; writer’s press rejected until then | reject / extractor | not logged |
| Stale-coordinate re-snap | grounding | cited coordinate matches a demo location but no current detection; nearest class-compatible detection | correct | not logged |
| Container-coordinate authority | grounding | deterministic fold of the admitted move chain disagrees with the cited container | correct | not logged |
| Direction words (RouteStick) | demo record | reader’s stroke sense/side supersede the writer’s | reject writer | 1,640 words / 30 eps |
| Task | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 |
|---|---|---|---|---|---|---|---|---|
| PickXtimes | 9 | 6 | 8 | 8 | 9 | 10 | 9 | 10 |
| BinFill | 9 | 2 | 7 | 6 | 8 | 8 | 6 | 7 |
| SwingXtimes | 7 | 3 | 6 | 1 | 6 | 5 | 8 | 8 |
| StopCube | 3 | 3 | 1 | 1 | 2 | 5 | 5 | 5 |
| VideoUnmask | 10 | 8 | 10 | 10 | 10 | 10 | 10 | 8 |
| ButtonUnmask | 5 | 8 | 6 | 7 | 9 | 7 | 7 | 9 |
| Task | Ticks | Content% | Gnd med px | px% | Trans. | Adopted% | Lag | Premature% |
|---|---|---|---|---|---|---|---|---|
| ButtonUnmask | 237 | 60.3 | 5.7 | 37.8 | 9 | 100.0 | 2 | 10.0 |
| ButtonUnmaskSwap | 680 | 37.4 | 7.8 | 41.3 | 17 | 100.0 | 1 | 48.3 |
| StopCube | 154 | 72.1 | 5.0 | 0.0 | 20 | 50.0 | 0 | 0.0 |
| VideoUnmaskSwap | 77 | 100.0 | 38.2 | 90.9 | 0 | – | – | 0.0 |
| VideoRepick | 114 | 93.9 | 25.6 | 69.5 | 6 | 100.0 | 1 | 0.0 |
| VideoPlaceOrder | 124 | 98.4 | 7.1 | 13.1 | 10 | 100.0 | 0 | 0.0 |
| Family (tasks) | Tick-level metric | GroundSG+QwenVL | MemER | Gamma |
|---|---|---|---|---|
| Binding (VUS, VRP, VPO) | coordinates beyond wrong-instance radius (%) | 51.7 | 36.2 | 13.5 |
| Press-counting (BU, BUS) | premature subgoal switches (%) | 38.5 | 67.4 | 17.0 |
| Direction (PL, RS) | subgoal text matches oracle (%) | 6.5 | 19.5 | 100.0 |
| GroundSG+QwenVL | MemER | Gamma | |||||||
|---|---|---|---|---|---|---|---|---|---|
| Task | content | px | prem. | content | px | prem. | content | px | prem. |
| ButtonUnmask | 60.3 | 37.8 | 10.0 | 45.6 | 7.7 | 64.9 | 70.6 | 0.0 | 28.6 |
| ButtonUnmaskSwap | 37.4 | 41.3 | 48.3 | 50.5 | 35.9 | 69.2 | 57.7 | 2.5 | 12.8 |
| StopCube | 72.1 | 0.0 | 0.0 | – | – | – | 89.1 | 0.0 | 23.8 |
| VideoUnmaskSwap | 100.0 | 90.9 | 0.0 | 100.0 | 81.2 | 0.0 | 82.6 | 1.0 | 40.0 |
| VideoRepick | 93.9 | 69.5 | 0.0 | 74.4 | 24.4 | 5.3 | 83.1 | 11.9 | 8.3 |
| step | live oracle (this run) | predicted subgoal | writer claim verdict |
|---|---|---|---|
| GroundSG+QwenVL | |||
| 0 | press the first button at | press the first button at | |
| 128 | press the second button at | press the second button at | |
| 192 | pick up the container at that hides the red cube | press the second button at | |
| 288 | pick up the container at that hides the red cube | pick up the container at that hides the red cube | |
| outcome: failure (episode ends at step 1312) | |||
| step | live oracle (this run) | predicted subgoal | writer claim verdict |
|---|---|---|---|
| GroundSG+QwenVL | |||
| 0 | pick up the correct cube at for the first time | pick up the correct cube at for the first time | |
| outcome: failure (episode ends at step 128) | |||
| MemER | |||
| 0 | pick up the correct cube at for the first time | pick up the correct cube at for the first time | |
| outcome: failure (episode ends at step 112) | |||
| step | live oracle (this run) | predicted subgoal | writer claim verdict |
|---|---|---|---|
| GroundSG+QwenVL | |||
| 0 | move to the nearest right target by circling around the stick clockwise | move to the nearest right target by circling around the stick counterclockwise | |
| outcome: failure (episode ends at step 48) | |||
| MemER | |||
| 0 | move to the nearest right target by circling around the stick clockwise | move to the nearest right target by circling around the stick clockwise | |
| 48 | move to the nearest right target by circling around the stick counterclockwise | move to the nearest right target by circling around the stick clockwise | |
| Seed | PickX | BinF | SwingX | StopC | VU | BU | VUS | BUS | PH | VRP | VPB | VPO | MC | IP | PL | RS | Avg |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7 | 100.0 | 63.3 | 66.7 | 43.3 | 86.7 | 83.3 | 80.0 | 36.7 | 70.0 | 76.7 | 73.3 | 70.0 | 60.0 | 6.7 | 96.7 | 53.3 | 66.7 |
| 8 | 96.7 | 66.7 | 73.3 | 36.7 | 83.3 | 93.3 | 66.7 | 40.0 | 73.3 | 63.3 | 76.7 | 63.3 | 63.3 | 3.3 | 100.0 | 60.0 | 66.3 |
| 9 | 100.0 | 83.3 | 66.7 | 26.7 | 90.0 | 76.7 | 80.0 | 30.0 | 70.0 | 56.7 | 76.7 | 66.7 | 63.3 | 0.0 | 100.0 | 56.7 | 65.2 |
| mean | 98.9 | 71.1 | 68.9 | 35.5 | 86.7 | 84.4 | 75.6 | 35.6 | 71.1 | 65.6 | 75.5 | 66.7 | 62.2 | 3.3 | 98.9 | 56.7 | 66.0 |
| Seed | PickX | BinF | SwingX | StopC | VU | BU | VUS | BUS | PH | VRP | VPB | VPO | MC | IP | PL | RS | Avg |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7 | 73.3 | 46.7 | 63.3 | 46.7 | 66.7 | 76.7 | 46.7 | 30.0 | 53.3 | 73.3 | 90.0 | 76.7 | 46.7 | 0.0 | 96.7 | 60.0 | 59.2 |
| 8 | 76.7 | 60.0 | 43.3 | 43.3 | 63.3 | 80.0 | 43.3 | 23.3 | 53.3 | 63.3 | 83.3 | 83.3 | 40.0 | 0.0 | 100.0 | 63.3 | 57.5 |
| 9 | 80.0 | 56.7 | 50.0 | 30.0 | 66.7 | 73.3 | 40.0 | 23.3 | 46.7 | 70.0 | 90.0 | 73.3 | 36.7 | 0.0 | 100.0 | 53.3 | 55.6 |
| mean | 76.7 | 54.4 | 52.2 | 40.0 | 65.6 | 76.7 | 43.3 | 25.6 | 51.1 | 68.9 | 87.8 | 77.8 | 41.1 | 0.0 | 98.9 | 58.9 | 57.4 |
| Row (task / subtask success, %) | Transferring | Occlusion | Counting | Sequence | Average |
|---|---|---|---|---|---|
| Our protocol: held-out layouts (seeds 50–99), 50 episodes per task unless marked | |||||
| executor, plan fed on benchmark stage predicates (privileged) | 3.5 / 23.6 | 2.4 / 40.7 | 11.4 / 36.5 | 35.0 / 68.1 | 10.0 / 41.1 |
| executor, plan fed on segment-completion conditions (privileged, 10 ep.) | 7.5 / 24.6 | 4.5 / 41.9 | 22.9 / 43.3 | 65.0 / 83.8 | 19.2 / 46.1 |
| Gamma full pipeline: writer + harness, claims settled two ticks | 27.4 / 37.6 | 19.2 / 50.1 | 52.3 / 67.5 | 80.7 / 90.3 | 38.8 / 59.0 |
| Gamma harness predicates only, no writer | 27.5 / 37.3 | 18.9 / 49.2 | 52.0 / 67.2 | 81.0 / 90.7 | 38.7 / 58.6 |
| Gamma writer + harness, claims admitted on the tick they are verified (10–20 ep.) | 1.2 / 20.2 | 3.2 / 45.1 | 24.3 / 42.1 | 72.5 / 86.2 | 19.2 / 46.8 |
| Writer (autoregressive rollout) | Reasoner | |||||
|---|---|---|---|---|---|---|
| Task | exact% | recall% | precision% | known% | ticks | exact% |
| PickXtimes | 99.2 | 97.6 | 97.6 | 97.5 | 260 | 80.0 |
| BinFill | 94.4 | 76.4 | 98.6 | 94.3 | 396 | 68.2 |
| SwingXtimes | 95.4 | 87.0 | 95.3 | 99.1 | 262 | 94.7 |
| StopCube | 80.0 | 65.2 | 91.9 | 96.3 | 240 | 88.7 |
| VideoUnmask | 100.0 | 100.0 | 100.0 | 100.0 | 126 | 100.0 |
| Class | Text prompt | Class | Text prompt |
|---|---|---|---|
| red_cube | a small red block on the table | target | a flat square target marker on the table |
| green_cube | a small green block on the table | bin | a white open box |
| blue_cube | a small blue block on the table | peg | a long cylindrical peg on the table |
| container | white container box | stick | a thin stick standing on the table |
| button | a grey push button on the table | arm | robot arm |
Memory-Augmented Agents
Memory-augmented agents use stored experience and knowledge to act coherently across long tasks, changing environments, and repeated interactions.
See all 348 papers