  ok  GENUINE: a bind AT /romm/assets, quoted                                rc=0 (expected 0)
  ok  GENUINE: an image not in the registry is not judged                    rc=0 (expected 0)
-- image-volumes: decoys and facts (each MUST be refused)
  ok  DECOY: the mount only in a COMMENT                                     rc=1 (expected 1)
  ok  DECOY: the mount on ANOTHER service                                    rc=1 (expected 1)
  ok  DECOY: the PARENT /romm mounted                                        rc=1 (expected 1)
  ok  DECOY: a CHILD /romm/assets/x mounted                                  rc=1 (expected 1)
  ok  DECOY: only a top-level volume, never mounted                          rc=1 (expected 1)
  ok  FACT: a steps/ file without it                                         rc=1 (expected 1)
  ok  FACT: no templates/ at all (nothing to judge)                          rc=3 (expected 3)

FAIL: FACT: a credential token rewritten in translation: rc=0 expected 1; missing ['credential token']
 code-server 52/52, crafty-controller 57/57, dawarich 54/54, docmost 51/51, emby 22/22, ghost 54/54, gitea 54/54, glance 43/43, grafana 50/50, gramps-web 53/53, grimmory 57/57, grocy 54/54, home-assistant 50/50, homebox 50/50, homepage 43/43, immich 59/59, jellyfin 54/54, karakeep 52/52, kimai 53/53, komga 56/56, lubelogger 57/57, mealie 53/53, metube 51/51, n8n 45/45, navidrome 55/55, nextcloud 60/60, nzbget 55/55, onlyoffice 52/52, opengist 49/49, outline 53/53, paperless-ngx 66/66, papra 50/50, plant-it 48/48, plex 57/57, privatebin 45/45, prowlarr 44/44, qbittorrent 54/54, radarr 55/55, radicale 51/51, rallly 48/48, recipe-importer 52/52, romm 74/74, sabnzbd 60/60, seerr 50/50, sonarr 55/55, sparkyfitness 54/54, tandoor 49/49, termix 46/46, transmission 52/52, uptime-kuma 49/49, vaultwarden 56/56, vikunja 50/50, wanderer 52/52, wger 52/52, wishlist 47/47, zipline 52/52
copy-i18n: OK


real	3m12.242s
user	3m6.178s
sys	0m5.255s
1654:        case_copy("FACT: a credential token rewritten in translation", clone,
1655-                  [(WG, lambda t: t.replace("      default_creds: 'admin / adminadmin'",
1656-                                            "      default_creds: 'Sign in: administrator / hunter2'"))],
1657-                  expect_rc=1, must_contain=("credential token 'admin'", "credential token 'adminadmin'"))
1658-        # The value itself reworded (a digit token, CRED_TOKEN), with the account word kept.
1659-        CW = "templates/calibre-web/.felhom.yml"
1660-        case_copy("FACT: a credential value reworded in translation (one digit added)", clone,
1661-                  [(CW, lambda t: t.replace("      default_creds: 'admin / admin123'",
1662-                                            "      default_creds: 'admin / admin1234'"))],
1663-                  expect_rc=1, must_contain=("credential token 'admin123'", "calibre-web"))
1664-        case_copy("FACT: an i18n block for a language the controller does not render", clone,
1665-                  [(PB, lambda t: t.rstrip("\n") + "\ni18n:\n  de:\n    description: \"Verschluesselte Notizen\"\n")],
1666-                  expect_rc=1, must_contain=("renders en only",))
1667-        case_copy("FACT: an English list with a different number of steps", clone,
1668-                  [(PB, en_with("        - 'Share the link you get - the encryption key is inside the URL'\n", ""))],
1669-                  expect_rc=1, must_contain=("a list is replaced",))
1670-
1671-        # THE RATCHET — the one thing --expect-missing does not test for the cases above, so it is
1672-        # tested here explicitly, in BOTH directions. A ceiling that only convicts upwards can be
1673-        # left behind by a push that translated more than it recorded.
1674-        # The ABOVE case REMOVES privatebin's English (2026-10-05): it used to ADD it and rely on the rest
1675-        # of the catalog being untranslated, so the day the catalog reached full coverage (ceiling 0) the
1676-        # tree had nothing missing, the gate rightly said OK, and the case failed on its own premise.
1677-        case_copy("FACT: ratchet — fewer strings translated than the ceiling records", clone,
1678-                  [(PB, strip_en)], expect_rc=1,
1679-                  must_contain=("English coverage", "ABOVE"),
1680-                  extra_args=("--expect-missing", "0"))
1681-        case_copy("FACT: ratchet — more translated than the ceiling records", clone,
1682-                  [(PB, add_en())], expect_rc=1,
1683-                  must_contain=("English coverage", "BELOW"),
1684-                  extra_args=("--expect-missing", "999999"))

[exited with code 0]
