Files
bambuddy/backend
maziggy 4599b6f4b4 fix(backup): read the printer's verdict before counting a K-profile restored (#2656)
`18938a10` on `dev` changed `set_kprofiles_batch` from returning a `bool` to
    returning the sequence_id it published the command under, and moved the
    verdict to a separate `await client.await_cali_ack(seq)` returning
    `(ok, detail)`. Every caller in `api/routes/kprofiles.py` was updated with it.
    `_restore_kprofiles` was not — it still did `sent = client.set_kprofiles_batch(...)`
    and branched on `if sent:`.

    A sequence_id string is truthy, so that compiled, passed, and silently made
    the restore the one path left in the codebase that reports a refused
    K-profile write as saved — exactly the defect `18938a10` closed everywhere
    else.

    Keep the sequence_id, await the ack per batch, and route an explicit refusal
    into `tally.failed` with a new `kprofilesRefused` note carrying the printer's
    own `reason`. Reusing `kprofilesSendFailed` would have been wrong: the
    command was sent, and the printer answered.

    Silence still counts restored. That is `await_cali_ack`'s own contract and
    the maintainer's rule — no answer is not evidence of refusal, and firmware
    predating the ack never answers. An exception reading the ack degrades the
    same way rather than inventing a failure out of a write that most likely
    landed.

    `kprofilesAckUnreliable` is reworded to match: a refusal is now believed, so
    the caveat narrows to what is genuinely left uncertain. The ack is only worth
    reading at all because `18938a10` also changed the payload's `tray_id` from
    `-1` to `0` — single-nozzle firmware answered `result: "fail"` to `-1` on
    writes that demonstrably applied. This restore builds no `tray_id` of its
    own, so it inherits that fix for free.

    Tests: 4 regression (the ack is awaited for the returned sequence_id; a
    refused batch counts failed and surfaces the printer's reason; one refused
    nozzle does not condemn the other; the reworded caveat) + 3 controls (a
    silent printer still counts restored; an unreadable ack does not fail the
    batch; `None` keeps the existing send-failed path and awaits nothing). All
    four confirmed failing against the pre-fix service.
2026-08-15 14:15:45 +02:00
..