Skip to content

Size-only bed-fit statements are not placement-aware #91

Open

Description

@DVOpenLabs

Problem

Several bed-fit statements are based on the model's overall size only: intelligence.project_info (shown by Design Health), the bed-fit path in service.py, bed_fit.py, and validation_report.py. They compare the x/y/z extents with the printer's bed size.

That answers "is the model small enough for the bed". It does not know where objects sit on the plate:

  • A small object that has been moved off the plate can still be reported as fitting by these size-only checks (the placement checks report it separately).
  • When a project has several separated objects or plates, the combined extents can be much larger than any one object, which can produce "scale or split" advice that is not about a single object.

Context

Found while planning the read-only 3D project inspection. The scene contract (scene/1) will provide placement-aware findings per instance. The size-only consumers are unchanged by that work except for a units correction (a 12-inch part must be 304.8 mm, not 12 mm).

Proposed follow-up

Separate "size of an object" (intrinsic, per object, in millimetres) from "placed bounds" (per instance and plate), and make each consumer say which one it is using. Add regression tests for translated, separated and multi-plate projects.

Not part of

The viewer and scene contract pull requests. They state the limitation in their descriptions.

Activity

  1. added a commit that references this issue on Oct 22, 2026
  2. DVOpenLabs commented on Oct 22, 2026

    @DVOpenLabs
    OwnerAuthor

    Reopened: #104 (merge 22334b9) closed this issue automatically, but its criteria are only partly met.

    Fixed and verified (merged main)

    • Object size and placed bounds are separate. Each object is sized on its own (untransformed, per object and per part, so two parts with the same object id keep distinct sizes, e.g. 10 mm and 50 mm), and a combined extent across separated objects is never used for 'scale or split' advice.
    • Placement is judged per instance and per plate, with height and below-plate checks, and says 'By size' or 'By placement' in every statement. A small object moved off the plate is reported by placement, not as 'fits' by size.
    • Design Health shows 'Not checked' on every path where the size is not established (including no overall dimensions with per-object sizes).
    • Placement findings carry stable condition ids and their own actions; they never receive keyword-matched community fixes. An unavailable bed fit is listed under 'not verified' in the Intelligence Report.
    • Evidence: full backend suite 3718 passed, 49 skipped, 0 failed (an earlier run at the pre-merge head had 1 failure, since adapted); desktop tsc clean, vitest 1185 passed; all 8 CI checks green on the merged head; independent Opus and Sol review of the integration and repair deltas, no blocking finding.

    Not met / limitations (RC2 geometry guard keeps these 'not checked')

    • Non-millimetre projects: no size, placement or bed verdict.
    • Rotated, scaled or sheared items: no placement or bed verdict; a rotated mm part placed off the plate now gets 'not checked' rather than a specific off-plate result.
    • Structure the guard cannot follow, including build items that name their part (p:path): placement is 'not checked'. Part sizes are still read, but no per-instance verdict. This is reduced placement coverage, not full support.
    • Known gaps from review, not fixed here: the Intelligence Report verdict and summary lines still read 'found no risks' when only the bed fit was unavailable (the 'Not verified: Bed fit' line is shown); the 'N build items could not be measured' warning has no condition id or action; when several plates are oversized they merge into one risk (all plates stay in its evidence); Design Health still judges against the connected printer's bed_mm axis travel rather than a printable area.
    • Multi-plate placement was not checked against Orca's own plate layout.

    Keeping this open until the not-checked cases have a real, guarded size basis.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions