Skip to content

[Production] Release 2026-07-10 - #133

Merged
wasimxyz merged 3 commits into
productionfrom
staging
Jul 10, 2026
Merged

[Production] Release 2026-07-10#133
wasimxyz merged 3 commits into
productionfrom
staging

Conversation

@wasimxyz

Copy link
Copy Markdown
Member

No description provided.

wasimxyz and others added 3 commits July 8, 2026 11:37
The docs site now serves under /docs on the product's domain via Vercel
Microfrontends, so move all references off the old
arcadia-data-hub-docs.vercel.app deployment.

- Swap the docs-site host in the READMEs, AGENTS.md, developer-docs, and the
  watcher package metadata to https://datahub.arcadiascience.com/docs.
- Source the docs origin from NEXT_PUBLIC_DOCS_BASE_URL so it inlines into the
  client bundle: the Docs link in the sidebar user menu is a Client Component,
  where the old non-public DOCS_BASE_URL resolved to undefined and silently
  fell back to the hardcoded URL.
- Add DOCS_URL (<origin>/docs) for the bare "Docs" links, which otherwise
  pointed at the product root after the domain move, and fix the login page's
  Quickstart link to /docs/quickstart (getting-started doesn't exist).

Co-authored-by: Cursor <cursoragent@cursor.com>
* Add admin retire flow for instruments with status tabs

Retiring soft-sets an instrument to `inactive` (surfaced as "Retired") and
always deregisters its watchers so agents stop heartbeating and pending
uploads drain. Reactivating sets it back to `active`. The /instruments page
now splits into Active / Pending / Retired tabs, and row actions move into a
three-dot menu (View details, Edit, Retire/Reactivate) with an inline Confirm
for pending rows.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Sync web lockfile so npm ci works

The committed package-lock.json was missing esbuild's optional per-platform
binaries and had stale emnapi entries, so `npm ci` failed with an out-of-sync
error. Regenerated via `npm install` (Node 24 / npm 11), which adds the missing
optional platform packages while keeping all versions within their existing
ranges — @biomejs/biome and ultracite stay pinned so lint behavior is unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Scope dashboard to active instruments; drop View details menu item

The dashboard runs-table instrument dropdown and the stat cards now only
consider active instruments (the instruments table was already active-only),
so retired/pending instruments no longer appear as filter targets or inflate
the KPI counts. `getInstruments` gains an opt-in `activeOnly` flag so the MCP
resource still lists all instruments. Also removes the redundant "View
details" item from the instrument row menu (rows remain clickable).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Hide retired instruments in sidebar and notifications settings

The sidebar's client-side "recently viewed" list wasn't status-aware, so a
retired instrument the user had visited kept showing. The layout now passes
the set of active instrument IDs down to the nav, which prunes recently-viewed
to active instruments only. The notifications settings page also now lists
active instruments only via a new opt-in `activeOnly` flag on
`listInstrumentSubscriptions` (the /instruments notify column is unchanged).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Keep watcher link on retired instrument header

Resolve the canonical watcher from soft-deleted rows when no live watcher
remains, and show the Retired lifecycle badge instead of "No Watcher".

Co-authored-by: Cursor <cursoragent@cursor.com>

* Show Deregistered badge for watcherless instruments

Distinguish an instrument whose watcher was deregistered from one that
never had a watcher, in both the instrument header and the /instruments
table, and keep linking to the deregistered watcher. Also tidy up the
row-action labels, skeleton row count, and drop the actions-column
skeleton on /instruments.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Add Edit/Retire actions to instrument header

Reuse the instruments-table admin actions on the detail page via a shared
InstrumentActions component (menu vs expanded variants), move the status
badge into the metadata row, and turn the notifications control into a
click/hover-friendly labelled pill. Also darken the Retired badge for
contrast.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix runs-table z-index over sidebar; tidy deregistered watcher header

Isolate the runs-table stacking context so row cells no longer paint over
the sidebar, and stop fading the deregistered watcher header (drop the
opacity/dashed border, match the Deregistered badge size).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Show lifecycle/deregistered badge in search results

Mirror the instruments table in the global search palette: render the
Retired/Pending lifecycle badge for those instruments and a deregistered-aware
watcher badge for active ones, instead of always showing watcher connectivity.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Trim over-verbose comments to follow code-comments rule

Co-authored-by: Cursor <cursoragent@cursor.com>

* Make retire atomic and address review feedback

- Wrap the instrument status flip and watcher teardown in one transaction
  via a threaded `DbExecutor`, so a failed teardown can't strand watchers.
- Hide the notifications pill on non-active instruments.
- Memoize the instruments-view row-actions renderer.
- Give `getInstruments` a primitive `activeOnly` arg for reliable cache dedup.
- Drop the sidebar recents active-instrument filter to avoid a layout-wide query.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Record and display who retired/deregistered

Add nullable `retired_by`/`retired_at` on instruments and `deregistered_by`
on watchers (FK to user, set null on delete), captured from the acting
session/PAT user in the instrument PATCH and watcher DELETE flows. Surface
the actor with an avatar in the instrument and watcher headers.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Regenerate web lockfile on Linux so npm ci works

`npm ci` on the ubuntu CI runner kept failing with "Missing:
@emnapi/runtime@1.11.2 / @emnapi/core@1.11.2 from lock file" because the
lockfile was previously regenerated on macOS, where npm prunes the emnapi
peer deps that the Linux WASM-fallback path (@napi-rs/wasm-runtime) needs.

Regenerated via `npm install --package-lock-only` in a node:24 Linux
container (matching CI), then confirmed the cross-platform union is stable
with per-platform passes. Net effect: adds the two required @emnapi nodes,
drops 26 stale phantom vitest/@esbuild binaries, and changes no resolved
versions. Verified npm ci passes for linux and darwin targets.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
* Add run status filter to instrument runs

Derive run status from raw-file aggregates and expose it as a
multi-select filter on the instrument page, dashboard, REST run-list
endpoints, and the MCP search_runs tool. Filtering uses priority-
exclusive EXISTS/NOT EXISTS predicates so the pagination count query
stays index-backed without a schema change. Reorder RunStatusIcon to
Failed > Pending > Uploaded > Processing > Completed > Empty, add a
dedicated empty state, and drive both the icon and the SQL from a
single shared run-status table.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Align run-status filter URL key with REST/MCP `status`

Rename the frontend nuqs key from `run_status` to `status` so the
shareable dashboard/instrument URL matches the REST `?status=` param and
the MCP `status` arg. The internal `RunListFilters.statuses` array stays.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop unused fileCount from deriveRunStatus input

`empty` is derived as the fall-through when every status bucket is zero, so
the `fileCount` field was never read. Remove it from `RunStatusCounts` and
the icon call site.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Add tests for derived run status filter

Unit tests cover `deriveRunStatus` priority ordering and
`parseRunStatusParam` parsing (repeated/comma-separated, unknown-drop,
dedup). Integration tests assert the `?status=` filter and pagination
total match the priority-exclusive SQL on both run-list endpoints.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@wasimxyz wasimxyz self-assigned this Jul 10, 2026
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
data-hub Ready Ready Preview, Comment Jul 10, 2026 5:34pm

Request Review

@wasimxyz
wasimxyz merged commit b6543cd into production Jul 10, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant