Skip to content

Conversation

@ddcc4
Copy link
Collaborator

@ddcc4 ddcc4 commented Nov 6, 2025

Changes from PD 8.6.3 and RS 8.8.0 from the past few days.

ddcc4 and others added 11 commits November 4, 2025 15:57
…ks (#20034)

# Overview

(This is Part 6 of tiprack definition fixes for PD.)

The problem we're trying to solve:
`Hydrated{MoveLiquid/Mix}FormData.tipRack` contains the URI of a
tiprack, which could be standard or custom labware. Then the lower-level
functions have to look up the tiprack definition for that URI. There are
3 ways they try to do that:

1. Get the definition from `InvariantContext.labwareEntities`.
2. Get the definition from `PipetteEntity.tiprackLabwareDef`.
3. Get it from `getAllDefinitions()[tiprackURI]`.

The problem with (1) and (2) is that the tiprack is removed from
`InvariantContext` and `PipetteEntity` when the user unselects a tiprack
from the pipette, but a step form can still refer to the deleted
tiprack's URI. The problem with (3) is that `getAllDefinitions()` only
contains standard labware, and doesn't work for custom tipracks.

We could solve this problem if any function could look up a tiprack
definition whenever it needed to, whether the tiprack is custom or not.
But PD does not make that easy. The custom tiprack definitions are
available in `BaseState`, but most functions only have access to the
`InvariantContext`, which does **not** have all the custom labware
definitions.

I think the best approach is to **hydrate the tiprack definition into
the `HydratedMoveLiquidFormData/HydratedMixFormData`**. So this PR
changes `.tipRack` from a URI string into a tiprack labware definition.
Then any function using `Hydrated*FormData` would have the tiprack
definition without having to implement its own lookup.

(There is a precedent for this: we do the same thing when we hydrate
`.pipette` in `Hydrated*FormData`, turning the field from a string into
a `PipetteEntity`.)

In order to hydrate the tiprack definition into
`Hydrated*FormData.tipRack`, we need to pass the labware definitions
down to the hydration functions, which this PR does by calling the
`getLabwareDefsByURI()` selector.

## Test Plan and Hands on Testing

Tested PD by hand locally.
Ran all the CI tests.

## Risk assessment

Low-ish. This PR doesn't change any functionality yet, it just hydrates
the tiprack definition into `Hydrated*FormData`. An upcoming PR will
change the low-level functions to use the hydrated tiprack definition in
`Hydrated*FormData.tipRack`.
…Definitions() [cherrypick] (#20044)

# Overview

This is a cherry-pick of PR #19916. In that PR, I said that I would only
apply that change to `edge`, and leave the PD branch alone because
`chore_release-pd-8.6.1` was frozen and about to be released, and the
files with the obsolete call were not used by the PD CI tests at all.

Well, it turns out that a change I want to make to the PD branch now
does trigger the `hardware-sim/` tests for some reason:
https://github.com/Opentrons/opentrons/actions/runs/19088629372/job/54534570318

So now I need to cherrypick this change back into the PD branch.

## Test Plan and Hands on Testing

CI really really hard.

## Risk assessment

Low-ish.

(cherry picked from commit 04e051d)
…Def instead of URI (#20039)

# Overview

The `getMaxConditioningVolume()` function previously took a tiprack URI
and tried to look up the tiprack definition in `labwareEntities`.
However, that could be unreliable if the tiprack URI refers to a tiprack
that has been removed from the deck, because the tiprack would no longer
be in `labwareEntities`.

Now that the tiprack definition is available in the hydrated form, this
PR changes `getMaxConditioningVolume()` to just take in the tiprack
definition directly instead of trying to look it up in
`labwareEntities`.

## Test Plan and Hands on Testing

Smoke tested PD running locally.
Ran `yarn vitest --silent=false step-generation/ protocol-designer/ app/`.
Will run CI tests.

## Risk assessment

Low-ish.
…irectly (#20047)

# Overview

`getMatchingTipLiquidSpecs()` takes a tiprack URI string, and tries to
find the labware definition for the tiprack. This has been causing a ton
of failures because the tiprack might not be in
`PipetteEntity.tiprackLabwareDef` (if the tiprack has been disassociated
from the pipette) nor in `InvariantContext.labwareEntities` (if the
tiprack has been removed from the deck). A previous bandaid tried to
fall back to looking up the tiprack in `getAllDefinitions()` (PR
#19874), but that would still fail if tiprack is custom, because
`getAllDefinitions()` only contains standard labware.

In this final long-term fix, we change `getMatchingTipLiquidSpecs()` to
take in the tiprack definition instead of the tiprack URI string. The
caller is responsible for supplying the correct tiprack definition:

- When the caller is using the `HydratedFormData`, such as in
`mixFormToArgs.ts` and `moveLiquidFormToArgs.ts`, the caller can just
get the tiprack definition from `HydratedFormData.tipRack`. We
previously changed hydration to put the tiprack definition into
`.tipRack` (PR #20034), and that works correctly for both custom and
default tipracks.

- When the caller is using the `rawForm`, such as in
`StepFormToolbox.tsx` and other React components, the caller can
`useSelector(getLabwareDefsByURI)` to get the tiprack definition. This
selector returns both custom and default labware, so it also works
correctly.

Sorry this is kind of long.

## Test Plan and Hands on Testing

Updated unit tests.
Ran `yarn vitest --silent=false step-generation/ protocol-designer/ app/`.
Smoke-tested PD running locally.
Will run CI tests.

## Risk assessment

Low-ish.
…tMatchingTipLiquidSpecsFromSpec() (#20048)

# Overview

The last one!

Back in PR #19041, @ncdiehl introduced `getMatchingTipLiquidSpecsFromSpec()`,
which was almost an exact a copy of `getMatchingTipLiquidSpecs()`
except that it looked up the tiprack definition differently, because
Nick's `getMatchingTipLiquidSpecsFromSpec()` did not have access to the
`PipetteEntity.tiprackLabwareDef`.

After the recent refactorings, the caller passes in the tiprack
definition into both `getMatchingTipLiquidSpecs()` and
`getMatchingTipLiquidSpecsFromSpec()`, so now there is no difference
between the 2 functions anymore.

So this PR merges the 2 functions together and eliminates
`getMatchingTipLiquidSpecsFromSpec()`.

## Test Plan and Hands on Testing

Run CI tests.

## Risk assessment

Low.
# Overview
Thought I had added these checks to everything but only added them to
dynamic mix.
…20051)

Covers EXEC-2032
Ensures the live stream is visible during run setup, and that live stream restarts if run specific enablement occurs in run setup.
# Overview

This PR enables mixpanel tracking for 
We will track
- Camera enablement & settings
- Photo usage
- Live feed usage
- Photo access and management

## Test Plan and Hands on Testing

- View analytics of robots in office on mixpanel

## Changelog


## Review requests

- Ensure I am not missing any spots in the code base where a camera
action can be set.
- How do I get livestream open duration time?

## Risk assessment

low
Lots of conflicts:
- components/src/hardware-sim/Pipette/PipetteRender.stories.tsx
- protocol-designer/src/form-types.ts
- protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/StepTools/MoveLiquidTools/SecondStepsMoveLiquidTools.tsx
- protocol-designer/src/pages/Designer/ProtocolSteps/StepForm/index.tsx
- protocol-designer/src/steplist/fieldLevel/index.ts
- protocol-designer/src/steplist/formLevel/handleFormChange/utils.ts
- protocol-designer/src/steplist/formLevel/stepFormToArgs/mixFormToArgs.ts
- protocol-designer/src/steplist/formLevel/stepFormToArgs/moveLiquidFormToArgs.ts
- protocol-designer/src/steplist/formLevel/stepFormToArgs/test/mixFormToArgs.test.ts
CaseyBatten and others added 2 commits November 6, 2025 15:48
…agnostic (#20066)

Covers EXEC-2031

Implements file name validation and formatting for image files.
…volume is out of bounds (#20056)

# Overview

Add a default value for the thermocycler max block volume when the found
well volume is out of bounds

## Test Plan and Hands on Testing

Simulated protocol
`/Users/rhyannclarke/opentrons/abr-testing/abr_testing/protocols/active_protocols/4_Illumina
DNA Enrichment.py` with apiLevel to 2.27 and received this error:
`ProtocolCommandFailedError [line 299]: Error 4000 GENERAL_ERROR
(ProtocolCommandFailedError): InvalidBlockVolumeError: Thermocycler max
block volume must be between 0 and 100, but got 150.0.`

After the change was made, the protocol simulated successfully with
`start_set_block_temperature()` and `set_block_temperature()`

## Changelog

- Added default block temperatures based on if it was higher than the
max or lower than the min


## Risk assessment

low

Closes RQA-4820
@codecov
Copy link

codecov bot commented Nov 6, 2025

Codecov Report

❌ Patch coverage is 39.04959% with 295 lines in your changes missing coverage. Please review.
✅ Project coverage is 57.07%. Comparing base (35af6b1) to head (d0b2708).
⚠️ Report is 52 commits behind head on edge.

Files with missing lines Patch % Lines
app/src/organisms/ODD/CameraSettings/index.tsx 0.00% 40 Missing ⚠️
...ux-resources/analytics/hooks/useCameraAnalytics.ts 54.66% 34 Missing ⚠️
...evices/RobotSettings/RobotSettingsCamera/index.tsx 4.00% 24 Missing ⚠️
...r/src/steplist/formLevel/handleFormChange/utils.ts 9.52% 19 Missing ⚠️
app/src/resources/dataFiles/useImageInfo.ts 0.00% 18 Missing ⚠️
...eGalleryContainer/GalleryContainerOverflowMenu.tsx 0.00% 17 Missing ⚠️
...ms/Desktop/Devices/HistoricalProtocolRunDrawer.tsx 0.00% 13 Missing ⚠️
.../Desktop/LivestreamViewer/LivestreamInfoScreen.tsx 29.41% 12 Missing ⚠️
...nt/ActionButton/hooks/useActionButtonProperties.ts 0.00% 11 Missing ⚠️
...HeaderModalContainer/useRunHeaderModalContainer.ts 0.00% 11 Missing ⚠️
... and 17 more
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             edge   #20063      +/-   ##
==========================================
- Coverage   57.31%   57.07%   -0.25%     
==========================================
  Files        3539     3552      +13     
  Lines      295419   298606    +3187     
  Branches    42154    42980     +826     
==========================================
+ Hits       169319   170420    +1101     
- Misses     125820   127906    +2086     
  Partials      280      280              
Flag Coverage Δ
protocol-designer 19.44% <12.80%> (+0.73%) ⬆️
step-generation 5.47% <0.00%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...ktop/Devices/HistoricalProtocolRunOverflowMenu.tsx 83.94% <100.00%> (+0.79%) ⬆️
...ganisms/Desktop/Devices/Peripherals/CameraCard.tsx 99.13% <100.00%> (+0.16%) ⬆️
...tocolRun/ProtocolRunCamera/LaunchLivestreamBtn.tsx 94.44% <100.00%> (+2.13%) ⬆️
...op/Devices/ProtocolRun/ProtocolRunCamera/index.tsx 94.00% <100.00%> (ø)
...op/Devices/ProtocolRun/ProtocolRunHeader/index.tsx 94.04% <ø> (ø)
...ms/ODD/CameraSettings/UsagePreferencesSettings.tsx 100.00% <ø> (ø)
...s/ODD/RobotSettingsDashboard/CameraPreferences.tsx 91.66% <100.00%> (+0.75%) ⬆️
.../src/pages/Desktop/Devices/RobotSettings/index.tsx 79.10% <100.00%> (+0.15%) ⬆️
app/src/pages/ODD/RobotSettingsDashboard/index.tsx 46.83% <100.00%> (+1.02%) ⬆️
app/src/redux-resources/analytics/hooks/index.ts 100.00% <100.00%> (ø)
... and 38 more

... and 125 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Contributor

@mjhuff mjhuff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you as always!

# Fix Slack notifications to prevent workflow failures

Fixes two issues with Slack notifications:

1. **Added missing `webhook-type` input** to `simple-build-alert` action
(required by `slackapi/[email protected]`)

2. **Made all Slack notifications non-blocking** by adding
`continue-on-error: true` to 5 notification steps in
`app-test-build-deploy.yaml`

Slack notification failures will no longer cause workflow failures,
while still logging warnings for debugging.
@ddcc4 ddcc4 merged commit 5039c78 into edge Nov 7, 2025
242 of 243 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants