Repository navigation
Description
Question
First contact with TACC's own data and services.
Rescoped by #69. This was originally a parallel deploy on TACC's cluster alongside the
untouched ui component. There are no users on Lit at TACC, so there is nothing to deploy
beside — the staged rollout bought nothing. Testing happens on a Vercel preview pointed at
TACC's Hasura and CKAN, and production is then upgraded directly in #77.
What a Vercel preview cannot prove moves to #77: the OAuth2 round-trip at the real
mint.tacc.utexas.edu origin, because previews use a dedicated OAuth path for preview origins
(see ADR-0002). #73 settles the redirect URI; #77 confirms it end to end at the real origin.
Everything else is provable here. Walk it by hand, in a real browser:
- Log in on the preview. Token attaches to writes.
/models— the faceted browser. Check the "Output variable" facet is populated. ADR-0001
warns theanonymousrole cannot readmodelcatalog_standard_variable, and it fails as
null, not as an error — so an empty facet is silent. Check logged out as well as in.- The §8 acceptance criterion: register or configure a model input and set variable +
standard variable + unit in one submission. This is the contracted deliverable; it must work
here, against TACC's catalog, not just locally. - The standard-variable and unit typeaheads actually return results — confirm TACC's catalog
holds the ~303 variables and ~107 units the form assumes. /datasets/*against real CKAN. Note a Vercel preview has no container nginx, so if Verify CKAN from a browser origin against ckan.tacc.utexas.edu — is CORS actually broken? #71 finds
CORS is broken this is exercised through whatever Proxy CKAN through the container nginx (only if T3 says CORS is broken) #74 lands on — or deferred to Flip mint.tacc.utexas.edu to ui-react #77./modeling/*— problem statement → task → thread wizard.
Verify in a real browser, not jsdom. ADR-0002 records that jsdom cannot catch the cmdk
data-[disabled] bug — no Tailwind is applied and userEvent.click ignores pointer-events,
so combobox options that are greyed and unclickable in production test green.
Whatever breaks here becomes new tickets.
Sharpened by Settle the window.MINT_CONFIG values for the TACC deployment:
three checks are already done, and one is off the list.
- No CKAN API key. Lit sets
DATA_CATALOG_KEYfrom a chart secret.ui-reacthas no such
key and needs none — it calls onlypackage_searchandpackage_show, with GET. Do not
chase a missing credential if a dataset does not appear. Anonymous read is the whole contract. - CORS is settled for Hasura and the Ensemble Manager. Both send
Access-Control-Allow-Origin: *to every origin, verified live. Only CKAN uses an allowlist,
which Verify CKAN from a browser origin against ckan.tacc.utexas.edu — is CORS actually broken? #71 already fixed for the branch alias. A CORS failure in this smoke test means the
preview is on the wrong URL, not that a service needs a change. - TACC's Hasura answers anonymously. A live query returned a row from
modelcatalog_standard_variable. The remaining permission question is what the Tapis token
unlocks after login, not whether the endpoint is reachable. ENSEMBLE_MANAGER_APIis set, tohttps://ensemble-manager.mint.tacc.utexas.edu/v1. The
service is live:GET /v1/executions/<id>/logsreturns 404 for an unknown id. So thread
execution is now in scope for this smoke test. It would have silently done nothing before.
Narrowed by the local smoke test (see the resolution comment below). The anonymous half is
done and passed: the Output variable facet is populated, the cmdk click bug is absent, CKAN
search works, /variables and /models render, and the console is clean. TACC holds 668
standard variables and 129 units, so the typeaheads have data.
What remains needs a signed-in human, on the Vercel preview
monorepo-git-develop-mosoriobs-projects.vercel.app:
- Sign in; confirm the token attaches to writes.
- §8 acceptance criterion — one model input, variable + standard variable + unit, in a
single submission, against TACC's catalog. The contracted deliverable. - The standard-variable and unit typeaheads inside that form return results.
-
/modeling/*— problem statement → task → thread. - Thread execution, now that
ENSEMBLE_MANAGER_APIis set.
Local login cannot substitute: client mint-local is registered to a callback_url that matches
no local origin, so every ProtectedRoute is unreachable on localhost.
Activity
[-]Deploy beside Lit on TACC's cluster and smoke-test against real data[/-][+]Smoke-test ui-react on a Vercel preview against TACC's real Hasura and CKAN[/+]mosoriob commentedon Aug 8, 2026
Constraint from #71: the
/datasets/*leg cannot run on a Vercel preview.CKAN echoes
Access-Control-Allow-Originonly for*.tacc.utexas.edu,localhostand127.0.0.1.*.vercel.appgets no ACAO, so every CKAN call from a preview is blocked by the browser — surfacing as afetchTypeError, not an HTTP error. This is not aui-reactdefect; production atmint.tacc.utexas.eduis allowlisted and works.The escape hatch this ticket names — "exercised through whatever #74 lands on" — is gone: #74 is closed unopened, because the container nginx proxy only serves the already-working production origin and never touches a preview.
Run the
/datasets/*leg fromlocalhostinstead.npm run dev(or the container run locally) pointed at TACC's real Hasura and CKAN is an allowlisted origin, so it exercises the real catalog with no proxy and no config request to TACC. Everything else on this ticket stays on the Vercel preview as written.Still a real-browser check either way — jsdom proves nothing here (ADR-0002).
mosoriob commentedon Aug 8, 2026
Incidental measurements from #71 — not a resolution of this ticket, just facts that fell
out of probing origins. Everything below still needs the real-browser walk this ticket
describes.
TACC's Hasura is
https://graphql.mint.tacc.utexas.edu/v1/graphql(found by probing; #75 stillowns pinning it in config).
Access-Control-Allow-Origin: *. The CKAN origin allowlist isnot mirrored here, so the Hasura half of this smoke test runs fine on a Vercel preview.
Only the
/datasets/*leg has to move tolocalhost.anonymouscan readmodelcatalog_standard_variableandmodelcatalog_unitat TACC —unlike the ISI endpoint ADR-0001 warns about. A two-row
limit: 2query returns real idsfrom both. So the silent-empty-facet failure mode this ticket flags may simply not exist
here. Still worth eyeballing the facet logged out, since a read permission is not the same
as the facet query succeeding.
*_aggregateis absent foranonymous(field 'modelcatalog_standard_variable_aggregate' not found in type: 'query_root') — same gap as ISI, so no server-side facet counts, and the~303 / ~107 counts could not be taken this way.
mosoriob commentedon Aug 8, 2026
The
localhostconstraint is lifted — disregard my earlier comment on this point.Max added
*.vercel.appto CKAN's nginx origin map and reloaded; I re-measured andAccess-Control-Allow-Originis now echoed to Vercel origins on every action this app calls,preflight included. See the amendment on
#71.
So this ticket runs entirely on the Vercel preview as originally written,
/datasets/*included. Nothing moves to
localhost, no proxy, no split test surface.The rest of that earlier comment still stands: Hasura is at
https://graphql.mint.tacc.utexas.edu/v1/graphqlwithAccess-Control-Allow-Origin: *,anonymouscan readmodelcatalog_standard_variableandmodelcatalog_unitat TACC(unlike ISI, so the silent-empty-facet trap may not bite here — still worth eyeballing the
facet logged out), and
*_aggregateis absent foranonymous, so facet counts and the~303 / ~107 tallies can't come from there.
mosoriob commentedon Aug 8, 2026
Test on the branch alias, not the per-deployment URL.
CKAN's origin allowlist was narrowed to two exact Vercel origins (see
#71 amendment 2):
https://monorepo-mosoriobs-projects.vercel.app— production aliashttps://monorepo-git-develop-mosoriobs-projects.vercel.app— use this onePer-deployment URLs like
monorepo-d21dd85we-mosoriobs-projects.vercel.appare refused, anddeliberately cannot be allowlisted — the hash changes on every push. The branch alias serves the
latest
developbuild, so it is the same artifact.If
/datasets/*comes up empty withfetchTypeErrors and no HTTP error in the network panel,check the origin in the address bar before filing it as a defect — that failure is this
allowlist. Testing any other branch needs its alias added to CKAN's nginx map first.
Verified live: all four CKAN actions this app calls return
200with the header from the branchalias, preflight included.
mosoriob commentedon Aug 8, 2026
Partial result: the anonymous half passes. The authenticated half is untested and still needs a human.
I could not use the Vercel preview. It sits behind Vercel SSO, and I will not log in to Vercel
as you. So I ran the app locally against TACC's real Hasura, CKAN and Ensemble Manager, and drove
it in a real Chrome — not jsdom, per the ADR-0002 warning.
localhostis in CKAN's allowlist (#71), so a local origin tests more than the preview does,not less. The one thing it cannot test is login. See the blocker below.
Passed, against TACC's real data
Output variablefacet is populated. This was the flagged silent-failure risk.ADR-0001 warns
anonymouscannot readmodelcatalog_standard_variableand that it fails asnull, not as an error. That warning does not apply to TACC. The facet returned 47 optionsfor the query
water, logged out.data-[disabled]bug is absent. I measured the rendered options rather thantrusting the screenshot: all 47 report
data-disabled="false",pointer-events: autoandopacity: 1. A real hit test withelementFromPointlanded on the option, and a real pointersequence selected it. The page then filtered to the one matching model and put the variable in
the URL. This is the check jsdom cannot do.
/datasets/searchworks against real CKAN.bayoureturned 2 datasets with full metadata.GLDASreturned 0 — and that is correct, not a silent failure: TACC's CKAN holds 215datasets and none match GLDAS. I confirmed both counts against the CKAN API directly.
/variablesrenders TACC's standard variables with categories and units./modelslists 35+ models from TACC's catalog.Catalog counts — the fog item is settled
anonymoushas no*_aggregateat TACC, so #75 could not take counts. I counted by paginginstead:
modelcatalog_standard_variablemodelcatalog_unitBoth are well above the assumption. The typeaheads have data to return.
Blocker: local login is impossible
Every remaining check is behind
ProtectedRoute—/models/register,/models/configure/:slugid, and all of/modeling/*. Signing in locally dead-ends at Tapis:The client
mint-localexists — a bogus client id returnsInvalid client.instead — but itsregistered
callback_urlmatches none oflocalhost:3000,:5173,:4173,:8080,127.0.0.1:3000, thehttps://form, or the/callbackand trailing-slash path variants.This is minor debt, not a rollout risk. Production uses client
mint, which #73 verified isregistered correctly for
https://mint.tacc.utexas.edu/oauth2/callback. But it means.env.exampleships anAUTH_CLIENT_IDthat cannot log in, so the local setup from #72 isread-only in practice. Worth a line in the README.
What is left — needs you signed in
Do this on the Vercel preview
monorepo-git-develop-mosoriobs-projects.vercel.app, where loginworks and CKAN is allowlisted:
the only item that must not be deferred.
there (668 / 129); this checks the form reaches it.
/modeling/*— problem statement → task → thread.ENSEMBLE_MANAGER_APIis set.The OAuth round-trip at the real origin stays with #77, as originally scoped.
mosoriob commentedon Aug 8, 2026
Login now works on
localhost:3000, and it immediately found a defect.The blocker in the comment above is fixed. Tapis client
mint-localhost-3000is registeredto
http://localhost:3000/oauth2/callbackand is now the repo's defaultAUTH_CLIENT_ID.mint-localis untouched and still serveshttp://mint.local/oauth2/callback— verified byprobing the authorize endpoint for both clients against both URIs.
Max signed in against TACC's Tapis. The OAuth round trip completed and the token landed in
localStorage.The defect: the token is stored as
mint.access_token, butMintThread.tsxandMintRuns.tsxreadaccess-token— a key nothing writes. Both Ensemble Manager callstherefore go out with no
Authorizationheader, and they fail silently because the header isspread conditionally. Tracked as #85.
This is why item 5 of the remaining checklist could not have passed. Do #85 before retrying
thread execution.
mosoriob commentedon Aug 8, 2026
Local login fix is up as PR #86 against
develop. It only changes the defaultAUTH_CLIENT_ID; production and Vercel override it. #85 is deliberately not included.mosoriob commentedon Aug 8, 2026
Resolved. The §8 acceptance criterion passes against TACC's real catalog — for a new input. Editing an existing one fails, which is #91.
Run signed in as
mosorio@portals(Tapis clientmint-localhost-3000, token live), in a realChrome, against TACC's Hasura, CKAN and Ensemble Manager.
On
localhost:3000, not the Vercel preview. The preview sits behind Vercel SSO and I will notlog in as you.
localhostis in CKAN's allowlist (#71) and now has a working OAuth client, so ittests strictly more than the preview does. The one thing it cannot test — the OAuth round trip at
the real origin — was already #77's, and stays there.
The acceptance criterion
Added a new input to
End to end testing / hello world file input testand set label +standard variable + unit in one submission. All three landed:
WAYFINDER TEST INPUT (delete me) — issue 76soil__porositym3 m-3The form is genuinely flattened. "Standard variable & unit" is one control: pick the standard
variable and the dialog offers the units already used with it —
m³ m⁻³ volume water per volume soilas a one-tap. No second modal.The cmdk trap ADR-0002 warns about is absent here, and could not have applied. This picker is
plain buttons, not cmdk — I checked the attributes. I verified it the hard way anyway:
pointer-events: auto,opacity: 1, andelementFromPointat the option's centre landing on theoption, then a real CDP mouse click.
Typeahead returns real results.
soilreturned many CSDMS-named variables.soil moisturereturned none — correct, not a silent failure; it is not a CSDMS name, and the dialog offers to
create it.
Checklist
Authorization: Bearer …/modeling/*— problem statement → task → threadWhat broke: #91
Editing any existing input fails at save, with
expected one of the values ['_PLACEHOLDER'] for type 'modelcatalog_configuration_input_update_column', but found 'is_optional'.The junction upsert names a column this repo's own metadata never exposes, so it is not
TACC-specific. It half-applies: the dataset-spec update commits before the throw.
A second, minor fault on the same path: after a successful save the detail view still showed
INPUTS (2). The row was in the database; nothing refetches, so the pre-save cache entry sticksuntil a manual reload.
Both are in #91, which now blocks #77.
/modeling/*Renders against TACC's real data. The wizard — Framing → Variables → Models → Datasets →
Parameters → Runs → Results → Summary — opens with the model already resolved.
One thing to know for the walkthrough: the region filter defaults to California, and TACC has no
problem statements there. The page says "No problem statements yet". Switch to Texas and 20-odd
appear,
SUBSIDE Allocationamong them. Not a defect, but it reads as an empty deployment.Facts for #92 and #77
/executionEngines/tapis,/executionsand/executionsLocal— exactly the three separate mounts ui-react submits runs to /executionEngines/localex, a route that does not exist #88 predicted.mint.tacc.utexas.edu/config.jssetsREACT_APP_EXECUTION_ENGINE = "tapis", so theEXECUTION_ENGINE: tapisconstraint on Flip mint.tacc.utexas.edu to ui-react #77 holds.localexand 1tapis— that path is all but unusedthere. Budget for a Tapis-side failure in Submit one thread run end to end against TACC's Ensemble Manager #92 that is not ours.
Housekeeping
Console clean apart from the two known React Router v7 future-flag warnings. Every test row was
removed — the junction, the dataset specification and the variable presentation. I checked the
orphans: deleting an input through the UI removes only the junction row and leaves the entity rows
behind. Worth knowing, not worth a ticket. TACC's catalog is back to its prior state.