Skip to content

Comments

docs: rewrite and restructure docs#3026

Open
tac0turtle wants to merge 10 commits intomainfrom
marko/docs_rewrite
Open

docs: rewrite and restructure docs#3026
tac0turtle wants to merge 10 commits intomainfrom
marko/docs_rewrite

Conversation

@tac0turtle
Copy link
Contributor

@tac0turtle tac0turtle commented Jan 28, 2026

Overview

This pr restructures the docs and writes new sections in order to be better suited for users

Summary by CodeRabbit

  • Documentation

    • Added comprehensive documentation covering system architecture, block lifecycle, and data availability concepts.
    • Added getting-started guides for EVM, Cosmos SDK, and custom executors.
    • Added operational guides for deployment, monitoring, troubleshooting, and upgrades.
    • Added node operation guides for aggregator, full, and attester nodes.
    • Added API reference documentation and configuration guides.
    • Added detailed technical specifications and interface documentation.
  • Chores

    • Updated build script to use npx markdownlint-cli.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 28, 2026

The latest Buf updates on your PR. Results from workflow CI / buf-check (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed⏩ skipped✅ passed✅ passedFeb 23, 2026, 9:06 PM

@claude
Copy link
Contributor

claude bot commented Jan 28, 2026

Claude finished @tac0turtle's task in 5m 2s —— View job


Documentation PR Review

Tasks:

  • Gather context and understand the PR
  • Review documentation structure and organization
  • Review technical accuracy of content
  • Review individual files for quality issues
  • Compile final review feedback

This is a substantial documentation effort — 63 new files covering concepts, guides, and reference specs. The structure is well thought out and the writing is generally clear. Below is a detailed review of issues found, grouped by severity.


Critical Issues

1. Wrong CLI flags in docs/guides/advanced/forced-inclusion.md:98

The recovery command uses incorrect flag prefixes:

# Current (WRONG):
./evnode start --node.aggregator --node.based_sequencer

# Correct (from pkg/config/config.go):
./evnode start --evnode.node.aggregator --evnode.node.based_sequencer

Confirmed against pkg/config/config.go where FlagAggregator = FlagPrefixEvnode + "node.aggregator" and FlagPrefixEvnode = "evnode.". Using the wrong flags here is particularly harmful as this is recovery documentation for a censorship scenario — users following this step-by-step will get an error at the critical moment.

Fix this →


Significant Issues

2. Near-complete duplication: docs/concepts/block-lifecycle.md vs docs/reference/specs/block-manager.md

Both files are ~744–759 lines and cover essentially the same material (Executor, Reaper, Submitter, Syncer, Cache Manager, retry strategy, metrics). The only difference is that block-manager.md adds a "Termination Condition" section. This creates an immediate maintenance split — any fix to one must be manually applied to the other. Decide on a single source of truth: either make block-lifecycle.md link to the spec, or consolidate into one document. This is the most important structural issue in the PR.

3. Backoff cap inconsistency in docs/concepts/block-lifecycle.md

  • Line 296: "Exponential backoff … capped at DABlockTime"
  • The mermaid diagram at line 323: node reads Cap at MaxBackoff - BlockTime

These use different terms. The spec (block-manager.md line 340) also says "capped at DABlockTime". The diagram label should be consistent with the prose — pick one and use it throughout.

4. Placeholder files included in the PR

Several files have only stub content with no actionable information for users. These should either be completed or removed before merging a "docs rewrite":

  • docs/guides/advanced/custom-precompiles.md — full placeholder
  • Portions of docs/guides/operations/upgrades.md — major upgrades section is incomplete
  • docs/guides/running-nodes/attester.md — deferred content (though it does appropriately note the feature is under development, which is acceptable)

5. Duplicate content between docs/getting-started/cosmos/ and docs/ev-abci/

As noted by @pthmas: docs/getting-started/cosmos/quickstart.md duplicates the integration guide at docs/ev-abci/integration-guide.md. Having two near-identical paths for the same content will diverge over time. Consider having getting-started/cosmos/ be a concise "entry point" that links to ev-abci/ for detailed steps, rather than repeating them.


Minor / Style Issues

6. Broken internal link in docs/reference/specs/overview.md:17

The file links to ./p2p.md but no p2p.md exists in docs/reference/specs/. This will 404.

7. Broken reference in docs/guides/operations/monitoring.md

Line 15 links to /learn/specs/block-manager.md#metrics which does not exist. The correct path based on this PR would be /reference/specs/block-manager (or /concepts/block-lifecycle for the metrics section).

8. Broken reference in docs/guides/running-nodes/full-node.md:7

Links to ./evm/single.md#setting-up-a-full-node which does not exist in this PR.

9. docs/overview/architecture.md:89 — Attester row lacks availability caveat

The node types table lists "Attester" as a current option, but docs/guides/running-nodes/attester.md itself states this is "under active development." The architecture table should note this (e.g., "(coming soon)") to avoid confusion.

10. Double space typo in docs/concepts/p2p-networking.md

"Every node" has two spaces. Fix this →

11. Gas price description in docs/concepts/block-lifecycle.md

The automatic gas price detection paragraph could mislead readers into thinking they must configure it manually. The Celestia guide correctly notes "By default, ev-node uses automatic gas price detection" — the block-lifecycle conceptual doc should align.


Positive Observations

  • The overall hierarchy (concepts → guides → reference/specs) is solid and follows established documentation patterns.
  • Mermaid diagrams are used well throughout block-lifecycle.md, block-manager.md, and forced-inclusion.md — they significantly aid comprehension.
  • docs/getting-started/choose-your-path.md is excellent — the comparison table and decision tree give developers what they need quickly.
  • docs/ev-abci/migration-from-cometbft.md is thorough and the 6-phase structure with explicit warnings is the right approach for a high-stakes operation.
  • The Celestia guide correctly uses --evnode.da.header_namespace and --evnode.da.data_namespace (the current flags), not the deprecated --evnode.da.namespace.
  • The migration-from-cometbft.md RunE implementation (line 190) correctly uses evabci_server.StartHandler(cmd, app.New) directly.

Summary

The two highest-priority items before merge are: (1) fix the wrong CLI flags in forced-inclusion.md (users will hit this error in a critical recovery scenario) and (2) resolve the block-lifecycle/block-manager duplication (most significant maintenance risk). The broken internal links (p2p.md, evm/single.md, monitoring metrics reference) should also be fixed since they'll 404 immediately on the live site.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @tac0turtle, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the project's documentation, providing a more organized and in-depth resource for developers and operators. It covers fundamental concepts, practical implementation steps for different execution environments, operational best practices, and detailed technical specifications, making it easier for users to understand, integrate, and manage Evolve-based chains.

Highlights

  • Comprehensive Documentation Restructuring: The documentation has been completely rewritten and reorganized into new conceptual guides, detailed integration and migration guides for both Cosmos SDK and EVM environments, operational guides, and comprehensive technical specifications. This aims to provide a more structured and user-friendly resource.
  • New Conceptual Guides: Introduced new conceptual documents covering core aspects like block lifecycle, data availability, fee systems, finality, P2P networking, sequencing modes (including forced inclusion and based sequencing), and transaction flow, enhancing understanding of Evolve's architecture.
  • Detailed Integration and Migration Paths: Added extensive guides for integrating ev-abci into Cosmos SDK applications, migrating existing CometBFT chains to Evolve, and setting up ev-reth for EVM rollups, including contract deployment and configuration. This provides clear pathways for developers to adopt Evolve.
  • Operational Guides and Tools: New guides for node operations such as deployment strategies, monitoring with Prometheus metrics, and using tools like the Blob Decoder and DA Visualizer have been added. Placeholders for troubleshooting and upgrade guides are also included, indicating future expansion.
  • Technical Specifications: Introduced a new section for technical specifications, detailing internal components like the block manager, block and header validity rules, the DA interface, full node architecture, header and data synchronization, and the storage system. This offers deep insights into Evolve's inner workings.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@codecov
Copy link

codecov bot commented Jan 28, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 60.90%. Comparing base (a5ef771) to head (6a3fe65).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3026      +/-   ##
==========================================
- Coverage   60.97%   60.90%   -0.08%     
==========================================
  Files         113      113              
  Lines       11617    11617              
==========================================
- Hits         7084     7075       -9     
- Misses       3734     3743       +9     
  Partials      799      799              
Flag Coverage Δ
combined 60.90% <ø> (-0.08%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant rewrite and restructuring of the documentation, adding a large volume of new content across concepts, guides, and reference sections. The effort to improve the documentation is commendable. However, there are several areas that need attention before this can be merged.

Firstly, there's a notable amount of content duplication, particularly between docs/concepts/block-lifecycle.md and docs/reference/specs/block-manager.md. This could lead to maintenance issues and should be resolved, perhaps by using includes or linking between documents.

Secondly, a large number of placeholder files have been added, containing only TODO comments. These should be either completed or removed.

Finally, there are various inconsistencies in technical details, formatting issues (like the use of :::: instead of ::: for VitePress admonitions), minor typos, and some broken links. Addressing these points will greatly improve the quality and usability of the new documentation.

- Updated Celestia guide to clarify prerequisites, installation, and configuration for connecting Evolve chains to Celestia.
- Enhanced Local DA documentation with installation instructions, configuration options, and use cases for development and testing.
- Expanded troubleshooting guide with detailed diagnostic commands, common issues, and solutions for node operations.
- Created comprehensive upgrades guide covering minor and major upgrades, version compatibility, and rollback procedures.
- Added aggregator node documentation detailing configuration, block production settings, and monitoring options.
- Introduced attester node overview with configuration and use cases for low-latency applications.
- Removed outdated light node documentation.
- Improved formatting and clarity in ev-reth chainspec reference for better readability.
@tac0turtle tac0turtle marked this pull request as ready for review January 28, 2026 12:48
Copy link
Contributor

@pthmas pthmas left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A lot of duplicate that we need to remove but overall looks good. I can't guarantee that the evm part is correct i don't have enough knowledge about it.

- The component architecture supports the separation of header and data structures in Evolve. This allows for expanding the sequencing scheme beyond single sequencing and enables the use of a decentralized sequencer mode. For detailed information on this architecture, see the [Header and Data Separation ADR](../../adr/adr-014-header-and-data-separation.md)
- Components process blocks with a minimal header format, which is designed to eliminate dependency on CometBFT's header format and can be used to produce an execution layer tailored header if needed. For details on this header structure, see the [Evolve Minimal Header](../../adr/adr-015-rollkit-minimal-header.md) specification

## Metrics
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the metric get a dedicated page?

- **Guarantee**: Data availability sampling (DAS)
- **Latency**: ~12 seconds to finality

### Custom DA
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we remove this?


We are now ready to run our full node. If we are running the full node on the same machine as the sequencer, we need to make sure we update the ports to avoid conflicts.

Make sure to include these flags with your start command:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

may we could also add that the config/ev-node file can be updated

| **Aggregator** | Yes | Yes | Yes | Block producer (sequencer) |
| **Full Node** | No | Yes | No | RPC provider, validator |
| **Light Node** | No | Headers only | No | Mobile, embedded clients |
| **Attester** | No | Yes | No | Soft consensus participant |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should specify that this is not yet available

@@ -0,0 +1,185 @@
# Architecture
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this feels also a bit like a duplicate of the docs/concepts folder

@@ -0,0 +1,95 @@
# Introduction
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imo the overview folder should be one page, for more information the reader should go to the concepts folder

@@ -0,0 +1,193 @@
# DA Interface
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's probably hard to maintain all the interfaces changes up to date and documented. Could we just point to the correct files in the repo?

@tac0turtle tac0turtle requested a review from pthmas February 9, 2026 18:15
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 23, 2026

📝 Walkthrough

Walkthrough

Comprehensive documentation expansion covering Evolve's architecture, core concepts, configuration, deployment, and API reference. Adds guides for EV-ABCI migration, EV-RETH setup, quickstarts for EVM and Cosmos chains, operational procedures, and detailed specification references. Includes minor makefile adjustment for markdown linting.

Changes

Cohort / File(s) Summary
Core Concepts
docs/concepts/block-lifecycle.md, docs/concepts/data-availability.md, docs/concepts/fee-systems.md, docs/concepts/finality.md, docs/concepts/p2p-networking.md, docs/concepts/sequencing.md, docs/concepts/transaction-flow.md
Documents fundamental concepts: block lifecycle architecture with component interactions, data availability layers and workflows, two-layer fee model, multi-stage finality, P2P client configuration and validators, sequencing models, and end-to-end transaction flow.
EV-ABCI Integration
docs/ev-abci/overview.md, docs/ev-abci/integration-guide.md, docs/ev-abci/migration-from-cometbft.md, docs/ev-abci/modules/migration-manager.md, docs/ev-abci/modules/staking-wrapper.md, docs/ev-abci/rpc-compatibility.md
EV-ABCI documentation including overview, step-by-step integration guide for replacing CometBFT, comprehensive migration procedures, migration manager and staking wrapper modules, and RPC compatibility details.
EV-RETH Setup & Features
docs/ev-reth/overview.md, docs/ev-reth/configuration.md, docs/ev-reth/engine-api.md, docs/ev-reth/features/base-fee-redirect.md, docs/ev-reth/features/contract-size-limits.md, docs/ev-reth/features/deploy-allowlist.md, docs/ev-reth/features/mint-precompile.md
EV-RETH documentation covering overview, chainspec configuration, Engine API integration, and feature guides (base fee redirection, contract size limits, deploy allowlist, mint precompile).
Getting Started Guides
docs/getting-started/choose-your-path.md, docs/getting-started/cosmos/quickstart.md, docs/getting-started/custom/implement-executor.md, docs/getting-started/custom/quickstart.md, docs/getting-started/evm/deploy-contracts.md, docs/getting-started/evm/quickstart.md, docs/getting-started/evm/setup-ev-reth.md
Quickstart and setup guides for choosing execution environments, launching Cosmos SDK chains, building custom executors, deploying EVM contracts, and running local EVM rollups.
Advanced Guides
docs/guides/advanced/based-sequencing.md, docs/guides/advanced/custom-precompiles.md, docs/guides/advanced/forced-inclusion.md, docs/guides/da-layers/celestia.md, docs/guides/da-layers/local-da.md
Advanced topics: based sequencing model, custom precompiles development, forced inclusion mechanics, and detailed DA layer integration guides for Celestia and Local DA.
Operations Guides
docs/guides/operations/deployment.md, docs/guides/operations/monitoring.md, docs/guides/operations/troubleshooting.md, docs/guides/operations/upgrades.md
Operational procedures: deployment options overview, Prometheus metrics configuration, comprehensive troubleshooting with diagnostics, and upgrade procedures across components.
Running Nodes Guides
docs/guides/running-nodes/aggregator.md, docs/guides/running-nodes/attester.md, docs/guides/running-nodes/full-node.md
Node operation guides covering aggregator (sequencer) setup with block production and DA submission, attester node configuration for soft finality, and full node initialization.
Tools Documentation
docs/guides/tools/blob-decoder.md, docs/guides/tools/visualizer.md
Documentation for development tools: Blob Decoder for DA layer inspection via web interface and API, and DA Visualizer for real-time submission monitoring.
Overview & Architecture
docs/overview/what-is-evolve.md, docs/overview/architecture.md, docs/overview/execution-environments.md
High-level documentation: Evolve introduction and value propositions, detailed system architecture with diagrams, and execution environment overview.
API References
docs/reference/api/abci-rpc.md, docs/reference/api/engine-api.md, docs/reference/api/rpc-endpoints.md
API documentation: ABCI RPC endpoints with examples, Engine API authentication and methods, and ev-node RPC endpoints reference.
Configuration References
docs/reference/configuration/ev-abci-flags.md, docs/reference/configuration/ev-node-config.md, docs/reference/configuration/ev-reth-chainspec.md
Comprehensive configuration documentation: ev-abci command-line flags and environment variables, complete ev-node configuration options, and ev-reth genesis/chainspec structure.
Interface References
docs/reference/interfaces/da.md, docs/reference/interfaces/executor.md, docs/reference/interfaces/sequencer.md
Interface documentation defining public contracts: Data Availability client/verifier interfaces and types, Executor interface with lifecycle methods, and Sequencer interface with batch operations.
Specification References
docs/reference/specs/overview.md, docs/reference/specs/block-manager.md, docs/reference/specs/block-validity.md, docs/reference/specs/da.md, docs/reference/specs/full-node.md, docs/reference/specs/header-sync.md, docs/reference/specs/store.md
Technical specifications: overview index, block manager architecture and workflows, block/header validity verification, DA submission/retrieval, full node behavior, header/data sync services, and store interface.
Build Tooling
scripts/utils.mk
Minor update to markdown linting command: replaced direct markdownlint invocation with npx markdownlint-cli wrapper in lint and lint-fix targets.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Docs bloom like carrots in the spring,
Architecture sketched with careful string,
From guides to specs, each piece in place,
The Evolve path, now clear to trace!
Hop along, explorer bold and bright, 🚀

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description acknowledges the restructuring and addition of new sections but lacks specific details about scope, rationale, or linked issues as suggested by the template. Expand the overview with the rationale for the restructuring, specific areas impacted, and any linked issues (e.g., Closes #3026) to provide fuller context.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'docs: rewrite and restructure docs' directly summarizes the main change—a comprehensive documentation rewrite and restructuring across multiple files and sections.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch marko/docs_rewrite

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

♻️ Duplicate comments (1)
docs/guides/advanced/based-sequencing.md (1)

17-23: Confirm “all full nodes independently construct identical batches” matches current implementation.

If the implementation still relies on a single sequencer (even in “based” mode), this statement needs adjustment to avoid overpromising decentralization. Please verify against current code/config docs.

#!/bin/bash
# Look for based sequencing/forced inclusion implementation notes
rg -n --type=go --type=md -C2 'based sequencing|forced inclusion|DAEpochForcedInclusion|sequencer'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/advanced/based-sequencing.md` around lines 17 - 23, The doc claim
"all full nodes independently construct identical batches" may be inaccurate if
the code/config still uses a single sequencer or centralized path; search the
codebase for symbols like DAEpochForcedInclusion, forced inclusion, based
sequencing, and sequencer to confirm whether batch construction is
decentralized, and if not, update the doc to reflect the actual implementation:
either state that full nodes independently construct batches (if code shows
per-node batch logic) or explicitly mention a single/sequencer-based flow (e.g.,
sequencer/DAEpochForcedInclusion responsible for batch assembly) and any config
flags that toggle modes so the guide matches behavior.
🟡 Minor comments (38)
docs/guides/tools/blob-decoder.md-156-158 (1)

156-158: ⚠️ Potential issue | 🟡 Minor

Celestia section is incomplete.

The ### Celestia subsection contains only a single sentence pointing to an external link, with no API example, no sample payload, and no decoded output — unlike every other example section. Either expand it with a concrete curl example and sample response (similar to the ### Decoding a Block Blob section), or fold the note into the ### Decoding DA Commitment example above it as a prose callout rather than leaving a stub subsection.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/tools/blob-decoder.md` around lines 156 - 158, The Celestia
subsection ("### Celestia") is incomplete — either expand it to match other
examples by adding a concrete API usage (e.g., a curl request against the
blob-decoding endpoint), a representative sample payload and the expected
decoded output, or remove the subsection and fold the note into the preceding
"### Decoding DA Commitment" as a prose callout; update the "### Celestia" block
(or the DA Commitment text) to include the sample request/response and a short
explanation of decoding namespace/payment fields so readers have a complete,
consistent example like the "Decoding a Block Blob" section.
docs/guides/tools/blob-decoder.md-59-76 (1)

59-76: ⚠️ Potential issue | 🟡 Minor

JSON code blocks contain invalid // comments.

JSON does not support inline comments. The // annotations in the request and response format blocks will cause parse errors if readers copy-paste them into tooling (e.g., curl, Postman, jq). Use a commented-out version via a non-JSON block, or strip the comments and rely on surrounding prose to explain each field.

📝 Proposed fix
 #### API Request Format

-```json
-{
-  "data": "string",      // The encoded blob data
-  "encoding": "string"   // Either "hex" or "base64"
-}
-```
+| Field      | Type   | Description                   |
+|------------|--------|-------------------------------|
+| `data`     | string | The encoded blob data         |
+| `encoding` | string | Either `"hex"` or `"base64"`  |

 #### API Response Format

-```json
-{
-  "success": true,
-  "decoded": {
-    // Decoded data structure
-  },
-  "error": "string"  // Only present if success is false
-}
-```
+| Field     | Type    | Description                              |
+|-----------|---------|------------------------------------------|
+| `success` | boolean | Whether decoding succeeded               |
+| `decoded` | object  | Decoded data structure                   |
+| `error`   | string  | Error message; only present on failure   |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/tools/blob-decoder.md` around lines 59 - 76, The JSON examples in
docs/guides/tools/blob-decoder.md include invalid `//` comments; locate the
request/response JSON blocks that reference the fields `data`, `encoding`,
`success`, `decoded`, and `error` and replace them so they are valid and
copy-paste-safe — either convert the examples to plain JSON with the comments
removed, or change the examples to a non-JSON fenced block (e.g., plain text) or
a Markdown table documenting each field (as in the proposed fix) so that the
descriptions for `data`, `encoding`, `success`, `decoded`, and `error` remain
present but not embedded as `//` comments.
scripts/utils.mk-18-18 (2)

18-18: ⚠️ Potential issue | 🟡 Minor

--ignore './changelog.md' is absent from lint but present in lint-fix.

lint (line 18) will report violations in changelog.md, but lint-fix (line 34) never auto-fixes it. Because not all rules include fix information when reporting issues, fixes may overlap, and not all issues are fixable — so if changelog.md carries unfixable violations, lint will fail indefinitely while lint-fix silently skips the file, making the CI failure unresolvable. Align both targets.

🔧 Proposed fix — add the same ignore to `lint`
-	`@npx` markdownlint-cli --config .markdownlint.yaml '**/*.md'
+	`@npx` markdownlint-cli --config .markdownlint.yaml --ignore './changelog.md' '**/*.md'

Also applies to: 34-34

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/utils.mk` at line 18, The `lint` target runs "npx markdownlint-cli"
without the ignore used by `lint-fix`, causing CI to fail on changelog.md;
update the `lint` target's command (the line invoking npx markdownlint-cli in
scripts/utils.mk) to include the same --ignore './changelog.md' flag so both
targets (`lint` and `lint-fix`) have identical ignore behavior and the changelog
is skipped consistently.

18-18: ⚠️ Potential issue | 🟡 Minor

--ignore './changelog.md' is absent from lint but present in lint-fix.

If changelog.md contains any markdownlint violations, lint will fail on it, but lint-fix will never auto-fix it — creating a CI failure that make lint-fix cannot resolve. Either add the same --ignore to the lint target, or remove it from lint-fix if changelog violations should be caught and fixed.

🔧 Proposed fix — align both targets
-	`@npx` markdownlint-cli --config .markdownlint.yaml '**/*.md'
+	`@npx` markdownlint-cli --config .markdownlint.yaml --ignore './changelog.md' '**/*.md'

Also applies to: 34-34

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/utils.mk` at line 18, The lint and lint-fix Makefile targets are
inconsistent: lint-fix passes --ignore './changelog.md' to npx markdownlint-cli
but lint does not, causing CI flakes; update the targets so they match by either
adding --ignore './changelog.md' to the lint target's npx markdownlint-cli
invocation or removing the --ignore from the lint-fix target (choose the
behavior you want), ensuring both the lint and lint-fix invocations of
markdownlint-cli use the same flags so changelog.md is treated consistently.
docs/guides/operations/monitoring.md-40-40 (1)

40-40: ⚠️ Potential issue | 🟡 Minor

Incorrect article: "a Evolve" → "an Evolve".

✏️ Proposed fix
-Here's a basic Prometheus configuration to scrape metrics from a Evolve node:
+Here's a basic Prometheus configuration to scrape metrics from an Evolve node:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/operations/monitoring.md` at line 40, Fix the grammar in the
sentence "Here's a basic Prometheus configuration to scrape metrics from a
Evolve node:" by changing "a Evolve" to "an Evolve" so it reads "Here's a basic
Prometheus configuration to scrape metrics from an Evolve node:"; update the
string in docs/guides/operations/monitoring.md where that sentence appears.
docs/concepts/finality.md-55-55 (1)

55-55: ⚠️ Potential issue | 🟡 Minor

Hyphenate "6-second" as a compound modifier.

✏️ Proposed fix
-DA finality depends on the DA layer. Celestia provides ~6 second finality.
+DA finality depends on the DA layer. Celestia provides ~6-second finality.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/concepts/finality.md` at line 55, Update the sentence "DA finality
depends on the DA layer. Celestia provides ~6 second finality." to hyphenate the
compound modifier by changing "6 second" to "6-second" (i.e., replace the
fragment "Celestia provides ~6 second finality." with "Celestia provides
~6-second finality.") so the phrase reads correctly as a compound adjective.
docs/ev-reth/overview.md-15-32 (1)

15-32: ⚠️ Potential issue | 🟡 Minor

Add a language specifier to the fenced code block.

The architecture diagram's fenced block is missing a language identifier, which triggers the MD040 lint warning.

🔧 Proposed fix
-```
+```text
 ┌─────────────────────────────────────────┐
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-reth/overview.md` around lines 15 - 32, The fenced ASCII diagram
block in overview.md is missing a language specifier causing MD040; update the
opening fence for the diagram (the triple backticks before the ASCII art) to
include a language tag such as "text" (i.e., change ``` to ```text) so the block
is explicitly marked and the linter warning is resolved.
docs/guides/running-nodes/attester.md-24-24 (1)

24-24: ⚠️ Potential issue | 🟡 Minor

Stale Celestia latency range; align with finality.md.

"~6-12 seconds" reflects the pre/post-Ginger range but the Ginger upgrade has been live on Celestia mainnet since December 2024, making ~6 seconds the current single-slot finality. finality.md already states ~6 seconds; this line should match.

✏️ Proposed fix
-Without attesters, finality depends on DA confirmation (~6-12 seconds for Celestia). With an attester network:
+Without attesters, finality depends on DA confirmation (~6 seconds for Celestia). With an attester network:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/running-nodes/attester.md` at line 24, Update the stale latency
range text in the attester doc: replace "Without attesters, finality depends on
DA confirmation (~6-12 seconds for Celestia)." with wording that matches
finality.md (use "~6 seconds" as current single-slot finality post-Ginger) and,
if helpful, add a brief parenthetical or link noting Ginger is live since Dec
2024 so the doc aligns with finality.md; ensure the sentence now reads something
like "Without attesters, finality depends on DA confirmation (~6 seconds for
Celestia)."
docs/getting-started/choose-your-path.md-94-110 (1)

94-110: ⚠️ Potential issue | 🟡 Minor

Add a language specifier to the decision tree code block.

The fenced code block for the decision tree is missing a language identifier, triggering the MD040 lint warning.

🔧 Proposed fix
-```
+```text
 Do you have an existing Cosmos SDK chain?
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/getting-started/choose-your-path.md` around lines 94 - 110, The fenced
decision-tree code block (the triple-backtick block containing "Do you have an
existing Cosmos SDK chain? ...") lacks a language specifier causing MD040;
update that block opener from ``` to ```text so the block becomes a plain-text
code fence (ensure you edit the exact triple-backtick that precedes the decision
tree and only add the "text" specifier).
docs/concepts/data-availability.md-29-29 (1)

29-29: ⚠️ Potential issue | 🟡 Minor

Celestia latency figure is outdated and conflicts with finality.md.

This line states "~12 seconds to finality" for Celestia, but finality.md correctly states ~6 seconds, and attester.md shows "~6-12 seconds." Celestia's Ginger upgrade (celestia-app v3) decreased block times from 12 seconds to 6 seconds, also improving transaction single-slot finality times. This Ginger upgrade deployed to mainnet in December 2024. All three files should consistently reflect the current ~6-second figure.

✏️ Proposed fix
-- **Latency**: ~12 seconds to finality
+- **Latency**: ~6 seconds to finality
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/concepts/data-availability.md` at line 29, The "Latency" figure in
docs/concepts/data-availability.md currently reads "~12 seconds to finality" and
must be updated to the post-Ginger value of "~6 seconds to finality" to match
finality.md and attester.md; locate the markdown line containing "**Latency**"
(the exact string "- **Latency**: ~12 seconds to finality") and replace the
numeric value to "~6 seconds to finality", then scan and update the same
phrasing in finality.md and attester.md so all three files consistently state
"~6 seconds" (and, if present, adjust any parenthetical ranges like "~6-12
seconds" to reflect "~6 seconds" or "~6-12 seconds" as appropriate per
attester.md guidance).
docs/overview/architecture.md-7-28 (1)

7-28: ⚠️ Potential issue | 🟡 Minor

Add language identifiers to fenced blocks (MD040).

markdownlint flags these fences without a language; adding text keeps formatting and passes lint.

✅ Suggested fix
-```
+```text
 ┌─────────────────────────────────────────────────────────────────┐
 ...
 └─────────────────────────────────────────────────────────────────┘

```diff
-```
+```text
                     ┌─────────────┐
 ...
                    └─────────────┘

```diff
-```
+```text
 User Tx → Execution Layer Mempool
 ...
 DA Layer (hard confirmation)

```diff
-```
+```text
 ┌────────────────────────────────────────┐
 ...
           Validate → Execute → Persist
</details>


Also applies to: 54-78, 116-136, 140-155

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/overview/architecture.md around lines 7 - 28, The fenced ASCII diagrams
in architecture.md (the blocks containing "ev-node", "Executor", "DA Layer
(Celestia)" and the other ASCII diagrams like "User Tx → Execution Layer
Mempool" and "Validate → Execute → Persist") lack a language identifier and
trigger MD040; change each opening triple-fence from totext for every
ASCII diagram block (including the ones corresponding to the "ev-node" diagram
and the other blocks you noted) so the diagrams keep formatting and markdownlint
passes.


</details>

</blockquote></details>
<details>
<summary>docs/guides/tools/visualizer.md-41-43 (1)</summary><blockquote>

`41-43`: _⚠️ Potential issue_ | _🟡 Minor_

**Add language identifier to fenced URL block (MD040).**  


<details>
<summary>✅ Suggested fix</summary>

```diff
-```
+```text
 http://localhost:7331/da
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/tools/visualizer.md` around lines 41 - 43, The fenced code block
containing the URL "http://localhost:7331/da" in docs/guides/tools/visualizer.md
lacks a language identifier; update that fenced block to include a language tag
(e.g., use the "text" info string) so the block becomes a fenced code block with
an explicit language identifier to satisfy MD040.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/configuration/ev-reth-chainspec.md-143-146 (1)</summary><blockquote>

`143-146`: _⚠️ Potential issue_ | _🟡 Minor_

**Use a valid hex address placeholder in the example.**

`"0xBridgeContract"` isn’t a valid hex address and may confuse readers copying the example. Consider replacing it with a proper `0x...` address placeholder.  


<details>
<summary>🔧 Suggested fix</summary>

```diff
       "mintPrecompile": {
-        "admin": "0xBridgeContract",
+        "admin": "0x1234567890123456789012345678901234567890",
         "address": "0x0000000000000000000000000000000000000100"
       }
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/configuration/ev-reth-chainspec.md` around lines 143 - 146,
The example in the mintPrecompile object uses an invalid placeholder admin value
("0xBridgeContract"); replace that string with a valid hex address placeholder
(for example "0x0000000000000000000000000000000000000001" or another 0x-prefixed
40-hex-character value) so readers won’t be confused when copying the example;
update the mintPrecompile.admin entry accordingly.
```

</details>

</blockquote></details>
<details>
<summary>docs/overview/execution-environments.md-5-5 (1)</summary><blockquote>

`5-5`: _⚠️ Potential issue_ | _🟡 Minor_

**Missing hyphen: "Reth-compatible"**

`Reth compatible applications` should be `Reth-compatible applications` (compound modifier before a noun).



<details>
<summary>✏️ Proposed fix</summary>

```diff
-This means you can use a variety of Cosmos SDK or Reth compatible applications as the execution environment for your chain: choose the execution environment that best fits your use case.
+This means you can use a variety of Cosmos SDK or Reth-compatible applications as the execution environment for your chain: choose the execution environment that best fits your use case.
```

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/overview/execution-environments.md` at line 5, Replace the phrase "Reth
compatible applications" with the hyphenated compound modifier "Reth-compatible
applications" in the sentence that reads "use a variety of Cosmos SDK or Reth
compatible applications as the execution environment for your chain" so the
compound adjective correctly modifies "applications."
```

</details>

</blockquote></details>
<details>
<summary>docs/overview/execution-environments.md-28-28 (1)</summary><blockquote>

`28-28`: _⚠️ Potential issue_ | _🟡 Minor_

**Celestia hardcoded as the only DA layer — contradicts the broader documentation**

The statement "uses Celestia as its data availability layer" presents Celestia as the sole option. The PR itself introduces docs for Local DA and the broader multi-DA architecture (`docs/guides/da-layers/local-da.md`, `docs/concepts/data-availability.md`). This framing will mislead users who want to run with a different DA backend.



<details>
<summary>✏️ Proposed fix</summary>

```diff
-- Evolve acts as the consensus and uses Celestia as its data availability layer.
+- Evolve acts as the consensus layer and delegates data availability to a pluggable DA layer (e.g., Celestia or Local DA).
```

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/overview/execution-environments.md` at line 28, The sentence in
docs/overview/execution-environments.md currently hardcodes Celestia as the DA
layer; change it to state that Evolve uses a pluggable/multi-DA data
availability layer and mention or link to the DA architecture docs (refer to
docs/concepts/data-availability.md and docs/guides/da-layers/local-da.md) so
readers know Celestia is one supported option rather than the only one (update
the sentence that currently reads "uses Celestia as its data availability layer"
to a neutral phrasing like "uses a pluggable data availability layer (e.g.,
Celestia; see ...)" or similar).
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/interfaces/da.md-149-152 (1)</summary><blockquote>

`149-152`: _⚠️ Potential issue_ | _🟡 Minor_

**Documentation syntax error — mixed named and unnamed return values**

The function signature has named returns `(height uint64, commitment []byte)` mixed with an unnamed return `(error)`, which is invalid Go syntax. The actual implementation at `pkg/da/types/types.go:78` uses all-unnamed returns.

<details>
<summary>🐛 Proposed fix</summary>

```diff
-func SplitID(id []byte) (height uint64, commitment []byte, error)
+func SplitID(id []byte) (uint64, []byte, error)
```

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/interfaces/da.md` around lines 149 - 152, The documented Go
signature for SplitID mixes named and unnamed returns which is invalid; update
the doc to match the actual implementation by changing the return tuple to
all-unnamed types (uint64, []byte, error) so the signature reads SplitID(id
[]byte) (uint64, []byte, error); reference the SplitID function to locate and
replace the incorrect signature in the docs.
```

</details>

</blockquote></details>
<details>
<summary>docs/ev-reth/engine-api.md-139-156 (1)</summary><blockquote>

`139-156`: _⚠️ Potential issue_ | _🟡 Minor_

**`engine_newPayloadV3` first param is incorrectly wrapped**

Per the official Engine API specification, `engine_newPayloadV3`'s first parameter is the `ExecutionPayloadV3` object directly — not nested inside a `{ "executionPayload": "..." }` wrapper. The wrapper is not part of the spec and would confuse developers implementing against this reference.

The first parameter should contain fields like `parentHash`, `feeRecipient`, `stateRoot`, `receiptsRoot`, `logsBloom`, `prevRandao`, `blockNumber`, `gasLimit`, `gasUsed`, `timestamp`, `extraData`, `baseFeePerGas`, `blockHash`, `transactions`, `withdrawals`, `blobGasUsed`, and `excessBlobGas` directly, not nested.

<details>
<summary>🐛 Proposed fix</summary>

```diff
 {
   "method": "engine_newPayloadV3",
   "params": [
-    { "executionPayload": "..." },
+    {
+      "parentHash": "0x...",
+      "feeRecipient": "0x...",
+      "stateRoot": "0x...",
+      "receiptsRoot": "0x...",
+      "logsBloom": "0x...",
+      "prevRandao": "0x...",
+      "blockNumber": "0x1",
+      "gasLimit": "0x...",
+      "gasUsed": "0x...",
+      "timestamp": "0x...",
+      "extraData": "0x",
+      "baseFeePerGas": "0x...",
+      "blockHash": "0x...",
+      "transactions": ["0x..."],
+      "withdrawals": [],
+      "blobGasUsed": "0x0",
+      "excessBlobGas": "0x0"
+    },
     ["0x...versionedHashes"],
     "0x...parentBeaconBlockRoot"
   ]
 }
```

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-reth/engine-api.md` around lines 139 - 156, The example for
engine_newPayloadV3 incorrectly wraps the ExecutionPayloadV3 inside {
"executionPayload": ... }; update the example so the first param is the
ExecutionPayloadV3 object itself (with fields like parentHash, feeRecipient,
stateRoot, receiptsRoot, logsBloom, prevRandao, blockNumber, gasLimit, gasUsed,
timestamp, extraData, baseFeePerGas, blockHash, transactions, withdrawals,
blobGasUsed, excessBlobGas), keep the second param as the versioned hashes array
and the third as the parentBeaconBlockRoot, and ensure the response example
remains unchanged (status and latestValidHash).
```

</details>

</blockquote></details>
<details>
<summary>docs/getting-started/cosmos/quickstart.md-65-68 (1)</summary><blockquote>

`65-68`: _⚠️ Potential issue_ | _🟡 Minor_

**Fenced code block lacks a language specifier (MD040).**

The log output block has no language hint, which triggers the `MD040` markdownlint warning. Add `text` or `console`:

<details>
<summary>✏️ Proposed fix</summary>

```diff
-```
+```text
 INF block marked as DA included blockHeight=1
 INF block marked as DA included blockHeight=2
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/getting-started/cosmos/quickstart.md around lines 65 - 68, The fenced
code block containing the two log lines "INF block marked as DA included
blockHeight=1" and "INF block marked as DA included blockHeight=2" is missing a
language specifier and triggers MD040; update that code fence to include a
language hint such as text or console (e.g., change the opening totext)
so the block is properly annotated.


</details>

</blockquote></details>
<details>
<summary>docs/reference/api/engine-api.md-13-17 (1)</summary><blockquote>

`13-17`: _⚠️ Potential issue_ | _🟡 Minor_

**"Generate JWT from shared secret" is misleading — the command generates the shared secret, not a JWT.**

`openssl rand -hex 32 > jwt.hex` produces the 32-byte shared secret file. The JWT token that goes in the `Authorization: Bearer` header is derived from this secret by the client at runtime.

<details>
<summary>✏️ Suggested fix</summary>

```diff
-Generate JWT from shared secret:
+Generate the shared secret file used for JWT authentication:

 ```bash
 openssl rand -hex 32 > jwt.hex
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/api/engine-api.md` around lines 13 - 17, The heading "Generate
JWT from shared secret" is misleading; update the text that precedes the code
block to say that the command generates a 32-byte shared secret (e.g., "Generate
shared secret" or "Generate 32-byte shared secret") and add a short clarifying
sentence that the JWT used in the Authorization: Bearer header is derived by the
client at runtime from that secret; change the label/reference to the openssl
command `openssl rand -hex 32 > jwt.hex` accordingly so the docs reflect that
the command creates the secret file, not the JWT.
```

</details>

</blockquote></details>
<details>
<summary>docs/ev-abci/modules/staking-wrapper.md-53-67 (1)</summary><blockquote>

`53-67`: _⚠️ Potential issue_ | _🟡 Minor_

**Missing `authtypes` and `govtypes` imports in the `app.go` snippet.**

`authtypes.NewModuleAddress(govtypes.ModuleName).String()` on line 65 references two packages that are absent from the import block. Developers copying this snippet will get a compile error.

<details>
<summary>🐛 Proposed fix</summary>

```diff
 import (
+    authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
+    govtypes  "github.com/cosmos/cosmos-sdk/x/gov/types"
     stakingkeeper "github.com/evstack/ev-abci/modules/staking/keeper"
     stakingtypes   "github.com/cosmos/cosmos-sdk/x/staking/types"
 )
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-abci/modules/staking-wrapper.md` around lines 53 - 67, The snippet
calling authtypes.NewModuleAddress(govtypes.ModuleName).String() is missing the
authtypes and govtypes imports; update the import block used with NewKeeper to
include authtypes and govtypes (e.g., the packages that expose NewModuleAddress
and ModuleName from the x/auth/types and x/gov/types modules) so the reference
in app.StakingKeeper = stakingkeeper.NewKeeper(...) compiles.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/api/rpc-endpoints.md-133-151 (1)</summary><blockquote>

`133-151`: _⚠️ Potential issue_ | _🟡 Minor_

**Type inconsistency in `/da_status` response: `pending_blocks` is an integer while heights are JSON strings.**

`da_height` and `last_submitted_height` are serialized as strings (e.g., `"5000"`), but `pending_blocks` is a bare integer (`1`). Consumers deserialising this response will need to handle mixed numeric types. If this reflects the actual wire format, add a note explaining the distinction; otherwise, make the types consistent.

<details>
<summary>💡 Proposed fix (if heights and counts should align)</summary>

```diff
   "result": {
     "da_height": "5000",
     "last_submitted_height": "999",
-    "pending_blocks": 1
+    "pending_blocks": "1"
   },
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/api/rpc-endpoints.md` around lines 133 - 151, The example
response for the POST /da_status endpoint is inconsistent: da_height and
last_submitted_height are JSON strings while pending_blocks is an integer;
update the example so types are consistent (e.g., change pending_blocks to a
string "1") and add a short note next to the /da_status docs clarifying the
chosen convention for da_height, last_submitted_height and pending_blocks (or,
if you prefer numeric counts, convert da_height and last_submitted_height to
numbers instead); target the response JSON example and the /da_status
documentation entry, referencing the fields da_height, last_submitted_height,
and pending_blocks.
```

</details>

</blockquote></details>
<details>
<summary>docs/guides/running-nodes/aggregator.md-98-105 (1)</summary><blockquote>

`98-105`: _⚠️ Potential issue_ | _🟡 Minor_

**Passphrase on the command line is a documentation anti-pattern.**

All three complete examples (`--evnode.signer.passphrase "secret"` / `"your-passphrase"`) expose the passphrase via shell history and process listings. Add a brief callout recommending the use of an environment variable or a prompt-based approach in production:

<details>
<summary>💡 Suggested note</summary>

```diff
+> **Note:** Avoid passing the passphrase on the command line in production. Use an environment variable
+> (e.g. `EVNODE_SIGNER_PASSPHRASE`) or a secrets manager instead, as command-line arguments are visible
+> in the process list and stored in shell history.
+
 # Using file-based signer
 evnode start \
   --evnode.node.aggregator \
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/running-nodes/aggregator.md` around lines 98 - 105, The examples
currently show using --evnode.signer.passphrase on the command line which leaks
secrets; update the aggregator.md examples to remove the inline passphrase and
add a short callout recommending using an environment variable (e.g.,
EVNODE_SIGNER_PASSPHRASE) or an interactive prompt/secret manager for
production, and include a one-sentence warning that command-line passphrases are
exposed via shell history and process listings; place this note adjacent to the
examples that reference --evnode.signer.passphrase so readers see the
recommendation when scanning the example block.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/specs/store.md-34-35 (1)</summary><blockquote>

`34-35`: _⚠️ Potential issue_ | _🟡 Minor_

**Grammar: “An Evolve full node”.**

Replace “A Evolve…” with “An Evolve…” for correct article usage.  
As per coding guidelines, user-facing text quality issues such as typographical/grammatical errors should be flagged.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/specs/store.md` around lines 34 - 35, Change the article in
the sentence that currently reads "A Evolve full node is [initialized]..." to
"An Evolve full node is [initialized]..." so the user-facing documentation uses
correct grammar; update the exact string "A Evolve full node is
[initialized][full_node_store_initialization] using `NewDefaultKVStore`..." to
the corrected "An Evolve full node..." in docs/reference/specs/store.md.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/specs/full-node.md-84-85 (1)</summary><blockquote>

`84-85`: _⚠️ Potential issue_ | _🟡 Minor_

**Hyphenate “Peer‑to‑Peer” consistently.**

The reference label uses “Peer to Peer” while the body uses “peer‑to‑peer.” Consider standardizing to “Peer‑to‑Peer.”  
As per coding guidelines, user-facing text quality issues such as typographical/grammatical errors should be flagged.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/specs/full-node.md` around lines 84 - 85, Update the reference
label text to use a consistent "Peer-to-Peer" hyphenation: change the link label
"[Peer to Peer Client]" to "[Peer-to-Peer Client]" so it matches the body usage
(and keep the reference target "[peer-to-peer client]" unchanged); ensure any
other occurrences of the label in this document follow the same "Peer-to-Peer"
capitalization and hyphenation.
```

</details>

</blockquote></details>
<details>
<summary>docs/getting-started/evm/deploy-contracts.md-86-93 (1)</summary><blockquote>

`86-93`: _⚠️ Potential issue_ | _🟡 Minor_

**Avoid `undefined` accounts when `PRIVATE_KEY` is unset.**

As written, `accounts: [process.env.PRIVATE_KEY]` will pass `[undefined]` if the env var isn’t set. Recommend documenting the required `0x`‑prefixed key or adding a guard in the snippet.

<details>
<summary>✍️ Suggested snippet</summary>

```diff
-      accounts: [process.env.PRIVATE_KEY],
+      accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/getting-started/evm/deploy-contracts.md` around lines 86 - 93, The
Hardhat config snippet currently sets networks.local.accounts to
[process.env.PRIVATE_KEY] which can yield [undefined] if PRIVATE_KEY is unset;
update the networks.local.accounts assignment in the exported config to guard
against undefined (e.g., only include the key when process.env.PRIVATE_KEY is
truthy or filter out falsy values) and document that PRIVATE_KEY must be a
0x‑prefixed private key; change references to networks.local.accounts and
process.env.PRIVATE_KEY accordingly and ensure the exported module still exports
solidity and networks as before.
```

</details>

</blockquote></details>
<details>
<summary>docs/guides/advanced/custom-precompiles.md-27-54 (1)</summary><blockquote>

`27-54`: _⚠️ Potential issue_ | _🟡 Minor_

**Use valid hex addresses in examples.**

`"0xBridgeContract"` and `0xRecipient` are not valid hex addresses and will break copy/paste for users. Replace with 20‑byte hex literals.

<details>
<summary>🛠️ Suggested fix</summary>

```diff
-        "admin": "0xBridgeContract",
+        "admin": "0x000000000000000000000000000000000000b0b0",
```

```diff
-    0xRecipient,
+    0x000000000000000000000000000000000000dEaD,
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/advanced/custom-precompiles.md` around lines 27 - 54, Replace the
placeholder non-hex identifiers with real 20-byte hex literals in both the JSON
precompile config ("mintPrecompile" -> "admin" and "address") and the Solidity
usage example that calls IMint.mint; specifically, change `"0xBridgeContract"`
and `0xRecipient` to valid 20-byte hex addresses (0x-prefixed 40-hex-character
values) so the JSON example and the IMint(0x000...0100).mint(...) call are
copy/paste-ready and use proper Ethereum address formats.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/specs/block-validity.md-53-114 (1)</summary><blockquote>

`53-114`: _⚠️ Potential issue_ | _🟡 Minor_

**Fix markdown/backtick typo and pseudocode casing.**

There are stray double backticks in “Verify()`` step” and inconsistent `If` capitalization in the pseudocode block.

<details>
<summary>✅ Suggested edits</summary>

```diff
-  If !sd.Signer.IsEmpty():
+  if !sd.Signer.IsEmpty():

- | Height              | Height of the previous accepted header, plus 1.                                            | checked in the `Verify()`` step          |
+ | Height              | Height of the previous accepted header, plus 1.                                            | checked in the `Verify()` step          |
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/specs/block-validity.md` around lines 53 - 114, Fix the
markdown and pseudocode casing: remove the stray double backticks so instances
like "checked in the `Verify()`` step" and "checked in the `ValidateBasic()``
step" read with a single code span (e.g., `Verify()` and `ValidateBasic()`), and
normalize pseudocode capitalization in the Verify pseudocode block by changing
`If` to `if` (e.g., lines inside SignedHeader.Verify / Header.Verify such as "If
untrustedHeader.Height != h.Height + 1" -> "if untrustedHeader.Height !=
h.Height + 1") to match the rest of the docs and the function names
SignedHeader.Verify and Header.Verify.
```

</details>

</blockquote></details>
<details>
<summary>docs/getting-started/evm/quickstart.md-20-22 (1)</summary><blockquote>

`20-22`: _⚠️ Potential issue_ | _🟡 Minor_

**Add a language to the log-output fence.**

Use `text` for the expected log snippet.

<details>
<summary>💡 Suggested fix</summary>

```diff
-```
+```text
 INF Listening on host=localhost port=7980
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/getting-started/evm/quickstart.md around lines 20 - 22, Update the
fenced code block that currently contains the log line "INF Listening on
host=localhost port=7980" to include a language identifier (use "text") after
the opening backticks so the snippet is rendered as text; locate the markdown
fenced block containing that exact log output and change the opening fence from
totext.


</details>

</blockquote></details>
<details>
<summary>docs/reference/specs/block-manager.md-667-669 (1)</summary><blockquote>

`667-669`: _⚠️ Potential issue_ | _🟡 Minor_

**Hyphenate “execution-layer” for readability.**

Small grammar tweak improves clarity.

<details>
<summary>✍️ Suggested edit</summary>

```diff
-...produce an execution layer tailored header if needed.
+...produce an execution-layer tailored header if needed.
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/specs/block-manager.md` around lines 667 - 669, The phrase
"execution layer" in the listed bullets should be hyphenated as
"execution-layer" for readability; update the text occurrences in this section
(references such as the bullet text containing "execution layer tailored header"
and nearby mentions in the lines discussing "Evolve Minimal Header" and
"Executor supports custom signature payload providers for headers") to use
"execution-layer" consistently.
```

</details>

</blockquote></details>
<details>
<summary>docs/getting-started/evm/quickstart.md-62-65 (1)</summary><blockquote>

`62-65`: _⚠️ Potential issue_ | _🟡 Minor_

**Add a language to the block-output fence.**

Use `text` to satisfy markdownlint.

<details>
<summary>💡 Suggested fix</summary>

```diff
-```
+```text
 INF block marked as DA included blockHeight=1
 INF block marked as DA included blockHeight=2
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/getting-started/evm/quickstart.md around lines 62 - 65, Update the
Markdown fenced code block that contains the lines starting with "INF block
marked as DA included blockHeight=1" and "INF block marked as DA included
blockHeight=2" to specify a language for the fence (use "text") so the block
becomes text ... ; locate the triple-backtick fence in quickstart.md that
wraps those INF lines and add the language identifier immediately after the
opening backticks.


</details>

</blockquote></details>
<details>
<summary>docs/reference/specs/da.md-26-28 (1)</summary><blockquote>

`26-28`: _⚠️ Potential issue_ | _🟡 Minor_

**Use “etc.” with a period.**

Minor punctuation fix.

<details>
<summary>✍️ Suggested edit</summary>

```diff
-...setting low gas price, etc, could return error.
+...setting low gas price, etc., could return error.
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/specs/da.md` around lines 26 - 28, Update the second bullet
point text that mentions "[celestia-da-json-rpc][jsonrpc]" so that "etc" is
written with a trailing period: change "etc" to "etc." (so the phrase becomes
"... setting low gas price, etc., could return error.") to follow the reviewer
punctuation suggestion.
```

</details>

</blockquote></details>
<details>
<summary>docs/ev-abci/integration-guide.md-74-79 (1)</summary><blockquote>

`74-79`: _⚠️ Potential issue_ | _🟡 Minor_

**Add a language to the “Expected flags” fence.**

This block is currently an untyped fence; markdownlint flags it. Use `text` to keep it explicit.

<details>
<summary>💡 Suggested fix</summary>

```diff
-```
+```text
 --evnode.node.aggregator     Run as block producer
 --evnode.da.address          DA layer address
 --evnode.signer.passphrase   Signer passphrase
 --evnode.node.block_time     Block production interval
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/ev-abci/integration-guide.md around lines 74 - 79, The fenced block
showing the expected flags is missing a language identifier; update the markdown
fence to use text so it becomes a typed code block (e.g., replace the opening with ```text) for the block containing the lines like
--evnode.node.aggregator, --evnode.da.address, --evnode.signer.passphrase, and
--evnode.node.block_time to satisfy markdownlint.


</details>

</blockquote></details>
<details>
<summary>docs/ev-abci/migration-from-cometbft.md-241-244 (1)</summary><blockquote>

`241-244`: _⚠️ Potential issue_ | _🟡 Minor_

**Rephrase the “due to pruning” sentence for clarity.**

This paragraph is a key instruction; a small wording tweak reads better.

<details>
<summary>✍️ Suggested edit</summary>

```diff
-If blocks are missing (e.g., due to pruning), they will be skipped.
+If blocks are missing (for example, because of pruning), they will be skipped.
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-abci/migration-from-cometbft.md` around lines 241 - 244, Reword the
second bullet for clarity: replace "If blocks are missing (e.g., due to
pruning), they will be skipped. Migration stops if more than the configured
maximum number of blocks are missing" with a single clearer sentence such as "If
blocks are missing—for example, because they were pruned—they will be skipped;
if the number of missing blocks exceeds the configured maximum, the migration
will stop," ensuring the meaning (skip missing blocks, abort when missing >
configured maximum) remains unchanged.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/configuration/ev-node-config.md-27-29 (1)</summary><blockquote>

`27-29`: _⚠️ Potential issue_ | _🟡 Minor_

**Fix the DA Header Namespace ToC entry (missing/duplicate anchor).**

The ToC links “DA Header Namespace” to `#da-namespace`, but there is no dedicated section for a header namespace and the anchor duplicates “DA Namespace.” Either add the section (with a distinct anchor) or remove the ToC entry.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/configuration/ev-node-config.md` around lines 27 - 29, The
Table of Contents entry "DA Header Namespace" currently links to the duplicate
anchor "#da-namespace"; fix by either removing the "DA Header Namespace" ToC
line or adding a dedicated header section titled "DA Header Namespace" with a
unique anchor (for example "#da-header-namespace") and ensure the ToC link
points to that new anchor; update any heading text to match the ToC entry (e.g.,
add a heading "DA Header Namespace" and its content) so the anchor is unique and
not duplicated with "DA Namespace".
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/configuration/ev-node-config.md-733-800 (1)</summary><blockquote>

`733-800`: _⚠️ Potential issue_ | _🟡 Minor_

**Fix relative paths to guides documentation.**

The relative paths `../guides/da/visualizer.md` and `../guides/metrics.md` are incorrect. From `docs/reference/configuration/ev-node-config.md`, these resolve to a non-existent `docs/reference/guides/` directory. The correct paths should be `../../guides/da/visualizer.md` and `../../guides/metrics.md` to properly reference the files at `docs/guides/da/visualizer.md` and `docs/guides/metrics.md`.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/configuration/ev-node-config.md` around lines 733 - 800,
Update the broken relative links in ev-node-config.md by replacing the link
target "../guides/da/visualizer.md" with "../../guides/da/visualizer.md" and
"../guides/metrics.md" with "../../guides/metrics.md" so the references from
docs/reference/configuration/ev-node-config.md correctly resolve to
docs/guides/da/visualizer.md and docs/guides/metrics.md; ensure both markdown
links (the DA Visualizer Guide link and the "See [Metrics]" link) are updated
accordingly.
```

</details>

</blockquote></details>
<details>
<summary>docs/concepts/block-lifecycle.md-652-654 (1)</summary><blockquote>

`652-654`: _⚠️ Potential issue_ | _🟡 Minor_

**Change `P2PConfig.Seeds` to `P2PConfig.Peers` in the documentation.**

The P2PConfig struct in `pkg/config/config.go` defines the field as `Peers`, not `Seeds`. This should be updated to match the actual configuration parameter name:
- Current (incorrect): `P2PConfig.Seeds`
- Correct: `P2PConfig.Peers`

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/concepts/block-lifecycle.md` around lines 652 - 654, Update the
documentation to reference the actual config field name: replace the incorrect
P2PConfig.Seeds with P2PConfig.Peers in the text describing block sync over P2P;
ensure any other mentions of P2PConfig.Seeds in this document are changed to
P2PConfig.Peers so the docs match the struct defined in pkg/config/config.go.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/configuration/ev-node-config.md-101-105 (1)</summary><blockquote>

`101-105`: _⚠️ Potential issue_ | _🟡 Minor_

**Clarify the config file name (evnode.yml vs config.yaml).**

This section references both `evnode.yml` and `config.yaml` as the YAML config. Please standardize on the actual filename used by ev-node to avoid confusion.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/configuration/ev-node-config.md` around lines 101 - 105, The
doc references two different YAML filenames (`evnode.yml` and `config.yaml`)
causing confusion; pick the canonical filename used by ev-node (e.g.,
`evnode.yml`) and update the paragraph to consistently use that name in both the
path examples and the explanatory list, replacing any `config.yaml` occurrences
with the chosen filename (`evnode.yml`) so the configuration precedence text and
file path examples match exactly.
```

</details>

</blockquote></details>
<details>
<summary>docs/reference/configuration/ev-node-config.md-407-410 (1)</summary><blockquote>

`407-410`: _⚠️ Potential issue_ | _🟡 Minor_

**Fix the example flag prefix in the signing_addresses documentation.**

The flag name on line 408 is correct (`--evnode.da.signing_addresses`), but the example on line 409 incorrectly uses the `--rollkit.*` prefix. Update the example to use `--evnode.da.signing_addresses` to match the actual flag name defined in the code.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/configuration/ev-node-config.md` around lines 407 - 410,
Update the documentation example to use the correct flag prefix for the signing
addresses: replace the incorrect `--rollkit.da.signing_addresses` example with
`--evnode.da.signing_addresses` so it matches the actual flag name
`--evnode.da.signing_addresses` and the documented `signing_addresses` setting.
```

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (10)</summary><blockquote>

<details>
<summary>scripts/utils.mk (2)</summary><blockquote>

`18-18`: **Pin the `markdownlint-cli` version in both invocations to ensure reproducible linting.**

`npx markdownlint-cli` without a version tag resolves to whatever npm finds at runtime. Since there is no `package.json` at the repository root to manage dependencies locally, inline version pinning is the appropriate solution here. Pin to `0.47.0` or your chosen stable version:

```diff
-	`@npx` markdownlint-cli --config .markdownlint.yaml '**/*.md'
+	`@npx` markdownlint-cli@0.47.0 --config .markdownlint.yaml '**/*.md'
```

```diff
-	`@npx` markdownlint-cli --config .markdownlint.yaml --ignore './changelog.md' '**/*.md' -f
+	`@npx` markdownlint-cli@0.47.0 --config .markdownlint.yaml --ignore './changelog.md' '**/*.md' -f
```

Also applies to: 34-34

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@scripts/utils.mk` at line 18, Pin the markdownlint-cli invocation by
replacing plain "npx markdownlint-cli" with a versioned invocation like "npx
markdownlint-cli@0.47.0" in both places where it appears (the rule that runs
"npx markdownlint-cli '**/*.md'"); ensure each occurrence uses the same pinned
version to guarantee reproducible linting.
```

</details>

---

`18-18`: **Update `markdownlint-cli` version pin to 0.47.0 or add as a pinned dev dependency.**

`npx markdownlint-cli` without a version tag resolves to whatever version npm finds at runtime, producing non-deterministic results across environments. The current repository does not pin this in `package.json`, so version pinning at the command level is necessary.

<details>
<summary>🔧 Proposed fix — pin the version</summary>

```diff
-	`@npx` markdownlint-cli --config .markdownlint.yaml '**/*.md'
+	`@npx` markdownlint-cli@0.47.0 --config .markdownlint.yaml '**/*.md'
```
```diff
-	`@npx` markdownlint-cli --config .markdownlint.yaml --ignore './changelog.md' '**/*.md' -f
+	`@npx` markdownlint-cli@0.47.0 --config .markdownlint.yaml --ignore './changelog.md' '**/*.md' -f
```
</details>

Alternatively, add `markdownlint-cli` as a pinned dev dependency in `package.json`.

Also applies to: 34-34

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@scripts/utils.mk` at line 18, The markdown lint invocation uses an unpinned
npx call ("npx markdownlint-cli ...") which causes non-deterministic versions;
update the command to pin the CLI to 0.47.0 (e.g., use "npx
markdownlint-cli@0.47.0") or instead add "markdownlint-cli": "0.47.0" to
package.json devDependencies and update scripts to call "npx markdownlint-cli"
reliably; modify the line invoking npx markdownlint-cli to use the pinned
version or add the devDependency and ensure CI/locals use that pinned version.
```

</details>

</blockquote></details>
<details>
<summary>docs/guides/operations/upgrades.md (1)</summary><blockquote>

`51-61`: **Consider pinning versions instead of `latest` for reproducible upgrades.**  


Using `@latest`/`:latest` can make upgrades non-deterministic. Consider aligning with the versioned examples already shown (e.g., `v1.2.3`).

<details>
<summary>🔧 Suggested tweak</summary>

```diff
-# Using Go:
-go install github.com/evstack/ev-node@latest
+# Using Go:
+go install github.com/evstack/ev-node@v1.2.3
```

```diff
-# Using Docker:
-docker pull evstack/evnode:latest
+# Using Docker:
+docker pull evstack/evnode:v1.2.3
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/operations/upgrades.md` around lines 51 - 61, Replace the
non-deterministic `@latest` and `:latest` examples with pinned release tags so
upgrades are reproducible: update the Go example `go install
github.com/evstack/ev-node@latest` to use a versioned tag like `go install
github.com/evstack/ev-node@vX.Y.Z` and update the Docker example `docker pull
evstack/evnode:latest` to `docker pull evstack/evnode:vX.Y.Z`; optionally show a
placeholder variable (e.g., `RELEASE=v1.2.3`) and examples using that to
encourage consistent pinning.
```

</details>

</blockquote></details>
<details>
<summary>docs/overview/what-is-evolve.md (1)</summary><blockquote>

`7-16`: **Tighten phrasing and hyphenation for readability.**

Minor style tweaks will improve flow and consistency (e.g., avoid repeated “No …” openers, use “open-source”).  


<details>
<summary>✍️ Suggested edits</summary>

```diff
-This isn't a toolkit. It's a launch stack.
-
-No fees. No middlemen. No revenue share.
+This isn't a toolkit. It's a launch stack.
+No fees, no middlemen, no revenue share.
@@
-- **Customizability:** Evolve is built as an open source modular framework, to make it easier for developers to reuse the four main components and customize their chains.
+- **Customizability:** Evolve is built as an open-source modular framework, to make it easier for developers to reuse the four main components and customize their chains.
```
</details>


Also applies to: 63-64

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@docs/overview/what-is-evolve.md` around lines 7 - 16, Tighten phrasing and
hyphenation under the "## What is Evolve" section: replace the repeated short
sentences "No fees. No middlemen. No revenue share." with a single, smoother
negative phrase (e.g., "No fees, middlemen, or revenue share."), use
"open-source" (hyphenated) instead of "open source"/"open-source" inconsistency,
and prefer explicit subject phrasing (replace "It's open-source,
production-ready, and fully composable." with "Evolve is open-source,
production-ready, and fully composable.") to improve flow; apply the same
hyphenation and phrasing consistency to the similar occurrence referenced
(63-64).
```

</details>

</blockquote></details>
<details>
<summary>docs/ev-reth/engine-api.md (1)</summary><blockquote>

`25-25`: **Add language specifier to the flow diagram code fence (MD040)**



<details>
<summary>✏️ Proposed fix</summary>

```diff
-```
+```text
 ev-node                                    ev-reth
```

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/ev-reth/engine-api.md at line 25, The code fence containing the flow
diagram currently uses a plain fence; update it to include a language specifier (e.g., change to text) so the block becomes text with the
diagram lines (ev-node ev-reth) inside; this
satisfies MD040 and ensures the diagram is treated as plain text by markdown
renderers.


</details>

</blockquote></details>
<details>
<summary>docs/concepts/fee-systems.md (1)</summary><blockquote>

`11-13`: **Add language specifiers to unlabeled fenced code blocks (MD040)**

Three code fences lack a language token. Use `text` for the formula and ASCII diagram blocks to satisfy the markdownlint rule and be consistent with the rest of the file.



<details>
<summary>✏️ Proposed fix</summary>

```diff
-```
+```text
 Transaction Fee = (Base Fee + Priority Fee) × Gas Used
 ```
```

```diff
-```
+```text
 Transaction Fee = Gas Price × Gas Used
 ```
```

```diff
-```
+```text
 User Transaction
 ...
 ```
```

</details>


Also applies to: 41-43, 110-131

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/concepts/fee-systems.md around lines 11 - 13, Add the missing language
specifier text to the unlabeled fenced code blocks that contain the formula
"Transaction Fee = (Base Fee + Priority Fee) × Gas Used", the formula
"Transaction Fee = Gas Price × Gas Used", and the ASCII diagram starting with
"User Transaction ..."; update those triple-backtick fences to begin with

to the other unlabeled fences referenced in the review).
docs/ev-abci/rpc-compatibility.md (1)

87-102: { ... } placeholder makes the commit example invalid JSON.

Using { ... } as a stand-in is a common pattern, but JSON parsers (and doc linters that validate code blocks) will reject it. Use an empty object or a commented-out placeholder instead:

✏️ Suggested fix
   "signed_header": {
-    "header": { ... },
+    "header": {},
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-abci/rpc-compatibility.md` around lines 87 - 102, The JSON example
under "signed_header" uses an invalid "{ ... }" placeholder for the "header"
field; replace that placeholder with a valid empty object or a JSON-safe
placeholder (e.g., "{}" or a clear commented note outside the code block) so the
"signed_header" -> "header" object becomes valid JSON and doc linters/parsers
will accept the example; ensure the structure still shows "signed_header",
"header", and "commit" with their fields intact.
docs/getting-started/custom/implement-executor.md (1)

204-217: Test example references undefined variables ctx, genesis, and txs.

Readers who try to run this directly will see compile errors. A brief setup showing how to obtain these values would make the example self-contained.

✏️ Suggested addition
 func TestExecuteTxs(t *testing.T) {
     exec := NewMyExecutor()
+    ctx := context.Background()
+    genesis := Genesis{AppState: []byte(`{"balances":{}}`)}
+    txs := [][]byte{}

     // Initialize
     _, err := exec.InitChain(ctx, genesis)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/getting-started/custom/implement-executor.md` around lines 204 - 217,
The test snippet references undefined variables (ctx, genesis, txs) causing
compile errors; update TestExecuteTxs so it is self-contained by showing minimal
setup: create a context (e.g., context.Background()) and assign it to ctx,
construct a small example genesis state and pass it to exec.InitChain (or call
the package helper that builds genesis) for the genesis variable, and prepare a
sample tx slice (e.g., one or two simple transactions or an appropriately typed
empty slice) to use as txs before calling exec.ExecuteTxs; keep the existing
calls to NewMyExecutor, exec.InitChain, and exec.ExecuteTxs unchanged, only
adding the setup lines to define ctx, genesis, and txs.
docs/reference/api/rpc-endpoints.md (1)

60-105: Inconsistent response examples for /header, /block_by_hash, and /tx.

These three endpoints document only the request, while /block documents both request and response. Similarly, /status and /da_status document only the response. For a consistent reference, each endpoint should include both a request and a response example.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/api/rpc-endpoints.md` around lines 60 - 105, The documentation
is inconsistent: the endpoints "header", "block_by_hash", and "tx" only show
request examples while "block" shows both request and response (and
"status"/"da_status" show only response). Add a matching response example for
each of the "header", "block_by_hash", and "tx" endpoints following the same
JSON-RPC response structure used by "block" (include "jsonrpc", "id", and a
representative "result" object with realistic fields), and ensure "status" and
"da_status" also include corresponding request examples or explicitly mirror the
chosen convention so all endpoints consistently show both request and response
examples.
docs/ev-abci/modules/staking-wrapper.md (1)

31-35: Repeated "normally" in three consecutive bullets degrades readability.

The static analysis flag is valid here.

✏️ Suggested rewrite
-Before migration is triggered, the wrapper behaves identically to the standard staking module:
+Before migration is triggered, the wrapper behaves identically to the standard staking module.
+All standard operations continue without change:

-- Delegations work normally
-- Validator operations work normally
-- Rewards distribution works normally
+- Delegations and undelegations
+- Validator creation and modification
+- Rewards distribution
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/ev-abci/modules/staking-wrapper.md` around lines 31 - 35, The three
bullet points under the pre-migration behavior repeat the word "normally,"
hurting readability; update the list in staking-wrapper.md so each bullet uses
distinct phrasing (e.g., "Delegations operate as usual", "Validator operations
remain unchanged", "Rewards are distributed as expected") or consolidate into a
single sentence like "Before migration is triggered, the wrapper behaves
identically to the standard staking module: delegations, validator operations,
and rewards distribution continue as before." Reference the bullets in the
pre-migration behavior section to apply the wording change.

Comment on lines +90 to +115
### Recovery from Malicious Sequencer

When a malicious sequencer is detected (censoring forced inclusion transactions):

**All nodes must restart the chain in based sequencing mode:**

```bash
# Restart with based sequencing enabled
./evnode start --node.aggregator --node.based_sequencer
```

**In based sequencing mode:**

- No single sequencer controls transaction ordering
- Every full node derives blocks independently from the DA layer
- Forced inclusion becomes the primary (and only) transaction submission method
- Censorship becomes impossible as ordering comes from the DA layer

**Important considerations:**

- All full nodes should coordinate the switch to based mode
- The chain continues from the last valid state
- Users submit transactions directly to the DA layer going forward
- This is a one-way transition - moving back to single sequencer requires social consensus

See [Based Sequencing documentation](./based.md) for details on operating in this mode.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Clarify the “must restart in based sequencing mode” requirement.

This reads as a hard requirement, but recovery from censorship likely depends on governance/coordination and may allow alternative mitigations. Please soften this language (e.g., “may require coordinated restart”) and describe prerequisites or conditions.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/advanced/forced-inclusion.md` around lines 90 - 115, Update the
"Recovery from Malicious Sequencer" section to soften the hard requirement:
change wording from "All nodes must restart the chain in based sequencing mode"
to language like "Nodes may require a coordinated restart into based sequencing
mode" and add brief prerequisites/conditions such as the need for governance or
operator coordination, a consensus decision or emergency governance action,
verification of the last valid state before restart, and an
announcement/rollback plan; keep the example CLI (./evnode start
--node.aggregator --node.based_sequencer) but label it as one possible
coordinated action rather than the only remedy, and link to the Based Sequencing
docs for operational steps and governance considerations.

Comment on lines +20 to +29
```bash
# Install celestia-node
curl -sL https://docs.celestia.org/install.sh | bash

# Initialize (choose your network)
celestia light init --p2p.network mocha

# Start the node
celestia light start --p2p.network mocha
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add a safety warning for curl | bash install.

The quick-start pipes a remote script directly into shell, which is a common supply-chain risk. Please add a short warning and recommend verifying the script/checksums before executing.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/da-layers/celestia.md` around lines 20 - 29, Add a safety warning
before the "curl -sL https://docs.celestia.org/install.sh | bash" install step
explaining the supply-chain risk of piping remote scripts to shell, instruct
users to review the script and verify checksums/signatures (or fetch and inspect
the script manually) before running, and provide a short alternative command
sequence (download, verify, then execute) as a safer option so readers know how
to validate the installer instead of running it directly.

Comment on lines +144 to +148
Key metrics to watch:

- `evolve_block_height` - Current block height
- `evolve_da_submission_total` - DA submissions count
- `evolve_da_submission_failures` - Failed DA submissions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for the documented metric names and Prometheus registration patterns
rg -n "evolve_block_height|evolve_da_submission_total|evolve_da_submission_failures|prometheus\.MustRegister|promauto\.NewCounter|promauto\.NewGauge" --type=go -A2

Repository: evstack/ev-node

Length of output: 41


🏁 Script executed:

#!/bin/bash
# Explore repository structure
git ls-files | head -30
echo "---"
# Look for metrics-related files
find . -type f -name "*metric*" -o -name "*prometheus*" 2>/dev/null | head -20
echo "---"
# Check file types present
file $(git ls-files | head -10)

Repository: evstack/ev-node

Length of output: 1286


🏁 Script executed:

#!/bin/bash
# Search for aggregator-related files
find . -type f -name "*aggregator*" 2>/dev/null | head -20
echo "---"
# Search for the specific metric names in all Go files
rg "evolve_block_height|evolve_da_submission_total|evolve_da_submission_failures" --type=go

Repository: evstack/ev-node

Length of output: 161


🏁 Script executed:

#!/bin/bash
# Examine the metrics.go files
echo "=== block/internal/common/metrics.go ==="
cat -n ./block/internal/common/metrics.go | head -100
echo ""
echo "=== pkg/p2p/metrics.go ==="
cat -n ./pkg/p2p/metrics.go | head -100

Repository: evstack/ev-node

Length of output: 9572


🏁 Script executed:

#!/bin/bash
# Search for "evolve" anywhere in the codebase
rg "evolve" --type=go --type=md 2>/dev/null | head -20
echo "---"
# Get the complete metrics.go file to see all DA metrics
cat ./block/internal/common/metrics.go | grep -n "DA\|Gauge\|Counter" | head -40

Repository: evstack/ev-node

Length of output: 4731


🏁 Script executed:

#!/bin/bash
# Get the rest of metrics.go to see metric registrations
tail -n +100 ./block/internal/common/metrics.go | head -200

Repository: evstack/ev-node

Length of output: 6504


Fix incorrect Prometheus metric names in documentation.

The documented metric names do not match the actual registered names in the codebase:

  • evolve_block_height → Should be <namespace>_sequencer_latest_block_height
  • evolve_da_submission_total → No such metric exists (did you mean da_submitter_pending_blobs for pending count?)
  • evolve_da_submission_failures → Should be <namespace>_sequencer_da_submitter_failures_total

The "evolve" prefix is incorrect; metrics use the "sequencer" subsystem. Review the intended metrics and provide accurate names that match the implementation in block/internal/common/metrics.go.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/guides/running-nodes/aggregator.md` around lines 144 - 148, The docs
list incorrect Prometheus metric names; update
docs/guides/running-nodes/aggregator.md to use the actual metric names defined
in block/internal/common/metrics.go: replace the incorrect "evolve_block_height"
with "<namespace>_sequencer_latest_block_height", change
"evolve_da_submission_total" to the intended pending metric
"da_submitter_pending_blobs" (if you meant pending count), and replace
"evolve_da_submission_failures" with
"<namespace>_sequencer_da_submitter_failures_total"; ensure the docs use the
"sequencer" subsystem prefix consistent with the metrics.go definitions.

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.

3 participants