docs: mainnet cutover complete - both hosted instances run the keyless build (deployed 2026-07-31)

David dispatched the mainnet cutover this morning: deploy-mainnet.yml ran successfully at
2026-07-31T11:00:06Z-11:01:20Z, deploying commit 04e410b (the PR #11 merge, itself the tip of
main after PRs #9/#10/#11 all merged 10:39:29Z-10:39:59Z the same morning). Testnet had already
auto-deployed the identical commit at 10:40:01Z-10:41:50Z. The non-custodial migration is now
complete on both hosted instances, not just in the code - the exact moment the prior docs pass's
deliberately-hedged notice was written for.

Verified directly before writing anything, not taken on faith from the dispatch: git/gh confirm
the merge timestamps and that both deploy workflow runs targeted 04e410b exactly; the custody
grep and safety.ts's absence were reconfirmed on this exact commit; both hosted endpoints
(https://mcp.vector.mainnet.apexfusion.org/sse and the testnet equivalent) were probed directly
with a bare curl request and both returned HTTP 401 right now - meaningful evidence on its own,
since the pre-PR#8 image had no auth at all, so a 401 today proves post-migration code is what's
actually running, not just what the deploy logs claim.

- README.md: the deployment-status callout rewritten with the dated, both-networks-current
  facts, replacing the custody caveat with an access caveat - both instances require a bearer
  token from the operators now (an access control, not a custody signal; neither instance would
  accept a mnemonic from an authenticated caller either, since the tool schemas that would carry
  one no longer exist). The connect command now shows the bearer-token header syntax, verified
  against Claude Code's own current `claude mcp add` documentation before writing it (`--transport
  sse` accepts `--header "Authorization: Bearer <token>"`, same as `--transport http`). The
  security notice rescoped from "this codebase, not every deployment" to a dated claim: complete
  in this codebase and on both hosted instances as of the 2026-07-31 cutover deploy specifically,
  explicitly not a "forever" claim - a future deploy is a separate operational action.
- packages/signer/README.md: the two passages scoped to "this codebase" in the prior docs pass
  now scoped to "any instance running the 2026-07-31 deploy or later," mainnet included, with the
  same access-control caveat about the bearer token.
- docs/architecture/non-custodial-split.md: PR-sequence row 9 (mainnet cutover) gets the same
  landed-marker style as rows 6-8, dated; section 11's rollout paragraph gets its one now-historical
  clause corrected to past tense with a dated annotation appended, following the established
  forward-only annotation convention rather than rewriting the paragraph.

Open public access (no token, per-IP rate limiting) remains a planned follow-up, not yet an open
PR or branch - checked directly (gh pr list, git branch -a) rather than assumed, and stated in
the docs as planned, not implied as already in progress.
This commit is contained in:
FilipBl4gojevic
2026-07-31 13:14:54 +02:00
parent 04e410b71d
commit 81c14729b0
3 changed files with 40 additions and 34 deletions

View File

@@ -15,35 +15,41 @@ Hosted instances run on both networks, exposing all 24 tools:
| Mainnet | `https://mcp.vector.mainnet.apexfusion.org/sse` |
| Testnet | `https://mcp.vector.testnet.apexfusion.org/sse` |
> **Deployment status differs by network.** Testnet auto-deploys from `main` on every merge, so
> it tracks this codebase closely. **Mainnet stays on its last custodial image until a
> deliberate cutover deploy ships** - that deploy is a separate, future step, not automatic and
> not implied by any merge (see [docs/architecture/non-custodial-split.md](docs/architecture/non-custodial-split.md),
> section 11, "Rollout"). Until it ships, treat the mainnet instance's signing tools as
> custodial: assume they may still accept a mnemonic as a tool-call parameter, and prefer
> self-hosting this release or the testnet instance instead.
> **Deployment status: both networks are current.** Both hosted instances run today's
> completed migration: testnet since the 2026-07-31 morning merges (auto-deployed from
> `main`), mainnet since a deliberate cutover deploy the same day (see
> [docs/architecture/non-custodial-split.md](docs/architecture/non-custodial-split.md), section
> 11, "Rollout", for the full history). **Both hosted instances currently require a bearer
> token from the operators to connect** - that is an access control, not a custody one:
> neither instance accepts a mnemonic from any caller, token or not. Open public access
> (per-IP rate limiting, no token required) is a planned follow-up, not yet shipped. Self-host
> this release for tokenless access today.
Connect from Claude Code in one command (testnet shown - swap in the mainnet URL once the
cutover deploy described above ships):
Connect from Claude Code in one command. Both hosted instances require a bearer token from the
operators (contact the Apex Fusion team for one):
```bash
claude mcp add --transport sse vector-mcp https://mcp.vector.testnet.apexfusion.org/sse
claude mcp add --transport sse vector-mcp https://mcp.vector.mainnet.apexfusion.org/sse \
--header "Authorization: Bearer <your-token>"
```
> **Security notice: as of this release, the non-custodial migration is complete in this
> codebase.** No tool in this repository accepts a mnemonic, private key, or any other key
> material. Every `build_*` tool constructs an unsigned transaction from a wallet *address*
> only, and every signing operation happens locally on your own machine, through the local
> signer companion. Broadcast the signed result with `vector_submit_transaction` - your seed
> phrase never leaves your machine, and no server running this release ever holds one. This is
> enforced mechanically in the code, not just by convention: the builder's custody boundary test
> scans every source file for key-material vocabulary against an allowlist that is now empty and
> pinned at size zero, so a future change cannot silently reintroduce a mnemonic parameter
> without failing that test by name.
> **This is a claim about the code, not about every deployment of it** - see the deployment
> status note above the connect command, and
Self-hosting (below) needs no token and gives every caller open access to your own instance.
> **Security notice: the non-custodial migration is complete, in this codebase and on both
> hosted instances, as of the 2026-07-31 cutover deploy.** No tool in this repository accepts a
> mnemonic, private key, or any other key material. Every `build_*` tool constructs an unsigned
> transaction from a wallet *address* only, and every signing operation happens locally on your
> own machine, through the local signer companion. Broadcast the signed result with
> `vector_submit_transaction` - your seed phrase never leaves your machine, and no server
> running this release ever holds one. This is enforced mechanically in the code, not just by
> convention: the builder's custody boundary test scans every source file for key-material
> vocabulary against an allowlist that is now empty and pinned at size zero, so a future change
> cannot silently reintroduce a mnemonic parameter without failing that test by name.
> **This describes this release and the 2026-07-31 deploy specifically** - a later deploy is a
> separate operational action, not automatically covered by this notice; see the deployment
> status note above and
> [docs/architecture/non-custodial-split.md](docs/architecture/non-custodial-split.md) for the
> full rollout plan.
> full rollout history.
Self-hosting instructions are below.

View File

@@ -191,7 +191,7 @@ TDD throughout: failing test before implementation, every PR.
| **6** | **Family 1 — wallet/tx keyless.** Mnemonics removed; `build_*` tools land ✅ **(landed — this PR)** | **yes** |
| **7** | **Family 2 — agent registry keyless.** Drops `@ts-nocheck` from `agent-network.ts` ✅ **(landed — this PR)** | yes |
| **8** | **Family 3 — self-improvement keyless.** Ref-UTxO env config carried over from the custodial code; the suspected CBOR encoding issue closed as no-bug (audit #10, golden-pinned against a live on-chain token) ✅ **(landed — this PR)** | yes |
| **9** | Mainnet cutover: README, security-page correction, deliberate `workflow_dispatch` | — |
| **9** | Mainnet cutover: README, security-page correction, deliberate `workflow_dispatch` ✅ **(landed — deployed 2026-07-31)** | — |
**PR 4 is the review that matters.** It is additive, self-contained, and *is* the security boundary. It breaks nothing while it is reviewed.
@@ -223,7 +223,7 @@ PR 4 and PR 5 both depend on the workspace split (PR 3) and can proceed in paral
## 11. Rollout
Testnet auto-deploys on push to `main` (`deploy.yml`) and **is the proving ground** — breaking it from PR 6 onward is expected and useful signal. Mainnet deploys only by manual `workflow_dispatch` and **stays on the last custodial image until PR 9**. This uses the existing CI split as designed; no new infrastructure.
Testnet auto-deploys on push to `main` (`deploy.yml`) and **is the proving ground** — breaking it from PR 6 onward is expected and useful signal. Mainnet deploys only by manual `workflow_dispatch` and **stayed on the last custodial image until PR 9** ✅ **(cutover deployed 2026-07-31, both networks now run the same image)**. This uses the existing CI split as designed; no new infrastructure.
## 12. Findings from local verification

View File

@@ -165,10 +165,11 @@ over-counts, which refuses too much rather than too little.
and the smoke tests above). **Nothing is left open in the code: this was the last custodial
family.** The non-custodial migration described in
[`docs/architecture/non-custodial-split.md`](../../docs/architecture/non-custodial-split.md)
is complete in this codebase. It is not yet complete on every deployment: the mainnet hosted
instance stays on its last custodial image until a deliberate cutover deploy ships (see that
document's rollout section). Until then, pair this signer with a self-hosted or testnet
builder if you want the guarantee above to actually hold - not the mainnet one.
is complete in this codebase, and as of the 2026-07-31 cutover deploy, on both hosted
instances too: pair this signer with a self-hosted builder, the testnet instance, or the
mainnet instance now, since any of them running the 2026-07-31 deploy or later carries the
guarantee above. Both hosted instances currently require a bearer token from the operators
to connect - that is an access control, separate from the custody guarantee above.
## Running it
@@ -195,11 +196,10 @@ example):
```
Register it alongside the builder so an agent has both sets of tools available. This pairing
keeps your mnemonic off any server running this release, for every family it exposes: wallet,
transaction, smart-contract, agent-registry, and self-improvement alike - as long as that
server is actually running this release. The mainnet hosted instance is not, yet: see the
deployment status note in the root README before assuming this covers it. See the last bullet
under Known limitations above for the full evidence.
keeps your mnemonic off any server running the 2026-07-31 deploy or later, for every family it
exposes: wallet, transaction, smart-contract, agent-registry, and self-improvement alike. Both
hosted instances qualify now, and so does any self-hosted deployment of this release. See the
last bullet under Known limitations above for the full evidence.
## Testing