Skip to content

fix: undefined cancel-vote constant, deposit re-drain, dispute timelock bypass, and paused-claim exploit#1233

Open
Emeka000 wants to merge 150 commits into
solutions-plug:payfrom
Emeka000:pay
Open

fix: undefined cancel-vote constant, deposit re-drain, dispute timelock bypass, and paused-claim exploit#1233
Emeka000 wants to merge 150 commits into
solutions-plug:payfrom
Emeka000:pay

Conversation

@Emeka000

Copy link
Copy Markdown
Contributor

PR Body

Summary

Known blocker (pre-existing, not introduced by this PR)

main currently fails to build independent of these changes — confirmed via git stash before touching any files. ~28 compile errors exist in contracts/predict-iq, including calls to markets::get_outcome_stake / set_outcome_stake / increment_outcome_bet_count / validate_parent_market that don't exist in markets.rs, missing ErrorCode/ConfigKey variants, and a Market initializer missing fields. This PR's changes reduce the error count from 28 to 26 (fixing the undefined-constant compile error from #1184) but do not touch the remaining unrelated breakage.

Because of this, cargo build / cargo test / cargo clippy could not be run to completion in this environment, so the tests required by each issue's "Testing Requirements" are not included here — they need to be added once the baseline build is fixed. Flagging this rather than silently skipping it.

Test plan

Closes #1184,

closes #1185,

closes #1187

closes #1188

dependabot Bot and others added 30 commits June 4, 2026 18:05
Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 19.2.6 to 19.2.7.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-version: 19.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [next](https://github.com/vercel/next.js) from 16.2.6 to 16.2.9.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](vercel/next.js@v16.2.6...v16.2.9)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 16.2.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [axe-core](https://github.com/dequelabs/axe-core) from 4.11.4 to 4.12.1.
- [Release notes](https://github.com/dequelabs/axe-core/releases)
- [Changelog](https://github.com/dequelabs/axe-core/blob/develop/CHANGELOG.md)
- [Commits](dequelabs/axe-core@v4.11.4...v4.12.1)

---
updated-dependencies:
- dependency-name: axe-core
  dependency-version: 4.12.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 25.9.1 to 26.0.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@axe-core/react](https://github.com/dequelabs/axe-core-npm) from 4.11.3 to 4.12.1.
- [Release notes](https://github.com/dequelabs/axe-core-npm/releases)
- [Changelog](https://github.com/dequelabs/axe-core-npm/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core-npm/commits)

---
updated-dependencies:
- dependency-name: "@axe-core/react"
  dependency-version: 4.12.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.60.0 to 1.61.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.60.0...v1.61.1)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.61.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…utions-plug#1003)

Adds docs/architecture.md with a Mermaid C4 level-1 system context
diagram and a C4 level-2 container diagram showing all services
(API, TTS, frontend), databases (PostgreSQL, Redis), external
dependencies (Stellar RPC, SendGrid), and network boundaries
(VPC public/private subnets). Includes an architecture-review
checklist item for PRs that touch these boundaries.

Closes solutions-plug#1003

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…utions-plug#1004)

Adds docs/data-flow.md documenting the full lifecycle of every major
data type (email addresses, subscription status, audit events, market
data, on-chain bets, email tracking, analytics events, and transient
Redis data). Each entry covers collection point, storage location,
retention period, deletion mechanism, and access control. Includes a
Mermaid data-flow diagram, a GDPR data-subject-rights implementation
map, an access-control summary table, and outstanding action items for
future compliance work.

Closes solutions-plug#1004

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…olutions-plug#999)

- Add proptest dev-dependency to predict-iq Cargo.toml
- Add property_invariants_test.rs with 5 proptest properties covering stake
  conservation, state-machine irreversibility, and non-negative stakes
- Create INVARIANTS.md documenting all financial and state-machine invariants
  with Certora/KEVM formal verification guidance

Closes solutions-plug#999

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ions-plug#1000)

- Add fuzz/ directory with Cargo.toml and three libFuzzer targets:
  fuzz_place_bet, fuzz_resolve_market, fuzz_withdraw
- Add contract-fuzz CI job to test.yml running each target for 60 s with
  crash artifact upload on failure
- Document fuzzing setup, targets, corpus handling, and CI in README.md

Closes solutions-plug#1000

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…utions-plug#1001)

- api-outage.md: API completely unreachable — ECS checks, force redeploy, ALB triage
- redis-failure.md: ElastiCache down — failover steps, memory/connection diagnostics
- email-queue-backup.md: SQS queue depth spike — worker restart, DLQ inspection, replay
- stellar-rpc-unavailable.md: RPC unavailable — fallback endpoint switch, ledger lag check
- ecs-task-crash-loop.md: Task exits immediately — exit code guide, rollback steps
- Add corresponding Prometheus alert rules with runbook_url annotations to alerts.yaml

Closes solutions-plug#1001

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…NGELOG (solutions-plug#998)

- Add 'Print unoptimized WASM size' step to build-optimized CI job so the
  size trend is visible on every push, not just when the limit is exceeded
- Add WASM size tracking table to CHANGELOG.md [Unreleased] section with
  a note on budget rationale and measurement instructions

The 65,536-byte (64 KB) budget and its rationale were already documented in
contracts/predict-iq/README.md (WASM_SIZE_LIMIT_BYTES env var reference).

Closes solutions-plug#998

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…lutions-plug#1005)

Adds utoipa 4 as a dependency and wires up automatic OpenAPI spec
generation from Axum route annotations:

- services/api/src/handlers.rs: all 26 public handler functions
  annotated with #[utoipa::path(...)]; request/response types
  derive ToSchema / IntoParams
- services/api/src/pagination.rs: adds the missing PaginationQuery
  struct (with limit() / cursor() helpers) that handlers.rs already
  imported; derives IntoParams for utoipa
- services/api/src/openapi_spec.rs: new module housing the
  #[derive(OpenApi)] struct that lists every annotated path and
  component schema
- services/api/src/bin/generate_openapi.rs: new binary that serialises
  ApiDoc to YAML on stdout; run with:
    cd services/api && cargo run --bin generate-openapi > openapi.yaml
- .github/workflows/test.yml: new openapi-drift-check job builds the
  binary, generates the spec, and fails CI if the annotated path set
  diverges from the committed openapi.yaml; added to all-tests-passed
  gate
- .github/pull_request_template.md: checklist items remind contributors
  to regenerate the spec and update docs/architecture.md when relevant

Closes solutions-plug#1005

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds docs/deployment.md covering all steps a new team member needs to
deploy PredictIQ from scratch:

- Prerequisites (AWS CLI, Terraform, Docker, Rust, psql, gh)
- First-time infrastructure provisioning via Terraform bootstrap
  script, plan, apply, and Secrets Manager setup
- Environment variable reference table (required + optional/tuning)
  derived from config.rs
- Normal deployment workflow: merge → GHCR image build → ECS rolling
  update → health validation
- Database migration process: apply, check status, write new migrations
  (with rollback script requirement)
- Rollback procedures for application, database, and infrastructure,
  with timeline targets
- Validation checklist with six curl / AWS CLI commands to run after
  every production deployment

Closes solutions-plug#1002

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add rust-version = '1.75' to services/api/Cargo.toml (determined by
  axum 0.7 / sqlx 0.8 / tower-http 0.6 requirements, matching the
  rust:1.75-slim image already pinned in the root Dockerfile)
- Add .github/workflows/msrv.yml that reads the MSRV dynamically from
  Cargo.toml, installs the toolchain via dtolnay/rust-toolchain, and
  runs cargo check + cargo build --release
- Document MSRV policy in CONTRIBUTING.md
- Replace single-stage Dockerfile with a two-stage build:
  builder (node:20-alpine) compiles TypeScript; runtime (node:20-alpine)
  installs production deps only and runs as non-root user ttsuser
- Add engines field to package.json to pin Node.js 20 LTS
- Add HEALTHCHECK calling /health/live with 30s interval
- Add tts service to docker-compose.tracing.yml with OTEL Collector
  dependency, tts-output volume, resource limits, and healthcheck
- checkOutputDirectory: write + delete a probe file to confirm writability
- checkElevenLabs: make a live GET /v1/user call (5 s timeout) to verify
  API key validity and network reachability; returns 503 on 401 or network
  errors
- checkGoogle: validate key file exists, parses as JSON, and contains
  project_id + private_key; same for inline credentials object
- checkJobQueueDepth: count pending+processing jobs against MAX_QUEUE_DEPTH
  (500); warns at 80 %, errors at 100 % — surfaced in /health/ready
- readiness() now aggregates all four probes and returns 503 with a
  structured JSON body listing every failing check when any fail
- /health/ready response body now includes a checks map alongside status,
  message, and timestamp
- Import opossum and add CircuitBreakerState/CircuitBreakerConfig types
- Default config: 5-failure threshold (volumeThreshold), 30 s rolling
  window (rollingCountTimeout), 30 s half-open interval (resetTimeout),
  10 s per-call timeout
- TTSService._initCircuitBreakers builds one opossum CircuitBreaker per
  configured provider (elevenlabs, google) and wires open/halfOpen/close
  log events
- TTSService._callProvider routes all provider calls through breaker.fire()
  so the open circuit fast-fails with HTTP 503 without making a network call
- TTSService.getCircuitBreakerStates returns state snapshots exposed in
  /health/ready response body
- HealthCheck.readiness includes circuit breaker states; open breakers
  produce an 'error' check entry causing a 503 readiness response
- Add circuit-breaker.test.ts with 5 tests: initial closed state, trips
  open after threshold, fast-fail without network call, half-open
  transition, and empty state when no providers configured
- Added cache_circuit_breaker_state gauge metric with state labels (closed/open/half_open)
- Updated CircuitBreaker to report state changes to metrics
- Added optional metrics parameter to RedisCache constructor
- Circuit breaker now logs and tracks state transitions (closed, open, half-open)
- Added alert rules for circuit breaker open (>2min) and half-open states
- Added Grafana dashboard panels:
  * Stat panel showing current circuit breaker state with color coding
  * Timeline graph showing state transitions over time
- Metrics are updated atomically on state transitions

Closes solutions-plug#963
- Added worker_status gauge metric with worker name labels
- Each worker reports status: 1=running, 0=stopped
- Implemented heartbeat mechanism (30s interval) for all workers:
  * email_queue - email processing worker
  * blockchain_sync - blockchain event sync worker
  * blockchain_tx_monitor - transaction monitoring worker
  * rate_limiter_cleanup - rate limit cleanup task
  * newsletter_cleanup - newsletter cleanup task
- Workers set status to 1 on startup and 0 on shutdown
- Added BackgroundWorkerDown alert rule (fires after 60s of status=0)
- Added Grafana dashboard panel showing all worker statuses with color coding
- Alert configuration includes noDataState=alerting for crash detection

Closes solutions-plug#962
…ug#971 solutions-plug#968 — testing & observability hardening

- solutions-plug#977: add proptest property-based tests for all validation functions
  (empty, over-max-len, all-whitespace, null bytes, control chars, Unicode,
  valid inputs); CI runs 1000 cases per property via PROPTEST_CASES=1000

- solutions-plug#972: add transaction-rollback DB fixture (with_test_transaction) so each
  integration test is isolated; CI verifies order-independence with two
  different nextest random seeds

- solutions-plug#971: add docker-compose.test.yml (Postgres 15, Redis 7, Stellar RPC stub)
  with health checks; add Makefile targets (test-integration,
  test-integration-down); wire CI job api-integration-tests

- solutions-plug#968: validate OTEL_EXPORTER_OTLP_ENDPOINT as a parseable URL at startup
  (fail-fast on bad config); TCP connectivity check with 2 s timeout logs WARN
  if unreachable; otel_export_errors_total Prometheus counter tracks failures;
  document OTLP config in TRACING.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…g bench

Issue 1 - Crash reporting:
- Add worker_crash_total IntCounterVec to Metrics
- Wrap email worker spawn in monitored restart loop (max 5 restarts,
  exponential backoff 1s/2s/4s/8s/16s), log FATAL on exhaustion
- Add EmailWorkerDown and EmailWorkerCrashLooping Prometheus alerts

Issue 2 - Template caching:
- Templates already compiled once at EmailTemplateEngine::new() startup
- Add benches/email_templates.rs: cached vs per-request at 1000 renders
- Register bench in Cargo.toml; document restart-to-update policy

Issue 3 - Context size limit:
- Reject contexts > 64 KB (serialised JSON) in render() before Handlebars
- Return structured anyhow error with byte count and template name

Issue 4 - Template schema validation:
- Add templates/schema.json documenting required vars per template
- validate_all_templates() uses realistic per-template fixture data
- Add 16 boundary-value tests: empty strings, special chars, long strings,
  XSS escaping, and startup validation sanity check

Misc: tighten .gitignore (test snapshots, bench output, temp files)
…s counter

- Add sendgrid_retries_total{reason} counter to Metrics
- Retry on 429 and 5xx responses (max 3 attempts)
- Exponential backoff with jitter (2^attempt * 100ms + rand[0,100)ms)
- Respect Retry-After header on 429 responses
- Add wiremock to dev-dependencies for HTTP mock testing
- Add test: two 429s followed by 202 verifies email sent and counter=2

Closes #reliability #email
…ed body)

- Add DEFAULT_REQUEST_BODY_MAX_BYTES = 1 MiB constant
- Add request_size_validation_middleware to validation.rs
  - Fast path: reject on Content-Length header > limit
  - Slow path: buffer chunked body via axum::body::to_bytes with cap
  - Returns 413 Payload Too Large with JSON error body
- Add content_type_validation_middleware (415 for non-JSON POST/PUT/PATCH)
- Add request_validation_middleware (400 for SQLi/path-traversal patterns)
- Add parse_request_body_max_bytes() for env-var override
- Add two_mb_body_returns_413 integration test

Closes #security #reliability #api
…-plug#936, solutions-plug#938

solutions-plug#935 — Add full jitter to RPC retry backoff
- Introduce RPC_BACKOFF_JITTER_FACTOR env var (default 1.0 = full jitter)
- Replace deterministic exponential backoff with random(0, min(cap, base*2^n))
- Add rpc_backoff_jitter_factor field to Config and BlockchainClient
- Add unit tests verifying unique delays and zero-jitter determinism

solutions-plug#938 — Handle ledger gaps/forks in blockchain sync worker
- Persist last processed ledger as a checkpoint key in Redis (7d TTL)
- On restart, detect and log gaps between checkpoint and current ledger
- During normal sync, detect sequence skips and emit log.warn with gap size
- Emit log.error alert when gap exceeds 10 ledgers
- Add observe_ledger_gap metric (blockchain_ledger_gaps_total)

solutions-plug#936 — Supervised sync worker with Prometheus metrics and health endpoint
- Extract inner run_sync_loop (no coordinator) from run_sync_worker
- Wrap in supervised restart loop in start_background_tasks: catches panics,
  increments blockchain_sync_worker_restarts_total, restarts after 1s
- Add blockchain_sync_worker_last_heartbeat_ts gauge updated each poll cycle
- Add GET /health/ready endpoint: returns 503 if heartbeat older than 60s

solutions-plug#932 — HMAC-SHA256 email idempotency key
- Replace SHA-256(recipient||template||data) with HMAC-SHA256(secret, recipient||template||hour_bucket)
- Add EMAIL_IDEMPOTENCY_SECRET env var (falls back to HMAC_KEY)
- Add hour-boundary timestamp bucket to bound pre-computation window
- Update idempotency_key signature; propagate secret through EmailService and queue
- Add test verifying key changes when secret changes
- Add auth_failures_total Prometheus counter with 'reason' label to
  Metrics struct; observe_auth_failure(reason) increments it.
  Valid reason labels: invalid_api_key, expired_token, missing_credentials.

- Add AuthFailureReason enum with from_headers() classifier:
    * x-api-key header present → InvalidApiKey
    * Authorization header present → ExpiredToken
    * neither present → MissingCredentials

- In audit_logging_middleware, detect 401 responses and emit a dedicated
  'auth_failure' audit log entry that includes:
    * masked key prefix (first 4 chars + ****) for API-key attempts
    * client IP address from the TCP socket
    * user-agent string
    * failure reason, path, and HTTP method in the details JSON blob
  The entry is written asynchronously so it never blocks the response.

- Emit a WARN-level tracing event on every auth failure with reason,
  masked actor, client IP, and user-agent for log-based alerting.

- Add unit tests:
    * AuthFailureReason correctly classified from header combinations
    * key_prefix masks all but the first four characters
    * as_str() labels are stable and match Prometheus convention
    * parse_admin_action correctly maps known and unknown paths
Previously DATABASE_URL and REDIS_URL were already in Secrets Manager,
but HMAC_KEY, SENDGRID_API_KEY, and API_SIGNING_KEY were missing.
No plaintext sensitive values are passed through ECS environment blocks.

infrastructure/terraform/modules/ecs/main.tf:
- Add aws_secretsmanager_secret + aws_secretsmanager_secret_version for:
    * predictiq/<env>/hmac-key        (rotation: 90 days)
    * predictiq/<env>/sendgrid-api-key (rotation: 180 days)
    * predictiq/<env>/api-signing-key  (rotation: 90 days)
- Add all five secret ARNs to the ECS task definition 'secrets' block
  so ECS agent injects them as env vars at task startup.
- Expand aws_iam_role_policy.ecs_task_execution_secrets Resource list
  to include the three new secret ARNs (least-privilege; no wildcards).
- Add 'secret_arns' output map so CI/CD pipelines can reference ARNs.
- Tag each secret with RotationEnabled and RotationSchedule for auditability.

infrastructure/terraform/variables.tf:
- Add hmac_key, sendgrid_api_key, api_signing_key variable declarations
  (all sensitive=true, with validation rules).

infrastructure/terraform/main.tf:
- Pass the three new variables through to the ECS module.

scripts/rotate-secret.sh:
- New helper: rotates a named secret and triggers ECS rolling redeployment.
- Validates secret name against known inventory; prompts for confirmation
  in production; reads value from stdin when '-' is passed as value arg.

docs/secrets.md:
- Full secrets inventory with paths, env var names, types, and rotation
  schedule.
- Architecture diagram showing Terraform → Secrets Manager → ECS flow.
- Manual and automated rotation procedures.
- Instructions for adding new secrets, auditing access, and emergency
  revocation.
hman38705 and others added 29 commits June 30, 2026 15:13
…t metric, load_watched_transactions, cap check in watch_transaction, DB persistence for tx watch/resolve, fix duplicate health_live

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.0.1 to 26.1.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…/npm_and_yarn/services/tts/types/node-26.1.0

chore(deps-dev): bump @types/node from 26.0.1 to 26.1.0 in /services/tts
Bumps [express-rate-limit](https://github.com/express-rate-limit/express-rate-limit) from 7.5.1 to 8.5.2.
- [Release notes](https://github.com/express-rate-limit/express-rate-limit/releases)
- [Commits](express-rate-limit/express-rate-limit@v7.5.1...v8.5.2)

---
updated-dependencies:
- dependency-name: express-rate-limit
  dependency-version: 8.5.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [opossum](https://github.com/nodeshift/opossum) from 8.5.0 to 10.0.0.
- [Release notes](https://github.com/nodeshift/opossum/releases)
- [Changelog](https://github.com/nodeshift/opossum/blob/main/CHANGELOG.md)
- [Commits](nodeshift/opossum@v8.5.0...v10.0.0)

---
updated-dependencies:
- dependency-name: opossum
  dependency-version: 10.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Updates the requirements on [soroban-sdk](https://github.com/stellar/rs-soroban-sdk) to permit the latest version.
- [Release notes](https://github.com/stellar/rs-soroban-sdk/releases)
- [Commits](stellar/rs-soroban-sdk@v26.0.1...v27.0.0)

---
updated-dependencies:
- dependency-name: soroban-sdk
  dependency-version: 27.0.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [typescript](https://github.com/microsoft/TypeScript) from 6.0.3 to 7.0.2.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/commits)

---
updated-dependencies:
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
…uite

Get the Next.js 16 frontend building and running, give it a real design
system, and bring the full test/CI gate to green.

Build fixes
- Resolve dependency conflicts (typescript ^5.9.3, bundlewatch ^0.4.2,
  @next/bundle-analyzer aligned to Next 16.2.9)
- Fix Zod v4 breakage (ZodError.errors -> .issues) in next.config.js and
  src/lib/env.ts
- Migrate config to Next 16 / Turbopack (drop swcMinify + custom webpack
  splitChunks; Turbopack handles chunking/minification)
- Rename middleware.ts -> proxy.ts (function middleware -> proxy)
- Add .env.local (NEXT_PUBLIC_API_URL)

Redesign (UI/UX: Modern Dark, gold + purple on deep navy)
- New design token system (tokens.css) with dark-primary + light variant
- Full visual layer (landing.css): glass sticky nav, hero with ambient glow
  and gradient display type (Orbitron/Exo 2, self-hosted via next/font),
  glass email capture, bento feature cards, numbered step cards, footer
- Token-driven Statistics band
- Create previously-404 brand assets (mark.svg, feature icons, favicon)
- Trim accessibility.css to pure a11y utilities

Functional fix
- CSP connect-src blocked the statistics API; proxy.ts now allowlists the
  configured API origin from NEXT_PUBLIC_API_URL

Tests / CI (0 failing, coverage gate met)
- Fix jest env loading (default NEXT_PUBLIC_API_URL in jest.config.js)
- Exclude Playwright e2e specs from Jest
- Fix broken relative imports (LoadingSpinner/Skeleton suites)
- Stub api.getStatistics so Statistics mount doesn't consume form fetch mocks;
  fix mock shapes, tab-order assumptions, and stale copy expectations
- Convert nav menubar/menuitem roles to semantic links; add required attr
- Add API endpoint-wrapper + env validation tests; exclude framework entry
  files from coverage collection
…/npm_and_yarn/services/tts/express-rate-limit-8.5.2

chore(deps): bump express-rate-limit from 7.5.1 to 8.5.2 in /services/tts
…/npm_and_yarn/services/tts/opossum-10.0.0

chore(deps): bump opossum from 8.5.0 to 10.0.0 in /services/tts
Bumps [@opentelemetry/sdk-node](https://github.com/open-telemetry/opentelemetry-js) from 0.219.0 to 0.220.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@experimental/v0.219.0...experimental/v0.220.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/sdk-node"
  dependency-version: 0.220.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…/cargo/soroban-sdk-27.0.0

chore(deps): update soroban-sdk requirement from 26.0.1 to 27.0.0
…/npm_and_yarn/services/tts/opentelemetry/sdk-node-0.220.0

chore(deps): bump @opentelemetry/sdk-node from 0.219.0 to 0.220.0 in /services/tts
Bumps [@opentelemetry/core](https://github.com/open-telemetry/opentelemetry-js) from 2.8.0 to 2.9.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@v2.8.0...v2.9.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/core"
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@opentelemetry/instrumentation-http](https://github.com/open-telemetry/opentelemetry-js) from 0.219.0 to 0.220.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@experimental/v0.219.0...experimental/v0.220.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/instrumentation-http"
  dependency-version: 0.220.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…/npm_and_yarn/services/tts/opentelemetry/core-2.9.0

chore(deps): bump @opentelemetry/core from 2.8.0 to 2.9.0 in /services/tts
Bumps [@opentelemetry/semantic-conventions](https://github.com/open-telemetry/opentelemetry-js) from 1.41.1 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@semconv/v1.41.1...semconv/v1.43.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/semantic-conventions"
  dependency-version: 1.42.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@opentelemetry/exporter-trace-otlp-grpc](https://github.com/open-telemetry/opentelemetry-js) from 0.219.0 to 0.220.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-js/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-js/blob/main/CHANGELOG.md)
- [Commits](open-telemetry/opentelemetry-js@experimental/v0.219.0...experimental/v0.220.0)

---
updated-dependencies:
- dependency-name: "@opentelemetry/exporter-trace-otlp-grpc"
  dependency-version: 0.220.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
…/npm_and_yarn/services/tts/opentelemetry/instrumentation-http-0.220.0

chore(deps): bump @opentelemetry/instrumentation-http from 0.219.0 to 0.220.0 in /services/tts
…/npm_and_yarn/services/tts/opentelemetry/exporter-trace-otlp-grpc-0.220.0

chore(deps): bump @opentelemetry/exporter-trace-otlp-grpc from 0.219.0 to 0.220.0 in /services/tts
…/npm_and_yarn/services/tts/types/node-26.1.1

chore(deps-dev): bump @types/node from 26.1.0 to 26.1.1 in /services/tts
…/npm_and_yarn/services/tts/opentelemetry/semantic-conventions-1.42.0

chore(deps): bump @opentelemetry/semantic-conventions from 1.41.1 to 1.43.0 in /services/tts
…/npm_and_yarn/services/tts/typescript-7.0.2

chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /services/tts
…end-build-redesign-tests

feat: fix frontend build, redesign landing page, and green the test suite
@drips-wave

drips-wave Bot commented Jul 27, 2026

Copy link
Copy Markdown

@Emeka000 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.