juspay / juspay/odu

Web board shows live but empty catalog through an SSH port forward

Open
#111 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
7
Forks
0
Avg merge
4h 35m
Merged PRs (30d)
23

Description

Odu's web UI shows **“live” and “No runs in the catalog yet” through an SSH port forward**, while opening the same server directly on localhost lists the runs. This is reproducible in two tabs of the same browser. The underlying cause is not yet established; the empty-state/healthy-status combination is misleading regardless.

### Reproduction observed on 2026-09-13

1. Odu is running on `naiveintent`, listening on `127.0.0.1:18440` (Bun PID 2477101).
2. `pureintent` exposes that listener with a plain SSH local forward:
```sh
ssh -L '*:18440:127.0.0.1:18440' naiveintent 'echo PORT-FORWARD-READY; cat'
```
`ss` confirms SSH owns pureintent's public port 18440. This is forwarding to the same service, not a separate catalog.
3. Open `http://127.0.0.1:18440/` in a browser on naiveintent: hundreds of runs appear, including run `0mu08a1p1-nctlhal2`, branch `native-stand`, commit `8ab986478`.
4. Open `http://pureintent.rooster-blues.ts.net:18440/` in another tab of that browser: header says `live`, All is selected, and the board says there are no runs. It stays empty for several minutes.

The original report was from a separate user's browser at the forwarded URL; the same-browser comparison above reproduced it independently.

### Read-only diagnostics

- The HTML fetched through both URLs is byte-identical. Forwarded HTML, JS, CSS and logo requests all return HTTP 200; browser console is empty.
- A raw browser WebSocket to the forwarded `/rpc/ws` reaches OPEN. This establishes that the handshake succeeds, not that RPC/subscriptions are healthy.
- Local `odu surface get service`, `odu surface keys runs`, and `odu surface get runs 0mu08a1p1-nctlhal2` succeed.
- `odu surface get service --origin http://pureintent.rooster-blues.ts.net:18440` failed after waiting with:
```text
RpcClientDefect: the wire re-dialled beneath this call: it was bound to socket epoch 1, the wire is now at socket epoch 2. Effect RPC registers an entry exactly once and never re-sends it onto another socket...
```
- A subsequent forwarded `odu surface get runs 0mu08a1p1-nctlhal2` reported:
```text
"runs" did not answer for key "0mu08a1p1-nctlhal2" within 5000ms — the read did not complete, so whether the item is there is still unknown
```

### Running service identity

```text
oduVersion: 0.1.0
protocolVersion: 1.3
storageVersion: 1
buildId: /nix/store/yyg5sj6gdlj4q91vxi994ha11b78sbds-odu
source: /nix/store/g4gpv9yab9906vcbqsajh5zdicq4m4cp-odu-base-0.1.0
catalog: /home/srid/.local/state/odu/runs
```

The client command was Kolu's pinned Odu (`juspay/odu` revision `6f7de52edb7f20c356a5e059031cab1955b0ca79`); the already-running service reports a null commit, so that pin should not be mistaken for the service revision.

Expected: the forwarded page displays the same catalog. If catalog delivery stalls, show loading/degraded/error state rather than a healthy, empty catalog.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the web board's catalog loading and the /rpc/ws entry point, comparing direct localhost access with the forwarded URL. Reproduce the socket re-dial and RPC timeout described in the issue, then trace catalog delivery through the client. Done means the forwarded page shows the catalog, or clearly reports loading, degraded, or error state instead of a healthy empty result.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
backend, frontend, networking
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.