{"number":139,"title":"Flow: a pipeline pinning an image nobody holds fails a check (#137)","body":"Closes #137 (Metal Gear's feedback, 2026-10-11): metalgear #289 landed a pipeline pinning image 9b16895c… that neither the hub nor a runner held, and run #178 queued until I pushed it.\n\nA run whose jobs pin an image held by neither the hub nor any runner sets a failing `pipeline/images` check on its state: *neither the hub nor a runner holds image 9b16895c8bee: send it with flow rootfs push HASH*. A proposal built on that state shows it before it lands; a later run of the state turns the check to passed once the image is held. To avoid false alarms, it says nothing unless some runner is known and every runner reports what it holds (both of ours do), and nothing at all when every image is held.\n\nTest: `a_pipeline_pinning_an_image_nobody_holds_fails_a_check`. Hub gate green (171 tests with it). Bookmark is main's heads (d7b9a629) plus this change.","author":"andymccall","state":"landed","target":"main","source":{"kind":"bookmark","bookmark":"image-check"},"changes":[{"hash":"1c8276b903141bd49f9b744e8c2e41d7e5c4a58c3208a0866714da894b79528a","message":"Flow: a pipeline pinning an image nobody holds fails a check\n\nA run whose jobs pin an image held by neither the hub nor a runner (when\nevery runner reports what it holds) sets a failing pipeline/images check\non its state, naming the images and saying to send them with flow rootfs\npush, so a proposal pinning a new image shows it before it lands instead\nof its runs queueing for good; a later run of the state turns the check\nto passed once every image is held.\n\ncloses #137","author":{"name":"Andy McCall","email":"mailme@andymccall.co.uk","key":"8bc05e0a32a86508708a7dffa1fdccee1f6601e8c8395275244a6c48a9684c8c","account":null,"note":"signed by a key not linked to any account; its owner links it under Settings → Keys (/settings/keys)"},"when_ms":1791766160232,"deps":["20b8fe85888b0cfd4f91c6884cbf43750f98a00daa52f0dd0cca7d40cc192ce6","42fa95540468b40f1710f40f1a79b1bea010c68de2bf9551876f2134644f8e09","501d8b268dd41fb957743014aff920aa0e26226d075e1d2fff07ebf54a46f65e","92a797b20912c4c3ae63111a9ad18c3499f0c12ceb7fb95afe42866579556908","93be9ce4653e32704c445475b3b3df34b72e8ca28723cb602770522bb7f71bf6","a0d4bbfbedd151cb19737a2893e56a5b8b1b19b286c3da4f59cc16b1bc7c9cb7","cc19697f8871064ada7194955455ed9ecd2a053bcc4410f657c9bcecc900e774"],"head":false,"signature":{"status":"valid","key":"8bc05e0a32a86508708a7dffa1fdccee1f6601e8c8395275244a6c48a9684c8c","sealed":false,"revoked":false}}],"projected_heads":["045f967db8f21b2aa9376e88e4e66ac266c50aa63685fa1bca479ffbe8cb8bf6","1b3a00986a5af27d50714ac69a47297eb1eea88fa1017ee53bbc8d963d723859","1b770a1fecf00ba25f4dec05fffd399e8805234618e48ded335d64c955bb5374","1c8276b903141bd49f9b744e8c2e41d7e5c4a58c3208a0866714da894b79528a","1d9702887eee79babadd1a7aa8314ef4500def25217c5137a4ee5587f8be3db0","1e23d0105921f536b1cf0483972849e0255efeb89b7f53656e36d2a8839ca14d","1f8a37d351abb70f0859612ff821a4083a9b45697ff86920af2057c91f668988","20c36ed92b6b052a02ef585998dc7e42b857a014d92920c913f3507ba345a620","260c33b4b6c4d8d23000b3d146fed71ec748a95dc6fc058119ed2a7c1627d31f","2d58f17e728b4125bbd7b5d2be9c692536e336f53bd3b34dc56f0361b38b50df","3e5cd2eba62654482a1214b1c387ffce03fa802047622660d17878689e42007f","56a786aa42f1e2a8c6da70e1acbc76edc81a8c746294d06d9c1be6fa6725e2bf","59338826539ca185be617d96deaa09a2b24a32c37bc11d57c3ecf5a32679f606","67b24adbf35ad837aba115aadba8fac7993f2ccb4e7362d60505d2cc28b7cbee","6978fd76a0666e56bc28171db3f8add9e346ebe90497646c92b8ab10c99a28dc","6ff755541a622b944b170f3a83dfb95ecf972a4387dd77ff481a34df28e05e82","72cde3da4176aff69eecc9cc4a625aa277dc22cd4cd5728ab1e18d0646135100","73beb84b202a8785d9caf0bb65e04c2feb6ae60cea0d5779133cba332a033cb8","7829b7c7bb59af96323959718722bbba411100c09f667e3bc3ce85110d822c18","883c77eaf2c9645cf8a634948c37c5b94942a4756d7810494c5d8998ba62eac1","8a2dbcb56246f568de32a5360d2f8be66bb9704909ce1b5cebb1f3051863f33b","92cea629fdf6614fe819c850b117a530402d079bc5dfc690ddacb0fe044fd336","967ef74f6fd9847b2d48a7a20b27bade903fe122f34d4eab7e48efb5242a0020","9991530b4beee381b95233964971965ad66ac833968f4c8f1fdbf4f1c2fb1713","9bc6b4720fc12185874a9710b310ddb36d2625cd86d653d23783b960915ef19d","a0dd06b0094eb52d4347f6bde0572de667a0d2cbac5878d9e6928ec3bba09947","a7c05940ebc4ba5c73eb14afcc7579680e1cdb53995e464db10d617e055c5d57","ad01845c4bf86859c3072a48277436580de78bbfe6ea6bc85de9b350522bf92b","ae138eea7a71055eed1bdb63b016828e6bbe2de7ff2b8b06a741ebeaa759e950","b210727578e88cb6d475b2ade065de6cbba939321382c491ea36e361a305d246","bd630386001ed3d0fc0d03c01548c193a2297f90b6fedb00b5883259f9ca1ad0","c0fac31d36fdfab3f7af0bcfc213767a973f016769e353538c30bfab90edd7fb","c21ef37dd4a0641cafb7fe4cf430093934e416d10b582d4183d9c30f722f42e5","c2732e07323b52f2491200ad8989352bc6fc6834c4d97a21e550b3abbe0acafb","c33dbd9a0d38f03313995c1259c16adbd34571f06efe1a71438b51783f1d7b36","c95446a17fddd892eaaa5513071c20ea4d154b748a7e0df5116d8e067ef834b2","c96b32865000b248ff1a38c6fd459d2f7e2bf4171f29e0e2cb3a9b988f0abbc1","cefb0ea24511445166d0db129929255276092d452c7832e877235b49fcdc5881","d336629ffa906b6783adf44337015e3c3d9d4437a6a4f97734367f903674db51","d94449e42718409b41ab98335c6641b2b4429332e8a1cab535e76467509986b4","db72849cd22e82e6160e21528548f9766cf4b10867415ce1b2fe177bfa05e71f","e1078e99c5604bb12c431c02dacb6fba8ea2a0515abe39b3accedd23c78af9ac","edcef27575a73e6acece529d1c0d3bb9f3509123de1a2c049ef4c0dd28b38bba","efb51b39db1c38e7b881f05a1ce1c46d09dc3317349df6ebfd24a2c6d12279db","f5c4433783335420787bf7c185fdc00ce8b856d2b57945ae841c88e94e8537ec","ff656953017324d89ff345da2edecab2eec2f200d4f87bd01d485294f33b8b36"],"projected_state":"43a797d99cf5e5e8508810ccbec1d3e84b08a38962b82d25f36adc4a213fc476","conflicted":false,"approvals":[],"landable":false,"blockers":[],"created_ms":1791766454441,"updated_ms":1791797614683,"url":"https://oxygenhub.io/andymccall/oxygenhub/proposal/139","repository_url":"https://oxygenhub.io/andymccall/oxygenhub","source_url":null,"landed":{"by":"andymccall","via":"api (token Claude)","when_ms":1791797614683},"auto_land":null,"requested_reviewers":[],"labels":[{"name":"feature","colour":"#0064e0","description":"Something new"},{"name":"gap","colour":"#8592ad","description":"Found by using the platform for real"}]}