Skip to content

Report a stored prefill/decode pair's state when its routing is missing - #555

Merged
dennis-upbound merged 2 commits into
modelplaneai:mainfrom
dennis-upbound:dennis/pd-followups
Oct 22, 2026
Merged

dennis-upbound merged 2 commits into
modelplaneai:mainfrom
dennis-upbound:dennis/pd-followups

Conversation

@dennis-upbound

Copy link
Copy Markdown
Collaborator

Description of your changes

A PrefillDecode replica stored before router became required gets a fatal result, which leaves its pods and router serving until its deployment adds its routing. compose-model-replica returned before deriving ModelAccepted and ModelReady, and Crossplane marks every condition a function doesn't set Unknown with reason FatalError, so a pair that still served reported ModelReady=Unknown.

The function now derives both conditions from observed state whether or not composing stops. The "Composing" event for the first reconcile moves into the composing path, so a fatal result doesn't announce that it's composing. PrefillDecodeRoutingMissing now models a stored pair whose workloads are Ready, and expects the fatal result beside ModelAccepted=True and ModelReady=True.

The default picker helper is renamed _default_unified_picker, since only a Unified replica runs it.

Both come from @negz's review of #529.

I have:

  • Read and followed Modelplane's contribution process.
  • Run nix flake check (or ./nix.sh flake check) and made sure it passes.
  • Added or updated tests covering any composition function changes.
  • Signed off every commit with git commit -s.

🤖 Generated with Claude Code

A PrefillDecode replica stored before router became required gets a fatal
result, which leaves its pods and router serving. The function returned
before deriving ModelAccepted and ModelReady, and Crossplane marks every
condition a function doesn't set Unknown with reason FatalError. A pair
that still served reported ModelReady=Unknown.

The function now derives both conditions from observed state whether or
not composing stops. The event announcing the first reconcile moves into
the composing path, so a fatal result doesn't claim to be composing.

The default picker helper is now _default_unified_picker, since only a
Unified replica runs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Dennis Ramdass <dennis@upbound.io>
@dennis-upbound

Copy link
Copy Markdown
Collaborator Author

@negz this is the follow-up for your two comments on #529: conditions are now derived even on the fatal result, so a stored prefill/decode pair that still serves reports ModelReady=True, and the helper is _default_unified_picker.

# Conditions are derived from observed state even when composing stops
# with a fatal result. Crossplane keeps the conditions a function sets
# and marks the rest Unknown, so skipping them would report a pair that
# still serves as ModelReady=Unknown.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This feels like the agent narrating this change. I don't think we need this comment.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Dropped in 0e3667d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Dennis Ramdass <dennis@upbound.io>
@dennis-upbound
dennis-upbound merged commit ace54b8 into modelplaneai:main Oct 22, 2026
5 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.

2 participants