Files
Patrick CasinoandClaude Opus 4.7 397286be6f feat(node): B1-FIX-1 — multipart POST + 431 safety-net message
Node now POSTs to arcIngest as multipart/form-data with 'image' (raw
PNG bytes) and 'metadata' (JSON object) parts, matching the server's
multipart-only transport that landed today on the platform side. The
legacy header transport (X-Arc-Generation-Metadata base64-encoded)
had a quiet GFE 431 cliff that fell over on the first real ComfyUI
workflow.

Changes:

  nodes/arc_save.py
    - _post_to_arc_ingest: builds multipart body via requests'
      `files=` kwarg. Image part carries a filename ("image.png") so
      it surfaces as a busboy 'file' event on the server; metadata
      part uses filename=None so it arrives as a 'field' event
      (server handles both shapes). Content-Type header drops away
      — requests sets it automatically with the boundary parameter.
    - X-Arc-Title header stays as-is (small, bounded; no cliff risk).
    - 431 safety-net: explicit error message when status == 431,
      pointing the creator at the issues URL. Trim per operator
      direction: just the issue-report pointer, no workaround
      paragraph (the multipart path means there is no real workaround
      to suggest until the bug is fixed upstream).
    - base64 import removed (was only used for the legacy header
      encode).
    - Trailing dash on the generic non-200 path replaced with a
      hyphen so the "trailing into a dash" reading from the B1-FIX-1
      diagnostic can't recur on truncated bodies either.

  tests/test_save_smoke.py
    - Docstring refreshed to record the multipart transport. The
      smoke goes through save() so it inherits the new transport
      automatically; no header-transport assertions remain (and none
      existed at the smoke layer in the first place — the test
      asserts on the receipt shape, not the wire encoding).

Live smoke against the just-deployed server reached the auth check
(traceId 4d9e90b51b1f464c37fa8ff401c2234a, ingest.auth_failed reason
"revoked"). That proves the multipart transport hit the function —
no 431 at GFE, no 415/400 from the parser. The 401 itself is operator-
side key state (the arc_config.json key was revoked in a prior pass);
re-issuing a fresh key from the Credentials surface will let smoke
re-pass against the new transport.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-12 17:36:36 -04:00
..