Jobs page: highlight ACTIVE users, not online users #76

Closed
opened 2026-07-06 05:11:17 +00:00 by coilysiren · 4 comments
Owner

The jobs page appears to still highlight online users instead of active users (the lastSeen/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online.

Files: frontend/src/pages/Jobs.tsx, frontend/src/lib/jobsApi.ts.

The jobs page appears to still highlight **online** users instead of **active** users (the `lastSeen`/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online. Files: `frontend/src/pages/Jobs.tsx`, `frontend/src/lib/jobsApi.ts`.
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-76 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-06T05:13:34Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-gaming/eco-app#76 · branch issue-76 · driver claude · workflow direct-main
  • Run: engineer-claude-eco-app-76 · ward v0.413.0 · dispatched 2026-07-06T05:13:34Z
  • Comment thread: 0 included in the pre-flight read, 0 stripped (ward's own automated comments).

Issue body as seeded:

The jobs page appears to still highlight **online** users instead of **active** users (the `lastSeen`/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online.

Files: `frontend/src/pages/Jobs.tsx`, `frontend/src/lib/jobsApi.ts`.

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-76` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-06T05:13:34Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-gaming/eco-app#76` · branch `issue-76` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-eco-app-76` · ward `v0.413.0` · dispatched `2026-07-06T05:13:34Z` - **Comment thread:** 0 included in the pre-flight read, 0 stripped (ward's own automated comments). **Issue body as seeded:** ``` The jobs page appears to still highlight **online** users instead of **active** users (the `lastSeen`/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online. Files: `frontend/src/pages/Jobs.tsx`, `frontend/src/lib/jobsApi.ts`. ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

🔓 Reservation released by ward container reap — container eco-app (--driver claude) exited at the auth pre-launch gate without launching the agent (ward#222/#264/#609), so the hold it took is retracted. A plain ward agent retry no longer needs --force.

Gate: auth smoke test (claude credentials)

Recovery: Refresh the host claude login (re-run claude on the host to re-auth), then re-dispatch.

error from the gate
auth smoke test: claude -p rejected the credentials (exit 1) - they are unusable in-container (ward#222). Refresh the host claude login (re-run 'claude' on the host) and relaunch; WARD_SMOKE_TEST_SKIP=1 bypasses.

— Claude (she/her), via ward agent

<!-- ward-agent-reservation-released --> 🔓 Reservation released by `ward container reap` — container `eco-app` (`--driver claude`) exited at the **auth** pre-launch gate without launching the agent (ward#222/#264/#609), so the hold it took is retracted. A plain `ward agent` retry no longer needs `--force`. **Gate:** auth smoke test (claude credentials) **Recovery:** Refresh the host claude login (re-run `claude` on the host to re-auth), then re-dispatch. <details><summary>error from the gate</summary> ``` auth smoke test: claude -p rejected the credentials (exit 1) - they are unusable in-container (ward#222). Refresh the host claude login (re-run 'claude' on the host) and relaunch; WARD_SMOKE_TEST_SKIP=1 bypasses. ``` </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-eco-app-76 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-06T05:36:41Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

run seed context — what this run is carrying (ward#609)
  • Resolved: coilyco-gaming/eco-app#76 · branch issue-76 · driver claude · workflow direct-main
  • Run: engineer-claude-eco-app-76 · ward v0.413.0 · dispatched 2026-07-06T05:36:41Z
  • Comment thread: 1 included in the pre-flight read, 1 stripped (ward's own automated comments).

Issue body as seeded:

The jobs page appears to still highlight **online** users instead of **active** users (the `lastSeen`/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online.

Files: `frontend/src/pages/Jobs.tsx`, `frontend/src/lib/jobsApi.ts`.

Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-eco-app-76` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-06T05:36:41Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <details><summary>run seed context — what this run is carrying (ward#609)</summary> - **Resolved:** `coilyco-gaming/eco-app#76` · branch `issue-76` · driver `claude` · workflow `direct-main` - **Run:** `engineer-claude-eco-app-76` · ward `v0.413.0` · dispatched `2026-07-06T05:36:41Z` - **Comment thread:** 1 included in the pre-flight read, 1 stripped (ward's own automated comments). - included: @coilysiren (2026-07-06T05:14:06Z) - stripped: @coilyco-ops (2026-07-06T05:13:39Z) **Issue body as seeded:** ``` The jobs page appears to still highlight **online** users instead of **active** users (the `lastSeen`/active distinction from #31 / #3). Verify against the live jobs API and fix so the highlight reflects active-in-window, not currently-online. Files: `frontend/src/pages/Jobs.tsx`, `frontend/src/lib/jobsApi.ts`. ``` Static container doctrine and seed boilerplate are identical every run and omitted here (they ride ward v0.413.0). </details> <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

WARD-OUTCOME: done - jobs lastSeen now anchors to persisted LastOnlineTime, not session-scoped LogoutTime, so offline-but-recently-active players stop collapsing to inactive.

This one wore a disguise. The issue points at Jobs.tsx and jobsApi.ts, but those are innocent - they faithfully render whatever active the API hands them, and the Python tracker windows lastSeen correctly too. The whole pipeline looked right, which is exactly what made it slippery.

Verifying against the live API is what cracked it: the jobs active set was precisely the 4 online players, while the server's own count was ~32 active. So the leak had to be upstream, in the mod. The tell that the new mod is actually deployed (and not the old active:bool shim) was the citizens id->name join working live on the crafting page - that endpoint shipped after the lastSeen change, so its presence implies lastSeen is present too. From there it was reading the real Eco User API out of the reference assemblies: LogoutTime only gets set on a same-session logout, so after any restart it's 0 for everyone offline, and they all fell out of the active window. LastOnlineTime is the persisted sibling that survives restarts.

Confidence: high on the diagnosis and that the code is correct; medium that it fully matches Eco's runtime, since I can't boot a real Eco server in here - it's compile-verified against the reference assemblies and reasoned from the API, not observed end-to-end. The honest caveat: this won't change the live page until the mod DLL redeploys at the next server restart (out of band, same as every mod change here). Worth a glance after that restart to confirm the active count jumps from ~online to ~active. A possible follow-up: there's no C# test harness for the mod, so this class of "which time field" bug can only be caught by eye today - a small mod-level unit/contract test would be a good guard.

WARD-OUTCOME: done - jobs `lastSeen` now anchors to persisted `LastOnlineTime`, not session-scoped `LogoutTime`, so offline-but-recently-active players stop collapsing to inactive. This one wore a disguise. The issue points at `Jobs.tsx` and `jobsApi.ts`, but those are innocent - they faithfully render whatever `active` the API hands them, and the Python tracker windows `lastSeen` correctly too. The whole pipeline *looked* right, which is exactly what made it slippery. Verifying against the live API is what cracked it: the jobs `active` set was precisely the 4 online players, while the server's own count was ~32 active. So the leak had to be upstream, in the mod. The tell that the new mod is actually deployed (and not the old `active:bool` shim) was the citizens id->name join working live on the crafting page - that endpoint shipped *after* the `lastSeen` change, so its presence implies `lastSeen` is present too. From there it was reading the real Eco `User` API out of the reference assemblies: `LogoutTime` only gets set on a same-session logout, so after any restart it's 0 for everyone offline, and they all fell out of the active window. `LastOnlineTime` is the persisted sibling that survives restarts. Confidence: high on the diagnosis and that the code is correct; medium that it fully matches Eco's runtime, since I can't boot a real Eco server in here - it's compile-verified against the reference assemblies and reasoned from the API, not observed end-to-end. The honest caveat: this won't change the live page until the mod DLL redeploys at the next server restart (out of band, same as every mod change here). Worth a glance after that restart to confirm the active count jumps from ~online to ~active. A possible follow-up: there's no C# test harness for the mod, so this class of "which time field" bug can only be caught by eye today - a small mod-level unit/contract test would be a good guard.
Sign in to join this conversation.
No description provided.