Skip to content

Commit d9197ed

Browse files
committed
[fix.dirac.ρ.D9+] cancellation intent is not a terminal job state
A live CCCCCCO surface job was labelled Cancelled while the ledger later recorded done with cancel_requested_at. Running native workers are not interruptible, so the UI must preserve the durable Job and distinguish a queued cancellation from a running cancel request. Failed invocations also omitted elapsed seconds, leaving refusal evidence incomplete. Reject equating an aborted browser wait with backend termination; the deadline remains the hard resource bound.
1 parent 083fff0 commit d9197ed

8 files changed

Lines changed: 2107 additions & 1667 deletions

File tree

‎backend/invocation.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,7 @@ def invoke(self, method_id: str, payload: dict, *,
439439
if job_id is not None and self.ledger is not None:
440440
try:
441441
self.ledger.failed(job_id, code=f.code, detail=f.message,
442+
seconds=round(time.time() - t0, 3),
442443
retryable=f.retryable)
443444
except Exception: # noqa: BLE001
444445
pass # the refusal is the answer; a ledger write is not
@@ -462,6 +463,7 @@ def invoke(self, method_id: str, payload: dict, *,
462463
if job_id is not None and self.ledger is not None:
463464
try:
464465
self.ledger.failed(job_id, code='INTERNAL', detail=str(e),
466+
seconds=round(time.time() - t0, 3),
465467
retryable=True)
466468
except Exception: # noqa: BLE001
467469
pass

‎backend/tests/test_surface_budget.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ def test_potential_evaluation_checks_before_integrals(self):
4545
deadline=time.time() - 1, max_seconds=1)
4646
field.mol.intor.assert_not_called()
4747

48+
def test_refused_job_records_elapsed_seconds(self):
49+
import catalog
50+
import invocation
51+
import jobs
52+
53+
molfile = (_BACKEND.parent / 'contracts/golden/fixtures/o_3.mol').read_text()
54+
ledger = jobs.MemoryJobStore()
55+
service = invocation.InvocationService(catalog.MethodCatalog.load(), ledger=ledger)
56+
envelope = service.invoke('surface.mep', {
57+
'molecule': {'kind': 'molfile', 'content': molfile, 'dimensionality': 3},
58+
'parameters': {'basis': 'sto-3g'},
59+
}, budget_seconds=1e-9)
60+
self.assertFalse(envelope['ok'])
61+
self.assertEqual(envelope['error']['code'], 'BUDGET')
62+
job = ledger.get(envelope['meta']['job_id'])
63+
self.assertEqual(job['state'], 'failed')
64+
self.assertIsNotNone(job['seconds'])
65+
self.assertGreaterEqual(job['seconds'], 0)
66+
4867

4968
if __name__ == '__main__':
5069
unittest.main()

‎docs/architecture/dirac-digital-twin.html‎

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)