Skip to content

Spec/behaviour mismatches found in full 47-endpoint hardware sweep #47

Description

@takusaito-ctrl

Environment: ILCE-7M5 · USB · Camera Remote SDK V2.02.00 · linux-arm64 (Raspberry Pi) · server 3.0.0

Full sweep of all 47 OpenAPI operations against live hardware. 40 behaved exactly per spec. The critical failures are filed separately (#40, #41, #42, #43, #44, #46); this issue collects the smaller contract mismatches, each independently reproducible.

Status codes / validation

  • /actions/button does not validate against the operable-key list. The camera reports 24 operable keys, but delete, c7, home, thumbnail, slot-select and display all return 200 "pressed" regardless. The spec promises 400 plus data.supported_buttons — that list is returned correctly for names outside the enum, so only the operable-key check is missing.
  • POST /connection with an invalid mode returns 200 "Camera already connected" when a camera is connected: the already-connected short-circuit runs before mode validation. Correctly returns 400 when disconnected.
  • GET /properties/all for an unknown camera returns 200 with success:false. Spec says 400.
  • GET /live-view/frame serves a cached JPEG with 200 after stop + disable, with status confirming streaming:false, enabled:false. Spec says 404.

Response body inconsistencies

  • /actions/zoom returns camera:{connected:false,model:"",id:""} on a successful call with a live camera. The same empty block appears on GET /properties/{unknown} and on focus-near-far validation errors.
  • /actions/touch returns x/y as strings; /af-area-position returns them as integers. Same conceptual value, two types.
  • PUT /properties/aperture {"value":"0x190"} replies "Aperture set to f/0x190" — the message blindly prefixes f/ without formatting the raw value. The set itself works correctly.

SSE event catalog

  • transferProgress payload does not match the spec. openapi.yaml:1304 documents {cameraId, contentId, fileId, percent, savedPath?}. The server actually emits {percent, notify, filename} (CameraDeviceRest.cpp:1471-1480), and the polling fallback adds synthetic:true (line 1554). None of cameraId, contentId, fileId or savedPath are present.
  • propertyChanged carries {codes, count} and disconnected carries {} — the catalog says both include cameraId.
  • Undocumented events observed in the wild: warning (e.g. {"code":"0x20011","message":"Captured_Event"}) and cautionDisplay.
  • lutImportResult and settingsResult are referenced in endpoint descriptions but missing from the event catalog table.

Confirmed correct (for the record)

  • af-area-position clamping matches the documented model exactly; on this body 0,080,72, usable x ≈ 80-559.
  • settings/upload: 200 + reboot warning, then SSE settingsResult {"operation":"read","success":true}, then disconnected.
  • settings/download wrote a 198 KB .DAT file.
  • movie-rec toggle verified against the recording-state property.
  • Live view 1024x680; OSD composite 720x480 with full camera UI rendered.
  • Thumbnail (160x120) and screennail (1616x1080) pulls work — until RemoteTransfer full-size download silently never completes and latches the whole subsystem into 0x8D03 #40 latches 0x8D03.
  • 0x8D02 (ContentNotFound) is surfaced with a genuinely helpful message.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions