From 14807866003c5d5d8f572c253c0fbdfca30c4eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gr=C3=BCner?= <47506558+MegaRedHand@users.noreply.github.com> Date: Tue, 4 Aug 2026 12:31:21 -0300 Subject: [PATCH] chore(skills): remove the stale test-pr-devnet skill devnet-runner and devnet-log-review now cover everything this skill did except building a branch-specific Docker image: node roster and image tag selection, pause/unpause instability testing, and log analysis. What remained had drifted from the current local setup. It hardcoded a lean-quickstart path outside the repo, waited for exactly four `_0` containers, and grepped zeam_0/ream_0/qlean_0, so every health check and its whole result summary reported nothing against the all-ethlambda validator config the local devnet uses now. --- .claude/skills/test-pr-devnet/SKILL.md | 248 ---------------- .../test-pr-devnet/scripts/check-status.sh | 58 ---- .../skills/test-pr-devnet/scripts/cleanup.sh | 38 --- .../test-pr-devnet/scripts/test-branch.sh | 267 ------------------ CLAUDE.md | 5 +- 5 files changed, 3 insertions(+), 613 deletions(-) delete mode 100644 .claude/skills/test-pr-devnet/SKILL.md delete mode 100755 .claude/skills/test-pr-devnet/scripts/check-status.sh delete mode 100755 .claude/skills/test-pr-devnet/scripts/cleanup.sh delete mode 100755 .claude/skills/test-pr-devnet/scripts/test-branch.sh diff --git a/.claude/skills/test-pr-devnet/SKILL.md b/.claude/skills/test-pr-devnet/SKILL.md deleted file mode 100644 index 53f851c2..00000000 --- a/.claude/skills/test-pr-devnet/SKILL.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -name: test-pr-devnet -description: Test ethlambda PR changes in multi-client devnet. Use when users want to (1) Test a branch/PR with other Lean clients, (2) Validate BlocksByRoot or P2P protocol changes, (3) Test sync recovery with pause/unpause, (4) Verify cross-client interoperability, (5) Run integration tests before merging. -disable-model-invocation: true ---- - -# Test PR in Devnet - -Test ethlambda branch changes in a multi-client local devnet with zeam (Zig), ream (Rust), qlean (C++), and ethlambda. - -## Quick Start - -```bash -# Test current branch (basic interoperability, ~60-90s) -.claude/skills/test-pr-devnet/scripts/test-branch.sh - -# Test with sync recovery (BlocksByRoot validation, ~90-120s) -.claude/skills/test-pr-devnet/scripts/test-branch.sh --with-sync-test - -# Test specific branch -.claude/skills/test-pr-devnet/scripts/test-branch.sh my-feature-branch - -# Check status while running -.claude/skills/test-pr-devnet/scripts/check-status.sh - -# Cleanup when done -.claude/skills/test-pr-devnet/scripts/cleanup.sh -``` - -## What It Does - -1. **Builds branch-specific Docker image** tagged as `ghcr.io/lambdaclass/ethlambda:` -2. **Updates lean-quickstart config** to use new image (backs up original) -3. **Starts 4-node devnet** with fresh genesis (zeam, ream, qlean, ethlambda) -4. **Optionally tests sync recovery** by pausing/unpausing nodes -5. **Analyzes results** and provides summary -6. **Leaves devnet running** for manual inspection - -## Prerequisites - -| Requirement | Location | Check | -|-------------|----------|-------| -| lean-quickstart | `/Users/mega/lean_consensus/lean-quickstart` | `ls $LEAN_QUICKSTART` | -| Docker running | - | `docker ps` | -| Git repository | ethlambda root | `git branch` | - -## Test Scenarios - -### Basic Interoperability (~60-90s) - -**Goal:** Verify ethlambda produces blocks and reaches consensus with other clients - -**Success criteria:** -- ✅ No errors in ethlambda logs -- ✅ All 4 nodes at same head slot -- ✅ Finalization advancing (every few slots on a healthy devnet) -- ✅ Each validator produces blocks for their slots - -### Sync Recovery (~90-120s) - -**Goal:** Test BlocksByRoot request/response when nodes fall behind - -**Usage:** Add `--with-sync-test` flag - -**What happens:** -1. Devnet runs for 10s (~2-3 slots) -2. Pauses `zeam_0` and `qlean_0` -3. Network progresses 20s (~5 slots) -4. Unpauses nodes → nodes sync - -**Success criteria:** -- ✅ Inbound BlocksByRoot requests logged -- ✅ Successful responses sent -- ✅ Paused nodes sync to current head - -## Configuration Changes - -The skill modifies `lean-quickstart/client-cmds/ethlambda-cmd.sh` to use your branch's Docker image. - -**Automatic backup:** Creates `ethlambda-cmd.sh.backup` - -**Restore methods:** -```bash -# 1. Cleanup script (recommended) -.claude/skills/test-pr-devnet/scripts/cleanup.sh - -# 2. Manual restore -mv $LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh.backup \ - $LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh - -# 3. Git restore (if no uncommitted changes) -cd $LEAN_QUICKSTART && git checkout client-cmds/ethlambda-cmd.sh -``` - -## Manual Workflow (Alternative to Script) - -If you need fine-grained control: - -### 1. Build Image - -```bash -cd /Users/mega/lean_consensus/ethlambda -BRANCH=$(git rev-parse --abbrev-ref HEAD) -docker build \ - --build-arg GIT_COMMIT=$(git rev-parse HEAD) \ - --build-arg GIT_BRANCH=$BRANCH \ - -t ghcr.io/lambdaclass/ethlambda:$BRANCH . -``` - -### 2. Update Configuration - -Edit `$LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh` line 17: -```bash -node_docker="ghcr.io/lambdaclass/ethlambda: \ -``` - -### 3. Start Devnet - -```bash -cd $LEAN_QUICKSTART -NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --metrics -``` - -### 4. Test Sync (Optional) - -```bash -# Create sync gap -docker pause zeam_0 qlean_0 -sleep 20 # Network progresses - -# Test recovery -docker unpause zeam_0 qlean_0 -sleep 10 # Wait for sync -``` - -### 5. Check Results - -```bash -# Quick status -.claude/skills/test-pr-devnet/scripts/check-status.sh - -# Detailed analysis (use this repo's devnet-log-review skill; dump logs first) -for node in zeam_0 ream_0 qlean_0 ethlambda_0; do - docker logs "$node" > "${node}.log" 2>&1 -done -.claude/skills/devnet-log-review/scripts/analyze-logs.sh -``` - -## Verification Checklist - -| Check | Command | Expected | -|-------|---------|----------| -| All nodes running | `docker ps --filter "name=_0"` | 4 containers | -| Peers connected | `docker logs ethlambda_0 \| grep "Received status request" \| wc -l` | > 10 | -| Blocks produced | `docker logs ethlambda_0 \| grep "Published block" \| wc -l` | > 0 | -| No errors | `docker logs ethlambda_0 \| grep ERROR \| wc -l` | 0 | - -## Troubleshooting - -### Build Fails -```bash -docker ps # Check Docker running -docker system prune -a # Clean cache if needed -``` - -### Nodes Won't Start -```bash -# Clean and retry -docker stop zeam_0 ream_0 qlean_0 ethlambda_0 2>/dev/null -docker rm zeam_0 ream_0 qlean_0 ethlambda_0 2>/dev/null -cd $LEAN_QUICKSTART -NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis -``` - -### Genesis Mismatch -```bash -cd $LEAN_QUICKSTART -NETWORK_DIR=local-devnet ./spin-node.sh --node all --cleanData --generateGenesis -``` - -### Image Tag Not Updated -```bash -# Verify the change -grep "node_docker=" $LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh -# Should show your branch name, not :local -``` - -### Port Already in Use -```bash -docker stop $(docker ps -q --filter "name=_0") 2>/dev/null || true -``` - -## Debugging - -### P2P Request/Response Debugging - -```bash -# Check inbound BlocksByRoot handling -docker logs ethlambda_0 2>&1 | grep "Received BlocksByRoot request" -docker logs ethlambda_0 2>&1 | grep "Responding to BlocksByRoot" - -# Check outbound BlocksByRoot requests -docker logs ethlambda_0 2>&1 | grep "Sending BlocksByRoot request" -docker logs ethlambda_0 2>&1 | grep "Received BlocksByRoot response" - -# Check for protocol errors -docker logs ethlambda_0 2>&1 | grep -E "Outbound request failed|protocol.*not.*support" - -# Count requests/responses -docker logs ethlambda_0 2>&1 | grep "Received BlocksByRoot request" | wc -l -``` - -### Devnet Status Checks - -```bash -# Check all nodes are running -docker ps --format "{{.Names}}: {{.Status}}" --filter "name=_0" - -# Get current chain status (zeam) -docker logs zeam_0 2>&1 | tail -100 | grep "CHAIN STATUS" | tail -1 - -# Get fork choice updates (ethlambda) -docker logs ethlambda_0 2>&1 | grep "Fork choice head updated" | tail -5 - -# Check peer connectivity -docker logs ethlambda_0 2>&1 | grep "Received status request" | wc -l -``` - -### Common Investigation Patterns - -```bash -# Verify ethlambda is proposing blocks -docker logs ethlambda_0 2>&1 | grep "We are the proposer" - -# Compare finalized slots across clients -for node in zeam_0 ream_0 ethlambda_0; do - echo "$node:" - docker logs "$node" 2>&1 | grep -i "finalized" | tail -1 -done - -# Check peer discovery -docker logs ethlambda_0 2>&1 | grep -i "peer\|connection" | head -20 -``` - -## References - -- **[ethlambda CLAUDE.md](../../../CLAUDE.md)** - Development workflow, detailed debugging commands -- **[devnet-log-review](../devnet-log-review/SKILL.md)** - Comprehensive log analysis (in this repo) diff --git a/.claude/skills/test-pr-devnet/scripts/check-status.sh b/.claude/skills/test-pr-devnet/scripts/check-status.sh deleted file mode 100755 index 3d82a691..00000000 --- a/.claude/skills/test-pr-devnet/scripts/check-status.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -# Quick devnet status check - -# Colors -GREEN='\033[0;32m' -RED='\033[0;31m' -BLUE='\033[0;34m' -NC='\033[0m' - -echo -e "${BLUE}=== Devnet Status ===${NC}" -echo "" - -# Check running nodes -echo "Running nodes:" -docker ps --format " {{.Names}}: {{.Status}}" --filter "name=_0" -echo "" - -# Check each node's latest status -for node in zeam_0 ream_0 qlean_0 ethlambda_0; do - if docker ps --format "{{.Names}}" | grep -q "^$node$"; then - echo -e "${GREEN}$node${NC}:" - - case $node in - zeam_0) - docker logs zeam_0 2>&1 | tail -100 | grep "CHAIN STATUS" | tail -1 | sed 's/^/ /' - ;; - ethlambda_0) - docker logs ethlambda_0 2>&1 | grep "Fork choice head updated" | tail -1 | sed 's/^/ /' - ;; - *) - echo " (check logs manually)" - ;; - esac - echo "" - fi -done - -# Check peer connectivity -if docker ps --format "{{.Names}}" | grep -q "^ethlambda_0$"; then - PEERS=$(docker logs ethlambda_0 2>&1 | grep "Received status request" | wc -l | tr -d ' ') - echo "ethlambda peer interactions: $PEERS" - echo "" -fi - -# Quick error check -echo "Error counts:" -for node in zeam_0 ream_0 qlean_0 ethlambda_0; do - if docker ps --format "{{.Names}}" | grep -q "^$node$"; then - COUNT=$(docker logs "$node" 2>&1 | grep -c "ERROR" || echo "0") - COUNT=$(echo "$COUNT" | tr -d '\n' | xargs) - if [[ "$COUNT" -eq 0 ]]; then - echo -e " $node: ${GREEN}$COUNT${NC}" - else - echo -e " $node: ${RED}$COUNT${NC}" - fi - fi -done diff --git a/.claude/skills/test-pr-devnet/scripts/cleanup.sh b/.claude/skills/test-pr-devnet/scripts/cleanup.sh deleted file mode 100755 index f664d3f7..00000000 --- a/.claude/skills/test-pr-devnet/scripts/cleanup.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Cleanup devnet and restore configurations - -LEAN_QUICKSTART="${LEAN_QUICKSTART:-/Users/mega/lean_consensus/lean-quickstart}" -ETHLAMBDA_CMD="$LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh" - -# Colors -GREEN='\033[0;32m' -BLUE='\033[0;34m' -NC='\033[0m' - -echo -e "${BLUE}=== Devnet Cleanup ===${NC}" -echo "" - -# Stop devnet -echo "Stopping devnet..." -cd "$LEAN_QUICKSTART" -NETWORK_DIR=local-devnet ./spin-node.sh --node all --stop 2>/dev/null || true - -# Force remove containers -echo "Removing containers..." -docker rm -f zeam_0 ream_0 qlean_0 ethlambda_0 2>/dev/null || true - -echo -e "${GREEN}✓ Devnet stopped${NC}" -echo "" - -# Restore config if backup exists -if [[ -f "$ETHLAMBDA_CMD.backup" ]]; then - echo "Restoring ethlambda-cmd.sh..." - mv "$ETHLAMBDA_CMD.backup" "$ETHLAMBDA_CMD" - echo -e "${GREEN}✓ Config restored${NC}" -else - echo "No backup found, skipping config restore" -fi - -echo "" -echo "Cleanup complete!" diff --git a/.claude/skills/test-pr-devnet/scripts/test-branch.sh b/.claude/skills/test-pr-devnet/scripts/test-branch.sh deleted file mode 100755 index 4d94ac50..00000000 --- a/.claude/skills/test-pr-devnet/scripts/test-branch.sh +++ /dev/null @@ -1,267 +0,0 @@ -#!/bin/bash -set -euo pipefail - -# Test ethlambda branch in multi-client devnet -# Usage: ./test-branch.sh [branch-name] [--with-sync-test] - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ETHLAMBDA_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)" -LEAN_QUICKSTART="${LEAN_QUICKSTART:-/Users/mega/lean_consensus/lean-quickstart}" - -# Colors -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Parse arguments -BRANCH_NAME="" -WITH_SYNC_TEST=false - -# First positional arg is branch name (if not a flag) -for arg in "$@"; do - if [[ "$arg" == "--with-sync-test" ]]; then - WITH_SYNC_TEST=true - elif [[ -z "$BRANCH_NAME" ]]; then - BRANCH_NAME="$arg" - fi -done - -# Default to current branch if not specified -if [[ -z "$BRANCH_NAME" ]]; then - BRANCH_NAME=$(git -C "$ETHLAMBDA_ROOT" rev-parse --abbrev-ref HEAD) -fi - -echo -e "${BLUE}=== ethlambda Devnet Testing ===${NC}" -echo "" -echo "Branch: $BRANCH_NAME" -echo "Sync test: $WITH_SYNC_TEST" -echo "ethlambda root: $ETHLAMBDA_ROOT" -echo "lean-quickstart: $LEAN_QUICKSTART" -echo "" - -# Validate prerequisites -echo "Validating prerequisites..." - -if [[ ! -d "$LEAN_QUICKSTART" ]]; then - echo -e "${RED}✗ Error: lean-quickstart not found at $LEAN_QUICKSTART${NC}" - echo " Set LEAN_QUICKSTART environment variable or clone it:" - echo " git clone https://github.com/blockblaz/lean-quickstart.git" - exit 1 -fi - -if [[ ! -f "$LEAN_QUICKSTART/spin-node.sh" ]]; then - echo -e "${RED}✗ Error: spin-node.sh not found in lean-quickstart${NC}" - exit 1 -fi - -if ! docker info &>/dev/null; then - echo -e "${RED}✗ Error: Docker is not running${NC}" - echo " Start Docker Desktop or docker daemon" - exit 1 -fi - -# Use `git rev-parse` instead of `-d .git` to support git worktrees, -# where .git is a file (not a directory) pointing to the main repo. -if ! git -C "$ETHLAMBDA_ROOT" rev-parse --git-dir &>/dev/null; then - echo -e "${RED}✗ Error: Not in a git repository${NC}" - echo " Run this script from ethlambda repository root" - exit 1 -fi - -echo -e "${GREEN}✓ Prerequisites validated${NC}" -echo "" - -# Step 1: Build Docker image -echo -e "${BLUE}[1/6] Building Docker image...${NC}" -cd "$ETHLAMBDA_ROOT" -GIT_COMMIT=$(git rev-parse HEAD) - -docker build \ - --build-arg GIT_COMMIT="$GIT_COMMIT" \ - --build-arg GIT_BRANCH="$BRANCH_NAME" \ - -t "ghcr.io/lambdaclass/ethlambda:$BRANCH_NAME" \ - . - -echo -e "${GREEN}✓ Image built: ghcr.io/lambdaclass/ethlambda:$BRANCH_NAME${NC}" -echo "" - -# Step 2: Update ethlambda-cmd.sh -echo -e "${BLUE}[2/6] Updating lean-quickstart config...${NC}" -ETHLAMBDA_CMD="$LEAN_QUICKSTART/client-cmds/ethlambda-cmd.sh" - -# Backup original -cp "$ETHLAMBDA_CMD" "$ETHLAMBDA_CMD.backup" - -# Update docker tag -sed -i.tmp "s|ghcr.io/lambdaclass/ethlambda:[^ ]*|ghcr.io/lambdaclass/ethlambda:$BRANCH_NAME|" "$ETHLAMBDA_CMD" -rm "$ETHLAMBDA_CMD.tmp" - -echo -e "${GREEN}✓ Updated $ETHLAMBDA_CMD${NC}" -echo " (Backup saved as $ETHLAMBDA_CMD.backup)" -echo "" - -# Step 3: Stop any existing devnet -echo -e "${BLUE}[3/6] Cleaning up existing devnet...${NC}" -cd "$LEAN_QUICKSTART" -NETWORK_DIR=local-devnet ./spin-node.sh --node all --stop 2>/dev/null || true -docker rm -f zeam_0 ream_0 qlean_0 ethlambda_0 2>/dev/null || true - -echo -e "${GREEN}✓ Cleanup complete${NC}" -echo "" - -# Step 4: Start devnet -echo -e "${BLUE}[4/6] Starting devnet...${NC}" -echo "This will take ~40 seconds (genesis generation + startup)" -echo "" - -# Run devnet in background -NETWORK_DIR=local-devnet ./spin-node.sh --node all --generateGenesis --metrics > /tmp/devnet-$BRANCH_NAME.log 2>&1 & -DEVNET_PID=$! - -# Wait for nodes to start (check docker ps) -echo -n "Waiting for nodes to start" -for i in {1..40}; do - sleep 1 - echo -n "." - if [[ $(docker ps --filter "name=_0" --format "{{.Names}}" | wc -l) -eq 4 ]]; then - echo "" - echo -e "${GREEN}✓ All 4 nodes running${NC}" - break - fi -done -echo "" - -# Show node status -docker ps --format " {{.Names}}: {{.Status}}" --filter "name=_0" -echo "" - -# Step 5: Sync recovery test (optional) -if [[ "$WITH_SYNC_TEST" == "true" ]]; then - echo -e "${BLUE}[5/6] Testing sync recovery...${NC}" - - # Let devnet run for a bit - echo "Letting devnet run for 10 seconds..." - sleep 10 - - # Pause nodes - echo "Pausing zeam_0 and qlean_0..." - docker pause zeam_0 qlean_0 - echo -e "${YELLOW}⏸ Nodes paused${NC}" - - # Wait for network to progress - echo "Network progressing for 20 seconds (~5 slots)..." - sleep 20 - - # Unpause - echo "Unpausing nodes..." - docker unpause zeam_0 qlean_0 - echo -e "${GREEN}▶ Nodes resumed${NC}" - - # Wait for sync - echo "Waiting 10 seconds for sync recovery..." - sleep 10 - - echo -e "${GREEN}✓ Sync recovery test complete${NC}" - echo "" -else - echo -e "${BLUE}[5/6] Skipping sync recovery test${NC}" - echo "Use --with-sync-test to enable" - echo "" - - # Just let it run for a bit - echo "Letting devnet run for 30 seconds..." - sleep 30 -fi - -# Step 6: Analyze results -echo -e "${BLUE}[6/6] Analyzing results...${NC}" -echo "" - -# Quick status check -echo "=== Quick Status ===" -echo "" - -# Check each node -for node in zeam_0 ream_0 qlean_0 ethlambda_0; do - if docker ps --format "{{.Names}}" | grep -q "^$node$"; then - echo -e "${GREEN}✓${NC} $node: Running" - else - echo -e "${RED}✗${NC} $node: Not running" - fi -done -echo "" - -# Check ethlambda specifics -echo "=== ethlambda Status ===" -echo "" - -# Get latest head -LATEST_HEAD=$(docker logs ethlambda_0 2>&1 | grep "Fork choice head updated" | tail -1 || echo "No head updates found") -echo "$LATEST_HEAD" -echo "" - -# Count peer interactions -PEER_COUNT=$(docker logs ethlambda_0 2>&1 | grep "Received status request" | wc -l | tr -d ' ') -echo "Peer interactions: $PEER_COUNT" - -# Count blocks -BLOCKS_PUBLISHED=$(docker logs ethlambda_0 2>&1 | grep "Published block" | wc -l | tr -d ' ') -echo "Blocks published: $BLOCKS_PUBLISHED" - -# Count errors -ERROR_COUNT=$(docker logs ethlambda_0 2>&1 | grep -c "ERROR" || echo "0") -ERROR_COUNT=$(echo "$ERROR_COUNT" | tr -d '\n' | xargs) -if [[ "$ERROR_COUNT" -eq 0 ]]; then - echo -e "Errors: ${GREEN}$ERROR_COUNT${NC}" -else - echo -e "Errors: ${RED}$ERROR_COUNT${NC}" -fi -echo "" - -# BlocksByRoot stats (if sync test was run) -if [[ "$WITH_SYNC_TEST" == "true" ]]; then - echo "=== BlocksByRoot Activity ===" - echo "" - - INBOUND=$(docker logs ethlambda_0 2>&1 | grep "Received BlocksByRoot request" | wc -l | tr -d ' ') - RESPONSES=$(docker logs ethlambda_0 2>&1 | grep "Responding to BlocksByRoot" | wc -l | tr -d ' ') - OUTBOUND=$(docker logs ethlambda_0 2>&1 | grep "Sending BlocksByRoot request" | wc -l | tr -d ' ') - - echo "Inbound requests: $INBOUND" - echo "Responses sent: $RESPONSES" - echo "Outbound requests: $OUTBOUND" - echo "" -fi - -# Final verdict -echo "=== Test Result ===" -echo "" -if [[ "$ERROR_COUNT" -eq 0 ]] && [[ "$PEER_COUNT" -gt 0 ]]; then - echo -e "${GREEN}✓ PASSED${NC} - Devnet running successfully" -else - echo -e "${YELLOW}⚠ CHECK LOGS${NC} - Some issues detected" -fi -echo "" - -# Next steps -echo "=== Next Steps ===" -echo "" -echo "Check detailed logs:" -echo " docker logs ethlambda_0 2>&1 | less" -echo "" -echo "Run log analysis:" -echo " cd $LEAN_QUICKSTART" -echo " .claude/skills/devnet-log-review/scripts/analyze-logs.sh" -echo "" -echo "Stop devnet:" -echo " cd $LEAN_QUICKSTART" -echo " NETWORK_DIR=local-devnet ./spin-node.sh --node all --stop" -echo "" -echo "Restore config:" -echo " mv $ETHLAMBDA_CMD.backup $ETHLAMBDA_CMD" -echo "" - -# Keep devnet running -echo -e "${YELLOW}Devnet is still running. Stop it when done testing.${NC}" diff --git a/CLAUDE.md b/CLAUDE.md index 3e092d5e..34ad0704 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -89,7 +89,6 @@ make test # All tests + forkchoice spec tests ### Common Operations ```bash -.claude/skills/test-pr-devnet/scripts/test-branch.sh # Test branch in multi-client devnet rm -rf leanSpec && make leanSpec/fixtures # Download latest released test fixtures make docker-build # Build Docker image (DOCKER_TAG=local) make run-devnet # Run local devnet with lean-quickstart @@ -97,7 +96,9 @@ make run-devnet # Run local devnet with ### Testing with Local Devnet -See `.claude/skills/test-pr-devnet/SKILL.md` for multi-client devnet testing workflows. +See `.claude/skills/devnet-runner/SKILL.md` for running a local multi-client devnet +(node roster, image tags, pause/unpause instability testing) and +`.claude/skills/devnet-log-review/SKILL.md` for analyzing the dumped logs. ## Important Patterns & Idioms