Skip to content

secure-chat messaging, hosting release race fix; v0.2.82 - #169

Merged
ralyodio merged 14 commits into
masterfrom
release/v0.2.82
Nov 9, 2026
Merged

ralyodio merged 14 commits into
masterfrom
release/v0.2.82

Conversation

@ralyodio

@ralyodio ralyodio commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

Releases what landed since v0.2.81 plus the last two pieces, as v0.2.82:

Verified on the merged tree (docker, isolated network): all lib tests (c0mpute-core 337), plus dm, hosting_market, inference and workflow e2e.

🤖 Generated with Claude Code

ralyodio and others added 14 commits November 9, 2026 04:21
video: pin the published runner by digest (RUNNER_PULL_REF), run it under a
local name, tag :stable in the workflow, label the package with its source,
and check anonymous pulls in CI. `video setup` (now in core) pulls the pinned
digest or builds from source. C0MPUTE_DOCKER overrides the container CLI.
Speech gateway exposes router() so POST /v1/videos is tested end to end on
loopback with a fake runner that writes a real MP4.

gameserver (spec v2): secrets never ride in the offer (sealed handoff to the
winning worker); backups every 30 min and at stop, encrypted to the buyer's
X25519 key; signed status records on c0mpute/gameserver/v1; `gameserver watch`
probes the port (Minecraft status, Valheim A2S, Factorio UDP + status),
mirrors backups and fails over to another worker from the latest one; hard
expiry via timeout + --init + --rm plus a boot/sweep watchdog. Runtime trait
lets the loopback e2e run without docker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…native p2p chat

train (infernet.text.train, `c0mpute train lora`):
- The corpus goes out as content-addressed 1 MiB pieces from the buyer's
  chunk store; the worker pulls them over libp2p (InputRef::fetch_to_file,
  streamed) and checks the sha256 the offer names. Training events are
  published on the job topic (run_id, step events throttled to 4/s). The
  worker stores the adapter files as pieces behind an AdapterManifest and
  its receipt carries the manifest's content hash; the buyer fetches and
  keeps the adapter only if the weights match the manifest's sha256.
  Nothing needs a reachable HTTP address any more.
- `c0mpute infernet text chat` (infernet.text.infer) is p2p the same way:
  adapter out as pieces (fetched on a worker cache miss), answer back as a
  chunk named by the receipt.
- Compatibility: specs keep the HTTP fields optional. Workers before this
  release require dataset_url/adapter_url, so they never bid on a
  pieces-only job; `--legacy-http` makes the buyer also run the transfer
  server for them (receipt `sha256:` = the old HTTP path, checked as before).
  Old buyers' HTTP specs still parse and run on new workers.
- Multi-turn chats: messages records are kept whole (every turn, in order)
  and prompt/completion becomes a one-exchange conversation, instead of
  collapsing to a "Brief me on: <last user turn>" record. Infernet's runner
  trains them with the loss on assistant turns
  (InfernetProtocol/infernet-protocol#161) and reports formats:["messages"];
  workers then advertise infernet:text:format:messages and buyers whose
  corpus has conversations require it. {title, text} records are unchanged.
- module.toml: available.

infernet (infernet.inference):
- New built-in workload c0mpute-core/src/inference.rs: workers answer chat
  turns from their own OpenAI-compatible runtime (Ollama at 127.0.0.1:11434
  by default, C0MPUTE_INFERENCE_URL for llama-server etc., `off` disables).
  Role `inference`, on by default, advertised only while /v1/models lists
  chat models (refreshed every minute): infernet:inference plus a tag per
  model. Answers are stored as chunks and checked against the receipt.
- `c0mpute chat --p2p` (the default when not signed in) runs one auction
  per turn over libp2p, REPL included; the jobs bridge accepts it too.
  No c0mpute.com and no infernet binary on either side.
- module.toml: available; temporal and text workers still need the infernet
  CLI for Infernet's own runtimes.

Tests: text_train_e2e (3 MiB mixed corpus as pieces on loopback with a fake
peft runner, gossip progress, adapter pieces verified, then adapter chat p2p),
inference_e2e (multi-turn chat p2p via the bridge; also passed against the
live Ollama on dev2), unit tests for specs, compat, conversion and tags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… video e2e

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ads billing no longer shells out to `coinpay wallet send`. Settlement lines
become payments::Transfer values keyed `ads:<settlement hash>:<line>` and go
through payments::pay_all on the node's one Rail (CoinPay payouts API via
$C0MPUTE_COINPAY_PAYOUT_KEY, FakeRail in tests), with the shared idempotent
payments ledger (`payments.json` per campaign) and the
`[payments] max_usd_per_round` cap. A lost ads-ledger reference is healed
from the shared ledger instead of paying twice.

- Removed ads' own PaymentRail, DisabledRail, FakeRail and CoinpayCliRail.
- `c0mpute ads settle --pay` needs both `[ads] payouts = true` and
  `[payments] enabled = true`; still a dry run otherwise.
- Payout addresses are `<COIN>:<address>` (CoinPay currency code), mapped
  to payments::Payee by billing::payee_of.
- Fee and split logic stay in ads. Docs and manifest notes updated.
- Tests: billing unit tests (cap, idempotency, heal), billing e2e on
  payments::FakeRail still checks payouts equal budget spent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nner

CI showed a failover worker that shared no connection with the buyer could
not fetch the restore world (Failed to dial the requested peer). Both sides
now put their addresses in the handoff and dial each other, so either side
can be the one behind NAT. Also fixes a unit test slicing a short last chunk.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r a holder that just let go

drop_site deleted chunks before announcing, so challengers that still listed the holder recorded failures (flaky hosting_market_e2e; could wrongly demote a preferred host). Announce first, garbage-collect after holder_ttl; a failed fetch from a peer that no longer lists the site yields no receipt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ry (DIP-0018)

- c0mpute-secure-chat: addresses = hash of all four public keys, signed
  key/home records, sealed outer layer hiding sender and recipient,
  rotating recipient tags, replay guard, bounded mailbox store,
  rendezvous placement, and client state encrypted at rest.
- c0mpute-net: /c0mpute/rpc/1.0.0 named-service request/response
  (RpcHandler, register_rpc, rpc, connected_peers).
- c0mpute-core::dm: mailbox role (on by default, gateways too), gossip
  on c0mpute/dm/v1, direct delivery to a recipient's home node, store on
  3 rendezvous-ranked mailboxes otherwise, fetch/ack, key publish and
  lookup by fingerprint. New Role::Mailbox.
- c0mpute dm: send/pull/inbox/lookup/contacts/block/unblock wired to the
  network; old `c0mpute chat <cmd>` forms still work.
- tests: unit tests plus dm_e2e (4 mailboxes, offline store-and-forward,
  ack deletes every copy, blocklist, fingerprint lookup, direct delivery).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ships train, infernet, video, gameserver (available), ads on the shared payments rail, hosting release race fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	plugins/gameserver/module.toml
#	plugins/infernet/module.toml
#	plugins/train/module.toml
#	plugins/video/module.toml
… release/v0.2.82

# Conflicts:
#	node/crates/c0mpute-cli/src/main.rs
#	node/crates/c0mpute-core/src/capabilities.rs
#	node/crates/c0mpute-core/src/config.rs
#	node/crates/c0mpute-proto/src/lib.rs
@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

13 finding(s)

HIGH/CRITICAL: 1 | MEDIUM: 8 | LOW: 4

Severity Rule Location
HIGH js-ssrf-outbound-request apps/web/public/sw.js:24
MEDIUM js-unescaped-html-sink apps/web/src/app/blog/[slug]/page.tsx:53
MEDIUM js-unescaped-html-sink apps/web/src/app/layout.tsx:80
MEDIUM sh-remote-script-execution scripts/dev-setup.sh:25
MEDIUM sh-eval-expansion scripts/dev-setup.sh:35
MEDIUM sh-remote-script-execution scripts/install.sh:173
MEDIUM sh-remote-script-execution scripts/install.sh:198
MEDIUM sh-remote-script-execution scripts/install.sh:316
MEDIUM sh-remote-script-execution scripts/install.sh:354
LOW py-ssrf-outbound-request examples/business-strategist-agent/chat.py:37
LOW py-ssrf-outbound-request examples/business-strategist-agent/train.py:54
LOW secret-generic-credential node/crates/c0mpute-core/src/webhook.rs:1165
LOW py-path-traversal node/crates/c0mpute-core/tests/fixtures/fake-infernet-text:29

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit 907e29d into master Nov 9, 2026
14 of 15 checks passed
ralyodio added a commit that referenced this pull request Nov 9, 2026
v0.2.82 was tagged at #168 (music) before #169 merged, so secure-chat messaging and the hosting release race fix were in no release. Ships them; secure-chat floor >=0.2.83.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant