From 252b766a5384ccaf333fe6811759985414110df1 Mon Sep 17 00:00:00 2001 From: TorNation01 <70rn4710n@proton.me> Date: Sun, 29 Mar 2026 10:13:59 +0800 Subject: [PATCH] feat(mission-control): sync launchpad and runbooks with upstream main - Merge-aligned doc-manifest regeneration (58 doc-derived runbooks) - Launchpad: Phoenix Deploy API, Meta testnet 2138 runbook, aggregator route matrix - Curated runbook: check-chain138-rpc-health.sh; README env vars; catalog test threshold Made-with: Cursor --- mission-control/README.md | 4 + mission-control/runbooks/doc-manifest.json | 138 +++++++++++++++++- .../specs/check-chain138-rpc-health.json | 67 +++++++++ mission-control/src/lib/launchpad.ts | 28 ++++ mission-control/src/lib/load-specs.test.ts | 3 +- 5 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 mission-control/runbooks/specs/check-chain138-rpc-health.json diff --git a/mission-control/README.md b/mission-control/README.md index 6bb4cc0..d2db16b 100644 --- a/mission-control/README.md +++ b/mission-control/README.md @@ -34,6 +34,10 @@ pnpm --filter mission-control run generate:runbooks | `GIT_BASH_PATH` | Windows: full path to `bash.exe` if not under default Git paths. | | `NEXT_PUBLIC_HELPER_SCRIPTS_URL` | Launchpad link for helper site (default `http://localhost:3000`). | | `NEXT_PUBLIC_EXPLORER_URL` | Launchpad link for explorer (default `https://explorer.d-bis.org`). | +| `NEXT_PUBLIC_PHOENIX_DEPLOY_API_URL` | Launchpad link for Phoenix Deploy API health (default `http://localhost:4001/health`). | +| `NEXT_PUBLIC_TESTNET_2138_RUNBOOK_URL` | Meta testnet 2138 runbook (Gitea markdown). | +| `NEXT_PUBLIC_ROUTE_MATRIX_URL` | Aggregator route matrix JSON in repo. | +| `NEXT_PUBLIC_DOCS_MASTER_URL` / `NEXT_PUBLIC_OPERATIONAL_RUNBOOKS_URL` | Override doc deep links on the launchpad. | ## Test diff --git a/mission-control/runbooks/doc-manifest.json b/mission-control/runbooks/doc-manifest.json index 3102d0a..8446ff0 100644 --- a/mission-control/runbooks/doc-manifest.json +++ b/mission-control/runbooks/doc-manifest.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-03-27T13:14:31.612Z", + "generatedAt": "2026-03-29T02:12:54.013Z", "runbooks": [ { "id": "doc-00-meta-deploy-confirm-and-full-e2e-runbook-39d840a5", @@ -111,7 +111,7 @@ { "id": "doc-03-deployment-add-liquidity-pmm-chain138-runbook-f349d900", "title": "Add Liquidity to PMM Pools (Chain 138) — Runbook", - "summary": "**Purpose:** Add base/quote liquidity to the three DODO PMM pools on Chain 138 (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC).", + "summary": "> Historical note (2026-03-26): this runbook originated during the earlier three-pool PMM phase. Current canonical Chain 138 PMM addresses are `DODOPMMIntegration=0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` and `DODOPMMProvider=0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381`.", "whyItMatters": "This links documentation to executable automation in the monorepo. Operators get repeatable runs and an audit trail.", "audienceHelp": "Use Practice mode when a script supports it. Set Proxmox host and RPC override when your environment differs from defaults.", "docPath": "docs/03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md", @@ -268,6 +268,71 @@ "complianceFramework": "DBIS-MC-DOC-RUNBOOK-1", "executionNote": "Automated steps are the scripts explicitly referenced in this runbook. Review the documentation for prerequisites (SSH, VPN, secrets) before running in production." }, + { + "id": "doc-03-deployment-chain138-pmm-redeploy-and-pool-funding-runbook-619d5ab4", + "title": "Chain 138 PMM Redeploy and Pool Funding Runbook", + "summary": "**Purpose:** Execute the live on-chain PMM remediation and funding sequence on Chain 138 in the correct order:", + "whyItMatters": "This links documentation to executable automation in the monorepo. Operators get repeatable runs and an audit trail.", + "audienceHelp": "Use Practice mode when a script supports it. Set Proxmox host and RPC override when your environment differs from defaults.", + "docPath": "docs/03-deployment/CHAIN138_PMM_REDEPLOY_AND_POOL_FUNDING_RUNBOOK.md", + "prerequisites": [ + "Read the linked markdown runbook for safety and ordering.", + "Bash (Linux, macOS, WSL, or Git Bash on Windows) for .sh steps; Node for .mjs.", + "Network, SSH, or API access as required by the underlying scripts." + ], + "steps": [ + { + "title": "Documentation", + "plainText": "Open and follow: docs/03-deployment/CHAIN138_PMM_REDEPLOY_AND_POOL_FUNDING_RUNBOOK.md", + "technicalNote": "Automated steps below are derived from script paths mentioned in that file." + } + ], + "inputs": [ + { + "name": "proxmoxHost", + "label": "Proxmox host", + "type": "string", + "help": "Used as PROXMOX_HOST in the environment for scripts that read it (e.g. 192.168.11.10).", + "example": "192.168.11.10", + "default": "192.168.11.10" + }, + { + "name": "rpcUrlOverride", + "label": "RPC URL override (optional)", + "type": "string", + "help": "If non-empty, set as RPC_URL_138 for scripts that use Chain 138 RPC.", + "example": "http://192.168.11.211:8545", + "default": "" + }, + { + "name": "practiceMode", + "label": "Practice mode (--dry-run where supported)", + "type": "boolean", + "help": "When enabled, each step whose script advertises --dry-run receives that flag.", + "default": false + } + ], + "execution": { + "steps": [ + { + "interpreter": "bash", + "scriptRelative": "scripts/mint-for-liquidity.sh", + "args": [], + "supportsDryRun": false + } + ] + }, + "touchpoints": [ + { + "id": "pipeline_exit", + "label": "All automated steps completed", + "description": "Aggregate exit status of the script chain.", + "passCondition": "exit_zero" + } + ], + "complianceFramework": "DBIS-MC-DOC-RUNBOOK-1", + "executionNote": "Automated steps are the scripts explicitly referenced in this runbook. Review the documentation for prerequisites (SSH, VPN, secrets) before running in production." + }, { "id": "doc-03-deployment-contract-deployment-runbook-30840969", "title": "Contract Deployment Runbook", @@ -2828,7 +2893,7 @@ { "id": "doc-05-network-e2e-cloudflare-domains-runbook-1bbeb05c", "title": "E2E Success Runbook: Cloudflare Domains", - "summary": "**Last Updated:** 2026-02-05", + "summary": "**Last Updated:** 2026-03-27", "whyItMatters": "This links documentation to executable automation in the monorepo. Operators get repeatable runs and an audit trail.", "audienceHelp": "Use Practice mode when a script supports it. Set Proxmox host and RPC override when your environment differs from defaults.", "docPath": "docs/05-network/E2E_CLOUDFLARE_DOMAINS_RUNBOOK.md", @@ -3148,7 +3213,7 @@ "interpreter": "bash", "scriptRelative": "scripts/update-all-dns-to-public-ip.sh", "args": [], - "supportsDryRun": false + "supportsDryRun": true } ] }, @@ -4234,6 +4299,71 @@ ], "complianceFramework": "DBIS-MC-DOC-RUNBOOK-1", "executionNote": "Automated steps are the scripts explicitly referenced in this runbook. Review the documentation for prerequisites (SSH, VPN, secrets) before running in production." + }, + { + "id": "doc-testnet-defi-oracle-meta-testnet-2138-runbook-baf4850c", + "title": "Defi Oracle Meta Testnet (Chain ID 2138) — Runbook", + "summary": "**Last Updated:** 2026-03-27", + "whyItMatters": "This links documentation to executable automation in the monorepo. Operators get repeatable runs and an audit trail.", + "audienceHelp": "Use Practice mode when a script supports it. Set Proxmox host and RPC override when your environment differs from defaults.", + "docPath": "docs/testnet/DEFI_ORACLE_META_TESTNET_2138_RUNBOOK.md", + "prerequisites": [ + "Read the linked markdown runbook for safety and ordering.", + "Bash (Linux, macOS, WSL, or Git Bash on Windows) for .sh steps; Node for .mjs.", + "Network, SSH, or API access as required by the underlying scripts." + ], + "steps": [ + { + "title": "Documentation", + "plainText": "Open and follow: docs/testnet/DEFI_ORACLE_META_TESTNET_2138_RUNBOOK.md", + "technicalNote": "Automated steps below are derived from script paths mentioned in that file." + } + ], + "inputs": [ + { + "name": "proxmoxHost", + "label": "Proxmox host", + "type": "string", + "help": "Used as PROXMOX_HOST in the environment for scripts that read it (e.g. 192.168.11.10).", + "example": "192.168.11.10", + "default": "192.168.11.10" + }, + { + "name": "rpcUrlOverride", + "label": "RPC URL override (optional)", + "type": "string", + "help": "If non-empty, set as RPC_URL_138 for scripts that use Chain 138 RPC.", + "example": "http://192.168.11.211:8545", + "default": "" + }, + { + "name": "practiceMode", + "label": "Practice mode (--dry-run where supported)", + "type": "boolean", + "help": "When enabled, each step whose script advertises --dry-run receives that flag.", + "default": false + } + ], + "execution": { + "steps": [ + { + "interpreter": "bash", + "scriptRelative": "scripts/validation/validate-config-files.sh", + "args": [], + "supportsDryRun": true + } + ] + }, + "touchpoints": [ + { + "id": "pipeline_exit", + "label": "All automated steps completed", + "description": "Aggregate exit status of the script chain.", + "passCondition": "exit_zero" + } + ], + "complianceFramework": "DBIS-MC-DOC-RUNBOOK-1", + "executionNote": "No shell/Node script paths were detected in this markdown. Mission Control runs repository config validation so you still get an automated check; follow the documentation for the full manual procedure." } ] } \ No newline at end of file diff --git a/mission-control/runbooks/specs/check-chain138-rpc-health.json b/mission-control/runbooks/specs/check-chain138-rpc-health.json new file mode 100644 index 0000000..e59c62b --- /dev/null +++ b/mission-control/runbooks/specs/check-chain138-rpc-health.json @@ -0,0 +1,67 @@ +{ + "id": "check-chain138-rpc-health", + "title": "Chain 138 RPC health (HTTP + peers + public probe)", + "summary": "Runs the repository script that checks Besu HTTP RPCs in parallel (head spread, peer counts) and probes public RPC capability against the documented matrix.", + "whyItMatters": "Catches silent RPC drift, split heads, or under-peered nodes before wallets and bridges fail in production.", + "audienceHelp": "You need bash (WSL, Git Bash, or Linux/macOS) and network reachability to the RPC IPs in config/ip-addresses.conf. Tunables: RPC_MAX_HEAD_SPREAD, RPC_MIN_PEERS, RPC_TIMEOUT_SEC, CHAIN138_PUBLIC_RPC_URL.", + "docPath": "scripts/verify/check-chain138-rpc-health.sh", + "prerequisites": [ + "Bash and curl available on PATH.", + "Optional: config/ip-addresses.conf present for LAN IP overrides." + ], + "steps": [ + { + "title": "Parallel RPC checks", + "plainText": "The script queries each configured HTTP endpoint for block number and peer count, then compares head spread and minimum peers.", + "technicalNote": "See scripts/verify/check-chain138-rpc-health.sh header for env defaults." + }, + { + "title": "Public capability probe", + "plainText": "Validates the public RPC URL against the documented support matrix (methods / capabilities).", + "technicalNote": "CHAIN138_PUBLIC_RPC_URL overrides https://rpc-http-pub.d-bis.org" + } + ], + "inputs": [ + { + "name": "proxmoxHost", + "label": "Proxmox host", + "type": "string", + "help": "Passed as PROXMOX_HOST for any downstream tooling that reads it (this script primarily uses RPC IPs).", + "example": "192.168.11.10", + "default": "192.168.11.10" + }, + { + "name": "rpcUrlOverride", + "label": "RPC URL override (optional)", + "type": "string", + "help": "If non-empty, set as RPC_URL_138 in the environment for consistency with other runbooks.", + "example": "http://192.168.11.211:8545", + "default": "" + }, + { + "name": "practiceMode", + "label": "Practice mode (--dry-run where supported)", + "type": "boolean", + "help": "This script does not implement --dry-run; leave off for a real check.", + "default": false + } + ], + "touchpoints": [ + { + "id": "exit_ok", + "label": "Script exit", + "description": "check-chain138-rpc-health.sh exited 0.", + "passCondition": "exit_zero" + } + ], + "complianceFramework": "DBIS-MC-CHAIN138-RPC-1", + "execution": { + "steps": [ + { + "interpreter": "bash", + "scriptRelative": "scripts/verify/check-chain138-rpc-health.sh", + "args": [] + } + ] + } +} diff --git a/mission-control/src/lib/launchpad.ts b/mission-control/src/lib/launchpad.ts index 7d62951..69362a3 100644 --- a/mission-control/src/lib/launchpad.ts +++ b/mission-control/src/lib/launchpad.ts @@ -28,6 +28,14 @@ export function getLaunchDestinations(): LaunchDestination[] { href: envUrl('NEXT_PUBLIC_EXPLORER_URL', 'https://explorer.d-bis.org'), kind: 'external', }, + { + id: 'phoenix-deploy-api', + title: 'Phoenix Deploy API', + description: + 'Gitea webhooks, deploy stub, Proxmox VE rail, health summary. Run locally: cd phoenix-deploy-api && npm run dev (default port 4001).', + href: envUrl('NEXT_PUBLIC_PHOENIX_DEPLOY_API_URL', 'http://localhost:4001/health'), + kind: 'external', + }, { id: 'docs-master', title: 'Documentation index', @@ -45,5 +53,25 @@ export function getLaunchDestinations(): LaunchDestination[] { ), kind: 'docs', }, + { + id: 'meta-testnet-2138-runbook', + title: 'Meta testnet (2138) runbook', + description: 'DeFi Oracle Meta testnet deployment and wallet flow (Wagmi, MetaMask JSON, RPC).', + href: envUrl( + 'NEXT_PUBLIC_TESTNET_2138_RUNBOOK_URL', + 'https://gitea.d-bis.org/d-bis/proxmox/src/branch/main/docs/testnet/DEFI_ORACLE_META_TESTNET_2138_RUNBOOK.md', + ), + kind: 'docs', + }, + { + id: 'aggregator-route-matrix', + title: 'Aggregator route matrix', + description: 'JSON matrix of NPM / aggregator routes for operators (also available as CSV in config/).', + href: envUrl( + 'NEXT_PUBLIC_ROUTE_MATRIX_URL', + 'https://gitea.d-bis.org/d-bis/proxmox/src/branch/main/config/aggregator-route-matrix.json', + ), + kind: 'docs', + }, ]; } diff --git a/mission-control/src/lib/load-specs.test.ts b/mission-control/src/lib/load-specs.test.ts index 04fc069..490637c 100644 --- a/mission-control/src/lib/load-specs.test.ts +++ b/mission-control/src/lib/load-specs.test.ts @@ -4,9 +4,10 @@ import { loadAllRunbookSpecs } from '@/lib/load-specs'; describe('runbook catalog', () => { it('merges hand-written specs with all doc-derived runbooks', () => { const all = loadAllRunbookSpecs(); - expect(all.length).toBeGreaterThanOrEqual(56); + expect(all.length).toBeGreaterThanOrEqual(58); const ids = new Set(all.map((s) => s.id)); expect(ids.has('health-self-check')).toBe(true); + expect(ids.has('check-chain138-rpc-health')).toBe(true); expect([...ids].some((id) => id.startsWith('doc-'))).toBe(true); for (const s of all) { expect(s.execution.steps.length).toBeGreaterThan(0);