Commit 6ecf5e3
fix(temporal): reject one-sided valid_from that inverts a stored valid_to on re-assert (#363)
Review finding (PR #370 verifier, round 3): the mirror image of the
one-sided valid_to hole. On a content-UNCHANGED re-assert the entities
UPDATE takes the caller's valid_from via COALESCE while KEEPING the
stored valid_to (the content-changed stamp that would re-set valid_to
never runs), so `remember {identical body, valid_from: >= stored close}`
silently stored an inverted [vf, stored_to) period — unmatchable by
valid_at at every instant.
Symmetric guard in remember_impl: when valid_from is supplied without
valid_to on the content-unchanged branch, validate it against the stored
valid_to the write will keep; reject vf >= stored_to before any mutation,
same error style. The content-changed and insert paths are unaffected —
they re-set valid_to to the caller's value (NULL => unbounded), which a
one-sided valid_from cannot invert.
Tests: new reassert_rejects_one_sided_valid_from_at_or_after_stored_valid_to
(after/at the stored close rejected with the period verified untouched;
before the close accepted and moves the open; unbounded fact accepts any
one-sided valid_from). Tightened the round-2 identical-re-assert case to
assert the stored period is unchanged, not just the error string.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>1 parent 2f6b804 commit 6ecf5e3
2 files changed
Lines changed: 128 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1769 | 1769 | | |
1770 | 1770 | | |
1771 | 1771 | | |
| 1772 | + | |
| 1773 | + | |
| 1774 | + | |
| 1775 | + | |
| 1776 | + | |
| 1777 | + | |
| 1778 | + | |
| 1779 | + | |
| 1780 | + | |
| 1781 | + | |
| 1782 | + | |
| 1783 | + | |
| 1784 | + | |
| 1785 | + | |
| 1786 | + | |
| 1787 | + | |
| 1788 | + | |
| 1789 | + | |
| 1790 | + | |
| 1791 | + | |
| 1792 | + | |
| 1793 | + | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
1772 | 1797 | | |
1773 | 1798 | | |
1774 | 1799 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2864 | 2864 | | |
2865 | 2865 | | |
2866 | 2866 | | |
2867 | | - | |
| 2867 | + | |
| 2868 | + | |
| 2869 | + | |
| 2870 | + | |
| 2871 | + | |
| 2872 | + | |
| 2873 | + | |
| 2874 | + | |
| 2875 | + | |
| 2876 | + | |
| 2877 | + | |
| 2878 | + | |
| 2879 | + | |
2868 | 2880 | | |
2869 | 2881 | | |
2870 | 2882 | | |
2871 | 2883 | | |
2872 | 2884 | | |
2873 | 2885 | | |
2874 | 2886 | | |
| 2887 | + | |
| 2888 | + | |
| 2889 | + | |
| 2890 | + | |
| 2891 | + | |
| 2892 | + | |
| 2893 | + | |
| 2894 | + | |
| 2895 | + | |
| 2896 | + | |
| 2897 | + | |
| 2898 | + | |
| 2899 | + | |
| 2900 | + | |
| 2901 | + | |
| 2902 | + | |
| 2903 | + | |
| 2904 | + | |
| 2905 | + | |
| 2906 | + | |
| 2907 | + | |
| 2908 | + | |
| 2909 | + | |
| 2910 | + | |
| 2911 | + | |
| 2912 | + | |
| 2913 | + | |
| 2914 | + | |
| 2915 | + | |
| 2916 | + | |
| 2917 | + | |
| 2918 | + | |
| 2919 | + | |
| 2920 | + | |
| 2921 | + | |
| 2922 | + | |
| 2923 | + | |
| 2924 | + | |
| 2925 | + | |
| 2926 | + | |
| 2927 | + | |
| 2928 | + | |
| 2929 | + | |
| 2930 | + | |
| 2931 | + | |
| 2932 | + | |
| 2933 | + | |
| 2934 | + | |
| 2935 | + | |
| 2936 | + | |
| 2937 | + | |
| 2938 | + | |
| 2939 | + | |
| 2940 | + | |
| 2941 | + | |
| 2942 | + | |
| 2943 | + | |
| 2944 | + | |
| 2945 | + | |
| 2946 | + | |
| 2947 | + | |
| 2948 | + | |
| 2949 | + | |
| 2950 | + | |
| 2951 | + | |
| 2952 | + | |
| 2953 | + | |
| 2954 | + | |
| 2955 | + | |
| 2956 | + | |
| 2957 | + | |
| 2958 | + | |
| 2959 | + | |
| 2960 | + | |
| 2961 | + | |
| 2962 | + | |
| 2963 | + | |
| 2964 | + | |
| 2965 | + | |
| 2966 | + | |
| 2967 | + | |
| 2968 | + | |
| 2969 | + | |
| 2970 | + | |
| 2971 | + | |
| 2972 | + | |
| 2973 | + | |
| 2974 | + | |
| 2975 | + | |
| 2976 | + | |
2875 | 2977 | | |
2876 | 2978 | | |
2877 | 2979 | | |
| |||
0 commit comments