blueprint rollback and reconcile report an unreadable run directory as a missing run
- Dominant language
- TypeScript
- Stars
- 22.5k
- Forks
- 3.1k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 715
Description
### What happens
`actionRollback` and `actionReconcile` report every failure to read the run directory as a
missing run, so a run that exists but cannot be read is described as absent.
Both sites are byte-identical. `nemoclaw/src/blueprint/runner.ts:2639-2643` (`actionRollback`)
and `nemoclaw/src/blueprint/runner.ts:2521-2525` (`actionReconcile`):
```
try {
readdirSync(stateDir);
} catch {
throw new Error(`Run ${rid} not found.`);
}
```
The `catch` is unconditional. `EACCES` on the run directory — wrong ownership, a restrictive
umask, a directory written by another user — produces `Run nc-run-1 not found.`
The operator is then told to look for a run that is sitting right there. They go hunting for
missing state, or re-run the blueprint, when the actual problem is a permission on a directory
that exists.
### Why this looks like drift rather than a decision
Discriminating `ENOENT` is established practice here — **79 files** do it, including one in this
same blueprint tree, `nemoclaw/src/blueprint/private-networks.ts:77`:
```
function isNodeEnoent(err: unknown): boolean {
return err instanceof Error && "code" in err && err.code === "ENOENT";
}
```
So the pattern was available and is already used a few files away.
The bare `catch` arrived with **#772 (`385d6b047`), `refactor: convert blueprint Python modules
to TypeScript`** — a mechanical port, where a bare `except` becomes a bare `catch` without anyone
deciding that an unreadable directory should be reported as missing. The second copy in
`actionReconcile` was added later, duplicating the same shape.
### Environment
macOS 26.5.1 (25F80), Node v26.7.0, `main` at `152758793`.
Contributor guide
Research direction
Read nemoclaw/src/blueprint/runner.ts at actionReconcile lines 2521-2525 and actionRollback lines 2639-2643, then compare the error check in nemoclaw/src/blueprint/private-networks.ts:77. Confirm the behavior for a missing run versus an unreadable existing directory, and verify both actions report those cases distinctly.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 78/100