Skip to content

epic: NetScript Dev Dashboard — the Aspire/Scalar satellite that drives the framework (ships as a plugin, beta.6) #400

Description

@rickylabs

Summary

A DX-oriented dev dashboard shipping as plugins/dashboard + packages/plugin-dashboard-core on @netscript/fresh-ui. It is a satellite of Aspire's control surface, not a rival — and it is how you drive the framework: it renders only NetScript-domain state Aspire and Scalar cannot see, mirrors the CLI's management verbs through the UI, and deep-links back out to Aspire/Scalar for everything they already own.

Rescoped 2026-07-06 (owner mandate, amended same day). The pass-1 direction duplicated Aspire/Scalar surfaces. The rescope keeps three pillars from the original seed research: Observe (only-NetScript state), Manage (Appwrite-style per-capability console mirroring the CLI), Follow (Encore-model live seam-flow, never re-rendered OTLP).

DX thesis

Answer the questions no existing tool can: "is my NetScript app wired the way I declared it, what is my runtime doing right now at the primitive level, what did this request actually cause, and let me act on it without leaving the browser."

  • Aspire owns: resources, console/structured logs, raw traces, metrics, health, process lifecycle.
  • Scalar owns: API reference, schemas, try-it, code samples.
  • The dashboard owns: primitive run-state (executions/attempts, saga instances incl. compensating, trigger firings, stream deliveries), the runtime override/config layer including gated write-back, plugin-registry wiring + doctor + contribution axes, contract provenance/coverage/duality, route→contract binding, codegen/scaffold state (migrations, drift), the per-capability management loop (create → configure(tabs) → monitor), and the live request journey across framework seams (S13).

Authoritative screen set (supersedes the pass-1 DDX panel list)

Acceptance lines (MANDATORY, gate every slice)

  1. Non-duplication. No dashboard screen may render, as an owned surface: an OTLP trace waterfall / span-bar gantt, a structured/console log tail, a metrics chart, a resource start/stop/restart panel, or an OpenAPI operation list / try-it console. Each is Aspire's or Scalar's job and MUST be a deep-link out. Every merged panel must pass "why can't this just deep-link to Aspire/Scalar?" with a NetScript-only answer recorded in its issue — only-NetScript state, only-NetScript action (CLI-mirroring), or framework-seam semantics raw OTLP cannot express.
  2. One generator, two callers. Every dashboard mutation invokes the same contract route / CLI scaffolder the terminal does and renders its CLI-equivalent line (netscript … CodeBlock). No dashboard-only write paths, no forked codegen.
  3. Flow ≠ waterfall. S13 renders a primitive-grouped causal chain with payloads at seams, assembled from NetScript's own seam events; the moment raw timing/span detail is needed it out-links to Aspire /traces/detail/{id}. No span bars, no time-proportional gantt, no log tails in S13 — ever.

Integration seams (four seams, one URL scheme)

  1. Aspire → dashboard: WithUrl("NetScript Dashboard", /resource/{name}) on every scaffolded resource + two framework withCommands — generator emission on [dashboard DDX-14] CLI surface + auto-launch #424, Seam A widening (command/app kinds) on [dashboard DDX-1] @netscript/aspire command + app resource kinds #411, Seam B interim.
  2. Dashboard → Aspire: correlation-only TelemetryQueryPort ([dashboard DDX-3] TelemetryQueryPort + aspire-otlp-http adapter #413) resolves a traceId, then out-links to {aspireBase}/traces/detail/{id}, /structuredlogs?resource=, /consolelogs/resource/, /metrics/resource/. Never re-renders OTLP. The S13 flow plane does not widen this port.
  3. Dashboard → Scalar: /api/docs (+ operation anchor) deep-links only; externalDocs optional polish.
  4. Data plane: owned /_netscript/* introspection ([dashboard DDX-13] Introspection endpoint (/_netscript/*) #423) over already-shipped oRPC contracts, plus /_netscript/flows (SSE): beta.6 joins the shipped per-primitive streams on the stamped traceparent; co-req DDX-23 ([dashboard DDX-23] seam-event flow plane: unified envelope + HTTP boundary events (S13 co-req) #557) adds the unified seam-event envelope + HTTP boundary events.

Killed / folded surfaces (documented so they don't creep back)

Slice map / dependencies

Plumbing: #410 (fresh-ui L3 blocks) → #412 (core scaffold, + FlowRecord) → #414 (thin plugin) · #411 (Seam A) · #413 (+#408 telemetry T7) · #423 (introspection + flows join) · #424 (CLI/deep-links/generator) · #427 (panel seam — the Directus-validated contribution axis).
Screens: #415, #416, #417, #418 (S13), #419, #420, #428#431, DDX-20/21/22 (#551 #552 #553).
Management wave (beta.7): #432 elevated — "Add resource" scaffold-from-UI keystone; DDX-23 seam-event envelope #557; template-gallery create entries in S5/S7–S10.
Design pre-step: #507 (S1–S13 Claude Design prototype; duplication caught at design review). UI quality: #509.
Gate: #426 (E2E join + panel smoke; v2 adds the S13 flow-chain assertion, still no owned-waterfall assertion).
Co-requisites (wave:defer): TriggerDlqPort contract route #554, queue DeadLetterStore CLI/API #555. Co-requisite (beta.7): runtime-config mutation use-cases #556 (S3 write-back — surface check 2026-07-06: the store is read+watch-only today).
Deferred convergences: in-dashboard AI-on-codegen (with #238), in-app plugin marketplace beyond S5 marketplace-lite.

Refs #301 (road to stable). Co-lands with epic:telemetry-revamp (#399) for T4–T7 correlation fidelity.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions