You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] The job list Clear control cannot dismiss a finished job
#9602
Component:packages/api/job-controller (shipped as @deepseek-ai/dsh-api-job-controller)
Symptom
A finished background job cannot be removed from the job list. The Clear control above the list does not clear it - the click appears to do nothing, and the entry persists for the session.
It is mildly annoying rather than blocking, but it makes the list mislead: a finished row reads as activity.
Reproduction
Let any background job finish - a long build or plan is easiest - then use Clear above the job list. The finished job remains.
Mechanism, read from the shipped source
lib/types/observe.jsdoes handle removal: it "closes it with the removed job's terminal projection" and speaks of having "dropped the record". So the roster can emit removed, and the client mirrors it.
lib/types/index.js exposes exactly one mutating request: _kill_decorators = [Remote('kill')] - "Kill one background job on a human's behalf" - documented as returning "the registry's admission of the kill request", so it can be refused.
It is refused for a terminal job. Observed through the tool API: job bash-337 had already finished [status: completed, exit code: 0].
So no available path lets the client dismiss a job that has already finished.
Suggested fix
Add a dismiss / remove Remote that accepts a terminal job. The removed projection path already exists, so only the request is missing. More cheaply: let kill on an already-finished job drop it from the roster and return an admission the client can act on.
Worth separating
The retention is not the bug. Keeping a finished job's output is the right behaviour, and README.md line 1 describes the roster as "the roster one session can see". The defect is that nothing can dismiss it.
Caveat on my evidence
I could not read the UI's Clear handler - the client is a bundled asset and no file is named for it - so identifying Clear with kill is inference from the API surface, not something I read. The underlying gap, that no dismissal request exists, is read directly from the source.
packages/jobs/jobs/src/index.ts:179 → * Drop one settled job's record from the visible set and announce … :186 → abstract remove(id: JobId, caller?: SessionId): void
packages/jobs/jobs-local/src/index.ts:340 → remove(id: JobId, caller?: SessionId): void {;:342 → if (!isTerminal(job.status)) throw new Error(...);:343 → this.drop([job])
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Component:
packages/api/job-controller(shipped as@deepseek-ai/dsh-api-job-controller)Symptom
A finished background job cannot be removed from the job list. The Clear control above the list does not clear it - the click appears to do nothing, and the entry persists for the session.
It is mildly annoying rather than blocking, but it makes the list mislead: a finished row reads as activity.
Reproduction
Let any background job finish - a long build or plan is easiest - then use Clear above the job list. The finished job remains.
Mechanism, read from the shipped source
lib/types/observe.jsdoes handle removal: it "closes it with the removed job's terminal projection" and speaks of having "dropped the record". So the roster can emitremoved, and the client mirrors it.lib/types/index.jsexposes exactly one mutating request:_kill_decorators = [Remote('kill')]- "Kill one background job on a human's behalf" - documented as returning "the registry's admission of the kill request", so it can be refused.job bash-337 had already finished [status: completed, exit code: 0].So no available path lets the client dismiss a job that has already finished.
Suggested fix
Add a
dismiss/removeRemote that accepts a terminal job. Theremovedprojection path already exists, so only the request is missing. More cheaply: letkillon an already-finished job drop it from the roster and return an admission the client can act on.Worth separating
The retention is not the bug. Keeping a finished job's output is the right behaviour, and
README.mdline 1 describes the roster as "the roster one session can see". The defect is that nothing can dismiss it.Caveat on my evidence
I could not read the UI's Clear handler - the client is a bundled asset and no file is named for it - so identifying Clear with
killis inference from the API surface, not something I read. The underlying gap, that no dismissal request exists, is read directly from the source.All reactions