{"version": 2, "width": 96, "height": 30, "timestamp": 1790106185, "title": "grip: keep a grip on your code", "env": {"TERM": "xterm-256color", "SHELL": "/bin/bash"}}
[0.0038, "o", "\u001b[?2004h❯ "]
[0.8045, "o", "g"]
[0.8326, "o", "i"]
[0.8778, "o", "t"]
[0.9112, "o", " "]
[0.9573, "o", "s"]
[0.9963, "o", "t"]
[1.0357, "o", "a"]
[1.0745, "o", "t"]
[1.1122, "o", "u"]
[1.1434, "o", "s"]
[1.1741, "o", " "]
[1.2481, "o", "-"]
[1.2813, "o", "-"]
[1.3271, "o", "s"]
[1.3768, "o", "h"]
[1.4294, "o", "o"]
[1.4849, "o", "r"]
[1.5148, "o", "t"]
[1.7952, "o", "\r\n\u001b[?2004l\r"]
[1.798, "o", "\u001b[32mM\u001b[m  amr_safety/cmd_vel_filter.py\r\n"]
[1.7983, "o", "\u001b[?2004h❯ "]
[2.999, "o", "g"]
[3.0427, "o", "i"]
[3.096, "o", "t"]
[3.1339, "o", " "]
[3.2092, "o", "c"]
[3.2642, "o", "o"]
[3.3046, "o", "m"]
[3.3524, "o", "m"]
[3.4001, "o", "i"]
[3.4524, "o", "t"]
[3.4752, "o", " "]
[3.5195, "o", "-"]
[3.5768, "o", "m"]
[3.6252, "o", " "]
[3.6786, "o", "\""]
[3.7268, "o", "s"]
[3.7544, "o", "a"]
[3.789, "o", "f"]
[3.8263, "o", "e"]
[3.8561, "o", "t"]
[3.8826, "o", "y"]
[3.9225, "o", ":"]
[3.994, "o", " "]
[4.0464, "o", "s"]
[4.0918, "o", "t"]
[4.1486, "o", "o"]
[4.1722, "o", "p"]
[4.2036, "o", " "]
[4.2433, "o", "w"]
[4.2891, "o", "h"]
[4.3254, "o", "e"]
[4.3628, "o", "n"]
[4.3933, "o", " "]
[4.4724, "o", "t"]
[4.5211, "o", "h"]
[4.5586, "o", "e"]
[4.6098, "o", " "]
[4.6574, "o", "s"]
[4.6914, "o", "c"]
[4.7472, "o", "a"]
[4.7769, "o", "n"]
[4.8036, "o", " "]
[4.84, "o", "g"]
[4.8858, "o", "o"]
[4.9366, "o", "e"]
[4.9602, "o", "s"]
[4.9989, "o", " "]
[5.056, "o", "s"]
[5.0893, "o", "t"]
[5.1193, "o", "a"]
[5.1547, "o", "l"]
[5.1813, "o", "e"]
[5.236, "o", "\""]
[5.5149, "o", "\r\n\u001b[?2004l\r"]
[5.6763, "o", "\r\n"]
[5.6769, "o", "╭───────────────────────────────── grip ─────────────────────────────────╮\r\n│ \u001b[1m5 questions\u001b[0m about your \u001b[1mstaged changes\u001b[0m (pre-commit). Pass mark: \u001b[1m70/100\u001b[0m. │\r\n│                                                                        │\r\n│ amr_safety/cmd_vel_filter.py                                           │\r\n╰─────────────────────── keep a grip on your code ───────────────────────╯\r\n"]
[5.6788, "o", "\u001b[?25l"]
[5.7611, "o", "\u001b[32m⠋\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[5.8422, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[5.923, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.0037, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.0845, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.1653, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.2465, "o", "\r\u001b[2K\u001b[32m⠦\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.3276, "o", "\r\u001b[2K\u001b[32m⠧\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.4085, "o", "\r\u001b[2K\u001b[32m⠇\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.4893, "o", "\r\u001b[2K\u001b[32m⠏\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.57, "o", "\r\u001b[2K\u001b[32m⠋\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.6509, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.7318, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.8127, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.8933, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.9744, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[6.9803, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"]
[6.9805, "o", "\r\n\u001b[2mThe cmd_vel safety filter gains a scan watchdog: with no LaserScan for scan_timeout it publishes\u001b[0m\r\n\u001b[2ma zero Twist instead of forwarding commands on stale data, and the hard-coded stop distance \u001b[0m\r\n\u001b[2mbecomes the stop_distance parameter.\u001b[0m\r\n\r\n"]
[6.9807, "o", "\u001b[2mAnswer in a sentence or two. Press Enter on an empty line to skip.\u001b[0m\r\n\r\n"]
[6.9811, "o", "\u001b[1;36mQ1/5\u001b[0m \u001b[2m(behaviour)\u001b[0m What does the node publish on /cmd_vel once no /scan message has arrived for \r\nlonger than scan_timeout?\r\n"]
[6.9811, "o", "\u001b[1m> \u001b[0m"]
[7.4839, "o", "i"]
[7.5138, "o", "t"]
[7.5502, "o", " "]
[7.6045, "o", "s"]
[7.6397, "o", "t"]
[7.6735, "o", "o"]
[7.7156, "o", "p"]
[7.7445, "o", "s"]
[7.7857, "o", " "]
[7.8185, "o", "i"]
[7.8486, "o", " "]
[7.8988, "o", "g"]
[7.9237, "o", "u"]
[7.9687, "o", "e"]
[7.9992, "o", "s"]
[8.0457, "o", "s"]
[8.3481, "o", "\r\n"]
[8.3486, "o", "\r\n"]
[8.3491, "o", "\u001b[1;36mQ2/5\u001b[0m \u001b[2m(motivation)\u001b[0m Why is the staleness check done in the cmd_vel callback rather than in the \r\nscan callback?\r\n"]
[8.3493, "o", "\u001b[1m> \u001b[0m"]
[9.1, "o", "\r\n"]
[9.1005, "o", "\r\n"]
[9.1009, "o", "\u001b[1;36mQ3/5\u001b[0m \u001b[2m(edge case)\u001b[0m The lidar is healthy but its clock runs a few seconds behind the robot's. What \r\ndoes the robot do?\r\n"]
[9.1011, "o", "\u001b[1m> \u001b[0m"]
[9.6015, "o", "n"]
[9.6325, "o", "o"]
[9.6578, "o", "t"]
[9.6996, "o", "h"]
[9.7222, "o", "i"]
[9.7604, "o", "n"]
[9.7926, "o", "g"]
[10.0664, "o", "\r\n"]
[10.0669, "o", "\r\n"]
[10.0673, "o", "\u001b[1;36mQ4/5\u001b[0m \u001b[2m(risk)\u001b[0m Which new parameter controls the obstacle stop, and what happens if it is set to 0?\r\n\u001b[1m> \u001b[0m"]
[10.5678, "o", "t"]
[10.6035, "o", "h"]
[10.6362, "o", "e"]
[10.6611, "o", " "]
[10.7395, "o", "l"]
[10.7599, "o", "i"]
[10.7971, "o", "d"]
[10.8471, "o", "a"]
[10.8701, "o", "r"]
[11.1591, "o", "\r\n"]
[11.1596, "o", "\r\n"]
[11.1601, "o", "\u001b[1;36mQ5/5\u001b[0m \u001b[2m(testing)\u001b[0m How would you test the watchdog without a real lidar?\r\n"]
[11.1604, "o", "\u001b[1m> \u001b[0m"]
[11.6608, "o", "d"]
[11.7133, "o", "r"]
[11.7339, "o", "i"]
[11.7786, "o", "v"]
[11.8042, "o", "e"]
[11.8572, "o", " "]
[11.8903, "o", "i"]
[11.9399, "o", "t"]
[11.9828, "o", " "]
[12.0607, "o", "a"]
[12.1142, "o", "r"]
[12.1425, "o", "o"]
[12.1738, "o", "u"]
[12.2176, "o", "n"]
[12.2472, "o", "d"]
[12.5264, "o", "\r\n"]
[12.527, "o", "\r\n"]
[12.5272, "o", "\u001b[?25l"]
[12.6087, "o", "\u001b[32m⠋\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[12.69, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[12.771, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[12.8518, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[12.9329, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.0139, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.0949, "o", "\r\u001b[2K\u001b[32m⠦\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.1757, "o", "\r\u001b[2K\u001b[32m⠧\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.2565, "o", "\r\u001b[2K\u001b[32m⠇\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.3373, "o", "\r\u001b[2K\u001b[32m⠏\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.4182, "o", "\r\u001b[2K\u001b[32m⠋\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.4989, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.5797, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.6605, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.7415, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.8223, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[13.8285, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"]
[13.8322, "o", "╭──┬────────────┬───────┬──────────────────────────────────────────────────────────────────────╮\r\n│\u001b[1m#\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mFocus     \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mScore\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mFeedback                                                             \u001b[0m│\r\n├──┼────────────┼───────┼──────────────────────────────────────────────────────────────────────┤\r\n│1 │ behaviour  │  \u001b[1;31m8/20\u001b[0m │ Right outcome; say what it publishes: a zero Twist, not the last     │\r\n│  │            │       │ command.                                                             │\r\n│2 │ motivation │  \u001b[1;31m0/20\u001b[0m │ Missed: a callback that has stopped firing cannot notice that it     │\r\n│  │            │       │ stopped.                                                             │\r\n│3 │ edge case  │  \u001b[1;31m0/20\u001b[0m │ It matters: the age check uses header.stamp, not arrival time.       │\r\n│4 │ risk       │  \u001b[1;31m0/20\u001b[0m │ Missed: stop_distance is new and 0 turns the obstacle stop off.      │\r\n│5 │ testing    │  \u001b[1;31m4/20\u001b[0m │ Driving it by hand is not a repeatable check; publish synthetic scans│\r\n│  │            │       │ in a test.                                                           │\r\n╰──┴────────────┴───────┴──────────────────────────────────────────────────────────────────────╯\r\n"]
[13.8327, "o", "╭──────────────────────────────────────────────────────────────────────────────────────────────╮\r\n│ \u001b[1;31mGrip Score: 12/100\u001b[0m  \u001b[1;31mFAIL\u001b[0m \u001b[2m(pass mark 70)\u001b[0m                                                      │\r\n│                                                                                              │\r\n│ You could not explain what this node does when its inputs go quiet. Read the diff again      │\r\n│ before sending it upstream.                                                                  │\r\n╰──────────────────────────────────────────────────────────────────────────────────────────────╯\r\n"]
[13.8337, "o", "\u001b[1;31mgrip:\u001b[0m Grip Score 12/100 is below the pass mark of 70. Re-read your change and try again. Report:\r\n.git/grip/last-report.json\r\n"]
[13.87, "o", "\u001b[?2004h❯ "]
[17.0706, "o", "g"]
[17.1176, "o", "i"]
[17.1693, "o", "t"]
[17.1973, "o", " "]
[17.289, "o", "d"]
[17.3177, "o", "i"]
[17.3631, "o", "f"]
[17.3881, "o", "f"]
[17.4368, "o", " "]
[17.4802, "o", "-"]
[17.5269, "o", "-"]
[17.5745, "o", "c"]
[17.6235, "o", "a"]
[17.6609, "o", "c"]
[17.7135, "o", "h"]
[17.7703, "o", "e"]
[17.7962, "o", "d"]
[17.8364, "o", " "]
[17.9257, "o", "-"]
[17.9737, "o", "-"]
[18.0111, "o", "s"]
[18.0436, "o", "t"]
[18.0994, "o", "a"]
[18.1241, "o", "t"]
[18.4231, "o", "\r\n\u001b[?2004l\r"]
[18.4269, "o", "\u001b[?1h\u001b=\r amr_safety/cmd_vel_filter.py | 19 \u001b[32m++++++++++++++++\u001b[m\u001b[31m---\u001b[m\u001b[m\r\n 1 file changed, 16 insertions(+), 3 deletions(-)\u001b[m\r\n"]
[18.4269, "o", "\r\u001b[K\u001b[?1l\u001b>"]
[18.4275, "o", "\u001b[?2004h❯ "]
[19.4283, "o", "g"]
[19.472, "o", "i"]
[19.5253, "o", "t"]
[19.5632, "o", " "]
[19.6384, "o", "c"]
[19.6934, "o", "o"]
[19.7336, "o", "m"]
[19.7814, "o", "m"]
[19.8291, "o", "i"]
[19.8814, "o", "t"]
[19.9043, "o", " "]
[19.9485, "o", "-"]
[20.0056, "o", "m"]
[20.0541, "o", " "]
[20.1034, "o", "\""]
[20.1515, "o", "s"]
[20.1793, "o", "a"]
[20.2137, "o", "f"]
[20.2511, "o", "e"]
[20.2808, "o", "t"]
[20.3074, "o", "y"]
[20.3471, "o", ":"]
[20.4186, "o", " "]
[20.4712, "o", "s"]
[20.5165, "o", "t"]
[20.5733, "o", "o"]
[20.5967, "o", "p"]
[20.6283, "o", " "]
[20.6682, "o", "w"]
[20.7141, "o", "h"]
[20.7508, "o", "e"]
[20.7879, "o", "n"]
[20.8184, "o", " "]
[20.8974, "o", "t"]
[20.9463, "o", "h"]
[20.984, "o", "e"]
[21.035, "o", " "]
[21.0827, "o", "s"]
[21.1166, "o", "c"]
[21.1726, "o", "a"]
[21.2025, "o", "n"]
[21.2293, "o", " "]
[21.2683, "o", "g"]
[21.3115, "o", "o"]
[21.3624, "o", "e"]
[21.386, "o", "s"]
[21.4247, "o", " "]
[21.482, "o", "s"]
[21.5153, "o", "t"]
[21.5453, "o", "a"]
[21.5807, "o", "l"]
[21.6073, "o", "e"]
[21.6617, "o", "\""]
[21.9406, "o", "\r\n\u001b[?2004l\r"]
[22.1173, "o", "\r\n"]
[22.1179, "o", "╭───────────────────────────────── grip ─────────────────────────────────╮\r\n│ \u001b[1m5 questions\u001b[0m about your \u001b[1mstaged changes\u001b[0m (pre-commit). Pass mark: \u001b[1m70/100\u001b[0m. │\r\n│                                                                        │\r\n│ amr_safety/cmd_vel_filter.py                                           │\r\n╰─────────────────────── keep a grip on your code ───────────────────────╯\r\n"]
[22.1197, "o", "\u001b[?25l"]
[22.2018, "o", "\u001b[32m⠋\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.2826, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.3634, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.4442, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.5255, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.6063, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.6872, "o", "\r\u001b[2K\u001b[32m⠦\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.7682, "o", "\r\u001b[2K\u001b[32m⠧\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.8491, "o", "\r\u001b[2K\u001b[32m⠇\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[22.9299, "o", "\r\u001b[2K\u001b[32m⠏\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.0107, "o", "\r\u001b[2K\u001b[32m⠋\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.0915, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.1723, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.2533, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.334, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.4149, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m"]
[23.4212, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is reading your diff…\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"]
[23.4215, "o", "\r\n\u001b[2mThe cmd_vel safety filter gains a scan watchdog: with no LaserScan for scan_timeout it publishes\u001b[0m\r\n\u001b[2ma zero Twist instead of forwarding commands on stale data, and the hard-coded stop distance \u001b[0m\r\n\u001b[2mbecomes the stop_distance parameter.\u001b[0m\r\n\r\n"]
[23.4217, "o", "\u001b[2mAnswer in a sentence or two. Press Enter on an empty line to skip.\u001b[0m\r\n\r\n"]
[23.422, "o", "\u001b[1;36mQ1/5\u001b[0m \u001b[2m(behaviour)\u001b[0m What does the node publish on /cmd_vel once no /scan message has arrived for \r\nlonger than scan_timeout?\r\n"]
[23.4221, "o", "\u001b[1m> \u001b[0m"]
[24.0227, "o", "A"]
[24.0575, "o", " "]
[24.0952, "o", "z"]
[24.1415, "o", "e"]
[24.1865, "o", "r"]
[24.2181, "o", "o"]
[24.2556, "o", " "]
[24.2941, "o", "T"]
[24.3185, "o", "w"]
[24.3447, "o", "i"]
[24.3832, "o", "s"]
[24.4071, "o", "t"]
[24.4541, "o", ":"]
[24.4854, "o", " "]
[24.5229, "o", "w"]
[24.5434, "o", "i"]
[24.5839, "o", "t"]
[24.6125, "o", "h"]
[24.6442, "o", " "]
[24.688, "o", "n"]
[24.7246, "o", "o"]
[24.7544, "o", " "]
[24.7925, "o", "s"]
[24.8231, "o", "c"]
[24.8499, "o", "a"]
[24.8711, "o", "n"]
[24.9129, "o", " "]
[24.9736, "o", "f"]
[25.0109, "o", "o"]
[25.0548, "o", "r"]
[25.0842, "o", " "]
[25.1304, "o", "s"]
[25.1609, "o", "c"]
[25.1905, "o", "a"]
[25.2282, "o", "n"]
[25.2461, "o", "_"]
[25.2776, "o", "t"]
[25.3111, "o", "i"]
[25.3391, "o", "m"]
[25.3577, "o", "e"]
[25.3962, "o", "o"]
[25.4144, "o", "u"]
[25.449, "o", "t"]
[25.4711, "o", " "]
[25.5012, "o", "t"]
[25.5245, "o", "h"]
[25.5442, "o", "e"]
[25.5665, "o", " "]
[25.6272, "o", "w"]
[25.6665, "o", "a"]
[25.6951, "o", "t"]
[25.7321, "o", "c"]
[25.7638, "o", "h"]
[25.7965, "o", "d"]
[25.8401, "o", "o"]
[25.867, "o", "g"]
[25.9104, "o", " "]
[25.9716, "o", "s"]
[26.0094, "o", "t"]
[26.0275, "o", "o"]
[26.0478, "o", "p"]
[26.0666, "o", "s"]
[26.0945, "o", " "]
[26.1676, "o", "t"]
[26.2111, "o", "h"]
[26.2536, "o", "e"]
[26.275, "o", " "]
[26.3365, "o", "r"]
[26.3772, "o", "o"]
[26.4188, "o", "b"]
[26.4602, "o", "o"]
[26.4821, "o", "t"]
[26.5052, "o", " "]
[26.5709, "o", "i"]
[26.6105, "o", "n"]
[26.6546, "o", "s"]
[26.6855, "o", "t"]
[26.7296, "o", "e"]
[26.7515, "o", "a"]
[26.7975, "o", "d"]
[26.8414, "o", " "]
[26.8857, "o", "o"]
[26.9055, "o", "f"]
[26.9396, "o", " "]
[27.0005, "o", "t"]
[27.0287, "o", "r"]
[27.0482, "o", "u"]
[27.0742, "o", "s"]
[27.1165, "o", "t"]
[27.1369, "o", "i"]
[27.1825, "o", "n"]
[27.2078, "o", "g"]
[27.2317, "o", " "]
[27.2653, "o", "o"]
[27.3121, "o", "l"]
[27.3564, "o", "d"]
[27.3837, "o", " "]
[27.4166, "o", "d"]
[27.4537, "o", "a"]
[27.4977, "o", "t"]
[27.5159, "o", "a"]
[27.8027, "o", "\r\n"]
[27.8031, "o", "\r\n"]
[27.8034, "o", "\u001b[1;36mQ2/5\u001b[0m \u001b[2m(motivation)\u001b[0m Why is the staleness check done in the cmd_vel callback rather than in the \r\nscan callback?\r\n"]
[27.8036, "o", "\u001b[1m> \u001b[0m"]
[28.4041, "o", "B"]
[28.4325, "o", "e"]
[28.4747, "o", "c"]
[28.503, "o", "a"]
[28.5227, "o", "u"]
[28.5544, "o", "s"]
[28.5937, "o", "e"]
[28.6316, "o", " "]
[28.6631, "o", "_"]
[28.6956, "o", "o"]
[28.7192, "o", "n"]
[28.7381, "o", "_"]
[28.7848, "o", "s"]
[28.8235, "o", "c"]
[28.8521, "o", "a"]
[28.8928, "o", "n"]
[28.934, "o", " "]
[28.9628, "o", "n"]
[28.992, "o", "e"]
[29.0188, "o", "v"]
[29.0382, "o", "e"]
[29.078, "o", "r"]
[29.1214, "o", " "]
[29.1728, "o", "r"]
[29.2152, "o", "u"]
[29.2488, "o", "n"]
[29.2785, "o", "s"]
[29.3131, "o", " "]
[29.3799, "o", "o"]
[29.4056, "o", "n"]
[29.4386, "o", "c"]
[29.4602, "o", "e"]
[29.4941, "o", " "]
[29.5551, "o", "s"]
[29.585, "o", "c"]
[29.6059, "o", "a"]
[29.6499, "o", "n"]
[29.6903, "o", "s"]
[29.7325, "o", " "]
[29.7683, "o", "s"]
[29.8156, "o", "t"]
[29.848, "o", "o"]
[29.8711, "o", "p"]
[29.8978, "o", ";"]
[29.9298, "o", " "]
[29.9964, "o", "t"]
[30.0422, "o", "h"]
[30.0868, "o", "e"]
[30.1257, "o", " "]
[30.179, "o", "c"]
[30.208, "o", "h"]
[30.2453, "o", "e"]
[30.2636, "o", "c"]
[30.2834, "o", "k"]
[30.317, "o", " "]
[30.3608, "o", "h"]
[30.4078, "o", "a"]
[30.4459, "o", "s"]
[30.4651, "o", " "]
[30.5222, "o", "t"]
[30.5411, "o", "o"]
[30.5871, "o", " "]
[30.6484, "o", "l"]
[30.6892, "o", "i"]
[30.7176, "o", "v"]
[30.7364, "o", "e"]
[30.7761, "o", " "]
[30.8367, "o", "o"]
[30.8644, "o", "n"]
[30.8883, "o", " "]
[30.9571, "o", "t"]
[30.9847, "o", "h"]
[31.0229, "o", "e"]
[31.0669, "o", " "]
[31.1267, "o", "p"]
[31.1484, "o", "a"]
[31.1912, "o", "t"]
[31.2378, "o", "h"]
[31.281, "o", " "]
[31.3415, "o", "t"]
[31.3622, "o", "h"]
[31.3826, "o", "a"]
[31.4232, "o", "t"]
[31.4445, "o", " "]
[31.5142, "o", "s"]
[31.5384, "o", "t"]
[31.5698, "o", "i"]
[31.5938, "o", "l"]
[31.6315, "o", "l"]
[31.6689, "o", " "]
[31.7109, "o", "e"]
[31.7431, "o", "x"]
[31.7751, "o", "e"]
[31.8122, "o", "c"]
[31.8568, "o", "u"]
[31.8871, "o", "t"]
[31.9056, "o", "e"]
[31.9505, "o", "s"]
[32.2398, "o", "\r\n"]
[32.2403, "o", "\r\n"]
[32.2406, "o", "\u001b[1;36mQ3/5\u001b[0m \u001b[2m(edge case)\u001b[0m The lidar is healthy but its clock runs a few seconds behind the robot's. What \r\ndoes the robot do?\r\n"]
[32.2408, "o", "\u001b[1m> \u001b[0m"]
[32.8414, "o", "I"]
[32.8652, "o", "t"]
[32.8859, "o", " "]
[32.9454, "o", "w"]
[32.9806, "o", "o"]
[33.0171, "o", "n"]
[33.0454, "o", "'"]
[33.0765, "o", "t"]
[33.1205, "o", " "]
[33.1875, "o", "m"]
[33.2131, "o", "o"]
[33.239, "o", "v"]
[33.2591, "o", "e"]
[33.2985, "o", " "]
[33.3325, "o", "e"]
[33.3703, "o", "v"]
[33.4161, "o", "e"]
[33.4591, "o", "n"]
[33.4878, "o", " "]
[33.5544, "o", "t"]
[33.5761, "o", "h"]
[33.6165, "o", "o"]
[33.6397, "o", "u"]
[33.6776, "o", "g"]
[33.6961, "o", "h"]
[33.7288, "o", " "]
[33.8008, "o", "t"]
[33.8251, "o", "h"]
[33.8459, "o", "e"]
[33.8763, "o", " "]
[33.9052, "o", "l"]
[33.9255, "o", "i"]
[33.9625, "o", "d"]
[34.0094, "o", "a"]
[34.0558, "o", "r"]
[34.0976, "o", " "]
[34.1466, "o", "i"]
[34.1875, "o", "s"]
[34.2272, "o", " "]
[34.2917, "o", "h"]
[34.3236, "o", "e"]
[34.3637, "o", "a"]
[34.3916, "o", "l"]
[34.4175, "o", "t"]
[34.4406, "o", "h"]
[34.4693, "o", "y"]
[34.5001, "o", ":"]
[34.5436, "o", " "]
[34.6133, "o", "a"]
[34.6468, "o", "g"]
[34.6771, "o", "e"]
[34.7233, "o", " "]
[34.7934, "o", "i"]
[34.813, "o", "s"]
[34.8409, "o", " "]
[34.9018, "o", "h"]
[34.9322, "o", "e"]
[34.9783, "o", "a"]
[35.0175, "o", "d"]
[35.063, "o", "e"]
[35.1007, "o", "r"]
[35.1243, "o", "."]
[35.1554, "o", "s"]
[35.1851, "o", "t"]
[35.2078, "o", "a"]
[35.2421, "o", "m"]
[35.2825, "o", "p"]
[35.3169, "o", " "]
[35.3785, "o", "a"]
[35.4, "o", "g"]
[35.4471, "o", "a"]
[35.4942, "o", "i"]
[35.5212, "o", "n"]
[35.5588, "o", "s"]
[35.5968, "o", "t"]
[35.6333, "o", " "]
[35.6755, "o", "t"]
[35.7045, "o", "h"]
[35.733, "o", "e"]
[35.7596, "o", " "]
[35.8291, "o", "n"]
[35.8673, "o", "o"]
[35.9038, "o", "d"]
[35.9218, "o", "e"]
[35.9432, "o", " "]
[35.9947, "o", "c"]
[36.0343, "o", "l"]
[36.0638, "o", "o"]
[36.1048, "o", "c"]
[36.1273, "o", "k"]
[36.4167, "o", "\r\n"]
[36.4173, "o", "\r\n"]
[36.4178, "o", "\u001b[1;36mQ4/5\u001b[0m \u001b[2m(risk)\u001b[0m Which new parameter controls the obstacle stop, and what happens if it is set to 0?\r\n"]
[36.418, "o", "\u001b[1m> \u001b[0m"]
[37.0184, "o", "s"]
[37.0534, "o", "t"]
[37.0771, "o", "o"]
[37.1249, "o", "p"]
[37.1699, "o", "_"]
[37.2014, "o", "d"]
[37.2388, "o", "i"]
[37.2629, "o", "s"]
[37.2873, "o", "t"]
[37.3138, "o", "a"]
[37.3519, "o", "n"]
[37.3762, "o", "c"]
[37.4225, "o", "e"]
[37.4425, "o", ";"]
[37.4802, "o", " "]
[37.5127, "o", "a"]
[37.5533, "o", "t"]
[37.5819, "o", " "]
[37.6326, "o", "0"]
[37.6601, "o", " "]
[37.7184, "o", "t"]
[37.7483, "o", "h"]
[37.7722, "o", "e"]
[37.8029, "o", " "]
[37.8459, "o", "m"]
[37.867, "o", "i"]
[37.909, "o", "n"]
[37.9469, "o", "_"]
[37.9844, "o", "r"]
[38.0281, "o", "a"]
[38.0576, "o", "n"]
[38.0867, "o", "g"]
[38.1169, "o", "e"]
[38.1467, "o", " "]
[38.2066, "o", "<"]
[38.2246, "o", " "]
[38.275, "o", "s"]
[38.3086, "o", "t"]
[38.3365, "o", "o"]
[38.3552, "o", "p"]
[38.3938, "o", "_"]
[38.4118, "o", "d"]
[38.4465, "o", "i"]
[38.4687, "o", "s"]
[38.4877, "o", "t"]
[38.511, "o", "a"]
[38.5307, "o", "n"]
[38.5531, "o", "c"]
[38.5911, "o", "e"]
[38.6303, "o", " "]
[38.6759, "o", "t"]
[38.7131, "o", "e"]
[38.7449, "o", "s"]
[38.7774, "o", "t"]
[38.8212, "o", " "]
[38.8643, "o", "c"]
[38.9078, "o", "a"]
[38.9461, "o", "n"]
[38.9841, "o", " "]
[39.0128, "o", "n"]
[39.0332, "o", "e"]
[39.0521, "o", "v"]
[39.0801, "o", "e"]
[39.1259, "o", "r"]
[39.1696, "o", " "]
[39.2375, "o", "b"]
[39.2588, "o", "e"]
[39.2975, "o", " "]
[39.3625, "o", "t"]
[39.4042, "o", "r"]
[39.4453, "o", "u"]
[39.4674, "o", "e"]
[39.4905, "o", ","]
[39.5563, "o", " "]
[39.6195, "o", "s"]
[39.6637, "o", "o"]
[39.6946, "o", " "]
[39.7649, "o", "t"]
[39.7869, "o", "h"]
[39.833, "o", "e"]
[39.877, "o", " "]
[39.9214, "o", "o"]
[39.9412, "o", "b"]
[39.9753, "o", "s"]
[40.0135, "o", "t"]
[40.0416, "o", "a"]
[40.0611, "o", "c"]
[40.0872, "o", "l"]
[40.1294, "o", "e"]
[40.1499, "o", " "]
[40.2225, "o", "s"]
[40.2477, "o", "t"]
[40.2715, "o", "o"]
[40.2928, "o", "p"]
[40.3395, "o", " "]
[40.4104, "o", "i"]
[40.4379, "o", "s"]
[40.4584, "o", " "]
[40.5177, "o", "o"]
[40.5618, "o", "f"]
[40.5799, "o", "f"]
[40.8666, "o", "\r\n"]
[40.8672, "o", "\r\n"]
[40.8675, "o", "\u001b[1;36mQ5/5\u001b[0m \u001b[2m(testing)\u001b[0m How would you test the watchdog without a real lidar?\r\n"]
[40.8678, "o", "\u001b[1m> \u001b[0m"]
[41.4684, "o", "P"]
[41.4986, "o", "u"]
[41.5331, "o", "b"]
[41.5674, "o", "l"]
[41.6024, "o", "i"]
[41.6439, "o", "s"]
[41.6903, "o", "h"]
[41.7278, "o", " "]
[41.7944, "o", "s"]
[41.8291, "o", "y"]
[41.8609, "o", "n"]
[41.9035, "o", "t"]
[41.9507, "o", "h"]
[41.9855, "o", "e"]
[42.0218, "o", "t"]
[42.0416, "o", "i"]
[42.0849, "o", "c"]
[42.1214, "o", " "]
[42.1799, "o", "L"]
[42.2026, "o", "a"]
[42.2376, "o", "s"]
[42.2733, "o", "e"]
[42.2959, "o", "r"]
[42.3257, "o", "S"]
[42.3654, "o", "c"]
[42.4062, "o", "a"]
[42.4451, "o", "n"]
[42.4827, "o", "s"]
[42.5287, "o", " "]
[42.5944, "o", "f"]
[42.6142, "o", "r"]
[42.6428, "o", "o"]
[42.6618, "o", "m"]
[42.7064, "o", " "]
[42.7672, "o", "a"]
[42.7915, "o", " "]
[42.8284, "o", "t"]
[42.8531, "o", "e"]
[42.8888, "o", "s"]
[42.9207, "o", "t"]
[42.9388, "o", " "]
[42.998, "o", "n"]
[43.0243, "o", "o"]
[43.0507, "o", "d"]
[43.0979, "o", "e"]
[43.1456, "o", ","]
[43.2147, "o", " "]
[43.2851, "o", "s"]
[43.3196, "o", "t"]
[43.339, "o", "o"]
[43.368, "o", "p"]
[43.4038, "o", ","]
[43.4761, "o", " "]
[43.5198, "o", "s"]
[43.5399, "o", "e"]
[43.5857, "o", "n"]
[43.6246, "o", "d"]
[43.6671, "o", " "]
[43.7186, "o", "a"]
[43.7457, "o", " "]
[43.7887, "o", "c"]
[43.8107, "o", "o"]
[43.8393, "o", "m"]
[43.8738, "o", "m"]
[43.9201, "o", "a"]
[43.9662, "o", "n"]
[43.9984, "o", "d"]
[44.0225, "o", ","]
[44.0963, "o", " "]
[44.1251, "o", "a"]
[44.1451, "o", "s"]
[44.1829, "o", "s"]
[44.2184, "o", "e"]
[44.2652, "o", "r"]
[44.3031, "o", "t"]
[44.3447, "o", " "]
[44.4147, "o", "/"]
[44.4607, "o", "c"]
[44.5046, "o", "m"]
[44.5375, "o", "d"]
[44.574, "o", "_"]
[44.6145, "o", "v"]
[44.633, "o", "e"]
[44.6664, "o", "l"]
[44.6964, "o", " "]
[44.7617, "o", "i"]
[44.7854, "o", "s"]
[44.8278, "o", " "]
[44.8668, "o", "z"]
[44.8983, "o", "e"]
[44.9321, "o", "r"]
[44.9592, "o", "o"]
[45.2488, "o", "\r\n"]
[45.2492, "o", "\r\n"]
[45.2494, "o", "\u001b[?25l"]
[45.3309, "o", "\u001b[32m⠋\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.4117, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.4926, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.5736, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.6557, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.7368, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.8176, "o", "\r\u001b[2K\u001b[32m⠦\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.8984, "o", "\r\u001b[2K\u001b[32m⠧\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[45.9791, "o", "\r\u001b[2K\u001b[32m⠇\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.0601, "o", "\r\u001b[2K\u001b[32m⠏\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.1411, "o", "\r\u001b[2K\u001b[32m⠋\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.2222, "o", "\r\u001b[2K\u001b[32m⠙\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.3029, "o", "\r\u001b[2K\u001b[32m⠹\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.3837, "o", "\r\u001b[2K\u001b[32m⠸\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.4649, "o", "\r\u001b[2K\u001b[32m⠼\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.5456, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m"]
[46.551, "o", "\r\u001b[2K\u001b[32m⠴\u001b[0m \u001b[2mgrip is grading…\u001b[0m\r\n\u001b[?25h\r\u001b[1A\u001b[2K"]
[46.555, "o", "╭──┬────────────┬───────┬──────────────────────────────────────────────────────────────────────╮\r\n│\u001b[1m#\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mFocus     \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mScore\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mFeedback                                                             \u001b[0m│\r\n├──┼────────────┼───────┼──────────────────────────────────────────────────────────────────────┤\r\n│1 │ behaviour  │ \u001b[1;32m20/20\u001b[0m │ Correct: the watchdog publishes an empty Twist, a full stop, not the │\r\n│  │            │       │ incoming command.                                                    │\r\n│2 │ motivation │ \u001b[1;32m20/20\u001b[0m │ Yes: once scans stop, _on_scan never runs, so the check has to live  │\r\n│  │            │       │ on the path that still executes.                                     │\r\n│3 │ edge case  │ \u001b[1;33m12/20\u001b[0m │ Right, and the consequence: every scan looks older than scan_timeout,│\r\n│  │            │       │ so the watchdog fires on every single command.                       │\r\n│4 │ risk       │ \u001b[1;32m20/20\u001b[0m │ Correct: stop_distance, and at 0 the comparison can never be true, so│\r\n│  │            │       │ the obstacle stop is off.                                            │\r\n│5 │ testing    │ \u001b[1;32m20/20\u001b[0m │ Good: publish fake scans, stop, send a command, assert a zero Twist  │\r\n│  │            │       │ on /cmd_vel.                                                         │\r\n╰──┴────────────┴───────┴──────────────────────────────────────────────────────────────────────╯\r\n"]
[46.5554, "o", "╭────────────────────────────────────────────────────────────────────────────────────╮\r\n│ \u001b[1;32mGrip Score: 92/100\u001b[0m  \u001b[1;32mPASS\u001b[0m \u001b[2m(pass mark 70)\u001b[0m                                            │\r\n│                                                                                    │\r\n│ Solid grasp of the watchdog, its clock assumptions and the new parameter. Ship it. │\r\n╰────────────────────────────────────────────────────────────────────────────────────╯\r\n"]
[46.6011, "o", "[main 5948ae3] safety: stop when the scan goes stale\r\n"]
[46.6013, "o", " 1 file changed, 16 insertions(+), 3 deletions(-)\r\n"]
[46.6016, "o", "\u001b[?2004h"]
[46.6017, "o", "❯ "]
[49.2025, "o", "g"]
[49.2564, "o", "i"]
[49.3026, "o", "t"]
[49.3517, "o", " "]
[49.4378, "o", "l"]
[49.4688, "o", "o"]
[49.513, "o", "g"]
[49.5671, "o", " "]
[49.6514, "o", "-"]
[49.6936, "o", "-"]
[49.7213, "o", "o"]
[49.7609, "o", "n"]
[49.8184, "o", "e"]
[49.8435, "o", "l"]
[49.8765, "o", "i"]
[49.9321, "o", "n"]
[49.9699, "o", "e"]
[49.9991, "o", " "]
[50.0516, "o", "-"]
[50.1055, "o", "2"]
[50.3895, "o", "\r\n\u001b[?2004l\r"]
[50.394, "o", "\u001b[?1h\u001b=\r\u001b[33m5948ae3\u001b[m\u001b[33m (\u001b[m\u001b[1;36mHEAD\u001b[m\u001b[33m -> \u001b[m\u001b[1;32mmain\u001b[m\u001b[33m)\u001b[m safety: stop when the scan goes stale\u001b[m\r\n\u001b[33me6d5f23\u001b[m safety: lidar stop in the cmd_vel filter\u001b[m\r\n"]
[50.3944, "o", "\r\u001b[K\u001b[?1l\u001b>"]
[50.395, "o", "\u001b[?2004h❯ "]
[53.396, "o", "exit\r\n\u001b[?2004l\r"]
[53.396, "o", "exit\r\n"]
