Repository navigation
Description
Question
Point the primary SUBSIDE host at ui-react in place of mint-ui-lit, once #76 has proven the
app works against TACC's real data on a Vercel preview.
Settled by #69 — these were open questions on this ticket and no longer are:
- The legacy
uicomponent stays deployed but unrouted. Not a second path, not a second
URL: the route moves toui-reactand the Lit deployment is simply left running. It is
removed after client sign-off (Remove the legacy ui Helm component from TACC's deployment #81), not here. - Rollback is therefore re-pointing the route back at the still-running Lit deployment.
- Nobody needs telling before the URL changes — there are no users on Lit at TACC.
What this ticket still has to do:
- Deploy
ui-reactto TACC's cluster and movemint.tacc.utexas.eduonto it. - Confirm the OAuth2 round-trip at the real origin. This is the one thing Smoke-test ui-react on a Vercel preview against TACC's real Hasura and CKAN #76 structurally
cannot prove, because Vercel previews use a dedicated OAuth path for preview origins
(ADR-0002). Check whether the OAuth2 redirect URI for mint.tacc.utexas.edu is already registered #73 settles the redirect URI; this is where it is exercised for real. - Re-check anything from Smoke-test ui-react on a Vercel preview against TACC's real Hasura and CKAN #76's checklist whose behaviour depends on the origin or on the
container's runtime config rather than on the app itself — in particular login-gated reads and,
if Proxy CKAN through the container nginx (only if T3 says CORS is broken) #74 landed an nginx CKAN proxy,/datasets/*through it.
This is the only genuinely one-way step on the map. Everything before it is reversible.
Sharpened by Check whether the OAuth2 redirect URI for mint.tacc.utexas.edu is already registered:
the redirect URI is already registered — https://mint.tacc.utexas.edu/oauth2/callback is the
exact callback_url of Tapis client mint, the one Lit uses today, and ui-react reuses that
client rather than getting its own. Three constraints follow, and they bind this ticket:
- The ingress host must be exactly
https://mint.tacc.utexas.edu. Tapis matches
redirect_urion scheme, host and path; a plain-http://route is rejected by the IdP
(verified). TLS is not cosmetic here, it is the login contract. - Lit must be unrouted, never re-hosted. Its callback URL is hardcoded to
${window.location.origin}/oauth2/callbackwith no override, and clientmintis pinned to
the one origin — so Lit parked at a second hostname cannot log in, and the rollback would
be a rollback to a broken app. Setcomponents.ui.ingress.enabled: falseand leave the
deployment running; that is exactly the state Confirm SUBSIDE can live without the un-ported Lit screens #69 asked for and the chart expresses it.
Rollback = re-enable that ingress and take the host offui_react. No IdP change either
way — whichever app holds the route is the one clientmintserves. - No staging host for
ui-reactbefore the flip. A temporary hostname would need its own
Tapis client — and the Vercel preview-forwarding trick cannot substitute, because it forwards
through the fixed origin, which would still be serving Lit, and Lit does not forward.
The OAuth round-trip this ticket must confirm is therefore a real check of the deployment
(TLS terminating on the right host, nginx SPA fallback serving /oauth2/callback, the
entrypoint writing AUTH_CLIENT_ID: mint), not of the registration — the registration is
proven. The container side already checks out: docker/nginx.conf falls back
try_files $uri /index.html, so the callback route loads the app rather than 404ing.
Sharpened by Settle the window.MINT_CONFIG values for the TACC deployment:
the config half of the flip is decided. Add exactly this to TACC's values:
components:
ui_react:
enabled: true
config:
client_id: "mint"
data_catalog_api: "https://ckan.tacc.utexas.edu"Ten of the twelve __MINT_CONFIG__ keys need no statement. They derive from the component
ingresses or inherit shared chart values that TACC already overrides. #75 has the full table and
the evidence for each.
data_catalog_api looks redundant and is not. The ui_react template derives CKAN from
components.data_catalog, which TACC does not use; TACC uses external_services.ckan.url.
Without the override the key is omitted and the app falls back to a compiled default that
happens to be correct. State it.
Two chart cleanups to do while you are in there, neither blocking:
ui-react-config.yamlstill emitsMODEL_CATALOG_API. Commit .env.example and local-setup notes so ui-react runs for someone who is not Max #72 deleted that key from the app.
The generator ignores unknown variables, so it is harmless — remove it for hygiene.values.yamland thefailinui-react-config.yamlclaim the React client must differ
from Lit's. Check whether the OAuth2 redirect URI for mint.tacc.utexas.edu is already registered #73 settled that this is wrong for this rollout. Correct the text. Thefail
itself triggers only on an emptyclient_id, so it does not block"mint".
Also make ui-react-config.yaml read external_services.ckan.url, as ui-config.yaml does.
The override above makes this optional.
Activity
mosoriob commentedon Aug 8, 2026
New chart change, from #88 — a prerequisite, not a cleanup.
ui-react-config.yamlmust emitEXECUTION_ENGINE. Derive it from.Values.components.ensemble_manager.config.execution_engine.type. This is howui-config.yaml:52already feedswindow.REACT_APP_EXECUTION_ENGINEto Lit. TACC overrides that value totapis, so TACC needs no new value.Why it is required. The app default is
localex, matching the chart default. Without the key,ui-reactat TACC posts run submissions to/executionsLocalinstead of/executionEngines/tapis.It does not block the flip. The SOW criterion is the single-form model input config, not run execution.
The chart cleanup list is now four items: the dead
MODEL_CATALOG_APIkey, the wrong "must be a distinct client" text,external_services.ckan.url, and this.mosoriob commentedon Aug 9, 2026
Known gap from #92, and it does not block this ticket.
ui-reactcannot find datasets by standard variable. The thread wizard's Datasets step returnsthe right datasets for only 3 of TACC's 40 annotated variables. 28 return zero, and some return
only false positives. Cause and evidence: #94.
Why it does not block the flip. The SOW §8 criterion is the single-form model input config,
which passes (#76). This fault is on the thread-execution path, the same side of the app as #85
and #88, neither of which blocked this ticket either.
Why it still matters at the flip. Anyone at TACC who opens a thread and reaches Datasets sees
an empty list with no error. It reads as an empty deployment, the same trap as the California
region default. Expect the question if TACC walks the modeling path before #94 lands.
No chart change follows from this. It is client-only.
8 remaining items
mosoriob commentedon Aug 11, 2026
Constraint from #116 — re-confirm the delete at the real origin after the flip.
#116 proved the delete round trip through TACC's production Hasura under a real Tapis token, but at
localhost:3000, not atmint.tacc.utexas.edu. The literal test could not be run: this host still serves Lit, and Lit's delete is broken for its own reason, so it would have failed without saying anything about the migration.Origin is not part of that round trip — same endpoint, same database, same
userrole. So nothing about the delete is left open. What is left open is what this ticket already owns: the deployment. Add the delete to the post-flip re-check list, next to the OAuth2 round trip:anonymous, not just in the app — an orphan is invisible to its owner and visible toanonymous, which is how Deleting a problem statement, task or thread leaves the row behind and reports success #99 hid for so longOne thing this ticket must not assume. The migration alone does not fix delete. The client fix (#115) is required, and Lit is still broken. Lit stays deployed-but-unrouted at the flip, so that is fine — but if the route is ever rolled back to Lit, delete goes back to silently orphaning rows.
Two orphans from the #116 verification are still in TACC's database, cleanup in #120. Not a blocker here.
mosoriob commentedon Aug 30, 2026
Sharpened by Chart never sets EXECUTION_ENGINE for ui_react:
the three chart cleanups #75 listed here are done, and one of them was not a cleanup.
MODEL_CATALOG_APIis no longer emitted, and its override key is gone fromvalues.yaml.client_idtext no longer claims the React UI needs a client distinct from the legacy UI's.ui-react-config.yamlnow readsexternal_services.ckan.url. This one mattered. Without itthe key was omitted, not wrong, so the app fell back to a compiled-in default that was correct
by coincidence — the same class of gap as Chart never sets EXECUTION_ENGINE for ui_react, so a deployed React UI submits runs to the wrong engine #150 itself.
So the values to add to TACC's deployment are now one line, not two:
data_catalog_apiis no longer needed — TACC setsexternal_services.ckan.url, and the templatenow reads it. Stating it explicitly is still harmless and still wins.
One new constraint:
9.0.0-beta.6is not installable from the chart repo.beta.4andbeta.5wereChart.yamlversion bumps that were never packaged, soreleases/andindex.yamlstop at
9.0.0-beta.3. This flip therefore needs either a packaged release commit(
make releasein helm-charts) or a deploy from a git checkout. The dev cluster rehearsal used alocal chart path.
And one worry that turns out not to apply. #123
(a config-map-only change does not roll pods) does not bite
ui_react: its deployment carries achecksum/configpod-template annotation, so changingcomponents.ui_react.configat the flip doesrestart the pod and the new
env-config.jsreaches the browser. Verified on the dev cluster.mint-uiandmint-ensemble-managercarry no such annotation, so #123 still applies to them.mosoriob commentedon Aug 30, 2026
Correction to the constraint above:
9.0.0-beta.6is now installable. It is packaged, taggedand published —
helm repo add mint https://mintproject.github.io/mint/then--version 9.0.0-beta.6. Rendering straight from the published repo against the dev cluster'svalues gives
EXECUTION_ENGINE: "tapis"andDATA_CATALOG_API: "https://ckan.tacc.utexas.edu".So this ticket does not need to package a release or deploy from a checkout. Two things remain
on the chart side:
beta.4andbeta.5never existed as artifacts. They wereChart.yamlbumps that were neverpackaged. The chart repo goes
9.0.0-beta.3→9.0.0-beta.6; there is no gap to explain, only anumbering jump.
helm-chartssubmodule pointer still needs bumping to the release commit(
7130169), the way #70 bumped it forbeta.3. Not done here — the working branch had an unrelated pointer bump in flight.mosoriob commentedon Sep 12, 2026
Three constraints from #207, measured
by rendering
dynamo/sharedwithui_react.enabled=true.1. The TACC values block is four lines, not one. #150 recorded "one line,
client_id: mint". That is wrong. Withenabled: truealone the render gives:AUTH_CLIENT_ID: "mint-local"— the chart default. TACC needs"mint"(#73).
ui_reactingress on hostmint.local, with no TLS, whilemint-uikeepsmint.tacc.utexas.eduand theminttaccsecret.So this ticket sets
enabled: true,config.client_id: "mint", the ingress host and theminttaccTLS block, and moves Lit's ingress aside in the same edit.branding: taccisalready there from #207; do not remove it.
2.
BRANDINGis carried, but never read at TACC. #207 proved the key on the dev cluster,in the pod's own
env-config.js. It could not prove it at TACC, because there is noui_reactpod until this ticket runs. Take #207's acceptance check here: after the flip,kubectl execinto theui_reactpod and readenv-config.js. It must showBRANDING: "tacc",AUTH_CLIENT_ID: "mint"andEXECUTION_ENGINE: "tapis". A greenhelm upgradeis not proof.3. The chart pin needs no bump.
dynamoalready pins9.0.0-beta.11, which carriesBRANDING.9.0.0-beta.12is on the chart'smainbut is unpublished, and nothing hereneeds it.
mosoriob commentedon Sep 12, 2026
The TACC deploy checkout is current. This ticket needs a values edit and nothing else.
Read on the login node at
~/tacc-values/sharedon 2026-09-12, after ahelm upgradethatreached revision 185:
git log→85149e7, level withdynamoorigin/main. That is the Carry BRANDING from the MINT chart to the pod at TACC #207 commit.Chart.lockandcharts/→MINT-9.0.0-beta.11.tgz, the version that carriesBRANDING.values.yaml:112-119→branding: taccundercomponents.ui_react.config.values.yaml:111→enabled: false, so the upgrade deployed noui_reactpod. Confirmed:deployments.apps "mint-ui-react" not found.So no
git pulland nohelm dependency updateare needed here.helm upgrade .reads thevendored
charts/directory rather than the repository, so a pull alone would not move the chart— but the chart is already right.
Note
helm listprintsmint-isi-0.3.0, the umbrella chart. It never shows the MINT dependencyversion. Read
Chart.lockfor that.mosoriob commentedon Sep 12, 2026
TACC deployment, read from outside on 2026-09-12
The finding: the pinned image has no branding
dynamosetsglobal.imageTag: '0.1.0'. That tag isv0.1.0=mainhead =971622c,cut 2026-08-30. It does not carry #206:
ui-react/src/lib/branding.ts— absent.BRANDINGinscripts/generate-env-config.mjs— absent.ui-react/public/images/— absent, so neither logo is in the image.So a flip on today's pin drops the TACC and UT Austin logos — the exact regression #206 was
opened to prevent, and which #207 just
carried through the chart and
dynamo. The chart would sendBRANDING: "tacc"to an image thatdoes not read the key.
developis 95 commits ahead ofv0.1.0. There is no newer release tag and no openrelease-please PR. So this ticket must also choose the image: cut a release from
develop, orpin
global.imageTagto adevelopSHA. All four services have an image at thedevelophead
9d58ec77a08151ffa6eacc6aa50648a9128718a0—mint-ui-react,ensemble-manager,model-catalog-apiandgraphql-engineall return a manifest — so a single global pin isavailable. Note the package is
ensemble-manager, notmint-ensemble-manager.A trap in the acceptance check
curl https://mint.tacc.utexas.edu/env-config.jsreturns 200 today, before any flip. nginxserves
index.htmlfor an unknown path, so the body is Lit's page. A status code proves nothinghere, in either direction. Read the body for
window.__MINT_CONFIG__, or read the fileinside the pod.
State confirmed
mint.tacc.utexas.edu<title>DYNAMO</title>,config.jswithREACT_APP_*)ui_reactpodenabled: falseAUTH_CLIENT_IDmint— confirms this ticket'sclient_id: "mint"EXECUTION_ENGINEtapisAccess-Control-Allow-Origin: */v1/executionEngines/tapispackage_listAccess-Control-Allow-Origin: https://mint.tacc.utexas.eduthread { response_variable { label } }validation-failed— #136 not appliedthread { response_variable { name } }One thing to file separately
Lit's
config.jsis served publicly and containsREACT_APP_DATA_CATALOG_KEY, a CKAN JWT. Itis readable by anyone who loads the page, so it is already exposed rather than newly exposed.
ui-reactneeds no CKAN key (#75 — everyread is an anonymous GET), so the flip stops publishing it. Rotate it when
#81 retires Lit.
mosoriob commentedon Sep 12, 2026
Flipped 2026-09-12. Verified from outside; two checks still need a login.
mint.tacc.utexas.eduservesui-react. Values indynamo#18, merged and deployed.
Proven
<title>MINT Model Catalog</title>env-config.jsAUTH_CLIENT_IDmintEXECUTION_ENGINEtapisBRANDINGtacc/oauth2/callback/config.jsAccess-Control-Allow-Origin: *thread { response_variable { label } }The served
env-config.jsreplaces #207'skubectl execcheck. It is stronger: it is the filethe browser gets.
The render matched the deploy
helm templatewith chart9.0.0-beta.13and TACC's own values changed exactly this: it removedIngress/mint-uiand addedConfigMap,Deployment,ServiceandIngressformint-ui-react.Deployment/mint-uistays, so the rollback of #73 is in place.Two md5 guards proved the file.
shared/values.yamlatdynamomainwas byte-identical to thefile I rendered against, and the patched file was byte-identical to the one whose render I read.
Still open on this ticket
it, reload, and confirm as
anonymous.Both need a signed-in browser.
One thing to file
Lit's
config.jspublishedREACT_APP_DATA_CATALOG_KEY, a CKAN JWT, to every visitor. The flipstops publishing it.
ui-reactneeds no CKAN key (#75). Rotate the key when#81 retires Lit.
mosoriob commentedon Sep 12, 2026
Done.
mint.tacc.utexas.eduservesui-react, signed in, at the real origin.Both open checks pass. Values in
dynamo#18.
1. The OAuth2 round trip — the thing #76 could not prove
Proven from the network log, not from the screen.
Tapis validates
redirect_uribefore it draws the login form, so the 302 is the match onscheme, host and path. The callback 200 is nginx's SPA fallback serving the app. The app took
the token and the header reads
mosorio. #73's decision to reuse clientmintholds.2. The delete round trip — the #116 constraint
Created, deleted, reloaded, and confirmed as
anonymous, which is how #99 hid.wb6crthxmtyr8yip)The child
taskrow is gone with it, so the CASCADE is verified from the app at the realorigin. The row is gone from the list after a reload.
Also confirmed
tacc.utexas.eduandutexas.edu.render with no login.
env-config.jsreadsAUTH_CLIENT_ID: "mint",EXECUTION_ENGINE: "tapis",BRANDING: "tacc".Three things outlive this ticket
env-config.jsbeats Carry BRANDING from the MINT chart to the pod at TACC #207'skubectl execcheck. It is the file the browsergets. Read it at the host.
straight to Tapis. An isolated context proved the app does not bounce anonymous visitors.
Check in a clean context before filing that bug.
problem statement list showed 1 item. This is the first screen
#80 hands the client. Say "switch to
Texas" in the handover, or it reads as an empty deployment.
One thing to file
Lit's
config.jspublishedREACT_APP_DATA_CATALOG_KEY, a CKAN JWT, to every visitor. The flipstops publishing it. Rotate the key when
#81 retires Lit.