The chains this pod serves share one disk, so warming their counts together
made each finish late and made a caller arriving during startup wait on the
contention.
The chains this pod serves share one disk, so warming their counts together
made each finish late and made a caller arriving during startup wait on the
contention.
The homepage's four headline cards are lifetime totals, and none of them can
use an index, so each one scanned a table. With every caller computing its own
copy over a shared pair of connections, concurrent loads queued behind each
other for longer than a browser waits, and the cards stayed empty.
The homepage's four headline cards are lifetime totals, and none of them can
use an index, so each one scanned a table. With every caller computing its own
copy over a shared pair of connections, concurrent loads queued behind each
other for longer than a browser waits, and the cards stayed empty.
The gate enforced only health. explorer, apps and branded each printed a
warning and fell through to an unconditional 'gate passed', so run 62877
went green with three red jobs. One rule now covers every guarded job:
green or the gate is red.
The apps matrix named itself App E2E (${{ matrix.app }}), which
stringifies the leg mapping to 'Object' — five identically named jobs,
none identifying which leg failed. Use matrix.app.name.
Explorer E2E was one of the hidden failures: it asserted SPC serves
stats, but no SPC chain exists and the explorer config disables the slug,
so api-explore-spc answers a plain-text 404. Four specs each carried
their own copy of the chain list; EXPLORERS in env.ts is now the one
list, and SPC is absent from it with the reason recorded.
httpGetJson fed error-page bodies to JSON.parse, reporting a complaint
about byte 4 of '404 page not found' instead of the endpoint and status.
It now reports both.
The gate enforced only health. explorer, apps and branded each printed a
warning and fell through to an unconditional 'gate passed', so run 62877
went green with three red jobs. One rule now covers every guarded job:
green or the gate is red.
The apps matrix named itself App E2E (${{ matrix.app }}), which
stringifies the leg mapping to 'Object' — five identically named jobs,
none identifying which leg failed. Use matrix.app.name.
Explorer E2E was one of the hidden failures: it asserted SPC serves
stats, but no SPC chain exists and the explorer config disables the slug,
so api-explore-spc answers a plain-text 404. Four specs each carried
their own copy of the chain list; EXPLORERS in env.ts is now the one
list, and SPC is absent from it with the reason recorded.
httpGetJson fed error-page bodies to JSON.parse, reporting a complaint
about byte 4 of '404 page not found' instead of the endpoint and status.
It now reports both.
The chains this pod serves share one disk, so warming their counts together
made each finish late and made a caller arriving during startup wait on the
contention.
The homepage's four headline cards are lifetime totals, and none of them can
use an index, so each one scanned a table. With every caller computing its own
copy over a shared pair of connections, concurrent loads queued behind each
other for longer than a browser waits, and the cards stayed empty.
The gate enforced only health. explorer, apps and branded each printed a
warning and fell through to an unconditional 'gate passed', so run 62877
went green with three red jobs. One rule now covers every guarded job:
green or the gate is red.
The apps matrix named itself App E2E (${{ matrix.app }}), which
stringifies the leg mapping to 'Object' — five identically named jobs,
none identifying which leg failed. Use matrix.app.name.
Explorer E2E was one of the hidden failures: it asserted SPC serves
stats, but no SPC chain exists and the explorer config disables the slug,
so api-explore-spc answers a plain-text 404. Four specs each carried
their own copy of the chain list; EXPLORERS in env.ts is now the one
list, and SPC is absent from it with the reason recorded.
httpGetJson fed error-page bodies to JSON.parse, reporting a complaint
about byte 4 of '404 page not found' instead of the endpoint and status.
It now reports both.
Capture the live lux-mainnet per-brand block-explorer frontends as declared
state (mirrors k8s/lux-devnet/explore-fe.yaml). ONE luxfi/explore source
white-labeled by hostname (chainRegistry.ts -> branding.logoContent); per-org
GHCR image overlay (luxfi/zooai/hanzoai/parsdao).
Pins lux/zoo/hanzo to v1.0.10 (luxfi/explore@4369780): real per-brand
hostname-driven header logo + single header per breakpoint, killing the stale
inline triangle that mislabeled the Lux mark as 'Hanzo icon'. explore.hanzo.network
now renders the real Hanzo blocky-H (@hanzo/logo, viewBox 0 0 67 67, 5 paths).
pars stays v1.0.4 (parsdao not yet in the kaniko fan-out).
dry-run/diff vs live = no image drift; apply only reconciles labels.
The pre-existing mainnet L* tokens (real, with live V3 liquidity — LETH/WLUX pool
0xfAfBF1A0 liq 5.519e19) are owned by 0xbe7A89F4 (key lost, from RLP history). A
forward-dated stateUpgrade (fork 1782235245) overwrites owner storage slot 5 ->
0x9011 for all three, preserving balances+liquidity. Next: 0x9011 -> multisig Safe.
Make the per-brand block explorers live on devnet, matching the
mainnet/testnet explore-fe-* stack.
- explore-fe.yaml: clone explore-fe-{lux,zoo,hanzo,pars} Deployments +
Services + explore-env-* ConfigMaps from lux-testnet into lux-devnet.
Per-brand image ghcr.io/{luxfi,zooai,hanzoai,parsdao}/explore:v1.0.4,
svc 80 -> containerPort 3000. RPC -> devnet C-chain (96370,
api.lux-dev.network/ext/bc/C/rpc) since the per-brand devnet L1 EVMs
(hanzo/zoo/pars aliases) currently 404; only C is live on devnet.
- explore-ingressroute.yaml: rewrite the 4 devnet lux-explorer-*
IngressRoutes (hanzo.ai/v1alpha1) so the brand frontend hosts route to
explore-fe-<brand>:80 (were pointing at the unified explorer:80, which
404s). Modeled byte-for-byte on lux-testnet/lux-explorer-zoo-testnet:
SPA data paths (/v1/*, /health, /envs.js, icons) -> explorer:8090;
frontend host -> explore-fe-<brand>:80; api-explore.* -> explorer:8090
with blockscout-prefix-<brand> + mainpage-rewrite + cors-allow-all.
Host scheme (proven by the mainnet explore-env-* configmaps):
mainnet explore.<brand>.network / testnet explore.<brand>-test.network
/ devnet explore.<brand>-dev.network.
CF DNS (separate, applied live): explore.{hanzo-test,hanzo-dev}.network
A -> 134.199.138.27 created; explore.{zoo-test,zoo-dev}.network repointed
209.38.118.103 -> 134.199.138.27; stale explorer.lux-dev.network ->
130.211.52.166 removed.
Document the declared-state source of truth (network.yaml + luxd-startup.yaml),
the dexConfig->granular migration (0x9996-9999 @ 1766708400, ascending-sorted),
the coordinated-cutover requirement for incompatible binary/config, and the
CF-served explorer frontend model (explore.lux-dev.network needs CF Pages, not
a k8s ingress).
LuxNetwork tag v1.28.20 -> v1.30.31 across all three networks. v1.30.31 carries
the finalized PQ threshold stack: consensus v1.25.19 (ConsensusCert envelope),
pulsar v1.1.5, magnetar v1.2.3, corona v0.7.9, threshold v1.9.9. luxd build
verified (57MB). Image building in CI (ghcr.io/luxfi/node:v1.30.31, multi-arch).