Automation Verification Engineer: Master Local/QA Executable Checklist #337
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#337
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Automation Verification Engineer — Master Checklist
Role: Automation Verification Engineer
Goal: Executable, evidence-backed verification of the entire CL8Y DEX dApp and its LocalTerra / QA-server stack before launch.
Environments: LocalTerra (
localterra, LCD:1317, RPC:26657), QA server (make start-qa/ SSH tunnel), indexer:3001, Vite:5173or:3000.Out of scope: Mainnet/testnet production deploys, treasury multisig ceremonies, formal smart-contract audits, infrastructure penetration tests, Prometheus/metrics (not implemented — #200).
References:
docs/qa-onboarding.md,docs/qa-invariants.md,docs/testing.md,QA_TEMPLATE.md,docs/runbooks/launch-checklist.md,docs/reviews/20260409T030009Z/RELEASE_READINESS_MATRIX.md, issue #291 (CEX UX), #292 (SDK 53), #293 (slippage).Item format: Each row is a single verification scenario. Record PASS/FAIL, build SHA (
git rev-parse HEAD), browser, wallet, and attach screenshots / tx hashes / API responses as noted.Sign-off rule: Section LR-00 Launch Readiness must be 100% PASS with no open P0/P1 blockers before calling the dApp launch-ready.
INF-00 — Environment & Stack Provisioning
INF-00-01 — Fresh LocalTerra full stack bootstrap
make setup-cloud-localterra(ormake reset && make start && make wait-healthy && make build-optimized && make deploy-local && bash scripts/e2e-start-indexer.sh).frontend-dapp/.env.localandindexer/.envexist;make has-localterraexit 0;curl -s http://127.0.0.1:3001/healthreturns OK; Vite serves at:5173.make status;.qa-deploy-stampcontents; indexer startup log first 50 lines.QA_FRESH_VOLUMES=1 make start-qawhen prior volume suspected stale.INF-00-02 — Q1 deploy verification (schema + stamp)
make qa-verify-deploy.is_pausedandexpired_limit_refundqueries succeed; stampgit_shamatchesgit rev-parse HEAD.unknown varianton LCD queries (stale chain volume); stamp mismatch aftergit pullwithout redeploy.scripts/qa/verify-deploy.shstdout; pair address from.env.local.make reset-qaif schema probe fails.INF-00-03 — QA server idempotent restart
make stop-qa && make start-qa(no fresh volumes).make qa-verify-deploystill passes if HEAD unchanged.FACTORY_ADDRESS.make status;lsof -i :3001; indexer logFACTORY_ADDRESSline.make stop-qa.INF-00-04 — Postgres role invariant (PG-1)
make setup-indexer-postgresor inspectindexer/.envDATABASE_URL; runmake test-indexer-integration(subset:cargo test --test security -- --test-threads=1).cl8y_legal(not legacypostgresonly); migrations apply.password authentication failed for user cl8y_legal.indexer/.envredacted URL host/user; migration log.INF-00-05 — Node 24 PATH for frontend dev
/exec-daemon/nodev22.make dev(not barenpm run dev); openhttp://127.0.0.1:5173in Chrome.node -vin dev script is v24.x per.nvmrc.ps aux | grep vite; browser screenshot.make dev.CFG-00 — Configuration & Environment Matrix
CFG-00-01 — Local network env wiring
deploy-localcompleted.frontend-dapp/.env.local:VITE_NETWORK=local,VITE_LCD_URL,VITE_RPC_URL,VITE_FACTORY_ADDRESS,VITE_ROUTER_ADDRESS,VITE_INDEXER_URL=http://127.0.0.1:3001.terra1…; indexer URL matches running API.VITE_INDEXER_URLpointing at dead host..env.localpaste; browser Network tabroute/solvehost.make deploy-local.CFG-00-02 — CORS localhost vs 127.0.0.1
CORS_ORIGINSinindexer/.env.http://localhost:5173and separately athttp://127.0.0.1:5173; trigger indexer fetch (Swap quote or Charts).Access-Control-Allow-Originmissing for one spelling (#131).indexer/.envCORS_ORIGINSline.CFG-00-03 — Simulated wallet dev-only gate
frontend-dapp/.env.developmentwithVITE_DEV_MODE=true,VITE_DEV_MNEMONIC.npm run buildand confirm prod build rejects dev mnemonic (vite.config.tsguard).CFG-00-04 — Expert Mode / slippage settings persistence
localStorage; retail submit still blocks >30% slippage unless Expert on (#293).localStoragekeys screenshot; blocked submit UI for 35% slippage quote.WL-00 — Wallets & Authentication
WL-00-01 — Keplr connect on LocalTerra (primary local wallet)
terra1…truncated address; LUNC balance chip loads (#frontend.md).WL-00-02 — Station on LocalTerra fee/signing limitation
WL-00-03 — Simulated wallet E2E parity
VITE_DEV_MODE=true; dev mnemonic funded by deploy script.terra1x46rqay4d3cssq8gxxvqz8xt6nwlz4td20k38v; tx confirms; balances update.txquery.WL-00-04 — Extension not installed UX
WL-00-05 — WalletConnect session (Cosmostation mobile)
WL-00-06 — Reject transaction recovery
WL-00-07 — Leap wallet absent
NAV-00 — Navigation, Routing & Global Shell
NAV-00-01 — Primary route reachability
/,/trade,/limits,/pool,/create,/charts,/portfolio,/tiers,/protocol; use header nav and mobile menu.NAV-00-02 — Deep link trade pair
.env.localor pool list./trade/<pairAddr>directly; reload.NAV-00-03 — Invalid route handling
/nonexistent,/trade/not-a-terra-address.NAV-00-04 — Theme persistence
localStorage); no flash of wrong theme >1s.NAV-00-05 —
/my-portfolioredirect/my-portfolio./portfolio.SW-00 — Swap (
/)SW-00-01 — Direct pool swap (on-chain tx)
10EMBER; review min received, price impact, route row; submit.SW-00-02 — Multi-hop router swap
route/solveJSON; tx eventwasmattributes.SW-00-03 — Wrap native LUNC swap path
wrap-swap.spec.tsparity.SW-00-04 — Slippage enrichment and retail guard (#293)
--freshif needed); pair with known arb asymmetry (EMBER→CORAL permake verify-issue-293).slippage_percenton route solve; attempt submit without Expert Mode.slippage_percentwhen assets clean.GET /api/v1/route/solve?...response fields; UI screenshot;make verify-issue-293output.SW-00-05 — Max button gas reserve
SW-00-06 — Swap during indexer outage
E2E_INDEXER_OUTAGE=1path or stop indexer; LCD up.swap-indexer-outage.spec.tsparity.SW-00-07 — Fee tier discount on quote
fee-discount-quote-245E2E.hybrid_simulationwithsender; tier page status.SW-00-08 — Hybrid swap disclosure (when hybrid enabled)
hybrid-swap.spec.ts.pool_return_amount/book_return_amountattrs; screenshot.SW-00-09 — Pause banner blocks swap
is_paused; UI screenshot.TR-00 — Trade Workspace (
/trade)TR-00-01 — Initial load layout
/trade; wait for chart, book, market panel.trade-page-initial-load.spec.ts).TR-00-02 — Market order panel execution
TR-00-03 — Limit ticket place + view order
[limit-place] indexer poll failed; placementorder_id.TR-00-04 — Order book edit mode
trade-book-edit-178.spec.ts.TR-00-05 — Pair selector search CLS
trade-pair-select-cls.spec.ts).TR-00-06 — Trade page indexer outage
/trade.trade-indexer-outage.spec.ts).TR-00-07 — Responsive trade layout
trade-page-responsive.spec.ts).LT-00 — Limit Orders (
/limits)LT-00-01 — Single limit place + cancel (tx)
GET .../limit-placementsbefore/after.LT-00-02 — Batch limit placement
LT-00-03 — Ladder placement UI + tx (#295)
/limits.3; type25rungs (inline max error); blur (clamps to 20); submit valid ladder.verify-issue-295-ladder-rung-ui.spec.ts; ladder tx succeeds.make verify-issue-295.LT-00-04 — Gas presets on limit place (#204)
max_adjust_stepsmatches preset mapping (verify-glab-204-limit-gas-presets.sh).LT-00-05 — Claim expired parked order
refundedin API (#142).lifecycle_status.LT-00-06 — Claim all expired batch
limit-orders-claim-all-tx.spec.ts).LT-00-07 — Deep order book pagination
GET .../limit-book?cursor=.pagination_gapwhen walk incomplete.LT-00-08 — Limits page indexer outage
/limits.limits-indexer-outage.spec.tsparity.PL-00 — Pool & Liquidity (
/pool)PL-00-01 — Pool list search, sort, pagination
GET /api/v1/pairs?.PL-00-02 — Add liquidity (tx)
pool-tx.spec.ts).PL-00-03 — Remove liquidity (tx)
PL-00-04 — Wrap in provide liquidity
wrap-pool.spec.ts).PL-00-05 — Router-known vs indexer-only badge
CP-00 — Create Pair (
/create)CP-00-01 — Validation gates
CP-00-02 — Successful pair creation (tx)
PairCreatedevent; pair appears in list (create-pair.spec.ts).FT-00 — Fee Tiers (
/tiers)FT-00-01 — Tier ladder display
/tiers; compare todocs/reference/fee-discount-tiers.md.make check-fee-discount-tier-docspasses.tier_fixtures.rs.FT-00-02 — Register + deregister tier (tx)
fee-tier-tx.spec.ts).PF-00 — Portfolio & Trader Profiles
PF-00-01 — Portfolio balances and positions
/portfolioconnected.PF-00-02 — Wallet swap/limit history (#163)
GET /api/v1/traders/{addr}/trades?format=csv.PF-00-03 — Public trader page
/trader/<addr>; reload; switch address in URL.CH-00 — Charts (
/charts& Trade chart)CH-00-01 — Candle intervals after seed-qa
cd indexer && cargo run -- seed-qa; indexer restarted.GET .../candles?interval=.cargo run -- seed-qa --cleanoptional.CH-00-02 — Chart matches last trade
GET .../trades?limit=1.CH-00-03 — Charts indexer outage
/charts.charts-indexer-outage.spec.ts).CH-00-04 — Price chart smoke (indicators)
price-chart-smoke.spec.ts,test-frontend-charts).PR-00 — Protocol & Oracle (
/protocol)PR-00-01 — Oracle price display
/protocol; note USTC/USD price, source, fetched-at.GET /api/v1/oracle/price.PR-00-02 — Hook events feed
GET /api/v1/hooks.IDX-00 — Indexer API & Sync
IDX-00-01 — Health and Swagger
GET /health; open/swagger-ui.IDX-00-02 — Route solve GET global best execution
GET /api/v1/route/solve?token_in=...&token_out=...&amount_in=1000000with hybrid-capable pair.estimated_amount_out,solver_version,paths_considered; 502 not raw LCD leak (#239).IDX-00-03 — Route solve POST hybrid_by_hop length validation
hybrid_by_hoplength ≠ hop count.IDX-00-04 — Security caps (limit injection)
GET /api/v1/pairs/.../candles?interval=1m';DROP TABLE--andlimit=-1.make test-indexer-integrationsecurity tests log.IDX-00-05 — Indexer sync after swap
GET .../trades; candle bucket updates.IDX-00-06 — CG/CMC compliance shapes
GET /cg/orderbook?ticker_id=...;GET /cmc/orderbook/{pair}.IDX-00-07 — Hybrid volume L10 reconciliation
return_amounttopool_leg_volume+book_leg_volume.api_integrator_hybrid_volumetest reference.IDX-00-08 — Lifecycle emitter scoping (#285)
make verify-issue-285.contract_addressdoes not attribute lifecycle to victim pair.make verify-issue-285output.ONC-00 — On-Chain Contracts (functional, not audit)
ONC-00-01 — Smoke pool swap script
bash scripts/smoke-pool-swap.sh.ONC-00-02 — Factory pause semantics
ONC-00-03 — Fee discount trusted router
is_trusted_routeron Fee Discount contract.truefor production router address.ONC-00-04 — Hybrid simulation vs execution (L8)
hybrid_simulationthen matchinghybridexecute same params.limit_order_tests.rsL8).ERR-00 — Error Recovery & Degraded Modes
ERR-00-01 — LCD outage during quote
make start.ERR-00-02 — ErrorBoundary recovery
ERR-00-03 — Tx broadcast timeout
ERR-00-04 — Insufficient balance preflight
CON-00 — Concurrency & Load (local/QA only)
CON-00-01 — Trading swarm stress
make swarm-localormake swarm-launchprerequisites met./trade.make status; indexer memory; screenshot UI still interactive.CON-00-02 — Parallel Playwright e2e-tx isolation
make test-e2e-tx(1 worker by design).CON-00-03 — Duplicate tab quote consistency
XBR-00 — Cross-Browser (local)
XBR-00-01 — Chrome desktop (primary)
XBR-00-02 — Firefox desktop swap smoke
XBR-00-03 — Playwright Chromium automated suite
CI=1 make test-e2e(5 workers smoke).frontend-dapp/playwright-report/.RES-00 — Responsive Layout
RES-00-01 — Mobile navigation stack
RES-00-02 — Tablet trade layout
/trade.A11Y-00 — Accessibility
A11Y-00-01 — Critical routes axe scan
e2e/a11y-critical-routes.spec.tsor axe DevTools on/,/trade,/limits.A11Y-00-02 — Keyboard-only swap
A11Y-00-03 — Modal focus trap
PERF-00 — Performance (local/QA)
PERF-00-01 — Quote latency p95
PERF-00-02 — Trade page memory 30 min
/tradeopen.PERF-00-03 — Production bundle no sourcemaps
npm run buildin frontend-dapp..js.mapindist/for production mode (#117).find dist -name '*.map'.SEC-00 — Application Security Behavior (not formal audit)
SEC-00-01 — Blacklist compliance probe
blacklist-checkendpoint.GET /api/v1/compliance/blacklist-check?address=...for known clean and test flagged addresses per docs.SEC-00-02 — Rate limit 429 on abuse
RATE_LIMIT_RPSenabled (default 60)./api/v1/route/solvefrom single IP.SEC-00-03 — CORS rejection
CORS_ORIGINS.curl -H "Origin: https://evil.example" /api/v1/pairs.Access-Control-Allow-Originfor evil origin.*in production config.SEC-00-04 — Risk disclosure / legal footer (#138)
docs/frontend.mdrisk surfacing; E2E #138 paths pass.make test-e2efilter 138 if exists.SEC-00-05 — Retail slippage hard block
OBS-00 — Observability & Evidence Collection
OBS-00-01 — Indexer structured logs on block lag
OBS-00-02 — Tx explorer links
localterra(or configured explorer).OBS-00-03 — Terra broadcast confirming link
terra-broadcast-confirming-link-tx.spec.ts).REG-00 — Automated Regression Gates
REG-00-01 — Contract unit tests
make test-contracts.REG-00-02 — Frontend unit tests
make test-frontend.REG-00-03 — Indexer lib tests
cd indexer && cargo test --lib.REG-00-04 — Indexer integration tests
make setup-indexer-postgres.make test-indexer-integration.REG-00-05 — Charts integration
make test-charts-integration.REG-00-06 — E2E strict on-chain
CI=1 make test-e2eandmake test-e2e-tx.REG-00-07 — E2E indexer outage project
make test-e2e-indexer-outage.docs/testing.md.REG-00-08 — Issue-specific verifiers
make verify-issue-285 && make verify-issue-293 && make verify-issue-295 && make verify-issue-324(as applicable).REG-00-09 — Fee tier doc drift
make check-fee-discount-tier-docs.REG-00-10 — Lint gates
make lint-contracts && make lint-frontend.EDGE-00 — Edge Cases & Boundary Conditions
EDGE-00-01 — Zero amount swap
EDGE-00-02 — Decimal precision dust
1e-18displayed.EDGE-00-03 — Non-whitelisted token pair swap attempt
EDGE-00-04 — Expired limit during match
limit-orders.md; no maker double-pay.EDGE-00-05 — Multi-swap same tx indexing (#287)
swap_indexrows.EDGE-00-06 — Chunk load failure recovery
INT-00 — Integration Boundaries
INT-00-01 — Frontend ↔ indexer contract
frontend-dapp/src/services/indexer/client.tstypes to liveGET /api/v1/pairsschema.INT-00-02 — Frontend ↔ LCD contract
poolquery.INT-00-03 — Indexer ↔ chain reorg safety (replay)
ON CONFLICT DO NOTHING— no duplicate swaps (#287).INT-00-04 — Wallet ↔ cosmes patch signing
npx vitest run cosmesPatch127.test.tsin frontend-dapp.INT-00-05 — Vyntrex / integrator route parity
GET /api/v1/route/solve/bestsame params as Swap UI./best.INT-00-06 — QA laptop tunnel workflow
make qa-tunnel-help; scp.env.local; localnpm run dev.LR-00 — Launch Readiness (must be 100% PASS)
LR-00-01 — Stack bootstrap INF-00-01 + Q1 INF-00-02
LR-00-02 — Automated regression suite REG-00-01 through REG-00-10
LR-00-03 — On-chain smoke ONC-00-01 + single-hop + multihop tx
smoke-pool-swap.shpass; SW-00-01 + SW-00-02 PASS manually or via E2E.LR-00-04 — Wallet matrix minimum
LR-00-05 — Core product flows
LR-00-06 — Indexer production invariants sample
LR-00-07 — Degraded mode honesty
LR-00-08 — Security UX gates
LR-00-09 — Accessibility minimum
LR-00-10 — Known blocker triage
blocker:launchorblocker:v2issues for pool-only launch; hybrid launch additionally requires noblocker:hybridand PRODUCT sign-off on quote disclosure (DEX-P1-003).LR-00-11 — SDK 53 / LocalTerra (#292)
make reset-qa && make test-e2ePASS on new image digest; document terrad version in sign-off.LR-00-12 — Slippage / route economics (#293)
make verify-issue-293PASS; retail >30% block confirmed (SW-00-04).LR-00-13 — Documentation alignment
make check-fee-discount-tier-docsPASS; operator confirmsdocs/runbooks/launch-checklist.mdPhase 0–3 items applicable to staging are checked.LR-00-14 — Cross-browser + mobile smoke
LR-00-15 — Final sign-off comment template
Post comment on this issue with:
Execution Notes for Automation Engineers
docs/testing.md).unknown variantLCD errors or address drift (#202, #120).docs/qa-templates/qa-test-pass.md).assigned to @Brouie
mentioned in commit
561d8482e5mentioned in commit
20826eaf42Verification pass — Automation Verification Engineer master checklist (#337)
Build:
20826ea(docs MR branch) / stack at038a457Environment: Cloud Agent VM, LocalTerra Docker, indexer
:3001, Vite:5173Issue: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/337
Outcome
Opened MR with doc cross-links and Cloud Agent E2E guardrail. Issue stays open until MR merges.
Checklist document integrity — PASS
qa-onboarding,qa-invariants,testing,QA_TEMPLATE,launch-checklist,RELEASE_READINESS_MATRIX)maketargets cited in the issue body are defined in the rootMakefilescripts/qa/Sample execution (automated)
make setup-cloud-localterramake qa-verify-deploycl8y_legal+make test-indexer-integrationmake test-charts-integration— no hostpsqlsg docker -c 'CI=1 make test-e2e'— 101/105 smoke passscripts/smoke-pool-swap.shwith deploy stamp pairManual sections (Keplr, WalletConnect, mobile nav, 30-min perf, etc.) remain for human QA using this checklist as the source of truth.
mentioned in merge request !833
mentioned in merge request !834
mentioned in merge request !835
Worked the whole no-browser half of this checklist on a fresh
make reset-qaat038a457(clean genesis: 25 pairs / 60 swaps / 14 assets, USTC-C unique so the #293 enrichment path is live). Posting this as progress, not a sign-off — it's the contract + indexer + source layer. The browser/UI matrix (wallets, nav, swap/trade/limits/pool/create/tiers/portfolio/charts, a11y, responsive, cross-browser, the Playwright e2e projects) I'm batching into the next pass.What passed, with real evidence:
Two real things I found and fixed:
npm run buildis red on main at038a457- tsc -b fails with 2 type errors: priceChartLightweightSeriesSync.ts (the #336 chart-viewport file) has an unconstrained SeriesApi, and useTerraBroadcastMutation.ts (the #305 onMutate wrapper) returns void instead of the mutation context. vite build alone is fine so it slipped - CI runs vitest + eslint but not tsc -b. Fix is type-only; tsc -b + npm run build green after, dist still ships no sourcemaps (#117 holds), chart + broadcast units pass. MR !834 (commit 6cc9e92). Worth adding tsc -b to CI so this stops recurring (same shape as the #246 break).Smaller stuff:
addr, notaddress; route_solver's doc-comment still says global_v1 but it answers global_v3.Counts so far: 36 PASS, 2 partial (REG-00-02 the env artifact; SEC-00-05 indexer-side confirmed, the UI submit-block batched into the browser pass), 3 deferred-with-reason (ONC-00-04 hybrid is out of pool-only launch scope per the readiness matrix; EDGE-00-04/05 covered by contract + #287 integration tests). The rest is the browser pass plus the LR-00 gates, batched next.
@PlasticDigits - two small MRs up: !834 (the red npm run build on main) and !835 (verify-285 harness). The build one is worth pulling in before the next checklist pass.
Browser-pass update (continuing from the no-browser note above). Worked through the live dApp UI against the QA stack — still a progress checkpoint, not the LR-00 sign-off.
Verified live in the UI (on-chain actions cross-checked against the tx + indexer from the back end):
Findings from this pass:
Test isolation:
make test-charts-integrationseeds fixtures (a placeholder pairterra1paircontractabc, tokenterra1ustctoken, traderterra1traderxyz, swapcharts_int_tx_1) into the LIVE indexer DB rather than an isolated one. They surface in the UI — a broken "LUNC / USTC - decoding bech32 failed" pair in /pool, a phantom trader on the leaderboard, and the "indexer 26 vs factory 25" pair-count mismatch. I purged the live copy; the real fix is pointing that test at its own DB. (Extends the earlier REG-00-05 note.)Slippage guard on the lopsided seed topology (#293): the best-execution router prefers junk multi-hop routes and the retail >30% guard blocks essentially every swap — even a fair direct EMBER/CORAL swap (0% hop spread) reports ~99.99% "vs best-route token prices" because the reference prices are skewed by the seed pools. The guard is behaving correctly and conservatively; it's the seed data that's lopsided. Net effect on this stack: executing any swap needs Expert Mode. On balanced liquidity this won't over-block. (SW-00-01 was therefore verified via an Expert-Mode execution.)
Pause UX (#87): pausing a single pool is route-specific — if the router can detour around the paused pool it won't show a pause banner (correct, since only that pool is paused), and the pause message surfaces at submit rather than pre-quote. Minor, worth a look.
Batched for the next pass: the wallet matrix (Keplr / Station / WalletConnect / reject-recovery / Leap), liquidity add/remove + create-pair + tier register (on-chain), market-order + book-edit + ladder/batch/claim limit flows, a11y, responsive, cross-browser, perf, and the Playwright e2e projects + verify-295 — then the LR-00 sign-off.
mentioned in commit
9d3bf713e5mentioned in commit
f875d5388amentioned in commit
06eb2d8bb5mentioned in commit
0675d67711mentioned in commit
0e3afcaef3mentioned in commit
449c51ba01mentioned in commit
a92891c4fcmentioned in commit
53b8658c58mentioned in commit
456886c2eamentioned in commit
8f0ca4009dmentioned in commit
081abcdffamentioned in commit
65876e17c7mentioned in commit
c5687c6e3fmentioned in merge request !843
Picking the local pass back up — quick state and what's verified since.
Environment: brought the stack back up from its volumes after a restart — same deployed build, no redeploy, chain + indexer + DB intact. Earlier two fixes both merged (build-break tsc fix, verify-285 slippage floor).
Limit-order lifecycle, all cross-checked on-chain:
Two findings:
On your PP2 wave: #341 (multi-hop price-impact hard-block even with Expert Mode) matches what I hit in the swap pass. #342 (native-LUNC "Cannot Sub") — the deployed contract's max_spread subtraction is guarded, so the one reachable unguarded Decimal sub I can see is provide_liquidity's
Decimal::one() - tolerance(panics if tolerance > 1); no repro steps on the issue so I'm not calling root cause.Still batched: wallet matrix, market order + rest of the trade page, create-pair, fee tiers, a11y/responsive/cross-browser, outage + boundary error checks, the e2e projects, then LR-00 sign-off. Sign-off stays gated on the open PP2 items clearing. !842/!843 need your merge — @PlasticDigits.
mentioned in issue #345
CP-00-02 create pair — filed as #345. Dapp create-pair is broken two ways: createPair never attaches the #276 fee (factory.ts, no coins arg), and CREATE_PAIR_GAS_LIMIT=800000 is under the real 871552 gas. Contract is fine — terrad create_pair with the fee attached instantiated the pair clean. Handed to the pipeline.
Also since the last note:
mentioned in issue #353
mentioned in issue #355
Browser-pass checkpoint (still progress, not the LR-00 sign-off). Continuing on the laptop dapp against the QA stack at main
83dc192, on-chain actions cross-checked from the back end. This batch was the re-test of the merged fix wave plus the rows it was blocking.PASS:
FAIL / new issues filed:
Net effect on the checklist: PL-00-02, PL-00-04, CP-00-02, SW-00-05, SW-00-07, FT-00-01 move to PASS. SW-00-03 stays FAIL pending #353. The trade-page rows (TR/LT) are gated on #354 for click-switch; I can still work them via URL navigation and will. LR-00 sign-off remains blocked on the open P0/P1s: #350, #353, #354, #355 (and the earlier #341/#342/#345 are now resolved/closed).
Still to run this pass: TR-00-03/04/07, LT-00-04/07, the wallet matrix, a11y/responsive/cross-browser/perf/concurrency, e2e projects + verify-295, remaining edge/error/integration rows, then LR-00.
Reconciled progress tally against the full checklist, so the scope is explicit. 135 rows total (120 scenarios + 15 LR-00 sign-off).
DEFER / waived (6):
The 31 functional rows left, grouped:
Note on the 82: that's the cumulative PASS across the no-browser sweep + the browser passes. Some were verified at the contract/source layer or on an earlier build; the LR-00 sign-off wants each LR row re-confirmed at the UI on the final SHA, and the merged-fix rows (PL-00-02, PL-00-04, CP-00-02, SW-00-05/07) only went green today. So the real remaining work is those 31 + 15 LR re-confirmations.
LR-00 sign-off stays blocked on the open P0/P1 set: #350, #353, #354, #355. Continuing the trade/limits rows next (via URL navigation, since #354 makes click-switch crash).
Batch B — trade/limit-order rows, all on EMBER/CORAL, on-chain cross-checked. Pair switching avoided per #354 (these don't need it).
Checklist moves to PASS: TR-00-03, TR-00-04, TR-00-07, LT-00-04, LT-00-07. New tally: 87 PASS / 6 defer / 1 fail (#353) / 41 left (26 functional + 15 LR-00). Remaining functional: WL matrix (7), ERR-00-01/02/03, RES-00-01/02, XBR-00-01/02/03, PERF-00-01/02, CON-00-02/03, REG-00-06/07/08, INT-00-02/06, CFG-00-03, EDGE-00-03/06, INF-00-04. LR-00 still gated on #350/#353/#354/#355.
(Note: the live QA stack picked up several new resting asks from my deep-book seed on pair 1 — session test state, clears on the next reset.)
Wallet matrix (WL-00) — laptop, real extensions (Station/Keplr/Cosmostation installed), on-chain cross-checked.
PASS:
Documented limitations (not dApp regressions, per the row criteria):
Deferred:
Minor positive: LuncDash returns a clean "localterra not supported" message (graceful failure, no crash) when its network does not match.
Updated tally: 90 PASS / 8 defer (incl WL-00-01 Keplr-blocked + WL-00-05 no-device) / 1 fail (SW-00-03 / #353) / 36 left = 21 functional + 15 LR-00. Functional remaining: ERR-00-01/02/03, RES-00-01/02, XBR-00-01/02/03, PERF-00-01/02, CON-00-02/03, REG-00-06/07/08, INT-00-02/06, CFG-00-03, EDGE-00-03/06, INF-00-04. LR-00 still gated on #350/#353/#354/#355.
VPS-side batch (no browser needed) — knocked out the rows verifiable on the QA stack directly.
PASS:
Caveat on REG-00-08 / verify-issue-293: exits 1, but NOT a #293 regression. The #293 core check (OE-1 hub pairs pool_only near-inverse) PASSES; the four failures are all the swarm liquidity bootstrap (make swarm-bootstrap-liquidity / swarm-launch) dying on
chmod: Operation not permittedagainst root-owned scripts/bots/*.sh — the same no-sudo box constraint that affects start-qa. The route-asymmetry and slippage-enrichment sub-checks fail downstream because the balanced swarm liquidity never got bootstrapped, not because the feature regressed. #293 was verified exit 0 (8/0) on this same038a457stack on 2026-06-07. Full re-run needs a clean host (or sudo to chmod the bot scripts) — deferring that rather than launching a full swarm mid-session. verify-issue-295 is the Playwright/laptop piece, batched with the e2e rows.The make wrappers for these verifiers also tripped the same root-owned-script chmod (Makefile @chmod step) — ran the scripts directly via bash to get the live results.
Tally: 96 PASS / 8 defer / 1 fail (#353) / 30 left. The 30 left = 15 functional (all browser/Playwright on laptop: ERR-00-01/02/03, RES-00-01/02, XBR-00-01/02/03, PERF-00-01/02, CON-00-02/03, REG-00-06/07, EDGE-00-06) + 15 LR-00. VPS-side queue is now exhausted. LR-00 still gated on #350/#353/#354/#355.
mentioned in issue #357
Main-tree health findings while verifying the #356/#357 wave at
3169af0— three things, all slipping past CI. Fixes for the first two are ready and going up as small MRs.npm run build is red on main: tsc -b fails with TS7006 in tradePairPrefetch.ts:43 (getNextPageParam param implicitly any). Came in with
35e38e5, the #354 prefetchInfiniteQuery fix. Reproduces in a clean tree ate198dcband3169af0. One-line fix: type the param as IndexerLimitBookPageResponse — build green, dist clean of sourcemaps, both prefetch regression files pass (3+1). This is the third tsc-only break to slip through (#246, then the one I fixed in !834) — the pipeline runs vitest+eslint but never tsc -b.SwapPage.test.tsx carries 2 red tests on main — the #293 expert-mode slippage block and the #329 fallback-label one. Bisected both to the same commit:
76723cf(the #341 preflight fix, merged ina6c43ca) added an enrichSwapOperationsWithHopMinReturns call to the quote path, but the suite's vi.mock factory for swapRoutePreflight never exported that function — undefined under the mock, throws inside the try, gets caught as an indexer failure, and the quote path dies. Test-bug only, no product regression: patching just the mock ate198dcbturns both tests green, and the real function on the live path is fine (the #341 behavior itself verified earlier). Fix = one mock export; the file runs 11/11 with it.Why CI never noticed either one: besides the missing tsc step, the recent main pipelines only ran the qa-indexer-binary job (itself red), so the frontend vitest job hasn't actually exercised main lately.
@PlasticDigits flagging the CI gap for your call — a tsc -b (or full npm run build) step plus making the frontend vitest job run on main pushes would have caught two of these three before they landed.
mentioned in merge request !863
mentioned in merge request !864
mentioned in issue #359
Batch wrap + LR-00-15 status comment in one. Scenario tally after tonight: 106 PASS / 1 FAIL / 13 DEFER of 120; LR-00 7 PASS / 5 PARTIAL / 3 BLOCKED of 15. Template first, evidence under it.
Tonight's evidence (laptop Chrome + Cosmostation/Simulated, on-chain cross-checked from the indexer/LCD side):
PASS:
FAIL (open):
DEFER:
Also live-observed along the way: route-solve fidelity (global_v4 EMBER->JADE->RUBY at ~217x the client-BFS fallback output), the #341 hop-spread guard correctly blocking a 32% thin-pool hop at 0.5% tolerance, and the #330 degrade banner truthfully reporting a real tunnel drop.
Status update at main
16e0656(chain stamp still038a457— zero contract-source diff in the range; this wave was frontend + cloud-agent infra + docs only). Big movement on the blocker set since the last tally.Board flips (all P0/P1 from the last note are gone):
Fresh on the VPS at
16e0656(the rows the frontend wave actually touched):LR-00 re-tally: 9 PASS / 6 PARTIAL / 0 BLOCKED (was 7 / 5 / 3).
What's actually left, and where it has to run:
16e0656: REG-00-06/07, XBR-00-03, CON-00-02, verify-295. Flips LR-00-02/07/11/14. Test hardware here can't carry the docker+Playwright stack and the VPS is barred by the no-frontend rule; chain-side fixtures are already seeded. @PlasticDigits requesting that run at current main, ideally after !868 + !867 merge so the build/REG-00-02 gate flips in the same pass.16e0656: the LR PASS rows above were browser-verified on earlier SHAs, so they want a re-confirm on the final frontend build, plus the live checks for #358 / #359 / #360 and the #353 2-hop re-broadcast, plus the wallet matrix. On my queue.So: 0 blockers open, the VPS share is current at
16e0656, and the gap to the 15/15 LR sign-off is the one clean-host e2e run plus the laptop browser re-confirm — gated on !868 and !867 landing. @PlasticDigits the two merges + that agent run are the path to sign-off.Correction + a new wrinkle on the build gate. Earlier today I called npm run build green at the !868 SHA — that was an incremental-cache false negative. A clean build (fresh .tsbuildinfo, like CI or a fresh checkout) is RED on main
8408689with 3 type-only errors, all in files the #359 merge (cd17813/ !867) added:typescript 5.9.3 and @types/node 22.19.15 are both lockfile-pinned, so CI hits these exactly — not a local float. An incremental tsc -b with a warm cache skips the unchanged files and masks all three, which is why it slipped past the merge AND my earlier check.
Fix up in !870 (type-only, no runtime change). Clean npm run build green after it, full vitest 594/596 (the 2 = the known terraExplorer 127.0.0.1-vs-localhost env artifact).
@PlasticDigits this is the 4th tsc-only break on main. The CI gap is now two-layered: the pipeline never runs tsc -b at all, and even when it's run locally an incremental build can hide a break. A tsc -b (or npm run build) step that runs cache-cold would catch this whole class. Net for #337: REG-00-02 / the build half of LR-00-02/08 are green only with !868 + !870 both merged.
mentioned in issue #369
LR-00-15 status snapshot after tonight's laptop pass (not the final sign-off — gated items listed under Open blockers).
Verified tonight (browser, on-chain cross-checked):
Findings shipped:
@PlasticDigits path to LR-00-15 final: (1) merge !869 + !870, (2) reopen #353 + I re-broadcast the 2-hop, (3) resolve/decide #369, (4) clean-host agent e2e at
8408689-> flips REG-00-06/07 + XBR-00-03 + CON-00-02 + verify-295 + axe a11y -> LR-00-02/06/07/09/11/14. Chain-side e2e fixtures already seeded.mentioned in issue #366
Back on this after the big wave landed — re-baselining the whole checklist against current main (
8c56f4b8). Everything LR-00 was gated on (#353/#357/#359/#366/#369 + the !867–!870 MRs) has merged, so the gate now is the redeploy + re-verify, not the fixes.First thing the source-gate re-run caught:
npm run build(tsc -b) is red on main. Two TS2322s, one root cause — SwapAdvancedSettings typesbookLegMaxResultas{ spendableRaw: string; human: string }, but the value isComputeMaxSpendableHumanAmountResultwherespendableRawis a bigint. Breaks the prop pass from SwapPage (#417) and thespendableRaw-> AmountBalanceActions bigint prop (#413). Type-only fix up as !951. Same blind spot as the earlier ones — CI runs no tsc -b.Source gates so far on
8c56f4b8:cargo testraces the shared test DB on api_hooks, not a real fail)VITE_WC_PROJECT_IDguard is satisfied; vitest 1082/1084 (the 2 are the known terraExplorer localhost-vs-127.0.0.1 env artifact)Redeploying the chain now — contracts changed (the #377 hook-settlement rework: pair settles tax/burn itself, min_return floor checks the net payout, lp-burn-hook caller auth), so the live bytecode is stale, and the indexer moved too (#379 hardening). Once it's up I'll re-verify the contract-behavior deltas on-chain plus the carried residuals and refresh the LR rows. Not signing anything off yet — this is a re-baseline.
mentioned in merge request !951
Redeploy + backend re-verify on
8c56f4b8done (browser layer still pending). Chain reset to fresh genesis, stamp now8c56f4b8, deploy schema-verified, indexer rebuilt + caught up.Heads up on addresses — this redeploy is NOT address-stable like past ones: the new #377 hook contracts shifted the instantiate sequence, so the pair moved (terra146ypn… -> terra16jd56…). Factory/router/fee-discount/treasury/wrap held. The deploy regenerated frontend .env.local with the new addrs, so the laptop just needs a pull + npm ci to pick them up.
Live backend checks on the fresh deploy:
Config note for whoever runs the stack: the deploy rewrites indexer/.env back to LCD-heavy=10 / no DB-hybrid on each redeploy, so I relaunch the indexer with ROUTE_SOLVER_DB_HYBRID=1 + RATE_LIMIT_LCD_HEAVY_RPS=0 exported inline (DB-hybrid confirmed live: db_queries>0, lcd_queries 0).
Still laptop-side (not done here):
Not signing off — LR-00 stays gated on the laptop browser pass + the clean-host e2e. This is the backend re-baseline.
mentioned in merge request !952
Knocked out the no-frontend items while the browser pass waits.
Security hardening wave re-verified on the fresh
8c56f4b8deploy (the #376 -> #381 SEC work): the docs-gates (#391 go/no-go, #407 IBC-hooks, #410 deploy-trace, #416 design-tokens + the check_*_docs validators) and the live LocalTerra smokes (#383 18-dec proxy, #384 fee-discount gas, #396 wrap-mapper pause, #397 gov emergency rehearsal, #399 emergency pause/blacklist cookbook, #400 blacklist decision) all pass — 20 checks green, and the chain is clean afterward (pair not left paused, no lingering blacklist). Launch hardening holds live on the current deploy.Also shipped the #353 swarm gas drift I flagged above -> MR !952 (swarm gas.ts was still 900k/hop vs the 950k constants.ts fix; could under-budget a 2-hop swarm swap and OOG).
Still browser/laptop-only for LR-00: the full UI matrix re-run on the new retail-UX frontend, #353 2-hop broadcast at the 1.91M floor, #359 hung-RPC recovery, and the clean-host Playwright e2e.
Backend/source half of the checklist re-verified on the current deploy (
8c56f4b8) — read-only pass, no chain state touched. Progress checkpoint, not the LR-00 sign-off (that stays the browser layer).Fresh PASS this pass (read-only against the live stack + live swarm traffic):
/health200,/swagger-ui/+/api-docs/openapi.json200 (40 paths). Swagger is public/unauth — expected, recorded per the #424 M-05 note.estimated_amount_out=15765212187,solver_version=global_v4,paths_considered=5; badtoken_in→ 400 sanitized, no LCD URL / no SQL leak (#239 clean).hybrid_by_hoplength ≠ hop count → 400 "length 3 does not match hop count 1", no 500 panic.interval=1m';DROP TABLE--→ 400 allowlist reject;limit=-1→ clamps to exactly 1 candle (#243)./cg/orderbooksingle object (epoch ms);/cmc/orderbookarray-of-one (#223); timestamps numeric (#222).3CB4BF…A784C9present in pair trades + on-chain (height 108180, code 0) + reflected in its 1m candle; indexer ~1-2s behind chain head, well inside the 30s bound.pool+ pool-onlyhybrid_simulation, exit 0, return 946 = pool 946 + book 0.is_trusted_router{addr: prod router}→ true; router matchesVITE_ROUTER_ADDRESS+ indexerROUTER_ADDRESS.pair_reservesat block 109026 (100226091620 / 95984780188) exactly match LCDpool{}at the same height, zero drift.Origin: https://evil.example→ 200 with NOAccess-Control-Allow-Originecho; allowlist is localhost-only.lint-contractsclippy/fmt clean (16.77s);lint-frontend0 errors (5 pre-existingexhaustive-depswarnings) on Node 24.18.docs/reference/fee-discount-tiers.md,tier_fixtures.rs,deploy-dex-local.sh, exit 0.cosmesPatch127.test.ts3/3, #127 fee-override signing patch intact.VITE_DEV_MNEMONICset, exact #118 message, non-zero exit.On top of the earlier-this-session re-baseline on the same deploy: REG-00-01 contracts 452, REG-00-03 indexer lib 152, REG-00-04 integration 523, REG-00-02 vitest 1082, REG-00-08 verify-285/293/324, the #381 security wave (20 checks), and #379/#377/#369 live.
Two that don't close clean (neither is a new bug):
npm run buildstill dies attsc -bon main with the twospendableRawbigint-vs-string TS2322s (SwapAdvancedSettings.tsx:130,SwapPage.tsx:1244), so no fresh dist is emitted. That's the same break MR !951 fixes — it just isn't merged, so main can't build a clean bundle. Once !951 lands I re-confirm 0.map(the stale dist already shows 0.mapand no mnemonic leak, but that's not the current tree).Still laptop-only for LR-00: the full UI matrix, wallet flows, the chain-mutating swap/pause/create tx rows, E2E REG-00-06/07, a11y, responsive, cross-browser, and the LR-00 sign-off gate — plus the PERF-00-03 / CFG-00-03 bundle re-run once the build is green.
@PlasticDigits — merging !951 unblocks the frontend build gate (PERF-00-03 + the bundle half of CFG-00-03); everything else here is green or laptop-gated.
Correcting myself on the two build-gated rows above — I was on a stale local checkout; the build is actually green.
!951 is merged. origin/main is at
767dcd1e, 4 commits ahead of the8c56f4b8deploy, and the whole range is frontend-only (zero diff tosmartcontracts/orindexer/), so the chain deploy stays current — no redeploy. My local tree was still pinned at the deployed8c56f4b8, which is why the batch re-hit the oldspendableRawtsc break that !951 already fixed.Built origin/main's frontend to confirm (production build, not a dev server):
npm run buildgreen (tsc -b clean, vite built in ~15s),dist/ships 0*.mapfiles.notice oak worry limit …) is not in the bundle. The onlyVITE_DEV_MNEMONIChit indistis the guard's own error string ("VITE_DEV_MNEMONIC is required for the dev wallet…") — the env-var name, not its value.So both flip to PASS; there's no open frontend-build issue (the build half of the checklist is green on current origin/main). The one genuine PARTIAL stands: IDX-00-07 needs a dual-leg split-fill (pool>0 AND book>0) to re-close the no-double-count guard live — current swarm traffic is pool-only AMM + book-only fills.
mentioned in merge request !953
mentioned in issue #421
Knocked out the VPS-doable rows still open on the current deploy (
8c56f4b8) while the stack was up and the swarm idle. On-chain actions cross-checked end to end from the contract event + the indexer API + Postgres. Progress checkpoint — LR-00 sign-off still rides the laptop browser pass.IDX-00-07 hybrid volume L10 — now fully closed live (this was the one open PARTIAL). Recent traffic only ever had pool-only AMM + book-only fills, so I seeded a genuine dual-leg split: placed a controlled ask (order 29, 20 EMBER @0.9, rests at 19.82M after the 90bps maker fee), then bought EMBER with 36 CORAL split pool_input 18M / book_input 18M (max_maker_fills 1, book_start_hint 29 to confine the book leg to my own order). Swap tx 6C0685B2, code 0:
ONC-00-02 factory pause semantics — re-confirmed on the new #377 pair bytecode. Heads up: pause is governance-only and governance was rotated off test1 onto the 2-of-3 gov multisig (terra1ltjjf30..., the #397/SEC-B09 rotation), so it runs through the factory SetPairPaused signed 2-of-3, not a single key.
ONC-00-04 hybrid sim vs exec (L8) — got this off the split-fill: the LCD hybrid_simulation predicted return 39,355,550 / pool 19,713,930 / book 19,641,620, and the on-chain execution matched to the micro-unit. 0% drift, well inside the L8 tolerance.
CON-00-01 swarm stress (backend half) — the 4h / 33-worker soak gave this its data: the indexer carried the load and is still healthy after ~15.7h continuous at a flat 25MB RSS, no OOM, no crash. Zero ERROR-level log lines over the window; the WARN volume is the offline-env oracle (no USD price source locally) plus benign rate-limit warns. UI-responsiveness half stays laptop.
INT-00-03 reorg replay (#287) — rewound the indexer cursor past my test swaps and let it re-poll ~5,900 blocks to head. swap_events stayed at 9,980 rows, distinct == total, my split-fill row still single, zero (tx_hash, pair_id, swap_index) dup groups. ON CONFLICT DO NOTHING holds on the current build. One good thing on the way: the #362 reorg-halt guard does its job — a checkpoint whose stored block-hash doesn't match canonical makes the indexer halt for operator recovery instead of blindly re-indexing; the documented empty-hash recovery path resumes it clean. Indexer back caught up to head, bound==pidfile, DB-hybrid live.
Moves to PASS on
8c56f4b8: IDX-00-07, ONC-00-02, ONC-00-04, CON-00-01 (backend), INT-00-03. VPS-side queue is exhausted again — what's left for sign-off is the laptop browser matrix + the clean-host Playwright e2e (REG-00-06/07, XBR-00-03, CON-00-02, a11y), unchanged.mentioned in issue #372
Backend re-verify done on the new tree — folded the #431/#432/#433 indexer fixes into the verified set.
Advanced local main to origin/main (
2a06048b). No chain redeploy: zero smartcontracts/ source diff in the range, deploy stamp stays8c56f4b8(factory terra1hrpna9, pair terra16jd56). The indexer is the only backend that moved — #431 (capped-list lower-bound limit tests), #432 (CSV formula-injection neutralize in trader exports), #433/SEC-F13 (startup log-secret guard). Rebuilt the indexer at2a06048band relaunched DB-hybrid.Source gates on
2a06048b:Live backend (LR-00-06 re-confirmed on the new build):
IDX-00-05 (sync-after-swap) stands — the poller is unchanged in this range and the indexer is syncing live (lag ~1); didn't broadcast a fresh swap this pass.
So the VPS/backend layer is green on the new tree. Still owed for LR-00-15 sign-off: the laptop retail-UX UI matrix + the clean-host Playwright e2e (REG-00-06/07, XBR-00-03, CON-00-02, verify-295, axe) — both off-box, not this layer.
Track A backend re-verified on a full redeploy to current main (
21381a0e). This range touched contracts and indexer, so it's a real chain + indexer redeploy this pass, not a no-op advance.Source gates on
21381a0e:Live backend on the fresh deploy:
The SEC-I contract + indexer fixes that landed in this range are all live-verified on the new deploy (details on their trackers): #455 factory registry guard (on-chain unregistered -> code 5, registered -> code 0), #456 blacklist default-deny (real pair + router swaps code 0 while the factory answers healthy), #451 empty-FACTORY guard (rejects in every RUN_MODE), #458 dual-zero rate-limit bind guard, #459 ILIKE wildcard escape (q=% -> 0, not match-all). Addresses held stable across the redeploy (factory terra1hrpna9, pair terra16jd56, router terra1yvgh8), so no env churn.
Backend/Track-A layer is green on
21381a0e; the retail-UX UI matrix rows are the remaining piece.