diff --git a/data_quality_review/mecka_folding_clothes_decisions.jsonl b/data_quality_review/mecka_folding_clothes_decisions.jsonl new file mode 100644 index 000000000..dc0cd8e94 --- /dev/null +++ b/data_quality_review/mecka_folding_clothes_decisions.jsonl @@ -0,0 +1,477 @@ +{"episode_hash": "696a1b1176b41c2326097747", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 1, "ts": 1780961896.200414} +{"episode_hash": "696ba3b9a491d5abbd79528b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 2, "ts": 1780961901.368631} +{"episode_hash": "696ba3f375020a567fd375b4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 3, "ts": 1780961929.0674722} +{"episode_hash": "696bc11770d628f8b0742337", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 4, "ts": 1780961973.330734} +{"episode_hash": "696bc17eed8ed158122ec6a3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 5, "ts": 1780961985.8473377} +{"episode_hash": "696bc7e021d8e8ab8ddc8380", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 6, "ts": 1780962086.0963867} +{"episode_hash": "696bcbe0e13d37dd4293f58b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 7, "ts": 1780962105.6562426} +{"episode_hash": "696bcbe86377d0871b6a9253", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 8, "ts": 1780962119.9568946} +{"episode_hash": "696bcc71ed8ed158122ec794", "decision": "uncertain", "task": "folding_clothes", "lab": "mecka", "index": 9, "ts": 1780962479.0561984} +{"episode_hash": "696bcd7c1376c8db5e3154a4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 10, "ts": 1780962499.856334} +{"episode_hash": "696bce8dcd29fb97fb107f44", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 11, "ts": 1780962515.5571225} +{"episode_hash": "696bcebfd3cc9dc76c561899", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 12, "ts": 1780962533.8222518} +{"episode_hash": "696bd14770d628f8b074249e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 13, "ts": 1780962552.572421} +{"episode_hash": "696bd1efd99e01dc631f3f13", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 14, "ts": 1780962577.0561032} +{"episode_hash": "696bd310a907c8962e22a9fa", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 15, "ts": 1780962585.856814} +{"episode_hash": "696bd324d1a6773989721fd3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 16, "ts": 1780962597.5570347} +{"episode_hash": "696bd3fac426c607c88b2fa0", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 17, "ts": 1780962607.6571233} +{"episode_hash": "696bd77693818b7b258ec43b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 18, "ts": 1780962619.3923826} +{"episode_hash": "696bd78eb0b2b22cc0d1f867", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 19, "ts": 1780962631.456344} +{"episode_hash": "696bd7fc8688d0ceb96d3e76", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 20, "ts": 1780962663.557912} +{"episode_hash": "696bdafd476e9a6e777fffde", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 21, "ts": 1780962688.2950456} +{"episode_hash": "692de240996d7b24ba715c0f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 0, "ts": 1781191889.210425} +{"episode_hash": "696a1b1176b41c2326097747", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 1, "ts": 1781191913.408992} +{"episode_hash": "696ba3b9a491d5abbd79528b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 2, "ts": 1781191916.9420416} +{"episode_hash": "696ba3f375020a567fd375b4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 3, "ts": 1781191919.4106882} +{"episode_hash": "696bc11770d628f8b0742337", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 4, "ts": 1781191926.894345} +{"episode_hash": "696bc17eed8ed158122ec6a3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 5, "ts": 1781191928.522426} +{"episode_hash": "696bc7e021d8e8ab8ddc8380", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 6, "ts": 1781191932.019225} +{"episode_hash": "696bcbe0e13d37dd4293f58b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 7, "ts": 1781191945.3096454} +{"episode_hash": "696bcbe86377d0871b6a9253", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 8, "ts": 1781191948.1995435} +{"episode_hash": "696bcc71ed8ed158122ec794", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 9, "ts": 1781191956.2746043} +{"episode_hash": "696bcd7c1376c8db5e3154a4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 10, "ts": 1781191962.824445} +{"episode_hash": "696bdc47cfb39c7ef2d48e64", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 22, "ts": 1781193931.2988217} +{"episode_hash": "696bdde3246cb36ca375820a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 23, "ts": 1781193936.539031} +{"episode_hash": "696d0d524b2b73eea2f1cc51", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 24, "ts": 1781193958.871052} +{"episode_hash": "696d0f02c7470f85da9346db", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 25, "ts": 1781193964.2038827} +{"episode_hash": "696d0f031244464a4aac1b8f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 26, "ts": 1781193968.575254} +{"episode_hash": "696d0fdafad368fca385f5a5", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 27, "ts": 1781193977.942537} +{"episode_hash": "696d0fe4a199224e8d66242c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 28, "ts": 1781193986.7647023} +{"episode_hash": "696d119e1fe17643f95f9fb9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 29, "ts": 1781193997.8531349} +{"episode_hash": "696d119fc0c2d9149de65a2f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 30, "ts": 1781193999.8418653} +{"episode_hash": "696d2fb388af7cc080636a98", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 31, "ts": 1781194004.7952423} +{"episode_hash": "696d30391b5841990138a18b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 32, "ts": 1781194009.923526} +{"episode_hash": "696d3055d878202cf6c99df7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 33, "ts": 1781194013.6586463} +{"episode_hash": "696d327667df29fbace8f267", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 34, "ts": 1781194022.4473052} +{"episode_hash": "696d8e837d42972c2ce7decf", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 35, "ts": 1781194031.299746} +{"episode_hash": "696d8eb6bcbf0c32b4b22a20", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 36, "ts": 1781194033.6432686} +{"episode_hash": "696d92ebdd1a587f40c9b67f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 37, "ts": 1781194038.3528547} +{"episode_hash": "696d953676ff4b529c5066c2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 38, "ts": 1781194041.065856} +{"episode_hash": "696da1be2ddbc19f3c9b0899", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 39, "ts": 1781194042.9420877} +{"episode_hash": "696da40edc787523fe33b60b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 40, "ts": 1781194045.469252} +{"episode_hash": "696dcd6ccdaff5670111ce7c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 41, "ts": 1781194063.4088817} +{"episode_hash": "696dcd733eec4106b2aa4cbc", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 42, "ts": 1781194067.9637637} +{"episode_hash": "696dce7f80f51286a174d3bf", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 43, "ts": 1781194076.0716984} +{"episode_hash": "696dce84f6b4ab314ae7a214", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 44, "ts": 1781194087.8888843} +{"episode_hash": "696dd090a56f03a27e59f69c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 45, "ts": 1781194099.6408167} +{"episode_hash": "696e3f575495dfdd91c9205e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 46, "ts": 1781194112.5131865} +{"episode_hash": "696e5d79fdf195647b323774", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 47, "ts": 1781194122.5481994} +{"episode_hash": "696e632d52cb044323851277", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 48, "ts": 1781194129.2641177} +{"episode_hash": "696e634bd4beb7b75cdb20d9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 49, "ts": 1781194142.431399} +{"episode_hash": "696e6362620da3c71e5ed248", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 50, "ts": 1781194149.8367205} +{"episode_hash": "696e757efea209e4672a3608", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 51, "ts": 1781194159.4249225} +{"episode_hash": "696e757ff885878a682d978e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 52, "ts": 1781194168.6233308} +{"episode_hash": "696e83e14b013c8444629071", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 53, "ts": 1781194177.2220027} +{"episode_hash": "696e84048a176d6397a7a11e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 54, "ts": 1781194188.0998328} +{"episode_hash": "696e8408a116db4479a45e96", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 55, "ts": 1781194193.1376936} +{"episode_hash": "696e840b6edf6acdd058bc2d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 56, "ts": 1781194198.9170976} +{"episode_hash": "696ea6d3658193f417ff82a2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 57, "ts": 1781194207.2461724} +{"episode_hash": "696ea6f7db9542d237e0aa18", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 58, "ts": 1781194215.6765177} +{"episode_hash": "696ec3b6f885878a682d9a4c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 59, "ts": 1781194219.3500009} +{"episode_hash": "696ec50636ef70301786c6a1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 60, "ts": 1781194220.687382} +{"episode_hash": "696f452d0259c3f150e4d888", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 61, "ts": 1781194229.5734425} +{"episode_hash": "696f45b790c7d8e3b26e0f7b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 62, "ts": 1781194232.5437653} +{"episode_hash": "696f53ee6eb34b6bd365d328", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 63, "ts": 1781194234.2942898} +{"episode_hash": "6970da534114c62961c14856", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 64, "ts": 1781194237.0038362} +{"episode_hash": "6970da55dac2ab9231ccb900", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 65, "ts": 1781194307.4488537} +{"episode_hash": "6970db4286a522aaedab70c2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 66, "ts": 1781194319.8762615} +{"episode_hash": "69715881431c58381d4b7aee", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 67, "ts": 1781194327.9846818} +{"episode_hash": "6971825cf8a169e07da41094", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 68, "ts": 1781194341.644501} +{"episode_hash": "69718a3ee23b35ecc6ffedc4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 69, "ts": 1781194351.9955385} +{"episode_hash": "69718a45eea62ebfb247a4ec", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 70, "ts": 1781194368.210338} +{"episode_hash": "69718c153cee844b7d27f9ec", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 71, "ts": 1781194376.3849993} +{"episode_hash": "6971e5fa7462078c5bcefa2b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 72, "ts": 1781194393.1237075} +{"episode_hash": "697298da3825a1eb490788b0", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 73, "ts": 1781194396.8843389} +{"episode_hash": "6972b304f1a4d4b92baba501", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 74, "ts": 1781194403.5508225} +{"episode_hash": "69730ed796f1bc436f1e9074", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 75, "ts": 1781194410.789431} +{"episode_hash": "69755fb51a8d514bff4b339d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 76, "ts": 1781194419.1807342} +{"episode_hash": "69b0db4c898a4fba5d1ed5c6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 77, "ts": 1781194429.6774123} +{"episode_hash": "69b11257b2f4aca278629cfe", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 78, "ts": 1781194442.9387512} +{"episode_hash": "69b136271547571f13ebfd6b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 79, "ts": 1781194453.444196} +{"episode_hash": "69b1c422f8c426b43024003e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 80, "ts": 1781194468.971568} +{"episode_hash": "69b1c43af8447b68e7d50ba0", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 81, "ts": 1781194643.70073} +{"episode_hash": "69b1c4dc1b7bf3cf07b4c1e3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 82, "ts": 1781194652.9326642} +{"episode_hash": "69b1c4df39f899f2207b2a67", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 83, "ts": 1781194656.7419288} +{"episode_hash": "69b1c57a9e42c23908130b99", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 84, "ts": 1781194663.0798073} +{"episode_hash": "69b1c5933787b8c726e3dc0b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 85, "ts": 1781194673.018062} +{"episode_hash": "69b1c7944e28de899eb9508b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 86, "ts": 1781194689.8175294} +{"episode_hash": "69b1c7f4f1c7e435bcfb9ae1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 87, "ts": 1781194694.1928732} +{"episode_hash": "69b1c91cb67db17b317ecf33", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 88, "ts": 1781194702.2712364} +{"episode_hash": "69b1c92b08452de438541ee5", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 89, "ts": 1781194792.9491382} +{"episode_hash": "69b1c9e184028c82aba1269e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 90, "ts": 1781194801.6520915} +{"episode_hash": "69b1ca5b179c113f82bd4614", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 91, "ts": 1781194809.4592862} +{"episode_hash": "69b1caa02c214819fe493b44", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 92, "ts": 1781194811.6021578} +{"episode_hash": "69b1cbcd3fa257258bdafc7d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 93, "ts": 1781194820.7265556} +{"episode_hash": "69b1cc733ef683abf3670b90", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 94, "ts": 1781194831.5469732} +{"episode_hash": "69b1cd61850f4b031baebdfe", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 95, "ts": 1781194842.4427319} +{"episode_hash": "69b1cd670f039f41c73468f6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 96, "ts": 1781194867.1513543} +{"episode_hash": "69b1d90aeaaec6169402ae02", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 97, "ts": 1781194870.012897} +{"episode_hash": "69b1e127bbf6e05cf50b8579", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 98, "ts": 1781194877.7009127} +{"episode_hash": "69b1e2191c6c05bcabe09dcd", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 99, "ts": 1781194885.8535147} +{"episode_hash": "69b20b64b75f730c0941a071", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 100, "ts": 1781194891.4583073} +{"episode_hash": "69b21c7d2513c12b3eb487b9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 101, "ts": 1781194899.6316535} +{"episode_hash": "69b238d3f6f2b3966869f7c7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 102, "ts": 1781194902.5286667} +{"episode_hash": "69b25d429ca8561be49ab97f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 103, "ts": 1781194905.5151877} +{"episode_hash": "69b262b3f134f5466995afd4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 104, "ts": 1781194907.2594752} +{"episode_hash": "69b2679d7ed77346530588da", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 105, "ts": 1781194911.5068018} +{"episode_hash": "69b268cc83c27231f770b967", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 106, "ts": 1781194913.0951138} +{"episode_hash": "69b27259ff208cc0ebe32225", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 107, "ts": 1781194914.1017435} +{"episode_hash": "69b272c97ba3e5cddc08eff7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 108, "ts": 1781194915.0422325} +{"episode_hash": "69b31fb3122e58b0d29ad6b1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 109, "ts": 1781194916.0307143} +{"episode_hash": "69b3246c3bf215e8fa28700d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 110, "ts": 1781194916.9164531} +{"episode_hash": "69b3249ebcfac7d916abb9c4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 111, "ts": 1781194918.1305273} +{"episode_hash": "69b3250b098c263fb8c36782", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 112, "ts": 1781194919.1394858} +{"episode_hash": "69b3258f82176d1f1ad692c8", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 113, "ts": 1781194920.3179085} +{"episode_hash": "69b3285072bd45fc976ff4db", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 114, "ts": 1781194921.3382413} +{"episode_hash": "69b3291c1d46dfe49c49edd9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 115, "ts": 1781194930.4614506} +{"episode_hash": "69b32ea71fea872861dae3f2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 116, "ts": 1781194936.705497} +{"episode_hash": "69b32ed213c67cb9ab27536c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 117, "ts": 1781194939.1447654} +{"episode_hash": "69b330bf13e59a723bbc6fec", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 118, "ts": 1781194940.7782738} +{"episode_hash": "69b331bfc45a40a0cc480646", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 119, "ts": 1781194946.5285106} +{"episode_hash": "69b337fe7aaac69b6ecbeeee", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 120, "ts": 1781194950.2957134} +{"episode_hash": "69b33c636d8e889d7aa560a6", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 121, "ts": 1781194958.5224876} +{"episode_hash": "69b33d84739d54b3dccf53d3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 122, "ts": 1781194963.8263576} +{"episode_hash": "69b33ee0ed19bd8136cc7f4b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 123, "ts": 1781194965.1512947} +{"episode_hash": "69b340965c46953805d1c898", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 124, "ts": 1781194966.1022677} +{"episode_hash": "69b3444a6db34bdbeac30538", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 125, "ts": 1781194968.0005238} +{"episode_hash": "69b345a5c77d03e742c361cc", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 126, "ts": 1781194971.909749} +{"episode_hash": "69b349025e6c644fc8c229ce", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 127, "ts": 1781194973.8069897} +{"episode_hash": "69b3496f13390784beeac7ad", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 128, "ts": 1781194976.3910127} +{"episode_hash": "69b349a2a979e0f0f0fe3dc6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 129, "ts": 1781194981.427794} +{"episode_hash": "69b34e7081212300ef2cbf5e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 130, "ts": 1781194985.5312245} +{"episode_hash": "69b36456806f8dde7843c8cd", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 131, "ts": 1781194999.60743} +{"episode_hash": "69b3654da1ede4de0049cc69", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 132, "ts": 1781195000.9865968} +{"episode_hash": "69b36788846a8cd39d79fa5f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 133, "ts": 1781195008.3165996} +{"episode_hash": "69b3699cd04bd6fd45e77d76", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 134, "ts": 1781195013.3455799} +{"episode_hash": "69b36adc1d815aa785771b6e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 135, "ts": 1781195022.4211733} +{"episode_hash": "69b37f77254f96a47b997d08", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 136, "ts": 1781195026.5065334} +{"episode_hash": "69b395313fb2fc1e7790afb7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 137, "ts": 1781195035.6918674} +{"episode_hash": "69b396679a8763ee259e6e97", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 138, "ts": 1781195039.3689003} +{"episode_hash": "69b3a406daef557c66e76aeb", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 139, "ts": 1781195041.6927135} +{"episode_hash": "69b3aa8c1e56f6bdf5a3766f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 140, "ts": 1781195048.2846727} +{"episode_hash": "69b3b01f487fcba2cc40e895", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 141, "ts": 1781195067.8549237} +{"episode_hash": "69b3b97161c85d2534e8effe", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 142, "ts": 1781195070.8095624} +{"episode_hash": "69b3c246fef79614fbc1a346", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 143, "ts": 1781195077.4880269} +{"episode_hash": "69b3c95ef435d2bd800ba015", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 144, "ts": 1781195084.7382786} +{"episode_hash": "69b3e5a200e6d908f86d7ec0", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 145, "ts": 1781195093.2924278} +{"episode_hash": "69b42182fd7b6f90a9fb4eea", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 146, "ts": 1781195104.1717615} +{"episode_hash": "69b43f198a313c3e6edaab44", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 147, "ts": 1781195110.013487} +{"episode_hash": "69b43f37bba20ceb05d7896c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 148, "ts": 1781195117.7598255} +{"episode_hash": "69b47d7217b1b3bbefd3fb89", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 149, "ts": 1781195119.4404228} +{"episode_hash": "69b485709b2ecfe4a474b8a9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 150, "ts": 1781195121.3392045} +{"episode_hash": "69b4916e1cb832bb839a861c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 151, "ts": 1781195133.7959812} +{"episode_hash": "69b49335cf653206178853da", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 152, "ts": 1781195137.526849} +{"episode_hash": "69b493541ee47c072a367c5d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 153, "ts": 1781195139.3472347} +{"episode_hash": "69b493642127166166f189f2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 154, "ts": 1781195141.5679593} +{"episode_hash": "69b493cf09ee8318e185a190", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 155, "ts": 1781195149.5468862} +{"episode_hash": "69b493d31e1240fd6bcfe78f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 156, "ts": 1781195151.6548579} +{"episode_hash": "69b493e98928b54df4a40399", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 157, "ts": 1781195153.0577612} +{"episode_hash": "69b4948bd0962527244f2b40", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 158, "ts": 1781195161.5321562} +{"episode_hash": "69b494c31afbcc4514532695", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 159, "ts": 1781195163.509757} +{"episode_hash": "69b494f9690ce5eb0225ca23", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 160, "ts": 1781195172.4698284} +{"episode_hash": "69b494fdfc520bb21dcd4f73", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 161, "ts": 1781195174.4040105} +{"episode_hash": "69b49520ba5771467aa5c4a7", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 162, "ts": 1781195185.896092} +{"episode_hash": "69b4953c60b9979b587b0c27", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 163, "ts": 1781195188.8811076} +{"episode_hash": "69b49552c7e02bc8d412ac5e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 164, "ts": 1781195198.1605225} +{"episode_hash": "69b495b2a506f1c6355d0475", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 165, "ts": 1781195205.4774232} +{"episode_hash": "69b495dccc419d655dacddb0", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 166, "ts": 1781195213.153767} +{"episode_hash": "69b49601a83a7b34affb4573", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 167, "ts": 1781195220.750531} +{"episode_hash": "69b496c930ac9bf923d7f170", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 168, "ts": 1781195222.0830846} +{"episode_hash": "69b49c50396463451d97c5e2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 169, "ts": 1781195223.106369} +{"episode_hash": "69b49c72246ccb645e50d68f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 170, "ts": 1781195231.2676017} +{"episode_hash": "69b49c96d5bde809a4eebb79", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 171, "ts": 1781195232.8498287} +{"episode_hash": "69b49d266a0a108e820b1073", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 172, "ts": 1781195233.8431165} +{"episode_hash": "69b49d2e8781fdde8bbaa9ca", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 173, "ts": 1781195234.6946797} +{"episode_hash": "69b49d3307347b484b3fd740", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 174, "ts": 1781195235.5617347} +{"episode_hash": "69b49d536325cbcd4232ac72", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 175, "ts": 1781195236.3871171} +{"episode_hash": "69b49d53a4b7915a9a847ca9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 176, "ts": 1781195237.324525} +{"episode_hash": "69b49d5e04a889619e4bdd1f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 177, "ts": 1781195241.516504} +{"episode_hash": "69b49d6def58e30ec42f86eb", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 178, "ts": 1781195243.5819619} +{"episode_hash": "69b49d838cd7957ebe478c88", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 179, "ts": 1781195245.7411466} +{"episode_hash": "69b49e7777f4dc69622ce92b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 180, "ts": 1781195248.1054585} +{"episode_hash": "69b4a04a64b814291648f037", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 181, "ts": 1781195252.7494648} +{"episode_hash": "69b4a0a9a03afaf54dbcba2b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 182, "ts": 1781195256.9789646} +{"episode_hash": "69b4a0d42e9983f31a0b56bc", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 183, "ts": 1781195262.087039} +{"episode_hash": "69b4a175017628a28b4a463a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 184, "ts": 1781195267.3407183} +{"episode_hash": "69b4a1d27e46044c0318caa8", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 185, "ts": 1781195275.6551368} +{"episode_hash": "69b4a21cf435d2bd800ba5f6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 186, "ts": 1781195280.5375762} +{"episode_hash": "69b4a22f17ec01169beb3ecd", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 187, "ts": 1781195284.262332} +{"episode_hash": "69b4a2d08505130f8b0e6d34", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 188, "ts": 1781195296.6810935} +{"episode_hash": "69b4a38041a4401e4c3f526c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 189, "ts": 1781195298.1020906} +{"episode_hash": "69b4a9655aee26acefead1ce", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 190, "ts": 1781195299.0775294} +{"episode_hash": "69b4abc0569652660a4f4ac4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 191, "ts": 1781195300.5355425} +{"episode_hash": "69b4abebd673f8a5bdac0a63", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 192, "ts": 1781195389.708286} +{"episode_hash": "69b4acf23282e47c8735365c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 193, "ts": 1781195392.0793543} +{"episode_hash": "69b4ae0a7b8718172195a07c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 194, "ts": 1781195394.391534} +{"episode_hash": "69b4ae3453e0e51b6dd346d7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 195, "ts": 1781195397.058112} +{"episode_hash": "69b4ae6d1279cedd289bc325", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 196, "ts": 1781195401.312326} +{"episode_hash": "69b4b143c7834bedf19721f2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 197, "ts": 1781195404.254006} +{"episode_hash": "69b4b2269b2ae0fb15ca36f3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 198, "ts": 1781195408.0234888} +{"episode_hash": "69b4b257b9918095dca8fb68", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 199, "ts": 1781195410.0103326} +{"episode_hash": "69b4b2827ff8637604061add", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 200, "ts": 1781195412.7229297} +{"episode_hash": "69b4b2e1ecc2eafbfae25d1d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 201, "ts": 1781195421.1050382} +{"episode_hash": "69b4b3125058b9f00b9fa573", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 202, "ts": 1781195427.0659525} +{"episode_hash": "69b4b33c5dac6770e6021e42", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 203, "ts": 1781195429.5346122} +{"episode_hash": "69b4b33c73ca03704a5029ad", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 204, "ts": 1781195434.45103} +{"episode_hash": "69b4b394d95f0cb5ffa2b9b6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 205, "ts": 1781195439.8384025} +{"episode_hash": "69b4b4ed999caf0c82b98be6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 206, "ts": 1781195441.8329132} +{"episode_hash": "69b4b52e6d78ad6736570e97", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 207, "ts": 1781195445.0422008} +{"episode_hash": "69b4b5988b0d76bdb828823d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 208, "ts": 1781195450.053083} +{"episode_hash": "69b4b5d3de62960a07de861e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 209, "ts": 1781195453.0628493} +{"episode_hash": "69b4b7ba0cd58dc901b8907a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 210, "ts": 1781195457.3484104} +{"episode_hash": "69b4b82da85a9038236c3e9e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 211, "ts": 1781195460.0280807} +{"episode_hash": "69b4b9abe8279eda42670225", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 212, "ts": 1781195462.195674} +{"episode_hash": "69b4b9cc970f3d65c454a159", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 213, "ts": 1781195469.0193737} +{"episode_hash": "69b4bab0dd4d1616e538713c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 214, "ts": 1781195474.9988782} +{"episode_hash": "69b4bd2c47952ada7592905d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 215, "ts": 1781195477.2326467} +{"episode_hash": "69b4be42f9274b0a852547ca", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 216, "ts": 1781195483.4704125} +{"episode_hash": "69b4bf8d4b8693d11c3b9872", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 217, "ts": 1781195487.8212204} +{"episode_hash": "69b4c6774e1b15ae18625e56", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 218, "ts": 1781195494.7324915} +{"episode_hash": "69b4d438d158ec4a43dcf8a0", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 219, "ts": 1781195496.6267927} +{"episode_hash": "69b4d43e97224d24a5b38505", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 220, "ts": 1781195498.0169196} +{"episode_hash": "69b4d468acea937039fea6b1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 221, "ts": 1781195499.7545795} +{"episode_hash": "69b4d5b5f4719f087672d2d2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 222, "ts": 1781195501.5696015} +{"episode_hash": "69b4d5ea2c83b2c34dfe560d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 223, "ts": 1781195503.714605} +{"episode_hash": "69b4db89291a7920c6fb7d00", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 224, "ts": 1781195505.4395874} +{"episode_hash": "69b4dbeada81c162c79f3af6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 225, "ts": 1781195507.9506202} +{"episode_hash": "69b4e89e680bedd399fcbb5c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 226, "ts": 1781195510.0888717} +{"episode_hash": "69b4eb631425999d967049be", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 227, "ts": 1781195516.8937354} +{"episode_hash": "69b4ee890a4ef7c33756bca5", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 228, "ts": 1781195523.919507} +{"episode_hash": "69b4f37c388ccecd105c5fe1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 229, "ts": 1781195525.4773657} +{"episode_hash": "69b4f533dd4d1616e5387348", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 230, "ts": 1781195526.5570602} +{"episode_hash": "69b4f55a9705148536965205", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 231, "ts": 1781195527.7045522} +{"episode_hash": "69b4f76b2e9983f31a0b5a70", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 232, "ts": 1781195528.9606209} +{"episode_hash": "69b4f843758deefb5ec01244", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 233, "ts": 1781195533.5545914} +{"episode_hash": "69b4f89752b439fcc613b58a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 234, "ts": 1781195535.2894707} +{"episode_hash": "69b4fac9caa6ed5689ec2d5e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 235, "ts": 1781195536.7873106} +{"episode_hash": "69b4fe13d309464df7115850", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 236, "ts": 1781195539.6530864} +{"episode_hash": "69b502ca758deefb5ec0126c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 237, "ts": 1781195544.962768} +{"episode_hash": "69b502d01cdb3cb1bcb16765", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 238, "ts": 1781195550.425937} +{"episode_hash": "69b5037d8faeb1c44a3ebe77", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 239, "ts": 1781195559.832753} +{"episode_hash": "69b504f361c85d2534e8f88a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 240, "ts": 1781195561.362128} +{"episode_hash": "69b507d79f66a2746698fb11", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 241, "ts": 1781195568.6558359} +{"episode_hash": "69b508cf5a10c4a2d8fa01a9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 242, "ts": 1781195571.5296519} +{"episode_hash": "69b50a89c7e02bc8d412af3d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 243, "ts": 1781195573.1100345} +{"episode_hash": "69b51604fc41f34c724bea67", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 244, "ts": 1781195574.0865755} +{"episode_hash": "69b525b01b5d00f6e2fca79a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 245, "ts": 1781195576.0962706} +{"episode_hash": "69b52839ff6f8c0fd774fee6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 246, "ts": 1781195577.762592} +{"episode_hash": "69b529589f66a2746698fbe1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 247, "ts": 1781195580.6580024} +{"episode_hash": "69b52abf4963ef0ac28d5beb", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 248, "ts": 1781195582.0923154} +{"episode_hash": "69b52d7fea15fe5d53dd0c72", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 249, "ts": 1781195591.162396} +{"episode_hash": "69b532685c9a724fbfbc1f86", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 250, "ts": 1781195595.446095} +{"episode_hash": "69b53a09124502aa36325304", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 251, "ts": 1781195596.4986854} +{"episode_hash": "69b53baf3dd17eb53d7ddc35", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 252, "ts": 1781195603.3095458} +{"episode_hash": "69b53f6f3a7542779b575391", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 253, "ts": 1781195649.154713} +{"episode_hash": "69b53f7d6c13d04069dccf86", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 254, "ts": 1781195650.541912} +{"episode_hash": "69b54012e248420994a83197", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 255, "ts": 1781195652.023949} +{"episode_hash": "69b541163dd17eb53d7ddc96", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 256, "ts": 1781195653.2309008} +{"episode_hash": "69b5425561c85d2534e8f9f1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 257, "ts": 1781195657.4937882} +{"episode_hash": "69b547d71666a9ba0092e8f4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 258, "ts": 1781195660.6518} +{"episode_hash": "69b54c24d3ef4c69cdc631b9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 259, "ts": 1781195664.4096777} +{"episode_hash": "69b54ff560172888461a8600", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 260, "ts": 1781195667.551034} +{"episode_hash": "69b553ebf629796beb9845d4", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 261, "ts": 1781195669.451696} +{"episode_hash": "69b554d4ae7c8a432518f9d6", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 262, "ts": 1781195673.7141843} +{"episode_hash": "69b554d746452e48802c28f9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 263, "ts": 1781195677.821727} +{"episode_hash": "69b555abee737c3c1639205b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 264, "ts": 1781195684.9354665} +{"episode_hash": "69b55a265907c64c2ffa35f2", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 265, "ts": 1781195692.1677032} +{"episode_hash": "69b56320d9bd4ed2c8cdab06", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 266, "ts": 1781195697.708202} +{"episode_hash": "69b5702e7e64d72afd3bf666", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 267, "ts": 1781195699.7198565} +{"episode_hash": "69b573ecf85fc301e7132041", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 268, "ts": 1781195708.070699} +{"episode_hash": "69b5764588f4b4a6e37d9f54", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 269, "ts": 1781195709.2602212} +{"episode_hash": "69b5787761c85d2534e8fb9a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 270, "ts": 1781195711.8470147} +{"episode_hash": "69b59456124502aa36325596", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 271, "ts": 1781195722.34849} +{"episode_hash": "69b67e3d90ff96d53410f277", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 272, "ts": 1781195728.5585535} +{"episode_hash": "69b684dccd225473d6956765", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 273, "ts": 1781195732.276111} +{"episode_hash": "69b685e796e604419ceb317d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 274, "ts": 1781195740.514693} +{"episode_hash": "69b68626af933f49003771c9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 275, "ts": 1781195748.1381276} +{"episode_hash": "69b687cc15c15130fd7d5792", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 276, "ts": 1781195755.985174} +{"episode_hash": "69b687f602c15af4600ee75a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 277, "ts": 1781195767.988932} +{"episode_hash": "69b689040362172e4a330f89", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 278, "ts": 1781195774.1909518} +{"episode_hash": "69b68a0de9a7a1d4e945b540", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 279, "ts": 1781195782.4311433} +{"episode_hash": "69b68b72d0ec56f9fd959a01", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 280, "ts": 1781195789.8951595} +{"episode_hash": "69b68b893c4071bc885c80a3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 281, "ts": 1781195797.5497606} +{"episode_hash": "69b68c03e14e59c96aca2789", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 282, "ts": 1781195802.325995} +{"episode_hash": "69b68cdb7f638ca7ddc771e8", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 283, "ts": 1781195807.5408654} +{"episode_hash": "69b68d3c863376b642ddc393", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 284, "ts": 1781195812.0811954} +{"episode_hash": "69b68ddab3c6644588cd1ef4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 285, "ts": 1781195819.730088} +{"episode_hash": "69b68f44359fa4d3b056169a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 286, "ts": 1781195827.5602267} +{"episode_hash": "69b6903d0248d6f194ddb858", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 287, "ts": 1781195839.6261806} +{"episode_hash": "69b690daeae2ffd4a8721274", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 288, "ts": 1781195844.9535253} +{"episode_hash": "69b692dd89a4397653bc7642", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 289, "ts": 1781195848.2843506} +{"episode_hash": "69b693120145701f877fec1a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 290, "ts": 1781195854.9343247} +{"episode_hash": "69b693eef572e72a4e66a23a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 291, "ts": 1781195860.7538273} +{"episode_hash": "69b694724d8c5f73d519add8", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 292, "ts": 1781195869.4911397} +{"episode_hash": "69b695e85f1d2dd786b35eee", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 293, "ts": 1781195877.2008204} +{"episode_hash": "69b696114f8988c123b33745", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 294, "ts": 1781195889.0527635} +{"episode_hash": "69b69a485b8909b6ece0d093", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 295, "ts": 1781195896.7095792} +{"episode_hash": "69b69aa7e63d73a27583dcf5", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 296, "ts": 1781195905.8436706} +{"episode_hash": "69b69abc67f8c87f5b771b39", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 297, "ts": 1781195969.2526853} +{"episode_hash": "69b69b0aa967df5ed187371e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 298, "ts": 1781195976.2531352} +{"episode_hash": "69b69b4ff2710b05b13a6e0e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 299, "ts": 1781195980.1592512} +{"episode_hash": "69b69b8e5b47da978eb918f6", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 300, "ts": 1781195987.917109} +{"episode_hash": "69b69d75c764c30eb512053a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 301, "ts": 1781196002.0166602} +{"episode_hash": "69b6abd2341121416d110fc4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 302, "ts": 1781196010.575453} +{"episode_hash": "69b6bb92e30380ba2b80f358", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 303, "ts": 1781196012.4760156} +{"episode_hash": "69b6c33604c8c2ebb7bbff19", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 304, "ts": 1781196020.5295076} +{"episode_hash": "69b6c6070d8cea8c65e3dd0f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 305, "ts": 1781196034.5595884} +{"episode_hash": "69b6c853630f2c9338a93758", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 306, "ts": 1781196039.479774} +{"episode_hash": "69b6cb1c97c4565c26beed30", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 307, "ts": 1781196045.294467} +{"episode_hash": "69b6d52ee374dd52788b2084", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 308, "ts": 1781196049.6251504} +{"episode_hash": "69b6d576f7de7d351cd43419", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 309, "ts": 1781196055.7574096} +{"episode_hash": "69b6d8002e7226cb41a3edc4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 310, "ts": 1781196064.1020503} +{"episode_hash": "69b84262cdbc7aede694381e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 311, "ts": 1781196127.2756708} +{"episode_hash": "69b8443c19aecd94aedc33b7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 312, "ts": 1781196136.3211951} +{"episode_hash": "69b8446ffb1a61ea23a43d40", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 313, "ts": 1781196151.8918343} +{"episode_hash": "69b8515ccdbc7aede6943906", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 314, "ts": 1781196160.703867} +{"episode_hash": "69b85e165dd104abd036bd65", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 315, "ts": 1781196163.9303951} +{"episode_hash": "69b85e92c5ab7070deca4907", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 316, "ts": 1781196175.8032634} +{"episode_hash": "69b871fa2c2daf3cb076c9ce", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 317, "ts": 1781196177.535106} +{"episode_hash": "69b876754763c6a9d3add5f3", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 318, "ts": 1781196181.7836285} +{"episode_hash": "69b879cc4763c6a9d3add60d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 319, "ts": 1781196186.338055} +{"episode_hash": "69b87ba3044006a7f056eea5", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 320, "ts": 1781196194.1616447} +{"episode_hash": "69b87eee19aecd94aedc36b4", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 321, "ts": 1781196199.0946586} +{"episode_hash": "69b8836035183530d04484ca", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 322, "ts": 1781196208.8873649} +{"episode_hash": "69b88fed7f0dd9337697cd81", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 323, "ts": 1781196216.7069058} +{"episode_hash": "69b8b05611d8df1e277c15b5", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 324, "ts": 1781196225.2604294} +{"episode_hash": "69b8bcb844a2e80ec56560ed", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 325, "ts": 1781196233.2025151} +{"episode_hash": "69b8c1014696c5cb757f8448", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 326, "ts": 1781196235.4817076} +{"episode_hash": "69b8c38222b409ba79d212eb", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 327, "ts": 1781196243.0301087} +{"episode_hash": "69b8c5be52c2c675c36ca19c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 328, "ts": 1781196250.053657} +{"episode_hash": "69b8cd7308daef11eac8a08b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 329, "ts": 1781196255.304099} +{"episode_hash": "69b8d98906cdf6f5e21c77f6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 330, "ts": 1781196264.3233955} +{"episode_hash": "69b8dc9aadb6e6a77d23fc3e", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 331, "ts": 1781196266.3586292} +{"episode_hash": "69b8eb6aa8f416005104fd69", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 332, "ts": 1781196275.3388777} +{"episode_hash": "69b8f01e6be1c6d054a42f98", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 333, "ts": 1781196283.094606} +{"episode_hash": "69b8f43f4b754305a80bf456", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 334, "ts": 1781196291.0443747} +{"episode_hash": "69b8f596a0f9b58bf114a371", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 335, "ts": 1781196297.8010035} +{"episode_hash": "69b8f63aa8f5c8c8ef9bae19", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 336, "ts": 1781196306.653056} +{"episode_hash": "69b8f7ca6a6fcc387e6fc89d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 337, "ts": 1781196313.8808694} +{"episode_hash": "69b90379a89e9b47645a9db3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 338, "ts": 1781196322.7630382} +{"episode_hash": "69b90c01020e9efa2add534b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 339, "ts": 1781196331.0652816} +{"episode_hash": "69b90c8cb1ffd7875e7cd0a9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 340, "ts": 1781196340.9738352} +{"episode_hash": "69b911c355294f107bfbc840", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 341, "ts": 1781196350.6533704} +{"episode_hash": "69b917adfb73b7a0dcf4c946", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 342, "ts": 1781196353.51598} +{"episode_hash": "69b918e86be1c6d054a430f9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 343, "ts": 1781196360.7897851} +{"episode_hash": "69b91a05de59539246182a53", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 344, "ts": 1781196373.6544528} +{"episode_hash": "69b91bb458ee0789cda81c28", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 345, "ts": 1781196537.3634174} +{"episode_hash": "69b91cc62030ce071fb4928d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 346, "ts": 1781196549.8681717} +{"episode_hash": "69b91d5fcf3be3afac7d74dc", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 347, "ts": 1781196552.0885637} +{"episode_hash": "69b91de3bd0a1226e8720ad0", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 348, "ts": 1781196561.021744} +{"episode_hash": "69b91f3ce3e5accb88abd186", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 349, "ts": 1781196566.185278} +{"episode_hash": "69b925ee9bcf11a7dc66d687", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 350, "ts": 1781196574.7462962} +{"episode_hash": "69b926fdfe7b4065d8ee60b6", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 351, "ts": 1781196581.9268599} +{"episode_hash": "69b9272ce02b54ac36b081e8", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 352, "ts": 1781196589.7549746} +{"episode_hash": "69b92908b1ffd7875e7cd19d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 353, "ts": 1781196600.6989985} +{"episode_hash": "69b929e5fe7b4065d8ee60ce", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 354, "ts": 1781196611.2983007} +{"episode_hash": "69b92d11b3cc90fa8d9acd2c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 355, "ts": 1781196620.6440506} +{"episode_hash": "69b93810b3fe52e7b3246b74", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 356, "ts": 1781196629.7131898} +{"episode_hash": "69b93ba25088ac62355d6cfa", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 357, "ts": 1781196637.808325} +{"episode_hash": "69b93bfffe5dea81e80546a7", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 358, "ts": 1781196647.4615273} +{"episode_hash": "69b93c898973f21812765cc3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 359, "ts": 1781196676.5865703} +{"episode_hash": "69b93ce3b3cc90fa8d9acdae", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 360, "ts": 1781196682.0942504} +{"episode_hash": "69b93da22e71fa6c931cbf9c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 361, "ts": 1781196700.3088686} +{"episode_hash": "69b93ddd1d448e9ea86d3b76", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 362, "ts": 1781196708.3951886} +{"episode_hash": "69b93ef8fa0ca5629329ebc2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 363, "ts": 1781196715.7997825} +{"episode_hash": "69b93f85aacf0a241873b767", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 364, "ts": 1781196721.9128563} +{"episode_hash": "69b93fb32ab1219ca569bfc2", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 365, "ts": 1781196723.9972482} +{"episode_hash": "69b95578a7178c0e45b56e83", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 366, "ts": 1781196730.5378776} +{"episode_hash": "69b955cd3d7564e60197052a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 367, "ts": 1781196738.3479388} +{"episode_hash": "69b955e72565bc2e9320ae7c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 368, "ts": 1781196746.5082135} +{"episode_hash": "69b957d0507132953a1af187", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 369, "ts": 1781196754.8488257} +{"episode_hash": "69b958b394c5e2cd4f0fd687", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 370, "ts": 1781196762.644659} +{"episode_hash": "69b9598994c5e2cd4f0fd691", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 371, "ts": 1781196772.2697005} +{"episode_hash": "69b95f27e02b54ac36b08430", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 372, "ts": 1781196779.0640783} +{"episode_hash": "69b95f5887a8695556dc140b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 373, "ts": 1781196791.5990744} +{"episode_hash": "69b95f9485ed8de7009108f0", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 374, "ts": 1781196794.1442218} +{"episode_hash": "69b95ff1cf3be3afac7d7767", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 375, "ts": 1781196797.2889643} +{"episode_hash": "69b960a0984ca3f76894d0ea", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 376, "ts": 1781196804.270811} +{"episode_hash": "69b961c7c5133d089fd7ca48", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 377, "ts": 1781196809.9715276} +{"episode_hash": "69b961edd1b1254fcf5880d0", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 378, "ts": 1781196815.3201938} +{"episode_hash": "69b9674cfa0ca5629329edae", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 379, "ts": 1781196820.0209134} +{"episode_hash": "69b96cd5ea8b4cce23afec76", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 380, "ts": 1781196828.232603} +{"episode_hash": "69b96de7d3f6bebb1b5201b9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 381, "ts": 1781196832.9850106} +{"episode_hash": "69b96e24a0f9b58bf114a80a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 382, "ts": 1781196840.8602018} +{"episode_hash": "69b96fe02030ce071fb49642", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 383, "ts": 1781196846.610056} +{"episode_hash": "69b97081b13a790889c05698", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 384, "ts": 1781196849.3974175} +{"episode_hash": "69b971414458d25a26dc6cd3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 385, "ts": 1781196853.5974426} +{"episode_hash": "69b9729a605829a110d6cd2b", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 386, "ts": 1781196857.67343} +{"episode_hash": "69b9739ce0d38179fe8305e8", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 387, "ts": 1781196859.2409122} +{"episode_hash": "69b97901571aa3769df5698f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 388, "ts": 1781196861.3940678} +{"episode_hash": "69b97a9f2030ce071fb496dd", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 389, "ts": 1781196868.6914492} +{"episode_hash": "69b97bfcadb6e6a77d24037f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 390, "ts": 1781196884.5491607} +{"episode_hash": "69b97c3ad1b1254fcf58822a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 391, "ts": 1781196891.568792} +{"episode_hash": "69b97e763eb66861b6b67463", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 392, "ts": 1781196896.5260985} +{"episode_hash": "69b97eb7e9e449ce481f0d16", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 393, "ts": 1781196898.312908} +{"episode_hash": "69b980da304dcbe492f247ba", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 394, "ts": 1781196900.0565271} +{"episode_hash": "69b9814aeccb0b08b29a4fd3", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 395, "ts": 1781196901.043118} +{"episode_hash": "69b98d15332eddd8ed1a352a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 396, "ts": 1781196906.551451} +{"episode_hash": "69b98d4721ace8909aabcb4e", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 397, "ts": 1781196911.4697173} +{"episode_hash": "69b98ed9daa94436aeb8f252", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 398, "ts": 1781196916.7220137} +{"episode_hash": "69b990db5114d18c01842534", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 399, "ts": 1781196918.7455163} +{"episode_hash": "69b992b602ef422eb23d8ae9", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 400, "ts": 1781196920.1235986} +{"episode_hash": "69b9982e0708f95ac3fce45c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 401, "ts": 1781196923.5576026} +{"episode_hash": "69b9996a9d8f2a52dc2e0406", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 402, "ts": 1781196938.3998575} +{"episode_hash": "69b999bceddc130379669eae", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 403, "ts": 1781196945.4642494} +{"episode_hash": "69b99acf02fc9c70406fa617", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 404, "ts": 1781196949.7852678} +{"episode_hash": "69b99b990a4d21fe795c1c9d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 405, "ts": 1781196951.2566192} +{"episode_hash": "69b99c0e3673ca659e070ac9", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 406, "ts": 1781196960.1772747} +{"episode_hash": "69b9a13ad056890bb2ca258a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 407, "ts": 1781196964.644518} +{"episode_hash": "69b9a1754458d25a26dc6e58", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 408, "ts": 1781196970.6208751} +{"episode_hash": "69b9a5ad4a24dede6ab84f25", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 409, "ts": 1781196979.163307} +{"episode_hash": "69b9a5d574d8ca57221c4671", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 410, "ts": 1781196985.2328248} +{"episode_hash": "69b9a67c99baab7f4f63f49a", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 411, "ts": 1781196989.4171102} +{"episode_hash": "69b9aa6441b2115214eb1083", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 412, "ts": 1781197018.3345978} +{"episode_hash": "69b9aa950a4d21fe795c1d53", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 413, "ts": 1781197045.4594646} +{"episode_hash": "69b9aaf507283983c22dd8e8", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 414, "ts": 1781197049.2648988} +{"episode_hash": "69b9ab17eecdb2675227fb13", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 415, "ts": 1781197056.6111102} +{"episode_hash": "69b9ab2e66541bb0435c0563", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 416, "ts": 1781197065.0544043} +{"episode_hash": "69b9ab50332eddd8ed1a35f6", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 417, "ts": 1781197074.0783556} +{"episode_hash": "69b9ab63c004b8e369a3d4c6", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 418, "ts": 1781197081.0970812} +{"episode_hash": "69b9abc3aa6e21f31eb6ba25", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 419, "ts": 1781197082.5773842} +{"episode_hash": "69b9ac3630e465706c590ffc", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 420, "ts": 1781197083.9917288} +{"episode_hash": "69b9ac42a3eedf54151c6464", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 421, "ts": 1781197092.799034} +{"episode_hash": "69b9ad1a332eddd8ed1a3604", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 422, "ts": 1781197095.4834816} +{"episode_hash": "69b9aea354b561b4d199a27c", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 423, "ts": 1781197096.8910515} +{"episode_hash": "69b9b0c7137fadc2c6df9077", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 424, "ts": 1781197098.1672525} +{"episode_hash": "69b9b0d99dcb1b5e480db006", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 425, "ts": 1781197102.6503592} +{"episode_hash": "69b9b1c455ee96e0d7396949", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 426, "ts": 1781197104.185319} +{"episode_hash": "69b9b260c004b8e369a3d517", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 427, "ts": 1781197112.0122728} +{"episode_hash": "69b9b2924673c55fc915ba66", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 428, "ts": 1781197117.1793156} +{"episode_hash": "69b9b60aa51108e7b73009d1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 429, "ts": 1781197119.9159145} +{"episode_hash": "69b9c8f8a6f41015b5203409", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 430, "ts": 1781197125.5086415} +{"episode_hash": "69b9c95b347986ddc8b9eb25", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 431, "ts": 1781197131.250412} +{"episode_hash": "69b9e074a5d0498b3beb60bf", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 432, "ts": 1781197137.2037067} +{"episode_hash": "69b9e2e42420a65b8f3b0d54", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 433, "ts": 1781197140.3426898} +{"episode_hash": "69b9e545bbb970524d3cf45d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 434, "ts": 1781197149.4880528} +{"episode_hash": "69b9e59388fdab48150e3d07", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 435, "ts": 1781197155.19751} +{"episode_hash": "69b9e68cd8d59e6ae34c0e1b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 436, "ts": 1781197158.1433516} +{"episode_hash": "69b9e6a0055065a1832b56b5", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 437, "ts": 1781197163.9667134} +{"episode_hash": "69b9fab7f4432734dc1b3b25", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 438, "ts": 1781197167.9245365} +{"episode_hash": "69ba00b5afb568e39e92f340", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 439, "ts": 1781197171.5330224} +{"episode_hash": "69ba0421ad41965cca81ccca", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 440, "ts": 1781197176.0160503} +{"episode_hash": "69ba06f4862b272d33cfec6f", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 441, "ts": 1781197180.2514691} +{"episode_hash": "69ba09ef8914508abf138bca", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 442, "ts": 1781197182.8434207} +{"episode_hash": "69bacdb87f9d2a9ee33a6ccf", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 443, "ts": 1781197184.5133073} +{"episode_hash": "69bad48044b0fc7135f86330", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 444, "ts": 1781197191.3982408} +{"episode_hash": "69bad84c337db01471731db7", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 445, "ts": 1781197199.6185615} +{"episode_hash": "69bad9296984eb7262b04a2a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 446, "ts": 1781197206.9425163} +{"episode_hash": "69bada5b790ccc5cb89c1083", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 447, "ts": 1781197211.777941} +{"episode_hash": "69bada5b790ccc5cb89c1083", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 447, "ts": 1781197215.3850782} +{"episode_hash": "69badbf27e311f13fc6df09b", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 448, "ts": 1781197223.408787} +{"episode_hash": "69badd72cc766ab7cf35ea9d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 449, "ts": 1781197229.3276045} +{"episode_hash": "69badde449d91f47d726c32a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 450, "ts": 1781197233.6260743} +{"episode_hash": "69bae0f65d1a1f3632b7fc8f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 451, "ts": 1781197239.3855052} +{"episode_hash": "69bae109828bb1912f3ef8c1", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 452, "ts": 1781197244.020985} +{"episode_hash": "69bae420f492c4f8a835a95c", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 453, "ts": 1781197251.9589348} +{"episode_hash": "69bae733b7af83de25a3812a", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 454, "ts": 1781197260.8201296} +{"episode_hash": "69bae9f54a1d1416e573806d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 455, "ts": 1781197265.7826817} +{"episode_hash": "69bae9f54a1d1416e573806d", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 455, "ts": 1781197265.7830448} +{"episode_hash": "69baf4d8935a9aa010abb230", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 457, "ts": 1781197273.4255347} +{"episode_hash": "69bb00a60bb085884dbc50b7", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 458, "ts": 1781197275.3977556} +{"episode_hash": "69bb01bf11e9b1cd78d2945d", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 459, "ts": 1781197282.0095515} +{"episode_hash": "69bb040ffb4c94a31bd85cbe", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 460, "ts": 1781197337.4954076} +{"episode_hash": "69bb0e1f7fcc76cdadcc00bb", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 461, "ts": 1781197344.3267846} +{"episode_hash": "69bb0e1f7fcc76cdadcc00bb", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 461, "ts": 1781197347.3648772} +{"episode_hash": "69bb0e1f7fcc76cdadcc00bb", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 461, "ts": 1781197350.266412} +{"episode_hash": "69bb0e1f7fcc76cdadcc00bb", "decision": "accept", "task": "folding_clothes", "lab": "mecka", "index": 461, "ts": 1781197353.9567144} +{"episode_hash": "69baed114012b22f2ea5f48f", "decision": "reject", "task": "folding_clothes", "lab": "mecka", "index": 456, "ts": 1781197402.1831589} diff --git a/egomimic/scripts/data_quality/__init__.py b/egomimic/scripts/data_quality/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/egomimic/scripts/data_quality/review_episodes.py b/egomimic/scripts/data_quality/review_episodes.py new file mode 100644 index 000000000..d66e4ac30 --- /dev/null +++ b/egomimic/scripts/data_quality/review_episodes.py @@ -0,0 +1,799 @@ +"""Interactive data-quality review tool for RLDB episodes. + +Eyeball each episode's raw front-camera video in a small Flask web app and +accept / reject / skip it. Every decision is appended to a JSONL file the +instant it is made, so the review is fully resumable and the accepted set can +later be wired into a filtered data config. + +This is a read-only consumer of the episode registry: it never writes to the +SQL table (``is_deleted`` is untouched) and never trains anything. It only +downloads the matched episodes' zarr stores and renders their ``images.front_1`` +frames to MP4 for viewing. + +---------------------------------------------------------------------------- +Usage +---------------------------------------------------------------------------- +Activate the venv first: ``source emimic/bin/activate`` + +1) Sanity-check the SQL filter (no downloads, no server): + + python -m egomimic.scripts.data_quality.review_episodes --list-only + +2) Review over an SSH port-forward (`ssh -L 5007:127.0.0.1:5007 `): + + python -m egomimic.scripts.data_quality.review_episodes \ + --lab mecka --task folding_clothes \ + --cache-dir /path/to/qc_cache + + then open http://127.0.0.1:5007 in your local browser. + Keys: [a]ccept [r]eject [s]kip [<-]/[->] prev/next. + +3) Export the accepted episode hashes as a ready-to-paste Python set: + + python -m egomimic.scripts.data_quality.review_episodes --print-accepted + + Paste the printed set into a copy of the data config, e.g. + ``egomimic/hydra_configs/data/mecka_pi_fold_clothes_freeform.yaml``: + + filter_lambdas: + - "lambda row: row['lab'] == 'mecka' and row['task'] == 'folding_clothes'" + - "lambda row: row['episode_hash'] in {'', '', ...}" + + (The ``episode_hash in {...}`` pattern is already used in + ``mecka_pi_eval.yaml``.) +""" + +from __future__ import annotations + +import argparse +import json +import math +import os +import threading +import time +from pathlib import Path + +import cv2 +import imageio +import imageio_ffmpeg # noqa: F401 (ensures a bundled ffmpeg is importable) +import numpy as np +import simplejpeg +from flask import Flask, Response, abort, jsonify, request, send_file + +from egomimic.rldb.filters import DatasetFilter +from egomimic.rldb.zarr.zarr_dataset_multi import S3EpisodeResolver, ZarrEpisode +from egomimic.utils.aws.aws_data_utils import load_env + +# Primary egocentric RGB key for all human/mecka embodiments (see CONTRIBUTING_DATA.md). +IMAGE_KEY = "images.front_1" +BUCKET_NAME = "rldb" +VALID_DECISIONS = ("accept", "reject", "uncertain", "skip") + +# Shared on-cluster store where episodes are already downloaded (= paths.dataset_dir +# in egomimic/hydra_configs/paths/default.yaml). Treated as read-only. +DEFAULT_DATASET_DIR = Path("/storage/project/r-dxu345-0/shared/egoverseS3ZarrDatasets") + + +# --------------------------------------------------------------------------- +# Episode discovery +# --------------------------------------------------------------------------- +def discover_episodes( + lab: str, task: str, extra_filters: list[str], debug: int | None +) -> tuple[list[str], dict[str, str], dict[str, str]]: + """Query the SQL registry and return matched episodes. + + Returns: + (ordered_hashes, hash_to_s3path, hash_to_task) + """ + lambdas = [f"lambda row: row['lab'] == {lab!r} and row['task'] == {task!r}"] + lambdas.extend(extra_filters or []) + filters = DatasetFilter(filter_lambdas=lambdas) + + paths, hash_to_task = S3EpisodeResolver._get_filtered_paths( + filters, debug=debug if debug else None + ) + hash_to_s3 = {h: p for (p, h) in paths} + ordered = sorted(hash_to_s3.keys()) + return ordered, hash_to_s3, hash_to_task + + +# --------------------------------------------------------------------------- +# Download + render +# --------------------------------------------------------------------------- +def resolve_episode_dir( + dataset_dir: Path, cache_dir: Path, episode_hash: str, s3_path: str +) -> Path: + """Return the local zarr store dir for an episode. + + Prefers the existing read-only shared store (``dataset_dir``); falls back to a + writable ``cache_dir`` for any episode not already present, downloading it + there only if needed. + """ + shared = dataset_dir / episode_hash + if shared.is_dir(): + return shared + cached = cache_dir / episode_hash + if not cached.is_dir(): + S3EpisodeResolver._sync_s3_to_local( + bucket_name=BUCKET_NAME, + s3_paths=[(s3_path, episode_hash)], + local_dir=cache_dir, + ) + if not cached.is_dir(): + raise FileNotFoundError( + f"Episode {episode_hash} not in {dataset_dir} and download failed" + ) + return cached + + +def effective_stride(total: int, stride: int, max_frames: int) -> int: + """Frame stride that keeps the clip within ``max_frames`` while spanning the + WHOLE episode. Uses ``stride`` for short episodes, but increases it for long + ones so the video always covers start-to-end (no truncated tail).""" + s = max(1, stride) + if max_frames and total > 0: + s = max(s, math.ceil(total / max_frames)) + return s + + +def _decode_json_entry(value): + """Decode one zarr JSON-encoded entry (mirrors ZarrDataset._decode_json_entry).""" + if isinstance(value, np.void): + value = value.item() + if isinstance(value, memoryview): + value = value.tobytes() + if isinstance(value, bytearray): + value = bytes(value) + if isinstance(value, bytes): + return json.loads(value.decode("utf-8")) + if isinstance(value, str): + return json.loads(value) + return value + + +def _episode_labels(ep: ZarrEpisode) -> list[dict]: + """Decoded language annotations for an open episode, sorted by start frame. + + Each entry is ``{"text": str, "start_idx": int, "end_idx": int}``. Returns an + empty list if the episode has no ``annotations`` array. + """ + if "annotations" not in ep._collect_keys(): + return [] + raw = ep._store["annotations"][:] + out: list[dict] = [] + for x in raw: + try: + d = _decode_json_entry(x) + except Exception: + continue + if isinstance(d, dict): + out.append( + { + "text": str(d.get("text", "")), + "start_idx": int(d.get("start_idx", -1)), + "end_idx": int(d.get("end_idx", -1)), + } + ) + out.sort(key=lambda a: a["start_idx"]) + return out + + +def read_annotations(zarr_dir: Path) -> list[dict]: + """Convenience wrapper: open an episode and return its language annotations.""" + return _episode_labels(ZarrEpisode(zarr_dir)) + + +def _placeholder_mp4(out_path: Path, text: str, fps: int) -> None: + """Write a tiny 1-second clip with an error message (unreadable episodes).""" + frame = np.zeros((360, 640, 3), dtype=np.uint8) + cv2.putText( + frame, + text[:60], + (20, 180), + cv2.FONT_HERSHEY_SIMPLEX, + 0.8, + (0, 0, 255), + 2, + cv2.LINE_AA, + ) + with imageio.get_writer( + str(out_path), + fps=fps, + codec="libx264", + pixelformat="yuv420p", + macro_block_size=16, + format="FFMPEG", + ) as w: + for _ in range(fps): + w.append_data(frame) + + +def render_video( + zarr_dir: Path, + out_path: Path, + fps: int | None, + stride: int, + max_frames: int, + max_width: int, + crf: int = 30, + preset: str = "veryfast", +) -> None: + """Decode ``images.front_1`` JPEGs from one episode into a browser-playable MP4. + + Tuned for fast review over an SSH tunnel: libjpeg decodes large frames at a + reduced scale (``min_width``) so decode is cheap, x264 uses a fast ``preset`` + and ``crf`` for small files, and ``+faststart`` moves the moov atom to the + front so the browser can begin playback before the file finishes downloading. + """ + try: + ep = ZarrEpisode(zarr_dir) + total = len(ep) + meta_fps = int(ep.metadata.get("fps", 30) or 30) + out_fps = fps if fps else max(1, min(meta_fps, 30)) + + if IMAGE_KEY not in ep._collect_keys(): + _placeholder_mp4(out_path, f"NO KEY {IMAGE_KEY}", out_fps) + return + + blobs = ep.read({IMAGE_KEY: (0, total)})[IMAGE_KEY] + # Stride chosen so the clip spans the whole episode within the frame budget. + eff_stride = effective_stride(total, stride, max_frames) + idxs = list(range(0, total, eff_stride)) + if not idxs: + _placeholder_mp4(out_path, "EMPTY EPISODE", out_fps) + return + + # libx264 output params: small files + fast encode + progressive playback. + out_params = [ + "-preset", + preset, + "-crf", + str(crf), + "-movflags", + "+faststart", + ] + tmp_path = out_path.with_suffix(".tmp.mp4") + wrote_any = False + with imageio.get_writer( + str(tmp_path), + fps=out_fps, + codec="libx264", + pixelformat="yuv420p", + macro_block_size=16, + format="FFMPEG", + output_params=out_params, + ) as writer: + for i in idxs: + try: + # min_width lets libjpeg downscale in the DCT domain (cheap) + # for large source frames; fast flags trade a little quality + # for speed (fine for QC playback). + frame = simplejpeg.decode_jpeg( + bytes(blobs[i]), + colorspace="RGB", + fastdct=True, + fastupsample=True, + min_width=max_width, + ) + except Exception: + continue + h, w = frame.shape[:2] + if w > max_width: + new_w = max_width + new_h = int(round(h * (max_width / w))) + frame = cv2.resize( + frame, (new_w, new_h), interpolation=cv2.INTER_AREA + ) + writer.append_data(np.ascontiguousarray(frame)) + wrote_any = True + + if not wrote_any: + tmp_path.unlink(missing_ok=True) + _placeholder_mp4(out_path, "ALL FRAMES UNREADABLE", out_fps) + return + os.replace(tmp_path, out_path) + except Exception as exc: # noqa: BLE001 - surface any failure as a viewable clip + try: + _placeholder_mp4(out_path, f"RENDER ERROR: {exc}", 10) + except Exception: + raise + + +# --------------------------------------------------------------------------- +# Decisions persistence (JSONL, last-line-wins per hash) +# --------------------------------------------------------------------------- +class DecisionLog: + def __init__(self, path: Path): + self.path = path + self.path.parent.mkdir(parents=True, exist_ok=True) + self._lock = threading.Lock() + self.decisions: dict[str, str] = {} + self._load() + + def _load(self) -> None: + if not self.path.exists(): + return + with self.path.open("r") as f: + for line in f: + line = line.strip() + if not line: + continue + try: + rec = json.loads(line) + except json.JSONDecodeError: + continue + h, d = rec.get("episode_hash"), rec.get("decision") + if h and d in VALID_DECISIONS: + self.decisions[h] = d + + def record( + self, episode_hash: str, decision: str, task: str, lab: str, index: int + ) -> None: + rec = { + "episode_hash": episode_hash, + "decision": decision, + "task": task, + "lab": lab, + "index": index, + "ts": time.time(), + } + line = json.dumps(rec) + with self._lock: + with self.path.open("a") as f: + f.write(line + "\n") + f.flush() + os.fsync(f.fileno()) + self.decisions[episode_hash] = decision + + def counts(self) -> dict[str, int]: + c = {k: 0 for k in VALID_DECISIONS} + for d in self.decisions.values(): + c[d] = c.get(d, 0) + 1 + return c + + +# --------------------------------------------------------------------------- +# Flask app +# --------------------------------------------------------------------------- +INDEX_HTML = """ +Episode QC + + +
+ + accept 0 + reject 0 + uncertain 0 + skip 0 + + a accept   r reject   u uncertain +   s skip   / nav +
+
+ +
hash:  |  task: +  |  current decision: -
+
+ + + + + + + +
+
+
+ + +""" + + +def build_app(cfg, ordered, hash_to_s3, hash_to_task, log) -> Flask: + app = Flask(__name__) + render_locks: dict[str, threading.Lock] = {} + locks_guard = threading.Lock() + + def _lock_for(h: str) -> threading.Lock: + with locks_guard: + return render_locks.setdefault(h, threading.Lock()) + + def _ensure_video(h: str) -> Path: + out = cfg.video_dir / f"{h}.mp4" + if out.exists(): + return out + with _lock_for(h): + if out.exists(): + return out + zarr_dir = resolve_episode_dir( + cfg.dataset_dir, cfg.cache_dir, h, hash_to_s3[h] + ) + render_video( + zarr_dir, + out, + cfg.fps, + cfg.stride, + cfg.max_frames, + cfg.max_width, + crf=cfg.crf, + preset=cfg.preset, + ) + return out + + def _start_prewarm(n_workers: int) -> None: + """Render undecided episodes ahead of time in the background so they're + already cached (only the transfer cost remains) by the time the user + reaches them. Bounded concurrency; skips already-rendered clips.""" + cursor = {"i": 0} + cur_lock = threading.Lock() + + def worker(): + while True: + with cur_lock: + i = cursor["i"] + cursor["i"] += 1 + if i >= len(ordered): + return + h = ordered[i] + if (cfg.video_dir / f"{h}.mp4").exists() or h in log.decisions: + continue + try: + _ensure_video(h) + except Exception: # noqa: BLE001 - keep warming the rest + continue + + for _ in range(n_workers): + threading.Thread(target=worker, daemon=True).start() + + if getattr(cfg, "prewarm", 0): + _start_prewarm(cfg.prewarm) + + @app.get("/") + def index() -> Response: + return Response(INDEX_HTML, mimetype="text/html") + + @app.get("/state") + def state(): + eps = [ + { + "hash": h, + "task": hash_to_task.get(h, cfg.task), + "decision": log.decisions.get(h), + } + for h in ordered + ] + return jsonify(total=len(ordered), counts=log.counts(), episodes=eps) + + @app.get("/video/") + def video(h: str): + if h not in hash_to_s3: + abort(404) + out = _ensure_video(h) + return send_file(str(out), mimetype="video/mp4", conditional=True) + + ann_cache: dict[str, dict] = {} + + @app.get("/annotations/") + def annotations(h: str): + if h not in hash_to_s3: + abort(404) + if h not in ann_cache: + try: + zarr_dir = resolve_episode_dir( + cfg.dataset_dir, cfg.cache_dir, h, hash_to_s3[h] + ) + ep = ZarrEpisode(zarr_dir) + meta_fps = int(ep.metadata.get("fps", 30) or 30) + out_fps = cfg.fps if cfg.fps else max(1, min(meta_fps, 30)) + total = len(ep) + eff_stride = effective_stride(total, cfg.stride, cfg.max_frames) + # The video samples every `eff_stride`-th original frame and plays + # at `out_fps`, so one second of video advances this many ORIGINAL + # frames — used client-side to map currentTime -> annotation span. + ann_cache[h] = { + "labels": _episode_labels(ep), + "orig_per_sec": out_fps * eff_stride, + "total_frames": total, + } + except Exception: # noqa: BLE001 - missing/unreadable annotations -> empty + ann_cache[h] = {"labels": [], "orig_per_sec": 1, "total_frames": 0} + return jsonify(ann_cache[h]) + + @app.get("/prefetch/") + def prefetch(h: str): + if h in hash_to_s3: + threading.Thread(target=_ensure_video, args=(h,), daemon=True).start() + return ("", 204) + + @app.post("/decide") + def decide(): + data = request.get_json(force=True) + h, d = data.get("hash"), data.get("decision") + if h not in hash_to_s3 or d not in VALID_DECISIONS: + abort(400) + log.record( + h, d, hash_to_task.get(h, cfg.task), cfg.lab, int(data.get("index", -1)) + ) + return jsonify(ok=True, counts=log.counts()) + + return app + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- +def parse_args(): + p = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + p.add_argument("--lab", default="mecka") + p.add_argument("--task", default="folding_clothes") + p.add_argument( + "--dataset-dir", + type=Path, + default=DEFAULT_DATASET_DIR, + help="Existing (read-only) shared store of downloaded episodes " + "(= paths.dataset_dir). Episodes found here are never re-downloaded.", + ) + p.add_argument( + "--cache-dir", + type=Path, + default=Path("./qc_cache"), + help="Writable fallback cache for episodes NOT in --dataset-dir.", + ) + p.add_argument( + "--video-dir", + type=Path, + default=Path("./qc_videos"), + help="Local cache for rendered MP4s.", + ) + p.add_argument( + "--out", + type=Path, + default=None, + help="Decisions JSONL (default ./data_quality_review/__decisions.jsonl).", + ) + p.add_argument("--host", default="127.0.0.1") + p.add_argument("--port", type=int, default=5007) + p.add_argument( + "--fps", + type=int, + default=None, + help="Playback fps (default: episode fps, capped 30).", + ) + p.add_argument( + "--stride", + type=int, + default=3, + help="Use every Nth frame (higher = smaller/faster).", + ) + p.add_argument("--max-frames", type=int, default=450, help="Cap frames per clip.") + p.add_argument( + "--max-width", + type=int, + default=480, + help="Resize cap in px (lower = smaller/faster).", + ) + p.add_argument( + "--crf", + type=int, + default=30, + help="x264 quality (higher = smaller file, 28-32 good for QC).", + ) + p.add_argument( + "--preset", default="veryfast", help="x264 speed preset (ultrafast..medium)." + ) + p.add_argument( + "--prewarm", + type=int, + default=2, + help="Background workers that pre-render upcoming episodes so they " + "load instantly. 0 disables. Use more CPU headroom (e.g. on a " + "compute node) to raise this.", + ) + p.add_argument( + "--debug", type=int, default=None, help="Limit to first N matched episodes." + ) + p.add_argument( + "--extra-filter", + action="append", + default=[], + help="Extra filter lambda string (repeatable).", + ) + p.add_argument( + "--list-only", + action="store_true", + help="Print matched episodes and exit (no downloads, no server).", + ) + p.add_argument( + "--print-accepted", + action="store_true", + help="Print accepted hashes from the decisions file as a Python set and exit.", + ) + p.add_argument( + "--print-uncertain", + action="store_true", + help="Print uncertain (flagged-to-revisit) hashes from the decisions file and exit.", + ) + args = p.parse_args() + if args.out is None: + args.out = ( + Path("./data_quality_review") / f"{args.lab}_{args.task}_decisions.jsonl" + ) + # Resolve to absolute paths: Flask's send_file interprets relative paths + # against the app root_path (the package dir), not the process cwd. + args.dataset_dir = args.dataset_dir.resolve() + args.cache_dir = args.cache_dir.resolve() + args.video_dir = args.video_dir.resolve() + args.out = args.out.resolve() + return args + + +def main(): + cfg = parse_args() + load_env() + + if cfg.print_accepted or cfg.print_uncertain: + log = DecisionLog(cfg.out) + want = "accept" if cfg.print_accepted else "uncertain" + hashes = sorted(h for h, d in log.decisions.items() if d == want) + print(f"# {len(hashes)} {want} episodes from {cfg.out}") + inner = ", ".join(repr(h) for h in hashes) + print("lambda row: row['episode_hash'] in {" + inner + "}") + return + + ordered, hash_to_s3, hash_to_task = discover_episodes( + cfg.lab, cfg.task, cfg.extra_filter, cfg.debug + ) + print(f"Matched {len(ordered)} episodes for lab={cfg.lab!r} task={cfg.task!r}") + + if cfg.list_only: + for h in ordered: + print(f"{h}\t{hash_to_s3[h]}") + return + + if not ordered: + raise SystemExit("No episodes matched; nothing to review.") + + cfg.cache_dir.mkdir(parents=True, exist_ok=True) + cfg.video_dir.mkdir(parents=True, exist_ok=True) + log = DecisionLog(cfg.out) + + present = sum(1 for h in ordered if (cfg.dataset_dir / h).is_dir()) + missing = len(ordered) - present + print( + f"Episodes already in {cfg.dataset_dir}: {present}/{len(ordered)}" + + ( + f" ({missing} will be fetched to {cfg.cache_dir} on demand)" + if missing + else "" + ) + ) + done = sum(1 for h in ordered if h in log.decisions) + print(f"Resuming: {done}/{len(ordered)} already decided. Decisions -> {cfg.out}") + print( + f"Open http://{cfg.host}:{cfg.port} (SSH: ssh -L {cfg.port}:127.0.0.1:{cfg.port} )" + ) + + app = build_app(cfg, ordered, hash_to_s3, hash_to_task, log) + app.run(host=cfg.host, port=cfg.port, threaded=True) + + +if __name__ == "__main__": + main()