Changelog
Reverse-chronological. Breaking changes flagged BREAKING.
2026-05-15 — Private-beta gate ready (off by default)
Section titled “2026-05-15 — Private-beta gate ready (off by default)”- The proxy at
market.pactnetwork.io/v1/<endpoint>/*now ships an admission middleware that checksAuthorization: Bearer pact_beta_…against theapi_keystable. The middleware is runtime-flagged viasystem_flags.beta_gate_enabled; the flag defaults to off, so traffic flows through unchanged today. When the flag is flipped on (separate changelog entry on that date), unauthenticated callers will start receiving403 { "error": "pact_auth_not_in_beta" }. - New intake at pactnetwork.io:
a one-minute application form replaces the email-only request flow.
We reply within 24 hours. Approved applicants get a
pact_beta_…Bearer key, returned once at issuance. - The previous “email/Telegram us to get a key” path still works as a fallback, but the form is the fast path.
- Signature verification on
/v1/:slug/*still runs after the gate — this is purely an admission layer, not a replacement forverifyPactSignature. - Apply now and we’ll have your key issued before the flip. See Applying for access.
2026-05-14 — @q3labs/pact-cli@0.3.0 — unified wallet
Section titled “2026-05-14 — @q3labs/pact-cli@0.3.0 — unified wallet”- BREAKING for
pact payusers.pact payandpact approvenow sign with pay.sh’s active account instead of a separate pact-managed keypair. The CLI reads~/.config/pay/accounts.ymlto find the active account, then shells out topay account export <name> -to retrieve the keypair (one Keychain auth prompt per session on macOS; ~5 min cache). - Single agent identity: the wallet that pays the merchant is the wallet
that holds the
pact approveallowance and receives refunds. Fund one wallet, not two. - The bare
pact <url>gateway flow is unchanged — still uses the pact-managed wallet at~/.config/pact/<project>/wallet.json. Only thepact payandpact approvepaths flipped. - Resolution order:
PACT_PRIVATE_KEYenv var → pay’s active account → throw with message naming both options. - New summary line
[pact] wallet: pay/<name> (xxxx…yyyy)shows which pay account signed when a payment was attempted. - The
cli_internal_error: "Attempt to debit an account but found no record of a prior credit"failure mode from 0.2.x — caused by the empty pact-managed wallet — is fixed in 0.3.0 becausepact approvenow debits from pay’s funded account directly. - Migration: if you previously granted an allowance from the pact-managed
wallet,
pact revokestill works against the legacy wallet (legacy fallback). Re-runpact approveonce on 0.3.0 to grant from pay’s account; the old grant becomes inert as soon as you stop topping up the legacy wallet.
2026-05-13 — @q3labs/pact-cli@0.2.8 — single-package Node bundle
Section titled “2026-05-13 — @q3labs/pact-cli@0.2.8 — single-package Node bundle”- Distribution collapsed from a 5-platform native binary matrix
(
@q3labs/pact-cli-{linux,darwin,windows}-{x64,arm64}~125 MB total) to one tarball containing a Node-compatible JS bundle atdist/pact.js(~340 kB compressed, ~1.7 MB unpacked). npm i -g @q3labs/pact-clinow installs one package that runs on any host with Node 18+. NooptionalDependencies, no platform sub-packages, noos/cpupinning.- Built with
bun build --target=node --format=esm; bun’s bundler still inlines bundled assets (e.g.SKILL.mdviawith { type: "text" }) at build time. - Internal:
pay-shell.tsswappedBun.spawnfornode:child_processspawnso the bundle runs cleanly under Node. Test injection point added (PayShellFn) — tests don’t touch the realpaybinary.
2026-05-13 — @q3labs/pact-cli@0.2.7 — facilitator hostname fix (not published)
Section titled “2026-05-13 — @q3labs/pact-cli@0.2.7 — facilitator hostname fix (not published)”DEFAULT_FACILITATOR_URLcorrected fromhttps://facilitator.pact.network(a non-existent domain) tohttps://facilitator.pactnetwork.io(the brand domain shared withapi.*,indexer.*,dashboard.*,market.*).- Effect of the prior typo: every
pact payinvocation in 0.2.3–0.2.6 hitENOTFOUNDon the coverage side-call. Coverage was never recorded on the pay.sh path; the upstream call still completed because pay had already settled with the merchant directly. The[pact]summary reported(coverage not recorded: facilitator unreachable — Unable to connect…). - Workaround for anyone still pinned to 0.2.6:
export PACT_FACILITATOR_URL=https://facilitator.pactnetwork.io. - 0.2.7 was tagged but never published to npm — the publish run hit an unrelated NPM token issue. The fix landed in 0.2.8 alongside the distribution collapse.
2026-05-07 — mainnet v1 deployed
Section titled “2026-05-07 — mainnet v1 deployed”- Solana program
pact-market-pinocchiodeployed to mainnet at5bCJcdWdKLJ7arrMVMFh3z99rQDxV785fnD9XGcr3xwc. - Off-chain stack (public API, indexer, settler) live in
pact-network-prodGCP project, regionasia-southeast1. - Settler is idle — waiting on on-chain bootstrap.
2026-05-05 — Network/Market layering refactor
Section titled “2026-05-05 — Network/Market layering refactor”- Renamed and re-scoped the contract layer: Pact Network is the protocol, Pact Market is one curated interface on top.
- API path renaming:
v1is the current public surface.
2026-05-03 — classifier split
Section titled “2026-05-03 — classifier split”- BREAKING:
errorclassification split intoclient_errorandserver_error. SDKs that readX-Pact-Classificationneed to handle the new values. - Settler instructions updated to expect the finer-grained label.
(Earlier — pre-mainnet) testnet / demo changes
Section titled “(Earlier — pre-mainnet) testnet / demo changes”Not tracked here. Anything testnet or demo-only is out of scope for this changelog. Mainnet v1 is the cut.