{"number":46,"title":"flow rootfs push and pull use the login oh already saved (#44)","body":"Closes #44 (Metal Gear's feedback, 2026-10-11).\n\n`flow rootfs push` needed `$OXY_TOKEN` though `oh auth login` had saved a login for that hub on the same machine. With no `OXY_TOKEN`, push and pull now take the token and CA from Oxygen's credential store (`oxy_core::credentials`, what `oh` and `oxy` use), and the hub from `--hub`, `OH_HUB` or the runner's config. With none: 'no token for HUB: sign in with `oh auth login --hub HUB`, or set OXY_TOKEN'.\n\nChecked by hand: with OXY_TOKEN unset, `flow rootfs pull <unknown> --hub https://oxygenhub.io` signed in with the saved login (the hub answered 'does not hold image', not 401). Gate green (54 tests, clippy, fmt). Bookmark is main's heads plus this change.","author":"andymccall","state":"landed","target":"main","source":{"kind":"bookmark","bookmark":"push-uses-login"},"changes":[{"hash":"e38bb032e38bad40c6499ec6191b1043dbb4f2379d7d57d58eb597e325da3d8f","message":"flow rootfs push and pull use the login oh already saved\n\nThey needed $OXY_TOKEN although oh auth login had saved a login for the\nsame hub on the same machine. With no OXY_TOKEN they now take the token\nand CA from Oxygen's credential store, as oh and oxy do, and the hub\nfrom --hub, OH_HUB or the runner's; with none, they say to sign in with\noh auth login.\n\ncloses #44","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":1791764483615,"deps":["4cf0c99a1486e32d3395552e851e5eb55af06d9ed5e909c980cd26b60c43942f","e0918b887850318bed4bbbc69e984e037b20bdff738ad75435012e75be400c40"],"head":false,"signature":{"status":"valid","key":"8bc05e0a32a86508708a7dffa1fdccee1f6601e8c8395275244a6c48a9684c8c","sealed":false,"revoked":false}}],"projected_heads":["1a1793bdfcc0947a2087336052330ea31bb43d0bb4f2b8efd6254bb2bc80de96","22007df200f30dd8e9c66979c132785fda99bbe3223cdaa8caec651d9bd54617","39dba8493cb076474a26e0ef752764053bde97678b581074594ca64f825c6185","3b9dddc92057914023d77830272fd4f996331cfa20899c2977845b926275ada4","59078d2b8d46ac771ab994acfee19435d59761da77c9738138e8f996d3299370","602ac9c8ed1ddee7f98e75b3fc3972df0c85625e8ac3d6dba5405f4e49657a63","630ee66034b2a27711318b21906453680d01c5fa58e43beb5e98560a30a0948a","6d53fb7d00eca0eeaf62fe6094a88849c03bd2e57846f9e747224566cf5b1001","701dcbc5d4688324d95fadf4968fdfad31d119e5bb516213e2485492b28f02cf","8f211e20bea5e995d04f82b9aab8961aea9b729aafe87a2894cadba90cd0c722","ab3204b9974bba7d93682a006d2d88fc713dd77052440e87687c16a344ae264c","acf7f363f19ec1f8bce05b82f6f447d758392ad36886b9a2f4c6498b21390c43","e38bb032e38bad40c6499ec6191b1043dbb4f2379d7d57d58eb597e325da3d8f","f2609cf795d80aae88e715e237d4ac48404454b2060e27bbb96dcdad5fbc97a6","f3b4fdeb2bc21583e58191fb9ea2314236f472de8d70333cbe2f8e45ee167b43","fad6152112b1a233d612513185a904d116fc9e83b25bfc96c418090f50a55eda"],"projected_state":"0b4557bd19d637edcfc012382c21ada17152f4add035139b9f8c402c7716f696","conflicted":false,"approvals":[],"landable":false,"blockers":[],"created_ms":1791764484567,"updated_ms":1791796971926,"url":"https://oxygenhub.io/andymccall/oxygenflow/proposal/46","repository_url":"https://oxygenhub.io/andymccall/oxygenflow","source_url":null,"landed":{"by":"andymccall","via":"api (token Claude)","when_ms":1791796971926},"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"}]}