{
 "rp": "0.2",
 "note": "Writes vectors/sessions.json (RP 0.2). Each case documents one rule; both reference implementations must pass all.\n\nSteps:  heard · say (+by, confidence) · intent (a non-speech intent: +by, confidence) · tick · stamp (+from, to) · end\n        merge (another recorder's lowerings) · preference (+by, authenticated)\nChecks: expect (applied level by label) · expect_default (applied level of a voice that set nothing)\n        expect_outcomes (of the step's intents) · expect_voices · expect_record (levels of a label's segments)\n        expect_usable (labels whose segments a derived artefact at `level` may use) · expect_events (event types emitted by the step)\n        expect_retention (retention_for(label) in seconds; label \"*\" = session)\n        expect_log_omits (a label whose voice id must appear nowhere in the event log)",
 "profile": {
  "rp": "0.2",
  "id": "rp-test",
  "default_level": 3,
  "max_default_level": 4,
  "max_voice_level": 4,
  "invocation": [
   "recorder"
  ],
  "locales": [
   "en"
  ],
  "objection_window": "PT30S",
  "session_gap": "PT10M",
  "attribution_threshold": 0.8,
  "max_participants": 10,
  "retention": [
   {
    "until": "P3D",
    "max_level": 5
   },
   {
    "until": "P30D",
    "max_level": 2
   },
   {
    "until": "P1Y",
    "max_level": 1
   }
  ]
 },
 "cases": [
  {
   "name": "lowering is immediate and needs no name",
   "rule": "§6.1",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "say": "honestly, this is off the record",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 0
     },
     "expect_outcomes": [
      "applied"
     ],
     "expect_events": [
      "level"
     ]
    }
   ]
  },
  {
   "name": "a room lowering caps a voice that raised itself",
   "rule": "§6.1",
   "steps": [
    {
     "t": 0,
     "say": "you can quote me",
     "by": "ben"
    },
    {
     "t": 1,
     "say": "can we keep this to just the decisions",
     "by": "ana"
    },
    {
     "expect": {
      "ben": 1,
      "ana": 1
     }
    }
   ]
  },
  {
   "name": "a lowering mid-sentence is still room-wide",
   "rule": "§7.2",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "heard": "ben"
    },
    {
     "t": 2,
     "say": "As I said, this is off the record.",
     "by": "ana"
    },
    {
     "expect": {
      "ben": 0
     }
    }
   ]
  },
  {
   "name": "own words only",
   "rule": "§6.2",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "heard": "ben"
    },
    {
     "t": 2,
     "say": "keep my words to just the decisions",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 1,
      "ben": 3
     }
    }
   ]
  },
  {
   "name": "raising your own words is immediate",
   "rule": "§6.2",
   "steps": [
    {
     "t": 0,
     "say": "you can quote me on that",
     "by": "ben"
    },
    {
     "expect": {
      "ben": 4
     },
     "expect_outcomes": [
      "applied"
     ]
    }
   ]
  },
  {
   "name": "a self lowering never raises",
   "rule": "§6.2",
   "steps": [
    {
     "t": 0,
     "say": "please leave me out of this",
     "by": "ana"
    },
    {
     "t": 1,
     "say": "don't quote me on this",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 0
     }
    }
   ]
  },
  {
   "name": "a self raise is capped by max_voice_level",
   "rule": "§6.2",
   "steps": [
    {
     "t": 0,
     "say": "you can quote me",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 3
     }
    }
   ],
   "profile": {
    "max_voice_level": 3,
    "max_default_level": 3
   }
  },
  {
   "name": "self resume clears your own request",
   "rule": "§6.2",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "intent": {
      "kind": "lower",
      "scope": "self",
      "level": 1,
      "source": "ui"
     },
     "by": "ana",
     "confidence": 1
    },
    {
     "expect": {
      "ana": 1
     }
    },
    {
     "t": 2,
     "intent": {
      "kind": "resume",
      "scope": "self",
      "source": "ui"
     },
     "by": "ana",
     "confidence": 1
    },
    {
     "expect": {
      "ana": 3
     }
    }
   ]
  },
  {
   "name": "a room raise needs the name",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "keep this word for word",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "ignored"
     ],
     "expect_default": 3
    }
   ]
  },
  {
   "name": "a room raise applies at once, provisionally",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "provisional"
     ],
     "expect_default": 4
    },
    {
     "t": 30,
     "tick": true
    },
    {
     "expect_default": 4
    }
   ]
  },
  {
   "name": "a room raise is capped by max_default_level",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "expect_default": 3
    }
   ],
   "profile": {
    "max_default_level": 3
   }
  },
  {
   "name": "a room raise can be disabled",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "ignored"
     ],
     "expect_default": 3
    }
   ],
   "profile": {
    "room_raise": "disabled"
   }
  },
  {
   "name": "a non-voice explicit action counts as addressed",
   "rule": "§7.1",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "intent": {
      "kind": "raise",
      "scope": "room",
      "level": 4,
      "source": "ui",
      "addressed": true
     },
     "by": "ana",
     "confidence": 1
    },
    {
     "expect_default": 4
    }
   ]
  },
  {
   "name": "an objection undoes a raise, retroactively",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "t": 2,
     "heard": "ben"
    },
    {
     "t": 4,
     "stamp": "ben",
     "from": 2,
     "to": 4
    },
    {
     "expect_record": {
      "ben": [
       4
      ]
     },
     "expect_usable": {
      "level": 4,
      "labels": []
     }
    },
    {
     "t": 5,
     "say": "no",
     "by": "cai"
    },
    {
     "expect_outcomes": [
      "reverted"
     ],
     "expect_default": 3,
     "expect_record": {
      "ben": [
       3
      ]
     }
    },
    {
     "t": 60,
     "tick": true
    },
    {
     "expect_default": 3
    }
   ]
  },
  {
   "name": "a lowering inside the window undoes the raise",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "t": 5,
     "say": "only the action items",
     "by": "ben"
    },
    {
     "expect_default": 1
    },
    {
     "t": 60,
     "tick": true
    },
    {
     "expect_default": 1
    }
   ]
  },
  {
   "name": "back on the record returns at once; an objection restores the lowering",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 10,
     "say": "ok, we're back on the record",
     "by": "ben"
    },
    {
     "expect_outcomes": [
      "provisional"
     ],
     "expect_default": 3
    },
    {
     "t": 12,
     "stamp": "ben",
     "from": 10,
     "to": 12
    },
    {
     "t": 15,
     "say": "no",
     "by": "ana"
    },
    {
     "expect_default": 0,
     "expect_record": {
      "ben": [
       0
      ]
     }
    },
    {
     "t": 60,
     "say": "ok, we're back on the record",
     "by": "ana"
    },
    {
     "expect_default": 3
    },
    {
     "t": 91,
     "tick": true
    },
    {
     "expect_default": 3,
     "expect_events": [
      "confirmed"
     ]
    }
   ]
  },
  {
   "name": "the meeting case: Bruno goes off the record, Chiara brings it back",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "heard": "Ada"
    },
    {
     "t": 5,
     "say": "Between us, the last owner we named left the week after.",
     "by": "Bruno"
    },
    {
     "expect_default": 0
    },
    {
     "t": 10,
     "say": "Okay, back on the record. Ownership should sit with whoever can change the rule.",
     "by": "Chiara"
    },
    {
     "expect": {
      "Ada": 3,
      "Bruno": 3,
      "Chiara": 3
     }
    },
    {
     "t": 45,
     "tick": true
    },
    {
     "expect": {
      "Ada": 3
     }
    }
   ]
  },
  {
   "name": "a second raise restarts the window",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 1,
     "say": "back on the record",
     "by": "ben"
    },
    {
     "t": 30,
     "say": "Recorder, keep this word for word",
     "by": "ben"
    },
    {
     "t": 31,
     "tick": true
    },
    {
     "expect_default": 4
    },
    {
     "t": 45,
     "say": "no",
     "by": "ana"
    },
    {
     "expect_default": 0
    }
   ]
  },
  {
   "name": "ending the session inside the window undoes the raise",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 10,
     "say": "back on the record",
     "by": "ana"
    },
    {
     "t": 11,
     "heard": "ben"
    },
    {
     "t": 20,
     "stamp": "ben",
     "from": 11,
     "to": 20
    },
    {
     "t": 25,
     "end": true,
     "expect_events": [
      "reverted",
      "level",
      "level",
      "end"
     ]
    },
    {
     "expect_record": {}
    }
   ]
  },
  {
   "name": "an objection with nothing to undo is ignored",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "no",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "ignored"
     ]
    }
   ]
  },
  {
   "name": "back on the record when nothing was lowered is ignored",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "back on the record",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "ignored"
     ]
    }
   ]
  },
  {
   "name": "nobody raises anyone else",
   "rule": "§6.4",
   "steps": [
    {
     "t": 0,
     "say": "leave me out of this",
     "by": "ana"
    },
    {
     "t": 1,
     "say": "Recorder, keep this word for word",
     "by": "ben"
    },
    {
     "t": 40,
     "tick": true
    },
    {
     "expect": {
      "ana": 0,
      "ben": 4
     }
    }
   ]
  },
  {
   "name": "an unsure self lowering applies to everyone",
   "rule": "§6.5",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "heard": "ben"
    },
    {
     "t": 2,
     "say": "keep my words to just the decisions",
     "by": "ana",
     "confidence": 0.4
    },
    {
     "expect": {
      "ana": 1,
      "ben": 1
     },
     "expect_default": 1
    }
   ]
  },
  {
   "name": "an unsure self raise is ignored",
   "rule": "§6.5",
   "steps": [
    {
     "t": 0,
     "say": "you can quote me",
     "by": "ben",
     "confidence": 0.4
    },
    {
     "expect": {
      "ben": 3
     },
     "expect_outcomes": [
      "ignored"
     ]
    }
   ]
  },
  {
   "name": "an unsure 'forget what I said' forgets for everyone",
   "rule": "§6.5",
   "steps": [
    {
     "t": 100,
     "stamp": "ben",
     "from": 90,
     "to": 100
    },
    {
     "t": 110,
     "say": "forget what I just said",
     "by": "ana",
     "confidence": 0.4
    },
    {
     "expect_record": {
      "ben": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "forget what I said is personal",
   "rule": "§6.6",
   "steps": [
    {
     "t": 500,
     "stamp": "ana",
     "from": 400,
     "to": 500
    },
    {
     "t": 500,
     "stamp": "ben",
     "from": 450,
     "to": 500
    },
    {
     "t": 600,
     "say": "forget what I just said",
     "by": "ana"
    },
    {
     "expect_record": {
      "ana": [
       0
      ],
      "ben": [
       3
      ]
     }
    }
   ]
  },
  {
   "name": "forget the last N minutes applies to everyone",
   "rule": "§6.6",
   "steps": [
    {
     "t": 500,
     "stamp": "ana",
     "from": 400,
     "to": 500
    },
    {
     "t": 500,
     "stamp": "ben",
     "from": 450,
     "to": 500
    },
    {
     "t": 600,
     "say": "forget the last ten minutes",
     "by": "ben"
    },
    {
     "expect_record": {
      "ana": [
       0
      ],
      "ben": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "forgetting reaches speech filed afterwards",
   "rule": "§6.6",
   "steps": [
    {
     "t": 0,
     "heard": "ben"
    },
    {
     "t": 50,
     "say": "forget the last five minutes",
     "by": "ana"
    },
    {
     "t": 60,
     "stamp": "ben",
     "from": 0,
     "to": 60
    },
    {
     "expect_record": {
      "ben": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "erase empties only the speaker's record",
   "rule": "§4.3",
   "steps": [
    {
     "t": 10,
     "stamp": "ana",
     "from": 0,
     "to": 10
    },
    {
     "t": 20,
     "stamp": "ben",
     "from": 10,
     "to": 20
    },
    {
     "t": 30,
     "say": "Recorder, erase everything I said",
     "by": "ana"
    },
    {
     "expect_record": {
      "ana": [
       0
      ],
      "ben": [
       3
      ]
     }
    }
   ]
  },
  {
   "name": "a raise at the start of a segment applies to it",
   "rule": "§6.1",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 0,
     "say": "you can quote me",
     "by": "ana"
    },
    {
     "t": 4,
     "stamp": "ana",
     "from": 0,
     "to": 4
    },
    {
     "expect_record": {
      "ana": [
       4
      ]
     }
    }
   ]
  },
  {
   "name": "a segment spanning a lowering keeps the lowest level",
   "rule": "§6.1",
   "steps": [
    {
     "t": 0,
     "heard": "ben"
    },
    {
     "t": 20,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 30,
     "say": "back on the record",
     "by": "ana"
    },
    {
     "t": 61,
     "tick": true
    },
    {
     "t": 100,
     "stamp": "ben",
     "from": 0,
     "to": 100
    },
    {
     "expect_record": {
      "ben": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "shortening only shortens",
   "rule": "§5.2",
   "steps": [
    {
     "t": 0,
     "say": "keep it for 3 days",
     "by": "ana"
    },
    {
     "expect_retention": {
      "*": 259200
     }
    },
    {
     "t": 1,
     "say": "keep it for a week",
     "by": "ana"
    },
    {
     "expect_retention": {
      "*": 259200
     }
    }
   ]
  },
  {
   "name": "keep it for zero days means keep nothing",
   "rule": "§5.2",
   "steps": [
    {
     "t": 0,
     "say": "keep this for 0 days",
     "by": "ana"
    },
    {
     "expect_retention": {
      "*": 0
     }
    }
   ]
  },
  {
   "name": "participant limit: voices over it are never recorded",
   "rule": "§4.1",
   "steps": [
    {
     "t": 0,
     "heard": "p0"
    },
    {
     "t": 1,
     "heard": "p1"
    },
    {
     "t": 2,
     "heard": "p2"
    },
    {
     "t": 3,
     "heard": "p3"
    },
    {
     "t": 4,
     "heard": "p4"
    },
    {
     "t": 5,
     "heard": "p5"
    },
    {
     "t": 6,
     "heard": "p6"
    },
    {
     "t": 7,
     "heard": "p7"
    },
    {
     "t": 8,
     "heard": "p8"
    },
    {
     "t": 9,
     "heard": "p9"
    },
    {
     "t": 10,
     "heard": "p10"
    },
    {
     "t": 12,
     "stamp": "p10",
     "from": 11,
     "to": 12
    },
    {
     "expect_voices": [
      "p0",
      "p1",
      "p2",
      "p3",
      "p4",
      "p5",
      "p6",
      "p7",
      "p8",
      "p9"
     ],
     "expect": {
      "p10": 0
     }
    }
   ]
  },
  {
   "name": "session end drops identities and resets levels",
   "rule": "§6.7",
   "steps": [
    {
     "t": 0,
     "say": "keep my words to just the decisions",
     "by": "ana"
    },
    {
     "t": 3,
     "say": "this is off the record",
     "by": "ben"
    },
    {
     "t": 700,
     "heard": "cai"
    },
    {
     "expect_voices": [
      "cai"
     ],
     "expect": {
      "ana": 3,
      "cai": 3
     }
    }
   ]
  },
  {
   "name": "a command after a long silence starts a new session",
   "rule": "§6.7",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 700,
     "say": "only the action items",
     "by": "ben"
    },
    {
     "expect_default": 1
    }
   ]
  },
  {
   "name": "derived artefacts respect each voice's level",
   "rule": "§5.4",
   "steps": [
    {
     "t": 0,
     "say": "keep my words to just the decisions",
     "by": "ana"
    },
    {
     "t": 10,
     "stamp": "ana",
     "from": 1,
     "to": 10
    },
    {
     "t": 20,
     "stamp": "ben",
     "from": 10,
     "to": 20
    },
    {
     "expect_usable": {
      "level": 3,
      "labels": [
       "ben"
      ]
     }
    },
    {
     "expect_usable": {
      "level": 1,
      "labels": [
       "ana",
       "ben"
      ]
     }
    }
   ]
  },
  {
   "name": "merging another recorder's lowerings takes the minimum",
   "rule": "§11.1",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "heard": "ben"
    },
    {
     "t": 2,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "ceiling": 2,
      "retention": null,
      "voices": {
       "ana": {
        "level": 0
       },
       "ben": {}
      }
     }
    },
    {
     "expect": {
      "ana": 0,
      "ben": 2
     }
    },
    {
     "t": 3,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "ceiling": 4,
      "retention": null,
      "voices": {
       "ana": {
        "level": 4
       }
      }
     }
    },
    {
     "expect": {
      "ana": 0,
      "ben": 2
     }
    }
   ]
  },
  {
   "name": "a standing lowering applies at once; a standing raise needs authentication",
   "rule": "§11.2",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "preference": {
      "level": 1
     },
     "by": "ana",
     "authenticated": false
    },
    {
     "expect": {
      "ana": 1
     }
    },
    {
     "t": 2,
     "heard": "ben"
    },
    {
     "t": 3,
     "preference": {
      "level": 4
     },
     "by": "ben",
     "authenticated": false
    },
    {
     "expect": {
      "ben": 3
     }
    },
    {
     "t": 4,
     "preference": {
      "level": 4
     },
     "by": "ben",
     "authenticated": true
    },
    {
     "expect": {
      "ben": 4
     }
    }
   ]
  },
  {
   "name": "side conversations: a lowering stays in its conversation",
   "rule": "ext side_conversations",
   "steps": [
    {
     "t": 2,
     "heard": "a1"
    },
    {
     "t": 4,
     "heard": "a2"
    },
    {
     "t": 6,
     "heard": "a3"
    },
    {
     "t": 28,
     "heard": "b1"
    },
    {
     "t": 30,
     "heard": "b2"
    },
    {
     "t": 32,
     "heard": "b3"
    },
    {
     "t": 54,
     "heard": "a1"
    },
    {
     "t": 56,
     "heard": "a2"
    },
    {
     "t": 58,
     "heard": "a3"
    },
    {
     "t": 80,
     "heard": "b1"
    },
    {
     "t": 82,
     "heard": "b2"
    },
    {
     "t": 84,
     "heard": "b3"
    },
    {
     "t": 106,
     "heard": "a1"
    },
    {
     "t": 108,
     "heard": "a2"
    },
    {
     "t": 110,
     "heard": "a3"
    },
    {
     "t": 132,
     "heard": "b1"
    },
    {
     "t": 134,
     "heard": "b2"
    },
    {
     "t": 136,
     "heard": "b3"
    },
    {
     "t": 157,
     "say": "this is off the record",
     "by": "a1"
    },
    {
     "expect": {
      "a1": 0,
      "a2": 0,
      "a3": 0,
      "b1": 3,
      "b2": 3,
      "b3": 3
     }
    }
   ],
   "profile": {
    "extensions": [
     "side_conversations"
    ]
   }
  },
  {
   "name": "side conversations: a lowering survives the groups merging",
   "rule": "ext side_conversations",
   "steps": [
    {
     "t": 2,
     "heard": "a1"
    },
    {
     "t": 4,
     "heard": "a2"
    },
    {
     "t": 6,
     "heard": "a3"
    },
    {
     "t": 28,
     "heard": "b1"
    },
    {
     "t": 30,
     "heard": "b2"
    },
    {
     "t": 32,
     "heard": "b3"
    },
    {
     "t": 54,
     "heard": "a1"
    },
    {
     "t": 56,
     "heard": "a2"
    },
    {
     "t": 58,
     "heard": "a3"
    },
    {
     "t": 80,
     "heard": "b1"
    },
    {
     "t": 82,
     "heard": "b2"
    },
    {
     "t": 84,
     "heard": "b3"
    },
    {
     "t": 106,
     "heard": "a1"
    },
    {
     "t": 108,
     "heard": "a2"
    },
    {
     "t": 110,
     "heard": "a3"
    },
    {
     "t": 132,
     "heard": "b1"
    },
    {
     "t": 134,
     "heard": "b2"
    },
    {
     "t": 136,
     "heard": "b3"
    },
    {
     "t": 157,
     "say": "this is off the record",
     "by": "a1"
    },
    {
     "t": 158,
     "heard": "b1"
    },
    {
     "t": 159,
     "heard": "a2"
    },
    {
     "t": 160,
     "heard": "b1"
    },
    {
     "t": 161,
     "heard": "a2"
    },
    {
     "expect": {
      "a1": 0,
      "a2": 0,
      "b1": 3
     }
    }
   ],
   "profile": {
    "extensions": [
     "side_conversations"
    ]
   }
  },
  {
   "name": "side conversations: an unsure lowering lowers everyone",
   "rule": "ext side_conversations",
   "steps": [
    {
     "t": 2,
     "heard": "a1"
    },
    {
     "t": 4,
     "heard": "a2"
    },
    {
     "t": 6,
     "heard": "a3"
    },
    {
     "t": 28,
     "heard": "b1"
    },
    {
     "t": 30,
     "heard": "b2"
    },
    {
     "t": 32,
     "heard": "b3"
    },
    {
     "t": 54,
     "heard": "a1"
    },
    {
     "t": 56,
     "heard": "a2"
    },
    {
     "t": 58,
     "heard": "a3"
    },
    {
     "t": 80,
     "heard": "b1"
    },
    {
     "t": 82,
     "heard": "b2"
    },
    {
     "t": 84,
     "heard": "b3"
    },
    {
     "t": 106,
     "heard": "a1"
    },
    {
     "t": 108,
     "heard": "a2"
    },
    {
     "t": 110,
     "heard": "a3"
    },
    {
     "t": 132,
     "heard": "b1"
    },
    {
     "t": 134,
     "heard": "b2"
    },
    {
     "t": 136,
     "heard": "b3"
    },
    {
     "t": 157,
     "say": "this is off the record",
     "by": "a1",
     "confidence": 0.4
    },
    {
     "expect": {
      "a1": 0,
      "b2": 0
     }
    }
   ],
   "profile": {
    "extensions": [
     "side_conversations"
    ]
   }
  },
  {
   "name": "claiming is an extension: ignored unless enabled",
   "rule": "ext claiming",
   "steps": [
    {
     "t": 0,
     "say": "remember my voice",
     "by": "ana"
    },
    {
     "expect_outcomes": []
    }
   ]
  },
  {
   "name": "claiming: the claim is logged for the binding",
   "rule": "ext claiming",
   "steps": [
    {
     "t": 0,
     "say": "remember my voice",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "applied"
     ],
     "expect_events": [
      "voice",
      "claim"
     ]
    }
   ],
   "profile": {
    "extensions": [
     "claiming"
    ]
   }
  },
  {
   "name": "speech from an undone window, filed later, keeps the earlier level",
   "rule": "§6.3",
   "steps": [
    {
     "t": 1,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 10,
     "say": "back on the record",
     "by": "ana"
    },
    {
     "t": 20,
     "say": "no",
     "by": "ana"
    },
    {
     "t": 25,
     "say": "back on the record",
     "by": "ana"
    },
    {
     "t": 60,
     "tick": true
    },
    {
     "t": 61,
     "stamp": "ben",
     "from": 11,
     "to": 19
    },
    {
     "expect_record": {
      "ben": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "speech from before the session's start is not recorded",
   "rule": "§6.7",
   "steps": [
    {
     "t": 1,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 100,
     "end": true
    },
    {
     "t": 101,
     "stamp": "ben",
     "from": 2,
     "to": 99
    },
    {
     "expect_voices": []
    }
   ]
  },
  {
   "name": "a late filing never moves the clock back or ends the session early",
   "rule": "§6.7",
   "steps": [
    {
     "t": 500,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 590,
     "heard": "ana"
    },
    {
     "t": 591,
     "stamp": "ben",
     "from": 0,
     "to": 10
    },
    {
     "t": 620,
     "heard": "ana"
    },
    {
     "expect_default": 0
    }
   ]
  },
  {
   "name": "a sentence that raises and lowers, lowers",
   "rule": "§7.2",
   "steps": [
    {
     "t": 0,
     "heard": "ben"
    },
    {
     "t": 1,
     "say": "You can quote me, but this part is off the record.",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 0,
      "ben": 0
     }
    }
   ]
  },
  {
   "name": "forget what I said in the last ten minutes",
   "rule": "§6.6",
   "steps": [
    {
     "t": 370,
     "stamp": "ana",
     "from": 200,
     "to": 370
    },
    {
     "t": 500,
     "say": "forget what I said in the last ten minutes",
     "by": "ana"
    },
    {
     "expect_record": {
      "ana": [
       0
      ]
     }
    }
   ]
  },
  {
   "name": "a standing lowering survives a ceiling",
   "rule": "§11.2",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 1,
     "preference": {
      "level": 1
     },
     "by": "ana",
     "authenticated": false
    },
    {
     "t": 2,
     "say": "back on the record",
     "by": "ben"
    },
    {
     "t": 40,
     "tick": true
    },
    {
     "expect": {
      "ana": 1,
      "ben": 3
     }
    }
   ]
  },
  {
   "name": "an authenticated standing lowering is still a lowering",
   "rule": "§11.2",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "preference": {
      "level": 1
     },
     "by": "ana",
     "authenticated": true
    },
    {
     "expect": {
      "ana": 1
     }
    }
   ]
  },
  {
   "name": "forgetting everything removes the voice from the event log",
   "rule": "§9",
   "steps": [
    {
     "t": 0,
     "say": "keep my words to just the decisions",
     "by": "ana"
    },
    {
     "t": 1,
     "say": "please delete my words",
     "by": "ana"
    },
    {
     "expect_log_omits": "ana"
    }
   ]
  },
  {
   "name": "merged labels never fake a side conversation",
   "rule": "§11.1",
   "steps": [
    {
     "t": 0,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "voices": {
       "ana": {},
       "ben": {}
      }
     }
    },
    {
     "t": 1,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "voices": {
       "cai": {},
       "dan": {}
      }
     }
    },
    {
     "t": 2,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "expect": {
      "ana": 0,
      "ben": 0,
      "cai": 0,
      "dan": 0
     }
    }
   ],
   "profile": {
    "extensions": [
     "side_conversations"
    ],
    "replies_for_group": 1
   }
  },
  {
   "name": "invalid exchange members are ignored",
   "rule": "§11.1",
   "steps": [
    {
     "t": 0,
     "heard": "ana"
    },
    {
     "t": 1,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "ceiling": -3,
      "voices": {
       "ana": {
        "level": 2.5
       }
      }
     }
    },
    {
     "t": 2,
     "merge": {
      "rp": "0.2",
      "type": "lowerings",
      "voices": {
       "ana": {
        "level": "0"
       }
      }
     }
    },
    {
     "expect": {
      "ana": 3
     },
     "expect_default": 3
    }
   ]
  },
  {
   "name": "an unsure speaker cannot raise the room",
   "rule": "§6.5",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana",
     "confidence": 0.1
    },
    {
     "expect_outcomes": [
      "ignored"
     ],
     "expect_default": 3
    }
   ]
  },
  {
   "name": "a voice over the cap cannot raise the room",
   "rule": "§6.5",
   "steps": [
    {
     "t": 0,
     "heard": "p0"
    },
    {
     "t": 1,
     "heard": "p1"
    },
    {
     "t": 2,
     "heard": "p2"
    },
    {
     "t": 3,
     "heard": "p3"
    },
    {
     "t": 4,
     "heard": "p4"
    },
    {
     "t": 5,
     "heard": "p5"
    },
    {
     "t": 6,
     "heard": "p6"
    },
    {
     "t": 7,
     "heard": "p7"
    },
    {
     "t": 8,
     "heard": "p8"
    },
    {
     "t": 9,
     "heard": "p9"
    },
    {
     "t": 11,
     "say": "Recorder, keep this word for word",
     "by": "p10"
    },
    {
     "expect_outcomes": [
      "ignored"
     ],
     "expect_default": 3
    }
   ]
  },
  {
   "name": "a room raise does not lift a ceiling",
   "rule": "§6.4",
   "steps": [
    {
     "t": 0,
     "say": "this is off the record",
     "by": "ana"
    },
    {
     "t": 1,
     "say": "Recorder, keep this word for word",
     "by": "ben"
    },
    {
     "expect_default": 0
    },
    {
     "t": 40,
     "tick": true
    },
    {
     "expect_default": 0
    }
   ]
  },
  {
   "name": "a negated raise lowers",
   "rule": "§7.2",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, please don't keep this word for word",
     "by": "ana"
    },
    {
     "expect_outcomes": [
      "applied"
     ],
     "expect_default": 3
    },
    {
     "t": 1,
     "say": "Recorder, keep this word for word",
     "by": "ben"
    },
    {
     "expect_default": 3
    }
   ]
  },
  {
   "name": "an objection exactly at the deadline still counts",
   "rule": "§6.3",
   "steps": [
    {
     "t": 0,
     "say": "Recorder, keep this word for word",
     "by": "ana"
    },
    {
     "t": 30,
     "say": "no",
     "by": "ben"
    },
    {
     "expect_outcomes": [
      "reverted"
     ],
     "expect_default": 3
    }
   ]
  },
  {
   "name": "side conversations: back on the record lifts caps after the groups merge",
   "rule": "ext side_conversations",
   "steps": [
    {
     "t": 2,
     "heard": "a1"
    },
    {
     "t": 4,
     "heard": "a2"
    },
    {
     "t": 6,
     "heard": "a3"
    },
    {
     "t": 28,
     "heard": "b1"
    },
    {
     "t": 30,
     "heard": "b2"
    },
    {
     "t": 32,
     "heard": "b3"
    },
    {
     "t": 54,
     "heard": "a1"
    },
    {
     "t": 56,
     "heard": "a2"
    },
    {
     "t": 58,
     "heard": "a3"
    },
    {
     "t": 80,
     "heard": "b1"
    },
    {
     "t": 82,
     "heard": "b2"
    },
    {
     "t": 84,
     "heard": "b3"
    },
    {
     "t": 106,
     "heard": "a1"
    },
    {
     "t": 108,
     "heard": "a2"
    },
    {
     "t": 110,
     "heard": "a3"
    },
    {
     "t": 132,
     "heard": "b1"
    },
    {
     "t": 134,
     "heard": "b2"
    },
    {
     "t": 136,
     "heard": "b3"
    },
    {
     "t": 157,
     "say": "this is off the record",
     "by": "a1"
    },
    {
     "t": 158,
     "heard": "b1"
    },
    {
     "t": 159,
     "heard": "a2"
    },
    {
     "t": 160,
     "heard": "b1"
    },
    {
     "t": 161,
     "heard": "a2"
    },
    {
     "t": 162,
     "say": "back on the record",
     "by": "b1"
    },
    {
     "expect": {
      "a1": 3,
      "a2": 3
     }
    }
   ],
   "profile": {
    "extensions": [
     "side_conversations"
    ]
   }
  }
 ]
}