2.7 KiB
m2-market operational runbook
Catalog rebuild (constitution II rebuildability)
The live memory-api is store/search only — no delete, no partition drop — so
m2-market-indexer reindex is an idempotent fill of the current partition, not a
rebuild. A true rebuild (needed after listing updates/delists or index corruption) is a
fresh-partition switch:
# 1. Fill a fresh partition from the registry (source of truth)
MEMORY_API_PARTITION=market:catalog-v2 \
MEMORY_API_URL=... MEMORY_API_KEY=... FORGEJO_URL=... FORGEJO_TOKEN=... \
LISTING_SCHEMA_PATH=$REPO/schemas/listing.schema.json \
python3 -m m2_market_indexer.reindex
# 2. Switch every reader (CLI/Store/Scout) by config — no code change
export M2_MARKET_CATALOG_PARTITION=market:catalog-v2 # or config management
# 3. The old partition is abandoned in place (memory-api cannot delete it);
# it costs storage only. Fold the suffix rotation back when memory-api
# grows delete support (fedlearn T13 follow-up).
Verification: m2-market search <known listing> returns the same results against the
new partition (quickstart.md Scenario E).
memory-api endpoint discovery
The live memory-api container IP changes across Coolify redeploys (known split-brain, two stacks). Resolve the current one:
MC=$(docker ps --format '{{.Names}}' | grep memory-api | head -1)
docker inspect $MC | jq -r '.[0].NetworkSettings.Networks | to_entries[0].value.IPAddress'
Public route: https://memory.machinemachine.ai. Writes need X-API-Key (the key lives
in the memory-api container env as MEMORY_API_KEY); reads are currently open.
Ledger
- Public:
https://ledger.machinemachine.ai(Cloudflare TLS → Traefik http router — the domain is registeredhttp://in Coolify on purpose; re-addinghttps://recreates the redirect loop). - Deploy: push to
m2/m2-marketmaster → Forgejo webhook (hook id 14) → Coolify deploy. Webhook delivery can lag ~40 s. Manual:GET /api/v1/deploy?uuid=<app>on Coolify. - Keys:
/home/m2/.m2-ledger-keys(host, 0600). Service key reads/installs; admin key grants/snapshots. - Daily snapshot: host cron 03:10 →
POST /snapshot→ commitsm2/market-registry:audit/YYYY-MM-DD.json. Balance disputes: recompute from the tx log (GET /tx), which is append-only truth. - Refund semantics: compensating refunds may overdraw a seller (debt position, settled at manual payout reconciliation) — data-model.md §Transaction.
Publish/status flow (known gap, analyze finding I2)
m2-market publish opens the PR with status: "draft"; nothing flips it on merge yet.
Until automated: after merging a listing PR, commit status: "published" on main (the
indexer only indexes published listings).