Release: merge development into main #35

Merged
mik-tf merged 74 commits from development into main 2026-03-02 02:36:57 +00:00
Member

Merge all development work into main to establish the production branch.

Changes

  • 72 commits from development since initial main
  • Full portal app: TFChain integration, vault, gateway, farm migration
  • CI workflows: test, deploy-production (main), build-container
  • Smoke tests and gateway integration tests

After merge, pushes to main will deploy to migrate.projectmycelium.com via deploy-production.yml.

Merge all development work into main to establish the production branch. ## Changes - 72 commits from development since initial main - Full portal app: TFChain integration, vault, gateway, farm migration - CI workflows: test, deploy-production (main), build-container - Smoke tests and gateway integration tests After merge, pushes to `main` will deploy to `migrate.projectmycelium.com` via `deploy-production.yml`.
Update .forgejo/workflows/deploy-staging.yml
Some checks failed
Deploy Staging / deploy (push) Failing after 1s
f523b07a60
Fix CI: use raw SSH instead of appleboy/ssh-action (unavailable on Forgejo)
Some checks failed
Deploy Staging / deploy (push) Failing after 1s
7a8ddad497
Fix CI: install openssh-client in ubuntu:latest container
Some checks failed
Deploy Staging / deploy (push) Failing after 15s
5f29464ce4
Fix CI: fix SSH quoting by sourcing cargo env explicitly
All checks were successful
Deploy Staging / deploy (push) Successful in 26s
7732f1a226
content update for live mycelium ledger
All checks were successful
Deploy Staging / deploy (push) Successful in 40s
8efdda78c9
mycelium ledger registration flow
All checks were successful
Deploy Staging / deploy (push) Successful in 51s
dc143b1a46
mycelium ledger js client connection with reused mnemonics + registration flow ui
All checks were successful
Deploy Staging / deploy (push) Successful in 49s
fb1bfb83e0
Update CI: deploy from www_migrate_mycelium, build frontend+backend, restart service
Some checks failed
Deploy Staging / deploy (push) Failing after 18s
eab9a9cc41
CI: build in builder container, rsync deploy to staging VM
Some checks failed
Deploy Staging / build-and-deploy (push) Failing after 10s
8bee91eddb
Fix CI: use existing rust from builder image, skip rustup reinstall
Some checks failed
Deploy Staging / build-and-deploy (push) Failing after 4s
3e6dd1d047
Update .forgejo/workflows/deploy-staging.yml
Some checks failed
Deploy Staging / build-and-deploy (push) Failing after 9s
f8bfa8f3bf
Update .forgejo/workflows/deploy-staging.yml
Some checks failed
Deploy Staging / build-and-deploy (push) Has been cancelled
3c20a01071
Update .forgejo/workflows/deploy-staging.yml
Some checks failed
Deploy Staging / build-and-deploy (push) Failing after 5m40s
99c51ee154
Update .forgejo/workflows/deploy-staging.yml
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 5m39s
b4b35c0e7a
Fix CI: copy frontend into crates/frontend/dist directly, remove symlink dependency
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 6m33s
41ad5002ca
mycelium ledger node registration flow
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 6m6s
814e8cbafb
content and ui improvements
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 6m1s
67d82d5a57
redesign get spore page
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 6m35s
1e1ba004e7
clean up
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 5m46s
5aae2b7348
implement Send SPORE functionality + resolve minor code quality warnings flagged by cargo clippy
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 6m37s
f726968216
- Add `memo` field to transfer requests and state
- Implement `batch_all` extrinsic for memoized transfers
- Create API endpoint to retrieve treasury address
- Configure treasury address from environment variable
- Update transfer UI to use treasury address and memo
- Add UI validation for Hero Ledger account and treasury address
Reviewed-on: #4

The environment variable TFCHAIN_TREASURY_ADDRESS still needs to be set in the deployment.
content updates
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 7m56s
4ebf4ccfa6
content
All checks were successful
Deploy Staging / build-and-deploy (push) Successful in 5m45s
48d1d48872
Replace all backend Hero Ledger proxy code with direct browser-to-gateway
communication using heroledger_gateway_client. This eliminates the
prepare/sign/submit dance (~1,400 lines removed net) and collapses
all ledger operations into single gateway client calls.

Frontend:
- Add heroledger_gateway_client dependency (WASM-compatible)
- New heroledger.rs wrapper with typed methods for all gateway operations
- New config.rs for gateway URL configuration
- Migrate pre-registration, SPORE transfers, marketplace registration,
  and account detection to use gateway client directly
- Remove ED25519/SLIP-10 crypto code from signing.rs (gateway handles internally)
- Clean up api.rs: remove all Hero Ledger API wrapper functions

Backend:
- Delete near_tx.rs entirely (-271 lines)
- Remove all 11 /heroledger/* route handlers from api.rs (-846 lines)
- Remove NearConfig, PendingNodeRegistration, http_client from state.rs
- Remove mod near_tx and heroledger routes from main.rs
- Remove sha2, bs58, reqwest dependencies

Shared:
- Remove all Hero Ledger request/response types from lib.rs (-130 lines)

Note: Vault integration (encrypted mnemonic storage) deferred due to
web-sys version incompatibility (needs 0.3.88, project resolves 0.3.85).

Closes #5

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add encrypted vault integration, smoke tests, and CI workflow
Some checks failed
Test / check (pull_request) Failing after 1m29s
caa598d1a3
Enable the vault feature in heroledger_gateway_client for encrypted
mnemonic storage in browser localStorage (PBKDF2 + AES-256-GCM via
Web Crypto API). Login modal now offers "Unlock Vault" tab when saved
entries exist, and prompts to save after mnemonic login. Identity page
shows vault status with save/remove controls.

Also adds bash curl-based smoke tests for all backend API endpoints,
a Forgejo CI workflow (test.yml) for compile/lint/format/test checks,
and Makefile targets (test-all, smoke-test).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: gate vault methods behind wasm32 cfg for cargo test
Some checks failed
Test / check (pull_request) Failing after 1m43s
ff47071fbb
The vault module in heroledger_gateway_client is only compiled for
wasm32 targets (uses Web Crypto API). Add cfg(not(wasm32)) stubs so
`cargo test --all` compiles the frontend on the host target.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: install clippy and rustfmt in CI workflow
All checks were successful
Test / check (pull_request) Successful in 1m54s
9626a54351
The --profile minimal rustup installation only includes rustc, rust-std,
and cargo. Add explicit `rustup component add clippy rustfmt` so the
Clippy and Format check steps work.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: resolve RefCell borrow panic across async await points
Some checks failed
Test / check (pull_request) Failing after 1m30s
0264b90dd2
Wrap GatewayClient in Option to prevent "RefCell already mutably borrowed"
panics when Dioxus re-renders during suspended futures. Add HandleExt trait
with async-safe helpers that take/put client around await points.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
style: fix rustfmt formatting
All checks were successful
Test / check (pull_request) Successful in 1m50s
d0ee3e8885
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Merge pull request 'Migrate to hero ledger gateway client' (#6) from development_gateway_client into development
All checks were successful
Test / check (push) Successful in 1m54s
Deploy Staging / build-and-deploy (push) Successful in 6m41s
863f704eae
Reviewed-on: #6
fix: resolve RefCell borrow panic and add unit tests
All checks were successful
Test / check (pull_request) Successful in 1m54s
0c9cc5587e
Decouple render-time reads from Rc<RefCell<HeroLedgerClient>> by
introducing a Signal<GatewayAccountId>, eliminating the borrow conflict
that caused "RefCell already mutably borrowed" panics when Dioxus
re-rendered during async gateway operations.

Also adds 33 unit tests across all three crates (signing, shared types,
backend validation) and cleans compiler warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Fix RefCell borrow panic and add unit tests' (#9) from fix/refcell-panic-and-unit-tests into development
All checks were successful
Test / check (push) Successful in 3m16s
Deploy Staging / build-and-deploy (push) Successful in 6m59s
70253a5804
Reviewed-on: #9
feat: add gateway client integration tests, smoke tests, and E2E setup
All checks were successful
Test / check (pull_request) Successful in 2m18s
fbad4f2bd2
Three test layers for the hero ledger gateway client:

1. Integration tests (crates/gateway-tests/) — 23 wiremock-based tests
   covering all GatewayClient methods: credentials, account ops, token
   transfers, marketplace listings, and error handling.

2. Gateway smoke tests (scripts/gateway-smoke-test.sh) — curl-based
   connectivity tests against the real gateway (network-dependent).

3. E2E browser tests (e2e/) — Playwright tests for app loading, wallet
   connect, vault flow, and RefCell regression. Mnemonic via TEST_MNEMONIC
   env var (never hardcoded).

Also updates Makefile with test-gateway, gateway-smoke-test, e2e-install,
and test-e2e targets, and adds gateway integration tests to CI workflow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: use canonical TFGRID_MNEMONIC env var for E2E tests
All checks were successful
Test / check (pull_request) Successful in 2m18s
63b9e014e9
Follow the env_secrets convention: source ~/hero/cfg/env/* before
running tests. E2E tests now read TFGRID_MNEMONIC (the canonical
registry name) instead of a custom TEST_MNEMONIC.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: rename env var to TFGRID_MNEMONIC_DEVNET
All checks were successful
Test / check (pull_request) Successful in 2m17s
cfb051913a
Distinguish devnet test mnemonic from mainnet TFGRID_MNEMONIC.
Matches the repo secret name on Forgejo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: scope E2E selectors to .login-modal to avoid overlay interception
All checks were successful
Test / check (pull_request) Successful in 2m36s
36d8afa9df
The generic button:has-text("Login") selector was matching the navbar
Login button behind the modal overlay instead of the modal's submit
button. All 6 E2E tests now pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: update gateway URL and source env vars in Makefile
All checks were successful
Test / check (pull_request) Successful in 2m28s
7bfe266060
- Gateway URL changed to http://ledger.dev.projectmycelium.com:9090
  (frontend default, smoke test default, Makefile help text)
- Makefile test-e2e and gateway-smoke-test now source ~/hero/cfg/env/*
  so env vars are available without manual sourcing
- Fix smoke test assertions: gateway returns 200 with JSON-RPC error
  body for malformed input, not HTTP 400

All 7 gateway smoke tests now pass against the live gateway.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: set SHELL := /bin/bash in Makefile for source compatibility
All checks were successful
Test / check (pull_request) Successful in 2m15s
85541c679b
Make defaults to /bin/sh which doesn't support the `source` builtin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Add gateway client integration, smoke, and E2E tests' (#11) from feat/gateway-integration-tests into development
All checks were successful
Test / check (push) Successful in 2m17s
Deploy Staging / build-and-deploy (push) Successful in 6m33s
85466ebf6c
Reviewed-on: #11
feat: add TFChain WebSocket auto-reconnect and health endpoint
All checks were successful
Test / check (pull_request) Successful in 2m2s
b8aac78f9f
The backend WebSocket connection to TFChain would die permanently on
disconnect (os error 54). Now:

- Client wrapped in RwLock for safe reconnection
- Background task checks chain health every 30s, auto-reconnects on failure
- GET /api/health returns chain status + latest block number (503 if disconnected)
- Submit handlers clone the API handle to avoid blocking reconnect during finalization
- Enhanced smoke tests: health endpoint, balance numerics, transfer prepare fields

32/32 smoke tests pass, 56/56 cargo tests pass, 6/6 E2E tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add post-login E2E data verification tests
All checks were successful
Test / check (pull_request) Successful in 2m58s
d0cc834965
Add 7 new E2E tests that verify real TFChain + Hero Ledger data loads
after wallet login — not just crash absence. Extract shared login helper
to eliminate code duplication across 3 test files. Total: 13 E2E tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ci: add smoke tests to CI pipeline
All checks were successful
Test / check (pull_request) Successful in 2m13s
43d7e6009a
Add live gateway smoke tests to PR checks (test.yml) and post-deploy
backend + gateway smoke tests to staging deployment (deploy-staging.yml).
Backend smoke tests run against staging after deployment with a 60s
readiness wait.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'TFChain WebSocket auto-reconnect, health endpoint, E2E data tests, CI smoke tests' (#14) from development_tfchain_reconnect into development
Some checks failed
Test / check (push) Successful in 2m8s
Deploy Staging / build-and-deploy (push) Failing after 8m36s
02e86b838b
Reviewed-on: #14
fix: use HTTPS for staging smoke tests (Caddy redirects HTTP→HTTPS)
All checks were successful
Test / check (pull_request) Successful in 2m10s
4b1b56de2b
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'fix: use HTTPS for staging smoke tests' (#15) from development_tfchain_reconnect into development
Some checks failed
Test / check (push) Failing after 1m37s
Deploy Staging / build-and-deploy (push) Failing after 8m13s
1afb45ba82
fix: update gateway URL to HTTPS and add reachability guard
All checks were successful
Test / check (pull_request) Successful in 2m7s
9870abe8b0
Gateway moved from http://port:9090 to https://port:443.
Add reachability check so CI warns but doesn't fail when
the gateway is temporarily unreachable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'fix: update gateway URL to HTTPS + reachability guard' (#18) from development_gateway_url_fix into development
Some checks failed
Test / check (push) Successful in 3m31s
Deploy Staging / build-and-deploy (push) Failing after 7m12s
0855b7384c
fix: remove invalid heroledger 404 smoke tests
All checks were successful
Test / check (pull_request) Successful in 2m9s
c10588ff54
These endpoints were never backend API routes — the SPA catch-all
serves index.html for any unknown path, so they always return 200.
Removes the false failures that block deploy-staging CI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'fix: remove invalid heroledger 404 smoke tests' (#20) from development_fix_smoke_tests into development
All checks were successful
Test / check (push) Successful in 2m18s
Deploy Staging / build-and-deploy (push) Successful in 6m2s
7f859e9a74
test: add safe opt-out smoke tests and E2E modal flow tests
All checks were successful
Test / check (pull_request) Successful in 2m10s
dcde790b70
Smoke tests (8 new):
- Prepare with valid input returns payload_hex + session_id
- Prepare with invalid signer returns 400
- Status endpoint returns node_id + opted_out fields
- Submit with missing/expired session returns 404

E2E tests (5 new):
- My Nodes page loads after login
- Node cards display hardware specs
- Move to Mycelium modal opens with T&Cs
- Proceed button disabled until T&Cs accepted
- Cancel closes modal without on-chain action

All tests are safe — no on-chain transactions executed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'test: safe opt-out smoke tests + E2E modal flow tests' (#22) from development_optout_tests into development
All checks were successful
Test / check (push) Successful in 3m33s
Deploy Staging / build-and-deploy (push) Successful in 7m12s
c19ea217d1
feat: add Dockerfile and Makefile docker targets
Some checks failed
Test / check (pull_request) Has been cancelled
f4b1dc3b30
Multi-stage Docker build (rust:latest → debian:bookworm-slim) producing
a ~38MB image that serves both the backend API and frontend SPA.

Closes #23

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add CI container workflow, Docker Compose, and K8s manifests
All checks were successful
Test / check (pull_request) Successful in 2m10s
11bd84fadf
- build-container.yml: tag-triggered CI to build and push Docker image
  to forge.ourworld.tf registry
- deploy/docker-compose.yml + Caddyfile: ready-to-run setup for TFGrid
  VM with automatic TLS via Caddy
- deploy/k8s/: Deployment, Service, Ingress, ConfigMap for K8s handoff
  to devops

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Add Docker containerization, CI publish, and deploy manifests' (#24) from development_docker into development
Some checks failed
Test / check (push) Successful in 2m49s
Deploy Staging / build-and-deploy (push) Successful in 7m2s
Build Container / build-and-push (push) Failing after 7m59s
3fb91a85db
fix: use Docker-in-Docker for container CI workflow
Some checks failed
Test / check (pull_request) Has been cancelled
10049b3008
The Forgejo runner doesn't have Docker on ubuntu-latest. Switch to
docker:24-dind with manual dockerd startup, buildx caching, and
auto-release creation — matching the hero_services pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: increase DinD daemon timeout to 60s
All checks were successful
Test / check (pull_request) Successful in 3m9s
aa2d4388e5
30s is too tight for Docker-in-Docker — the nested daemon needs to
initialize fuse-overlayfs storage and networking. 60s is the standard
timeout used by GitHub Actions, GitLab CI, and hero_services.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Fix container CI: use Docker-in-Docker + buildx + auto-release' (#26) from development_fix_container_ci into development
Some checks failed
Build Container / Build and Push Container (push) Failing after 1m7s
Build Container / Create Release (push) Has been skipped
Deploy Staging / build-and-deploy (push) Has been cancelled
Test / check (push) Has been cancelled
147485c0aa
fix: use ubuntu-latest runner label for container CI
All checks were successful
Test / check (pull_request) Successful in 3m47s
a0ffb41bdf
This repo's Forgejo runners use ubuntu-latest, not docker. Use
ubuntu-latest with container: docker:24-dind (same pattern as
deploy-staging.yml uses with the builder image).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Fix container CI runner label: ubuntu-latest instead of docker' (#27) from development_fix_runner_label into development
Some checks failed
Build Container / Build and Push Container (push) Failing after 1m6s
Build Container / Create Release (push) Has been skipped
Test / check (push) Successful in 2m34s
Deploy Staging / build-and-deploy (push) Successful in 7m37s
bba2c3fb78
fix: use docker runner label for container CI
All checks were successful
Test / check (pull_request) Successful in 2m17s
671c8c60b0
Requires circle_ops#642 — docker runner label for mycelium org.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Use docker runner label for container CI' (#28) from development_docker_runner into development
All checks were successful
Test / check (push) Successful in 2m2s
Deploy Staging / build-and-deploy (push) Successful in 6m52s
1b99e9358f
fix: align container CI with working hero_services pattern
All checks were successful
Test / check (pull_request) Successful in 2m18s
495dc0c09f
Remove manual dockerd startup (runner already provides Docker),
drop fuse-overlayfs, use actions/checkout@v4 instead of manual
git clone. Matches the proven lhumina_code/hero_services workflow.

Closes #30

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: improve vault UX with password validation and reactive vault state
All checks were successful
Test / check (push) Successful in 2m16s
Deploy Staging / build-and-deploy (push) Successful in 6m36s
2985349ef6
Merge pull request 'Fix container CI build workflow' (#31) from development_fix_container_build into development
All checks were successful
Test / check (push) Successful in 2m19s
Deploy Staging / build-and-deploy (push) Successful in 8m12s
9ba831fde3
Reviewed-on: #31
rename deploy-staging to deploy-production, trigger on main
All checks were successful
Test / check (pull_request) Successful in 2m10s
71341026ac
Rename deploy-staging.yml to deploy-production.yml, switch trigger
from development to main branch, update all URLs from
staging.hub.projectmycelium.com to migrate.projectmycelium.com.

Closes #33

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Switch production deploy to main branch' (#34) from development_deploy_production into development
All checks were successful
Test / check (push) Successful in 2m8s
Test / check (pull_request) Successful in 2m18s
8855dc5e1e
add deploy-dev.yml for development branch to staging
All checks were successful
Test / check (pull_request) Successful in 2m11s
d584987173
Deploy development branch pushes to staging.hub.projectmycelium.com.
Mirrors deploy-production.yml but targets the dev environment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge pull request 'Add deploy-dev.yml for development branch' (#36) from development_deploy_dev into development
All checks were successful
Test / check (push) Successful in 2m23s
Test / check (pull_request) Successful in 3m51s
Deploy Dev / build-and-deploy (push) Successful in 7m44s
fcbf86a798
Reviewed-on: #36
mik-tf merged commit 4ad77080f4 into main 2026-03-02 02:36:57 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mycelium/www_migrate_mycelium!35
No description provided.