You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+26Lines changed: 26 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,32 @@ All notable changes to the DKG V9 node are documented here. The format is based
6
6
7
7
---
8
8
9
+
## [10.0.0-rc.8] - 2026-05-15
10
+
11
+
libp2p reachability hardening (capacity / observability / multi-reservation series), tag-triggered npm publishing, agent-to-agent debug chat, Node UI chat panel revamp, and a Base Sepolia 7-contract redeploy. **Testnet contract redeploy required** — `chainResetMarker` bumped to `v10-profilestorage-paramstore-redeploy-2026-05-14` (already on `main` since #511); first boot on rc.8 wipes per-node chain-derived state for any operator still on the rc.6 marker. Hub at `0xC056e67Da4F51377Ad1B01f50F655fFdcCD809F6` and Token at `0x2A58BdD13176D85906D804cdbFFA0D9119282DC8` retain their addresses.
12
+
13
+
### Added
14
+
-**libp2p reachability hardening PR1/3 — Core Node relay capacity + TTLs + operator knob** (PR #524, `packages/core/src/node.ts`, `packages/core/src/types.ts`, `packages/cli/src/config.ts`, `packages/agent/src/dkg-agent.ts`): Core Nodes now scale `circuitRelayServer` capacity by `RELAY_CAPACITY_MULTIPLIER` so a node advertising itself as a relay actually accepts the reservations it gets dialed for. New `DKGNodeConfig.relayServerCapacity` operator knob (validated by `validateRelayServerCapacity`) lets large-fanout operators scale `maxReservations` / `maxCircuits` / `maxOutboundStreams` / `maxInboundStreams` together; defaults stay safe for small operators. Reservation TTL extended to 2 h with `defaultDurationLimit` of 30 min so long-lived edges aren't churned on every refresh cycle.
15
+
-**libp2p reachability hardening PR2/3 — relay observability** (PR #525, new `packages/core/src/relay-metrics-adapter.ts`, new `packages/core/src/relay-internal-shapes.ts`, `packages/core/src/node.ts`, `packages/node-ui/src/db.ts`, `packages/node-ui/src/api.ts`): `RelayMetricsAdapter` plugs into libp2p as a `Metrics` implementation and counts relay-server bytes by direction via `RELAY_V2_HOP_CODEC` / `RELAY_V2_STOP_CODEC` stream tracking (no more guessing from raw connection metadata). New `/api/relay/stats` endpoint surfaces `{ activeReservations, activeCircuits, bytesIn, bytesOut }`; values are persisted as `relay_*` columns on `metric_snapshots` for retention. Compatibility helpers (`readRelayReservations`, `readConnectionStreams`) validate libp2p internal shapes and return `null` on mismatch so the API reports a visible error rather than silently stale zeros if libp2p ever refactors. Pinned by `packages/core/test/relay-internal-shapes.test.ts` (9 cases).
16
+
- **libp2p reachability hardening PR3/3 — edge multi-reservation tuning** (PR #526, `packages/core/src/node.ts`, `packages/core/test/relay.test.ts`): edge nodes can now hold multiple parallel relay reservations for redundancy via `DKGNodeConfig.relayReservationCount` (default 3, gated to edge nodes that actually have `relayPeers`). The relay watchdog enforces *per-relay* reservation presence when target > 1, with a per-tick forced-redial budget capped at `missingSlotsAtTickStart` so a single cycle can't burn through every relay. New canonical `usableRelayCandidates` pass deduplicates `relayPeers` by canonical peerId (handles mixed base58btc/base32 encodings), aggregates alternate transports for the same peer (`[relayA-tcp, relayA-ws]` → one `RelayTarget` with both addrs), drops self-references, and warns on malformed entries. AutoNAT gating + `/p2p-circuit` listener fallback now key off `usableRelayCandidates.length` so a node whose every configured relay is unusable falls back cleanly instead of half-configuring itself.
17
+
-**Agent-to-agent debug chat** (PRs #510, #521, `packages/mcp-dkg/src/index.ts`, new `packages/agent/src/message-outbox.ts`, `packages/core/src/protocol-router.ts`): MCP exposes `dkg_send_message` / `dkg_check_inbox` / `dkg_get_chat_history` / `dkg_list_agents` so two agents on different nodes can exchange threaded messages with ACL enforcement (sender-on-allowlist, no rate-limit bypass). `MessageOutbox` retries silent-dropped invitee deliveries with per-key inflight guard against duplicate-delivery races; `ProtocolRouter.send` re-runs `peerResolver` per attempt so a stale handle from boot doesn't strand subsequent retries.
18
+
-**Node UI chat panel UX/UI revamp** (PRs #503, #504, #505, #516, #528, #529, `packages/node-ui/src/components/chat/**`): full chat-panel rebuild — sticky header, custom Select for project switching, drag-and-drop file composer with chip rendering, markdown + syntax highlighting in assistant turns, full-width assistant bubbles, send-button states, hover-revealed timestamps, inline streaming caret, my-projects picker, and a 404-resilient markdown viewer for imported documents. Replaces the legacy chat surface end-to-end.
19
+
-**Tag-triggered npm publishing** (PR #522, `.github/workflows/npm-publish.yml`, `.github/workflows/release.yml`): merging to `main` no longer publishes anything to npm. Publishing now fires only on signed annotated tags matching `v<major>.<minor>.<patch>` (e.g. `v10.0.0-rc.8`), and only when the tag is reachable from `main` or `v10-rc`, ssh- or gpg-signed, and matches every `package.json` version in the workspace. The `npm-publish` GitHub Environment requires a reviewer (5-minute wait, no self-approval) before any package is pushed. Replaces the previous continuous-publish-on-merge flow.
20
+
21
+
### Fixed
22
+
-**`relayServerCapacity` validator silently accepted unsafe-integer values** (PR #530, `packages/core/src/node.ts`, `packages/core/test/relay-capacity.test.ts`): the validator used `Number.isInteger` which accepts values above `Number.MAX_SAFE_INTEGER` (e.g. `9007199254740993`); multiplying by `RELAY_CAPACITY_MULTIPLIER` then silently lost precision and corrupted the libp2p caps. Now uses `Number.isSafeInteger` and a new `MAX_RELAY_SERVER_CAPACITY` ceiling that ensures every derived cap also stays within the safe range. `deriveRelayCaps` got the same belt-and-braces check.
23
+
-**Staking-V10: `_convertToNFT` left migrated TRAC stranded in `StakingStorage`** (PR #491, `packages/evm-module/contracts/StakingV10.sol`): the conviction-NFT conversion path read the migrated balance from `StakingStorage` but never transferred it onward to `ConvictionStakingStorage`, so the underlying TRAC was unrecoverable from either side post-conversion. Now transfers the balance in the same call before minting the NFT.
24
+
-**Staking-V10: operator-fee lookup ignored historical epoch** (PR #493, `packages/evm-module/contracts/StakingV10.sol`): `_getEffectiveOperatorFee` resolved against the latest fee-change rather than the epoch the lookup was for, so reward calculations against past epochs used today's fee. Now binds the lookup to the requesting epoch's timestamp.
25
+
-**Post-approval sync gap hid freshly-joined curated CGs** (PR #517, `packages/agent/src/dkg-agent.ts`): a window between approval-event arrival and `_meta` reconciliation left the just-joined CG invisible to the invitee until the next periodic sync. Approval handling now triggers an immediate targeted sync of the new CG.
26
+
-**Curator reject-reason was hidden in `JoinProjectModal`** (PR #508, `packages/node-ui/src/components/.../JoinProjectModal.tsx`): the modal swallowed the `reason` field on `JOIN_REQUEST_REJECTED`, leaving operators with a generic "rejected" UI. Now surfaces the curator's explicit reason string.
27
+
-**Axiom-4 trust upgrades** (PR #523): hardened trust-upgrade endpoint inputs, bounded the verify-collection timeout, fail-closed on non-quorum verify, and aligned devnet trust paths with the new gating. Companion devnet sections cover the regression surfaces.
28
+
-**`npm-publish` job missed hidden `.publish-artifacts` upload** (PR #515, `.github/workflows/npm-publish.yml`): renamed to non-hidden `publish-artifacts` so `actions/upload-artifact` includes it; preceded #522 (tag-triggered publishing) and unblocked the new flow.
29
+
30
+
### Changed
31
+
-**Base Sepolia (chainId 84532): 7 contracts redeployed off `main@7235e669`** (PR #511, `packages/evm-module/deployments/base_sepolia_v10_contracts.json`): refresh of the `Profile`/`ProfileStorage`/`ParameterStorage` family + the staking-V10 contracts that needed the #491 / #493 fixes deployed. New addresses are committed to `base_sepolia_v10_contracts.json`; agents discover them via `Hub.getContractAddress(...)` at runtime so no `network/testnet.json` edit was needed beyond the `chainResetMarker` bump (`v10-rc6-pca-author-attestation-2026-05-10` → `v10-profilestorage-paramstore-redeploy-2026-05-14`). Hub + Token addresses preserved.
32
+
33
+
---
34
+
9
35
## [10.0.0-rc.7] - 2026-05-13
10
36
11
37
RFC 07 in-process `PeerResolver` consolidation, Relay Registry tri-state on-chain semantics, PCA wiring at registration, and full invite/join e2e coverage in the devnet smoke suite. **No testnet contract redeploy** — `chainResetMarker` unchanged from rc.6 (`v10-rc6-pca-author-attestation-2026-05-10`); rc.7 is a node-only update over the existing on-chain world.
0 commit comments