feat: CI browser journey loses active break state after corrupt-record recovery #1319

Merged
timmy merged 1 commits from timmy/1315-ci-browser-journey-loses-active-break-state-afte into main 2026-08-23 19:46:52 +00:00
2 changed files with 30 additions and 1 deletions

View File

@ -126,7 +126,7 @@ function createTodayTimer({ storage, getLogin, now = () => Date.now(), onChange
state.attention_interruption = null;
state.search_interruption = null;
state.detour_interruption = null;
state.timed_break = null;
if(running || validBreak(state)?.identity !== identity) state.timed_break=null;
return write(state);
},
activate(identity) {

View File

@ -93,6 +93,35 @@ process.stdout.write(JSON.stringify({reopened,snapshot:timer.snapshot(),pending:
}
def test_adopting_paused_state_for_same_item_preserves_valid_local_break():
script = TIMER.read_text() + r"""
const values = new Map();
const storage = {getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value)};
const timer = createTodayTimer({storage,getLogin:()=> 'timmy',now:()=>100000});
timer.activate('issue:r:42:');
timer.startBreak(5);
const adopted = timer.adopt('issue:r:42:', 12000, false, [
{identity:'issue:r:42:',elapsed_ms:12000},
]);
process.stdout.write(JSON.stringify({adopted,snapshot:timer.snapshot(),pending:timer.breakSnapshot()}));
"""
assert run_node(script) == {
"adopted": True,
"snapshot": {
"identity": "issue:r:42:",
"elapsed_ms": 12000,
"running": False,
"break_deadline_at": 400_000,
},
"pending": {
"identity": "issue:r:42:",
"deadline_at": 400_000,
"expired": False,
},
}
def test_break_expiry_never_restarts_time_and_resume_is_explicit_and_idempotent():
script = TIMER.read_text() + r"""
const values = new Map();