Skip to main content

doc/release-checklist.md

# Release Checklist

This checklist is the final pre-release gate for the Binance-first Elixir CCXT
preview package. Run commands from the repository root unless a command starts
with `cd elixir`.

## Required Local Gate

Run the aggregate gate on the exact commit that will be released:

```sh
npm run releaseElixirPreviewCheck
```

This command runs:

- `npm run checkElixir`
- `npm run docsElixir`
- `npm run testElixirPackageConsumer`

The gate must prove:

- TypeScript AST/IR selected methods are complete and contain no fallback
  markers.
- Generated REST and Pro outputs are stable.
- Structure schema artifacts are stable.
- `mix format --check-formatted`, `mix compile --warnings-as-errors`, and
  ordinary ExUnit tests pass.
- ExDoc builds.
- A local Hex tarball can be built, unpacked, compiled by a temporary consumer
  app, and used by that consumer's public Pro smoke test.

## Optional Focused Gates

Use these when iterating on a narrower area:

```sh
npm run assertElixirPro
npm run assertElixirStructureSchemas
cd elixir && mix test test/ccxt_pro_binance_test.exs
npm run buildElixirPackage
npm run testElixirConsumer
npm run testElixirPackageConsumer
```

Do not replace the required local gate with focused gates before release.

## Live Commands

The standard live refresh command is:

```sh
cd elixir
mix test --include live --exclude prod_order_live \
  test/ccxt_pro_binance_live_test.exs --timeout 180000
```

This exercises public market streams and signed read-only websocket API or
user-data-stream paths when matching credentials and Binance permissions are
available. Missing credentials or permission-denied responses should be recorded
as evidence, not silently treated as coverage.

For demo private read-only smoke:

```sh
cd elixir
BINANCE_PRO_ENV=demo mix test --include live --only demo_private_live \
  test/ccxt_pro_binance_live_test.exs --timeout 180000
```

## Production Order Live Risk Gate

Production order tests send real Binance production requests. They are designed
to place non-marketable spot limit orders and clean them up immediately, but
they still require explicit operator intent.

Run only after confirming the production account has enough small spot balance
and the symbol/amount are acceptable:

```sh
cd elixir
CCXT_PRO_ENABLE_PROD_ORDER_LIVE=true \
BINANCE_PROD_ORDER_SYMBOL=BTC/USDT \
BINANCE_PROD_ORDER_AMOUNT=0.0002 \
mix test --only prod_order_live test/ccxt_pro_binance_live_test.exs \
  --timeout 180000
```

For manual example verification, start the private order event worker in one
shell and run the safe lifecycle example in another:

```sh
cd elixir
BINANCE_PRO_ENV=prod CCXT_PRO_ORDER_EVENT_WORKER_SECONDS=90 \
  mix run examples/pro_order_event_worker.exs
```

```sh
cd elixir
CCXT_PRO_ENABLE_PROD_ORDER_LIVE=true \
  mix run examples/pro_safe_order_lifecycle.exs
```

The worker should receive order-event updates and the lifecycle example should
create, edit, cancel, and clean up a non-marketable order.

## Package Dry-Run

Build the local Hex package:

```sh
npm run buildElixirPackage
```

The release package should include `lib`, `priv`, `doc`, `mix.exs`, and
`README.md`, and should exclude `test`, `examples`, `_build`, `deps`, and
`smoke`.

Verify the unpacked package from a clean temporary consumer:

```sh
npm run testElixirPackageConsumer
```

This is also part of `npm run releaseElixirPreviewCheck`.

## Soak Gates

Short soak sanity run:

```sh
CCXT_PRO_LONG_SOAK_SECONDS=5 CCXT_PRO_LONG_SOAK_MIN_UPDATES=1 \
  npm run testElixirProLongSoak
```

Default long soak:

```sh
npm run testElixirProLongSoak
```

The default long soak runs for about 15 minutes and should record update count,
first update latency, maximum update gap, connection starts, disconnects,
terminations, telemetry message count, and explicit websocket cleanup.

## Tests Excluded By Default

`test/test_helper.exs` excludes these tags from ordinary `mix test` and
`npm run checkElixir`:

| Tag | Why excluded by default | How to run |
| --- | --- | --- |
| `:live` | Requires network, Binance availability, and sometimes credentials | `mix test --include live ...` |
| `:private` | Requires private credentials and account permissions | Run only with appropriate credentials |
| `:soak` | Slower websocket stability check | `npm run testElixirProSoak` |
| `:soak_long` | Long-running stability check | `npm run testElixirProLongSoak` |

`prod_order_live` is an included tag inside the live test file, but the tests
only send orders when `CCXT_PRO_ENABLE_PROD_ORDER_LIVE=true` is set.

## Evidence Update

After running live or soak commands, update
`doc/release-0.1.0-binance-pro-preview.md` and
`doc/ccxt-pro-elixir-target.md` with:

- command
- date
- test count and failure count
- environment (`prod`, `demo`, or `testnet`)
- skipped credential or permission reasons
- order lifecycle outcome for production order tests
- soak metrics for long-running websocket tests