Commit 30f6ce5
committed
fix(serde): make idempotent rebind transactional on adapter-lookup failure
Codex P2 (both ThreadImpl and ChannelImpl): `from_json(existing_inst,
chat=Y)` was invalidating caches BEFORE calling `chat.get_adapter(name)`.
If the lookup failed and raised `RuntimeError`, the caller catching the
exception was left with a partially-mutated instance — `_state_adapter_
instance`, `_channel_cache`, `_message_history`, `_recent_messages`,
`_is_subscribed_context` all silently wiped, but `_adapter` unchanged.
Subsequent operations on the thread would re-resolve state/channel via
the singleton instead of the previously-bound chat.
Fix: pre-flight the adapter lookup BEFORE invalidating caches. If the
name doesn't resolve in the new chat, raise immediately with all
original state intact. The binding block below repeats the lookup
when it actually applies the result; that's a cheap duplicate in
exchange for transactional semantics.
Same fix in both `ThreadImpl.from_json` and `ChannelImpl.from_json`.
2 regression tests, each captures a snapshot of every cache-bearing
attribute before the rebind, calls `from_json(instance, chat=bad_chat)`
expecting RuntimeError, then asserts every snapshotted attribute is
byte-identical on the catch side:
- test_should_leave_thread_unchanged_when_chat_rebind_lookup_fails
- test_should_leave_channel_unchanged_when_chat_rebind_lookup_fails
3468 tests pass.
https://claude.ai/code/session_01XE1bMoQ5BjCvgi1iLGKKhG1 parent c345ac3 commit 30f6ce5
4 files changed
Lines changed: 135 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
423 | 423 | | |
424 | 424 | | |
425 | 425 | | |
426 | | - | |
427 | | - | |
428 | | - | |
429 | | - | |
430 | | - | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
431 | 446 | | |
432 | 447 | | |
433 | 448 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
843 | 843 | | |
844 | 844 | | |
845 | 845 | | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
846 | 864 | | |
847 | 865 | | |
848 | 866 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
722 | 722 | | |
723 | 723 | | |
724 | 724 | | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
725 | 767 | | |
726 | 768 | | |
727 | 769 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
665 | 665 | | |
666 | 666 | | |
667 | 667 | | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
668 | 723 | | |
669 | 724 | | |
670 | 725 | | |
| |||
0 commit comments