Since #22, PJM EXT classification uses EC/SN, so wait correctly distinguishes success from abnormal exit. The user-facing output still shows only the state label: status prints Job <id>: FAILED and wait prints Job finished: FAILED, while the decisive post-mortem facts — exit code, termination reason (pjstat -H -v REASON, e.g. ELAPSE LIMIT EXC), and elapsed time vs limit — require dropping to raw pjstat over ssh.
A motivating scenario: distinguishing "died after 4 seconds with EC=1" from "ran the full 30-minute limit and was killed" is the difference between an application bug and an undersized elapse request; both render identically as FAILED today.
Proposal
For terminal jobs, extend status (and wait's final line) with EC and, when available, REASON and ELAPSE_TIM / ELAPSE_LIM from the history query. Slurm has the analogous surface (DerivedExitCode / Reason) if cross-scheduler symmetry is wanted, but the PJM half alone already closes the debugging loop.
Since #22, PJM EXT classification uses EC/SN, so
waitcorrectly distinguishes success from abnormal exit. The user-facing output still shows only the state label:statusprintsJob <id>: FAILEDandwaitprintsJob finished: FAILED, while the decisive post-mortem facts — exit code, termination reason (pjstat -H -vREASON, e.g.ELAPSE LIMIT EXC), and elapsed time vs limit — require dropping to rawpjstatover ssh.A motivating scenario: distinguishing "died after 4 seconds with EC=1" from "ran the full 30-minute limit and was killed" is the difference between an application bug and an undersized elapse request; both render identically as
FAILEDtoday.Proposal
For terminal jobs, extend
status(andwait's final line) with EC and, when available, REASON and ELAPSE_TIM / ELAPSE_LIM from the history query. Slurm has the analogous surface (DerivedExitCode / Reason) if cross-scheduler symmetry is wanted, but the PJM half alone already closes the debugging loop.