Skip to content

refactor(api): Port tip consumption to StateUpdate#16469

Merged
SyntaxColoring merged 9 commits intoedgefrom
port_tip_state
Oct 11, 2024
Merged

refactor(api): Port tip consumption to StateUpdate#16469
SyntaxColoring merged 9 commits intoedgefrom
port_tip_state

Conversation

@SyntaxColoring
Copy link
Copy Markdown
Contributor

@SyntaxColoring SyntaxColoring commented Oct 11, 2024

Overview

A refactor towards EXEC-758 and EXEC-764.

Test Plan and Hands on Testing

  • Make sure analysis snapshot tests continue to pass, indicating that tip tracking has not changed.

Changelog

  • TipStore was looking for PickUpTipResults to track tips being consumed from tip racks. Convert this to use the newer StateUpdate mechanism.
  • Various other small refactors. See the commit messages for details.

Review requests

None in particular.

Risk assessment

Low if tests pass.

@SyntaxColoring SyntaxColoring requested a review from a team October 11, 2024 17:11
@SyntaxColoring SyntaxColoring requested a review from a team as a code owner October 11, 2024 17:11
Comment on lines +32 to +41
# todo(mm, 2024-10-10): This info is duplicated between here and PipetteState because
# TipStore is using it to compute which tips a PickUpTip removes from the tip rack,
# given the pipette's current nozzle map. We could avoid this duplication by moving the
# computation to TipView, calling it from PickUpTipImplementation, and passing the
# precomputed list of wells to TipStore.
@dataclass
class _PipetteInfo:
channels: int
active_channels: int
nozzle_map: NozzleMap
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Does this seem like a reasonable plan?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yes, definitely

Copy link
Copy Markdown
Member

@sfoster1 sfoster1 left a comment

Choose a reason for hiding this comment

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

Looks good, and agree with the path forward

Comment on lines +32 to +41
# todo(mm, 2024-10-10): This info is duplicated between here and PipetteState because
# TipStore is using it to compute which tips a PickUpTip removes from the tip rack,
# given the pipette's current nozzle map. We could avoid this duplication by moving the
# computation to TipView, calling it from PickUpTipImplementation, and passing the
# precomputed list of wells to TipStore.
@dataclass
class _PipetteInfo:
channels: int
active_channels: int
nozzle_map: NozzleMap
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

yes, definitely

Copy link
Copy Markdown
Member

@sanni-t sanni-t left a comment

Choose a reason for hiding this comment

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

Makes sense to me

Comment on lines -82 to -93
if nozzle_map:
self._state.active_channels_by_pipette_id[
pipette_id
] = nozzle_map.tip_count
self._state.nozzle_map_by_pipette_id[pipette_id] = nozzle_map
else:
self._state.active_channels_by_pipette_id[
pipette_id
] = self._state.channels_by_pipette_id[pipette_id]

elif isinstance(action, FailCommandAction):
self._handle_failed_command(action)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Oh nice! Is NozzleMap always available now? I think there was some state that had nozzle map optional even though I think the map was indeed available.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Oh nice! Is NozzleMap always available now?

Yep, for the purposes of TipStore, at least.

I think there was some state that had nozzle map optional even though I think the map was indeed available.

Good memory. I think that's this, over in PipetteStore. I'll play around with that and see if we can simplify it now. #14529 (comment)

@SyntaxColoring SyntaxColoring merged commit 76df073 into edge Oct 11, 2024
@SyntaxColoring SyntaxColoring deleted the port_tip_state branch October 11, 2024 19:14
SyntaxColoring added a commit that referenced this pull request Apr 30, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 16, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 17, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 19, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 19, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 19, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 20, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 20, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 22, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 23, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 24, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 24, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 29, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 29, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
ddcc4 pushed a commit that referenced this pull request May 29, 2025
…18207)

## Overview

This closes RQA-4058 (protocol analysis hanging if `pickUpTip` is given
a bad labware definition), and resolves some duplication we noticed a
little while ago
(#16469 (comment)).

## Details

When a `pickUpTip` command completes, `TipStore` marks the picked-up
tips as "used." Before this PR, that worked by `PickUpTipImplementation`
passing along just the single "target" tip, like A1; `TipStore` then
internally expanded that into the full list of actually-picked-up tips,
like A1+B1+⋯+H1, for an 8-channel pickup.

The choice to do the expansion inside `TipStore` caused two problems:

1. Error handling. If it happens inside `TipStore`, and something goes
wrong and raises an exception, then we've raised an exception from
inside an `opentrons.protocol_engine` *state update.* We are not in a
good position to handle that: it was an early architectural of
`opentrons.protocol_engine` that all the real work ought to happen in
command implementations, and that state updates ought to be dead-simple
and always successful.

(We can and should do something about that premise, but that's beyond
the scope of this PR.)

This is what caused RQA-4058.

2. Duplication. For `TipStore` to automatically expand the target well
into the full list of actually-picked-up tips, it needed to know details
about the pipette's current configuration. That was already part of
`PipetteStore`'s job;`TipStore` was duplicating it.

This PR tries to solve both of those by having `PickUpTipImplementation`
give `TipStore` a full precomputed list of tips.
`PickUpTipImplementation` produces that precomputed list with help from
new functions in `PipetteView` and `TipView`. Pipette concerns like
nozzle maps are expunged from `TipStore`. Overall, there's no new logic
here—just shifting things around and changing what's running where.

(cherry picked from commit 0855bd1)
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.

3 participants