Skip to content

Conversation

@zastrowm
Copy link
Member

Add a record of the decision that "opt-in breaking changes" being acceptable from an SDK evolution strategy.


By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

@strands-agent
Copy link
Contributor

Documentation Deployment Complete

Your documentation preview has been successfully deployed!

Preview URL: https://d3ehv1nix5p99z.cloudfront.net/pr-491/


Strict semver adherence can slow SDK development when the breaking change only affects users who explicitly adopt new functionality. If existing code paths remain unaffected, the practical impact on users is minimal.

For example, converting a `TypedDict` to `total=False` is technically breaking if existing implementations don't provide the new optional members. However, if the only way to encounter those new members is by adding a new tool that uses the new format, the change is effectively "pay for play." Users who don't adopt the new tool never observe the break.
Copy link
Contributor

Choose a reason for hiding this comment

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

Up until this point, I was just thinking "that's how backwards compatibility works" :P

But this makes sense. We have done something similar with Bidirectional Agents and tool context for example. We have started to pass in Bidi Agent as Agent. This is "technically" backwards compatible, but it's pay for play

mkmeral
mkmeral previously approved these changes Jan 28, 2026
yonib05
yonib05 previously approved these changes Jan 28, 2026

Strict semver adherence can slow SDK development when the breaking change only affects users who explicitly adopt new functionality. If existing code paths remain unaffected, the practical impact on users is minimal.

For example, converting a `TypedDict` to `total=False` is technically breaking if existing implementations don't provide the new optional members. However, if the only way to encounter those new members is by adding a new tool that uses the new format, the change is effectively "pay for play." Users who don't adopt the new tool never observe the break.
Copy link
Member

Choose a reason for hiding this comment

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

It might just be me but I feel this explanation is slightly confusing.

For example, converting a TypedDict to total=False is technically breaking if existing implementations don't provide the new optional members

I think I understand that you mean to say if a previously required field now becomes optional, existing code paths expecting the field would break if not provided. I just wonder if there is a more direct way to say this.

Copy link
Member Author

Choose a reason for hiding this comment

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

I concur; the example isn't clear at all; the problem is on the reading side, not the producing side. Updating the example

@zastrowm zastrowm dismissed stale reviews from yonib05 and mkmeral via f52b1c1 January 28, 2026 17:24
@strands-agent
Copy link
Contributor

Documentation Deployment Complete

Your documentation preview has been successfully deployed!

Preview URL: https://d3ehv1nix5p99z.cloudfront.net/pr-491/

Unshure
Unshure previously approved these changes Jan 28, 2026
pgrayy
pgrayy previously approved these changes Feb 2, 2026
@mehtarac
Copy link
Member

mehtarac commented Feb 3, 2026

/strands review

@github-actions
Copy link
Contributor

github-actions bot commented Feb 3, 2026

Assessment: Approve ✅

This decision record is well-written and follows the established structure in DECISIONS.md.

Key Observations:

  • Structure is consistent with prior decisions (Date, Decision, Rationale sections)
  • The "pay for play" principle is clearly explained with a concrete TypedDict example
  • Good balance of explaining when the policy applies vs. when it doesn't apply
  • External reference to Raymond Chen's post provides additional context

The updated example (addressing pgrayy's feedback) now clearly distinguishes between the producing side vs. reading side of the breaking change, making the concept more understandable.

Nice addition to the decision record! 🎉

mehtarac
mehtarac previously approved these changes Feb 3, 2026
@mkmeral mkmeral dismissed stale reviews from mehtarac, pgrayy, and Unshure via d44cccf February 3, 2026 23:13
@mkmeral mkmeral enabled auto-merge (squash) February 3, 2026 23:14
@strands-agent
Copy link
Contributor

Documentation Deployment Complete

Your documentation preview has been successfully deployed!

Preview URL: https://d3ehv1nix5p99z.cloudfront.net/pr-491/

1 similar comment
@strands-agent
Copy link
Contributor

Documentation Deployment Complete

Your documentation preview has been successfully deployed!

Preview URL: https://d3ehv1nix5p99z.cloudfront.net/pr-491/

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.

7 participants