T-IUES-add-a-determined-typecheck-moon-task-ci-gate-nuxi-typecheck
Status: planning/draft · Impact: high · Complexity: medium
The determined shell/frame packages and products have no typecheck task in moon
or CI, so nothing runs vue-tsc over their assembled layer graph. An 8-PR
shell-refactor epic (#897–#908) merged to main with zero build/typecheck of
its Vue/Nuxt code as a result. Add a moon typecheck task on a canary product
plus a path-scoped CI gate, so a shell/frame/experience change can’t merge
without nuxi typecheck passing.
| Location | Role today |
|---|---|
packages/ts/shell/ | @determined/shell — no moon.yml, no check/typecheck task |
packages/ts/app-frame/ | @sksizer/app-frame — no moon.yml, no check/typecheck task |
packages/ts/ui/ | @determined/ui — no moon.yml, no check/typecheck task |
solutions/determined/products/workbench/ | extends @determined/shell + all 20 experiences; has nuxt (so nuxi is available) but no typecheck script/moon target; not a registered moon project |
package.json | The repo-root manifest. Per-solution explicit enrollment (T-C9RD convention): solutions/determined/{apps,experiences,products,packages}/* are root Bun workspace members, so workbench installs from the root lockfile |
.moon/workspace.yml | project globs cover apps/* + packages/ts/* + per-solution augmented entries; determined projects are pinned as explicit sources: at solutions/determined/... — solutions/determined/products/* (incl. workbench) is NOT among them |
.moon/tasks/ | rust.yml, tauri.yml, ts-lib.yml — ts-lib’s inherited check (bunx tsc --noEmit) covers backend TS libraries only; no inherited Vue/Nuxt typecheck |
.github/workflows/determined-rust-ci.yml | the only determined-scoped CI gate; its paths: filter is solutions/determined/crates/** (+ platform-core, Cargo manifests) — Rust tests/lints only, never the Vue/Nuxt tier |
.github/workflows/polish-ci.yml | the pattern to mirror: a path-scoped (apps/legacy-polish/**) Nuxt nuxi typecheck gate for polish only |
Proposed
Section titled “Proposed”workbench (the maximal product — shell → app-frame → ui + all 20 experiences)
exposes a moon run workbench:typecheck task that runs nuxi typecheck over the
assembled layer graph. A CI workflow runs that task on PRs touching
packages/ts/{shell,app-frame,ui}/** or solutions/determined/{experiences,products}/**,
blocking merge on failure — mirroring how polish-ci gates polish.
Approach
Section titled “Approach”- Register the canary product as a moon project (add
solutions/determined/products/workbenchto.moon/workspace.ymlsources, joining the existing per-solution determined entries there, or add its ownmoon.yml— pick whichever matches the repo’s existing product-registration convention). - Add a
typechecktask toworkbench’smoon.yml:nuxi typecheck(runFromWorkspaceRoot: falseso it runs in the product dir;toolchains: system; dep oninstall). Canary =workbenchfor maximal coverage. - Add
.github/workflows/determined-ci.yml:pull_requestscoped topackages/ts/{shell,app-frame,ui}/**+solutions/determined/experiences/**+solutions/determined/products/**+ the workflow file; runsbun install --frozen-lockfilethenmoon run workbench:typecheck. Mirrorpolish-ci(concurrency group, bun/node setup) anddetermined-rust-ci(which path-filters onsolutions/determined/crates/**). - Verify: introduce a deliberate type error in
packages/ts/shell(orapp-frame), confirmmoon run workbench:typecheckand the CI job fail; revert.
Note: nuxi typecheck spawns the nuxi/vite worker fleet, which kills the local
harness executor (see vue-tsc-kills-host-executor); local runs go through
scripts/with-cleanup.sh. CI runs on a fresh runner, so no wrapper needed there.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
solutions/determined/products/workbench/moon.yml | new | typecheck task running nuxi typecheck |
.moon/workspace.yml | modify | register workbench (products) as a moon project source, if not already resolved by a glob |
.github/workflows/determined-ci.yml | new | path-scoped CI gate running moon run workbench:typecheck |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1:
moon run workbench:typecheckrunsnuxi typecheckover the shell → app-frame → ui + experiences graph and exits non-zero on a type error in any of those layers. - AC-2: a CI workflow runs that typecheck on PRs touching
packages/ts/{shell,app-frame,ui}/**orsolutions/determined/{experiences,products}/**, and blocks merge on failure. - AC-3: a deliberately introduced type error in
packages/ts/shell(orapp-frame) is caught by the gate, then reverted (demonstrated in the PR).
Out of scope
Section titled “Out of scope”- The general per-project-type quality-check system (the “Per-project-type quality-check moon task” backlog item, and B-VW5Z-quality-checks-by-glob-patterns) — this task is the determined-typecheck slice only; folding it into that system is the follow-on.
- Fixing any pre-existing type errors the gate surfaces on first run — triage separately (finding them is the point).
Dependencies
Section titled “Dependencies”- none
Discovery context
Section titled “Discovery context”Surfaced 2026-07-18 while validating the app-frame pane-shell stack (#897–#908): no moon or CI task typechecks the determined shell/frame, so the epic merged unbuilt. Relates to the “Per-project-type quality-check moon task” backlog item (the broader per-project-type system this is the first slice of).