Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: Replace runsim with Go stdlib testing #20490

Merged
merged 25 commits into from
Jun 17, 2024
Merged

perf: Replace runsim with Go stdlib testing #20490

merged 25 commits into from
Jun 17, 2024

Conversation

alpe
Copy link
Contributor

@alpe alpe commented May 30, 2024

Description

Part of #14753

Refactor simulations towards Go standard tests. With this change, we give up strong process isolation as runsim was doing in favour of much better execution speed, toolchain integration and IDE support.

  • Runsim devtool removed
  • Add simulation runner to support the process of setup and executing sims
  • Simpler DeriveRand
  • CLI params cleanup
  • Support for Go fuzzer: make test-sim-fuzz

Big thanks to @ggrieco-tob who provided an early spike with a fuzzer integration example. 💪


Author Checklist

All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.

I have...

  • included the correct type prefix in the PR title, you can find examples of the prefixes below:
  • confirmed ! in the type prefix if API or client breaking change
  • targeted the correct branch (see PR Targeting)
  • provided a link to the relevant issue or specification
  • reviewed "Files changed" and left comments if necessary
  • included the necessary unit and integration tests
  • added a changelog entry to CHANGELOG.md
  • updated the relevant documentation or specification, including comments for documenting Go code
  • confirmed all CI checks have passed

Reviewers Checklist

All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.

Please see Pull Request Reviewer section in the contributing guide for more information on how to review a pull request.

I have...

  • confirmed the correct type prefix in the PR title
  • confirmed all author checklist items have been addressed
  • reviewed state machine logic, API design and naming, documentation is accurate, tests and test coverage

Summary by CodeRabbit

  • New Features

    • Added new deterministic, non-deterministic streaming, and fuzz test jobs to the CI workflow.
  • Refactor

    • Updated simulation tests and functions to include new shared state management for proposal and group IDs.
    • Enhanced logging and error handling within the simulation process.
  • Chores

    • Improved CI workflow with specific runner usage and updated job triggers.
    • Performance enhancements in simulation tests by replacing runsim with Go stdlib testing.
  • Breaking Changes

    • CLI updates: runsim command replaced with Go stdlib testing; removed parameters: Commit, Lean, SimulateEveryOperation, PrintAllInvariants, and DBBackend.

@alpe alpe requested a review from a team as a code owner May 30, 2024 13:24
@alpe alpe marked this pull request as draft May 30, 2024 13:25
Copy link
Contributor

coderabbitai bot commented May 30, 2024

Walkthrough

Walkthrough

This update optimizes the simulation and testing aspects of the cosmos-sdk by introducing CLI breaking changes, replacing the runsim command with Go stdlib testing, and enhancing simulation functionalities. It includes substantial refactoring across multiple files, the addition of new job configurations in CI workflows, and passing new parameters in various simulation functions to improve performance and determinism in the simulations.

Changes

File/Path Change Summary
.github/.../sims.yml Adjustments to workflow triggers, runner specifications, new test jobs, and removal of caching and Slack notification sections.
CHANGELOG.md Added summaries about the replacement of the runsim command with Go stdlib testing, and the removal of CLI parameters such as Commit, Lean, SimulateEveryOperation, etc.
simapp/sim_bench_test.go Updated benchmarks by importing new log dependencies and modifying parameters for simulation.SimulateFromSeed.
simapp/sim_test.go Refactored test functions, reordered and updated imports, and integrated new parameters for simulation functions.
tests/.../gov/operations_test.go Added simulation.NewSharedState() parameter to various simulation functions like SimulateMsgDeposit, SimulateMsgVote, and SimulateMsgVoteWeighted.
testutil/sims/runner.go Introduced new structures and functions for running and configuring simulation tests, including SimStateFactory, SimulationApp, and TestInstance.
x/gov/.../operations.go Introduced SharedState struct and refactored simulation operations to use this new shared state system for managing proposal IDs.
x/group/.../operations.go Added SharedState struct for group operations to handle shared states like group IDs, and refactored functions accordingly.
x/simulation/log.go Enhanced logging capabilities by adding fields like Seed and implementing mechanisms to prevent redundant log printing.
x/simulation/operation.go Added BlockTime field to OperationEntry and modified entry functions to include blockTime parameter.
x/simulation/simulate.go Major refactor and addition of log.Logger, new function SimulateFromSeedX, and reorganization of simulation process to improve random number generation and logging.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant CLI
    participant GoTesting
    participant SimApp
    participant Logger
    
    User->>CLI: Initiate Simulation
    CLI->>GoTesting: Invoke Go stdlib test
    GoTesting->>SimApp: Setup Simulation Environment
    SimApp->>Logger: Initialize Logger
    SimApp->>GoTesting: Configure Parameters
    GoTesting->>SimApp: Run Simulation
    SimApp->>Logger: Log Simulation Results
    SimApp->>GoTesting: Return Results
    GoTesting->>CLI: Display Results to User
Loading

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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: 1

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 90cbb02 and 53e82b1.

Files selected for processing (14)
  • .github/workflows/sims.yml (5 hunks)
  • Makefile (6 hunks)
  • baseapp/baseapp.go (1 hunks)
  • simapp/runner.go (1 hunks)
  • simapp/sim_bench_test.go (2 hunks)
  • simapp/sim_test.go (5 hunks)
  • testutil/sims/simulation_helpers.go (3 hunks)
  • testutil/sims/state_helpers.go (3 hunks)
  • types/simulation/config.go (2 hunks)
  • types/simulation/rand_util.go (1 hunks)
  • types/simulation/rand_util_test.go (2 hunks)
  • x/simulation/client/cli/flags.go (3 hunks)
  • x/simulation/params.go (2 hunks)
  • x/simulation/simulate.go (12 hunks)
Files skipped from review due to trivial changes (4)
  • baseapp/baseapp.go
  • types/simulation/rand_util.go
  • x/simulation/client/cli/flags.go
  • x/simulation/params.go
Additional context used
Path-based instructions (8)
types/simulation/config.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/sim_bench_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

types/simulation/rand_util_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

testutil/sims/simulation_helpers.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/runner.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

testutil/sims/state_helpers.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/sim_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/simulation/simulate.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

Additional comments not posted (18)
types/simulation/config.go (2)

27-28: The addition of FuzzSeed and T fields in the Config struct aligns with the PR's objective to support Go fuzzer. Ensure that these new fields are properly documented and utilized consistently across the simulation tests.


31-49: The Clone method implementation is straightforward and correctly duplicates the Config struct. This is useful for ensuring that each test can modify its own copy of the configuration without affecting others, which is crucial for parallel test execution.

simapp/sim_bench_test.go (2)

7-8: The addition of "cosmossdk.io/log" is appropriate for enhanced logging capabilities within simulation benchmarks. Ensure that the logger is used effectively throughout the benchmarks to provide meaningful debug information.


67-78: The modifications in the BenchmarkFullAppSimulation function reflect the updated simulation setup and execution logic. It's crucial to ensure that these changes are covered by comprehensive tests to validate the correctness of the simulations, especially with the new logging integration.

.github/workflows/sims.yml (2)

5-9: Adjusting the workflow triggers to include pushes to main and release/** branches, as well as all pull requests, is a strategic change that ensures more comprehensive testing. This should help catch issues earlier in the development cycle.


21-21: The update to use large-sdk-runner for all jobs is a significant change that likely aims to provide more resources for simulation tests, which can be resource-intensive. The addition of test-sim-deterministic and test-sim-fuzz jobs aligns with the PR's goals to enhance testing capabilities. Ensure that these new jobs are configured correctly and that their results are monitored to assess their impact on the overall CI pipeline's performance and reliability.

Also applies to: 32-32, 46-46, 58-70, 72-97

types/simulation/rand_util_test.go (1)

181-185: The test for DeriveRand function is crucial to ensure that the derived random number generator does not produce the same output as the original, which is essential for the integrity of simulations. The use of assert.NotEqual is appropriate here. Consider adding more detailed assertions to verify the statistical properties of the randomness.

testutil/sims/simulation_helpers.go (1)

54-61: The addition of txConfig to SimulationOperations function is a necessary update to accommodate the new transaction configuration requirements in simulations. This change should be reflected in all relevant simulation operations to ensure consistency.

simapp/runner.go (1)

54-144: The implementation of Run and RunWithSeeds functions in simapp/runner.go introduces a more structured and potentially more efficient way to handle simulation tests. These functions leverage generics to provide flexibility in handling different types of simulation apps. It's important to ensure that these functions are well-documented and that their usage is clear to other developers.

testutil/sims/state_helpers.go (3)

39-46: Change in function naming from AppStateFn to appStateFn correctly encapsulates the function within the package.


49-58: Change in function naming from AppStateFnWithExtendedCb to appStateFnWithExtendedCb correctly encapsulates the function within the package.


61-67: Change in function naming from AppStateFnWithExtendedCbs to appStateFnWithExtendedCbs correctly encapsulates the function within the package.

simapp/sim_test.go (3)

55-56: Centralizing simulation setup in setupStateFactory enhances maintainability and reusability of test setup code.


67-102: The structured approach in TestAppImportExport effectively tests the import and export functionality of the app state, ensuring robustness.


109-144: Testing the application behavior after state import in TestAppSimulationAfterImport ensures the app's stability and correctness post-import.

x/simulation/simulate.go (1)

Line range hint 64-266: Refactoring of SimulateFromSeed to include detailed logging and robust error handling significantly enhances the observability and maintainability of the simulation process.

Makefile (2)

351-356: Validate the new test-sim-fuzz target to ensure it functions as expected.


158-158: Ensure that the distclean target properly cleans up all new directories or files introduced by this PR.

Makefile Outdated Show resolved Hide resolved
types/simulation/rand_util.go Dismissed Show dismissed Hide dismissed
x/simulation/simulate.go Dismissed Show dismissed Hide dismissed
x/simulation/simulate.go Dismissed Show dismissed Hide dismissed
x/simulation/simulate.go Dismissed Show dismissed Hide dismissed
@alpe alpe marked this pull request as ready for review May 31, 2024 15:36
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: 2

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 53e82b1 and 7f992b3.

Files selected for processing (5)
  • .github/workflows/sims.yml (5 hunks)
  • CHANGELOG.md (1 hunks)
  • Makefile (6 hunks)
  • simapp/sim_bench_test.go (2 hunks)
  • simapp/sim_test.go (5 hunks)
Files skipped from review as they are similar to previous changes (2)
  • Makefile
  • simapp/sim_bench_test.go
Additional context used
Path-based instructions (2)
simapp/sim_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

CHANGELOG.md (1)

Pattern **/*.md: "Assess the documentation for misspellings, grammatical errors, missing documentation and correctness"

Markdownlint
CHANGELOG.md

70-70: Expected: 2; Actual: 4
Unordered list indentation


71-71: Expected: 2; Actual: 4
Unordered list indentation


75-75: Expected: 2; Actual: 4
Unordered list indentation


76-76: Expected: 2; Actual: 4
Unordered list indentation


77-77: Expected: 2; Actual: 4
Unordered list indentation


78-78: Expected: 2; Actual: 4
Unordered list indentation


83-83: Expected: 2; Actual: 4
Unordered list indentation


127-127: Expected: 2; Actual: 4
Unordered list indentation


128-128: Expected: 2; Actual: 4
Unordered list indentation


129-129: Expected: 2; Actual: 4
Unordered list indentation


133-133: Expected: 2; Actual: 4
Unordered list indentation


136-136: Expected: 2; Actual: 4
Unordered list indentation


137-137: Expected: 2; Actual: 4
Unordered list indentation


138-138: Expected: 2; Actual: 4
Unordered list indentation


145-145: Expected: 2; Actual: 4
Unordered list indentation


155-155: Expected: 2; Actual: 4
Unordered list indentation


157-157: Expected: 2; Actual: 4
Unordered list indentation


160-160: Expected: 2; Actual: 4
Unordered list indentation


179-179: Expected: 2; Actual: 4
Unordered list indentation


180-180: Expected: 2; Actual: 4
Unordered list indentation


182-182: Expected: 2; Actual: 4
Unordered list indentation


183-183: Expected: 2; Actual: 4
Unordered list indentation


215-215: Expected: 2; Actual: 4
Unordered list indentation


216-216: Expected: 2; Actual: 4
Unordered list indentation


217-217: Expected: 2; Actual: 4
Unordered list indentation


381-381: Expected: 2; Actual: 4
Unordered list indentation


384-384: Expected: 2; Actual: 4
Unordered list indentation


406-406: Expected: 2; Actual: 4
Unordered list indentation


407-407: Expected: 2; Actual: 4
Unordered list indentation


420-420: Expected: 2; Actual: 4
Unordered list indentation


452-452: Expected: 2; Actual: 4
Unordered list indentation


453-453: Expected: 2; Actual: 4
Unordered list indentation


454-454: Expected: 2; Actual: 4
Unordered list indentation


455-455: Expected: 2; Actual: 4
Unordered list indentation


457-457: Expected: 2; Actual: 4
Unordered list indentation


458-458: Expected: 2; Actual: 4
Unordered list indentation


459-459: Expected: 2; Actual: 4
Unordered list indentation


460-460: Expected: 2; Actual: 4
Unordered list indentation


474-474: Expected: 2; Actual: 4
Unordered list indentation


476-476: Expected: 2; Actual: 4
Unordered list indentation


478-478: Expected: 2; Actual: 4
Unordered list indentation


480-480: Expected: 2; Actual: 4
Unordered list indentation


483-483: Expected: 2; Actual: 4
Unordered list indentation


484-484: Expected: 2; Actual: 4
Unordered list indentation


485-485: Expected: 2; Actual: 4
Unordered list indentation


493-493: Expected: 2; Actual: 4
Unordered list indentation


494-494: Expected: 2; Actual: 4
Unordered list indentation


496-496: Expected: 2; Actual: 4
Unordered list indentation


497-497: Expected: 2; Actual: 4
Unordered list indentation


499-499: Expected: 2; Actual: 4
Unordered list indentation


500-500: Expected: 2; Actual: 4
Unordered list indentation


501-501: Expected: 2; Actual: 4
Unordered list indentation


503-503: Expected: 2; Actual: 4
Unordered list indentation


504-504: Expected: 2; Actual: 4
Unordered list indentation


512-512: Expected: 2; Actual: 4
Unordered list indentation


523-523: Expected: 2; Actual: 4
Unordered list indentation


524-524: Expected: 2; Actual: 4
Unordered list indentation


525-525: Expected: 2; Actual: 4
Unordered list indentation


531-531: Expected: 2; Actual: 4
Unordered list indentation


532-532: Expected: 2; Actual: 4
Unordered list indentation


533-533: Expected: 2; Actual: 4
Unordered list indentation


539-539: Expected: 2; Actual: 4
Unordered list indentation


555-555: Expected: 2; Actual: 4
Unordered list indentation


556-556: Expected: 2; Actual: 4
Unordered list indentation


557-557: Expected: 2; Actual: 4
Unordered list indentation


558-558: Expected: 2; Actual: 4
Unordered list indentation


559-559: Expected: 2; Actual: 4
Unordered list indentation


560-560: Expected: 2; Actual: 4
Unordered list indentation


565-565: Expected: 2; Actual: 4
Unordered list indentation


566-566: Expected: 2; Actual: 4
Unordered list indentation


567-567: Expected: 2; Actual: 4
Unordered list indentation


568-568: Expected: 2; Actual: 4
Unordered list indentation


575-575: Expected: 2; Actual: 4
Unordered list indentation


576-576: Expected: 2; Actual: 4
Unordered list indentation


577-577: Expected: 2; Actual: 4
Unordered list indentation


611-611: Expected: 2; Actual: 4
Unordered list indentation


612-612: Expected: 2; Actual: 4
Unordered list indentation


613-613: Expected: 2; Actual: 4
Unordered list indentation


614-614: Expected: 2; Actual: 4
Unordered list indentation


619-619: Expected: 2; Actual: 4
Unordered list indentation


620-620: Expected: 2; Actual: 4
Unordered list indentation


757-757: Expected: 2; Actual: 4
Unordered list indentation


900-900: Expected: 2; Actual: 4
Unordered list indentation


921-921: Expected: 2; Actual: 4
Unordered list indentation


924-924: Expected: 2; Actual: 4
Unordered list indentation


1006-1006: Expected: 2; Actual: 4
Unordered list indentation


1007-1007: Expected: 2; Actual: 4
Unordered list indentation


1008-1008: Expected: 2; Actual: 4
Unordered list indentation


1009-1009: Expected: 2; Actual: 4
Unordered list indentation


1010-1010: Expected: 2; Actual: 4
Unordered list indentation


1011-1011: Expected: 2; Actual: 4
Unordered list indentation


1108-1108: Expected: 2; Actual: 4
Unordered list indentation


1194-1194: Expected: 2; Actual: 4
Unordered list indentation


1240-1240: Expected: 2; Actual: 4
Unordered list indentation


1246-1246: Expected: 2; Actual: 4
Unordered list indentation


1247-1247: Expected: 2; Actual: 4
Unordered list indentation


1248-1248: Expected: 2; Actual: 4
Unordered list indentation


1249-1249: Expected: 2; Actual: 4
Unordered list indentation


1250-1250: Expected: 2; Actual: 4
Unordered list indentation


1251-1251: Expected: 2; Actual: 4
Unordered list indentation


1351-1351: Expected: 2; Actual: 4
Unordered list indentation


1476-1476: Expected: 2; Actual: 4
Unordered list indentation


1477-1477: Expected: 4; Actual: 8
Unordered list indentation


1478-1478: Expected: 4; Actual: 8
Unordered list indentation


1479-1479: Expected: 2; Actual: 4
Unordered list indentation


1480-1480: Expected: 4; Actual: 8
Unordered list indentation


1481-1481: Expected: 4; Actual: 8
Unordered list indentation


1482-1482: Expected: 4; Actual: 8
Unordered list indentation


1483-1483: Expected: 2; Actual: 4
Unordered list indentation


1486-1486: Expected: 2; Actual: 4
Unordered list indentation


1487-1487: Expected: 4; Actual: 8
Unordered list indentation


1488-1488: Expected: 2; Actual: 4
Unordered list indentation


1489-1489: Expected: 4; Actual: 8
Unordered list indentation


1490-1490: Expected: 4; Actual: 8
Unordered list indentation


1491-1491: Expected: 4; Actual: 8
Unordered list indentation


1740-1740: Expected: 2; Actual: 4
Unordered list indentation


1741-1741: Expected: 2; Actual: 4
Unordered list indentation


1742-1742: Expected: 2; Actual: 4
Unordered list indentation


1743-1743: Expected: 2; Actual: 4
Unordered list indentation


1744-1744: Expected: 2; Actual: 4
Unordered list indentation


1745-1745: Expected: 2; Actual: 4
Unordered list indentation


1855-1855: Expected: 2; Actual: 4
Unordered list indentation


2192-2192: Expected: 2; Actual: 4
Unordered list indentation


2193-2193: Expected: 2; Actual: 4
Unordered list indentation


2194-2194: Expected: 2; Actual: 4
Unordered list indentation


2197-2197: Expected: 2; Actual: 4
Unordered list indentation


2198-2198: Expected: 2; Actual: 4
Unordered list indentation


2199-2199: Expected: 2; Actual: 4
Unordered list indentation


2221-2221: Expected: 2; Actual: 4
Unordered list indentation


2222-2222: Expected: 2; Actual: 4
Unordered list indentation


2223-2223: Expected: 2; Actual: 4
Unordered list indentation


2224-2224: Expected: 2; Actual: 4
Unordered list indentation


2225-2225: Expected: 2; Actual: 4
Unordered list indentation


2233-2233: Expected: 2; Actual: 4
Unordered list indentation


2234-2234: Expected: 2; Actual: 4
Unordered list indentation


2235-2235: Expected: 2; Actual: 4
Unordered list indentation


2236-2236: Expected: 2; Actual: 4
Unordered list indentation


2237-2237: Expected: 2; Actual: 4
Unordered list indentation


2239-2239: Expected: 2; Actual: 4
Unordered list indentation


2240-2240: Expected: 2; Actual: 4
Unordered list indentation


2241-2241: Expected: 2; Actual: 4
Unordered list indentation


2568-2568: Expected: 2; Actual: 4
Unordered list indentation


2569-2569: Expected: 2; Actual: 4
Unordered list indentation


2570-2570: Expected: 2; Actual: 4
Unordered list indentation


2571-2571: Expected: 2; Actual: 4
Unordered list indentation


2572-2572: Expected: 2; Actual: 4
Unordered list indentation


2574-2574: Expected: 2; Actual: 4
Unordered list indentation


2576-2576: Expected: 2; Actual: 4
Unordered list indentation


2577-2577: Expected: 2; Actual: 4
Unordered list indentation


2578-2578: Expected: 2; Actual: 4
Unordered list indentation


2579-2579: Expected: 2; Actual: 4
Unordered list indentation


2580-2580: Expected: 2; Actual: 4
Unordered list indentation


2581-2581: Expected: 2; Actual: 4
Unordered list indentation


2583-2583: Expected: 2; Actual: 4
Unordered list indentation


2584-2584: Expected: 2; Actual: 4
Unordered list indentation


2585-2585: Expected: 2; Actual: 4
Unordered list indentation


2588-2588: Expected: 2; Actual: 4
Unordered list indentation


2589-2589: Expected: 2; Actual: 4
Unordered list indentation


2590-2590: Expected: 2; Actual: 4
Unordered list indentation


2591-2591: Expected: 2; Actual: 4
Unordered list indentation


2592-2592: Expected: 2; Actual: 4
Unordered list indentation


2595-2595: Expected: 2; Actual: 4
Unordered list indentation


2598-2598: Expected: 2; Actual: 4
Unordered list indentation


2601-2601: Expected: 2; Actual: 4
Unordered list indentation


2602-2602: Expected: 2; Actual: 4
Unordered list indentation


2605-2605: Expected: 2; Actual: 4
Unordered list indentation


2612-2612: Expected: 2; Actual: 4
Unordered list indentation


2613-2613: Expected: 2; Actual: 4
Unordered list indentation


2614-2614: Expected: 2; Actual: 4
Unordered list indentation


2615-2615: Expected: 2; Actual: 4
Unordered list indentation


2616-2616: Expected: 2; Actual: 4
Unordered list indentation


2618-2618: Expected: 2; Actual: 4
Unordered list indentation


2619-2619: Expected: 2; Actual: 4
Unordered list indentation


2620-2620: Expected: 2; Actual: 4
Unordered list indentation


2621-2621: Expected: 2; Actual: 4
Unordered list indentation


2622-2622: Expected: 2; Actual: 4
Unordered list indentation


2623-2623: Expected: 2; Actual: 4
Unordered list indentation


2624-2624: Expected: 2; Actual: 4
Unordered list indentation


2625-2625: Expected: 2; Actual: 4
Unordered list indentation


2626-2626: Expected: 4; Actual: 8
Unordered list indentation


2629-2629: Expected: 2; Actual: 4
Unordered list indentation


2630-2630: Expected: 2; Actual: 4
Unordered list indentation


2631-2631: Expected: 2; Actual: 4
Unordered list indentation


2632-2632: Expected: 2; Actual: 4
Unordered list indentation


2633-2633: Expected: 2; Actual: 4
Unordered list indentation


2634-2634: Expected: 2; Actual: 4
Unordered list indentation


2641-2641: Expected: 2; Actual: 4
Unordered list indentation


2642-2642: Expected: 2; Actual: 4
Unordered list indentation


2643-2643: Expected: 2; Actual: 4
Unordered list indentation


2644-2644: Expected: 2; Actual: 4
Unordered list indentation


2651-2651: Expected: 2; Actual: 4
Unordered list indentation


2653-2653: Expected: 2; Actual: 4
Unordered list indentation


2655-2655: Expected: 2; Actual: 4
Unordered list indentation


2656-2656: Expected: 2; Actual: 4
Unordered list indentation


2657-2657: Expected: 2; Actual: 4
Unordered list indentation


2658-2658: Expected: 2; Actual: 4
Unordered list indentation


2659-2659: Expected: 2; Actual: 4
Unordered list indentation


2660-2660: Expected: 2; Actual: 4
Unordered list indentation


2661-2661: Expected: 2; Actual: 4
Unordered list indentation


2662-2662: Expected: 2; Actual: 4
Unordered list indentation


2663-2663: Expected: 2; Actual: 4
Unordered list indentation


2664-2664: Expected: 2; Actual: 4
Unordered list indentation


2665-2665: Expected: 2; Actual: 4
Unordered list indentation


2666-2666: Expected: 2; Actual: 4
Unordered list indentation


2667-2667: Expected: 2; Actual: 4
Unordered list indentation


2668-2668: Expected: 4; Actual: 8
Unordered list indentation


2669-2669: Expected: 4; Actual: 8
Unordered list indentation


2670-2670: Expected: 4; Actual: 8
Unordered list indentation


2671-2671: Expected: 2; Actual: 4
Unordered list indentation


2672-2672: Expected: 2; Actual: 4
Unordered list indentation


2673-2673: Expected: 2; Actual: 4
Unordered list indentation


2674-2674: Expected: 2; Actual: 4
Unordered list indentation


2675-2675: Expected: 2; Actual: 4
Unordered list indentation


2676-2676: Expected: 2; Actual: 4
Unordered list indentation


2677-2677: Expected: 2; Actual: 4
Unordered list indentation


2678-2678: Expected: 4; Actual: 8
Unordered list indentation


2679-2679: Expected: 4; Actual: 8
Unordered list indentation


2680-2680: Expected: 4; Actual: 8
Unordered list indentation


2681-2681: Expected: 2; Actual: 4
Unordered list indentation


2683-2683: Expected: 4; Actual: 8
Unordered list indentation


2684-2684: Expected: 4; Actual: 8
Unordered list indentation


2686-2686: Expected: 2; Actual: 4
Unordered list indentation


2687-2687: Expected: 2; Actual: 4
Unordered list indentation


2688-2688: Expected: 4; Actual: 8
Unordered list indentation


2689-2689: Expected: 4; Actual: 8
Unordered list indentation


2690-2690: Expected: 2; Actual: 4
Unordered list indentation


2691-2691: Expected: 2; Actual: 4
Unordered list indentation


2692-2692: Expected: 2; Actual: 4
Unordered list indentation


2695-2695: Expected: 2; Actual: 4
Unordered list indentation


2696-2696: Expected: 2; Actual: 4
Unordered list indentation


2698-2698: Expected: 2; Actual: 4
Unordered list indentation


2699-2699: Expected: 2; Actual: 4
Unordered list indentation


2702-2702: Expected: 2; Actual: 4
Unordered list indentation


2703-2703: Expected: 4; Actual: 8
Unordered list indentation


2704-2704: Expected: 4; Actual: 8
Unordered list indentation


2705-2705: Expected: 4; Actual: 8
Unordered list indentation


2706-2706: Expected: 4; Actual: 8
Unordered list indentation


2707-2707: Expected: 2; Actual: 4
Unordered list indentation


2708-2708: Expected: 2; Actual: 4
Unordered list indentation


2709-2709: Expected: 2; Actual: 4
Unordered list indentation


2711-2711: Expected: 2; Actual: 4
Unordered list indentation


2712-2712: Expected: 2; Actual: 4
Unordered list indentation


2713-2713: Expected: 2; Actual: 4
Unordered list indentation


2719-2719: Expected: 2; Actual: 4
Unordered list indentation


2722-2722: Expected: 2; Actual: 4
Unordered list indentation


2728-2728: Expected: 2; Actual: 4
Unordered list indentation


2736-2736: Expected: 2; Actual: 4
Unordered list indentation


2737-2737: Expected: 4; Actual: 8
Unordered list indentation


2738-2738: Expected: 4; Actual: 8
Unordered list indentation


2739-2739: Expected: 2; Actual: 4
Unordered list indentation


2747-2747: Expected: 2; Actual: 4
Unordered list indentation


2754-2754: Expected: 2; Actual: 4
Unordered list indentation


2755-2755: Expected: 2; Actual: 4
Unordered list indentation


2762-2762: Expected: 2; Actual: 4
Unordered list indentation


2764-2764: Expected: 2; Actual: 4
Unordered list indentation


2768-2768: Expected: 2; Actual: 4
Unordered list indentation


2769-2769: Expected: 2; Actual: 4
Unordered list indentation


2771-2771: Expected: 2; Actual: 4
Unordered list indentation


2779-2779: Expected: 2; Actual: 4
Unordered list indentation


2781-2781: Expected: 2; Actual: 4
Unordered list indentation


2782-2782: Expected: 2; Actual: 4
Unordered list indentation


2788-2788: Expected: 2; Actual: 4
Unordered list indentation


2796-2796: Expected: 2; Actual: 4
Unordered list indentation


2797-2797: Expected: 2; Actual: 4
Unordered list indentation


2798-2798: Expected: 2; Actual: 4
Unordered list indentation


2799-2799: Expected: 2; Actual: 4
Unordered list indentation


2800-2800: Expected: 2; Actual: 4
Unordered list indentation


2801-2801: Expected: 2; Actual: 4
Unordered list indentation


2802-2802: Expected: 2; Actual: 4
Unordered list indentation


2803-2803: Expected: 2; Actual: 4
Unordered list indentation


2804-2804: Expected: 2; Actual: 4
Unordered list indentation


2805-2805: Expected: 2; Actual: 4
Unordered list indentation


2806-2806: Expected: 2; Actual: 4
Unordered list indentation


2807-2807: Expected: 2; Actual: 4
Unordered list indentation


2808-2808: Expected: 2; Actual: 4
Unordered list indentation


2809-2809: Expected: 2; Actual: 4
Unordered list indentation


2811-2811: Expected: 2; Actual: 4
Unordered list indentation


2812-2812: Expected: 2; Actual: 4
Unordered list indentation


2814-2814: Expected: 2; Actual: 4
Unordered list indentation


2815-2815: Expected: 2; Actual: 4
Unordered list indentation


2816-2816: Expected: 4; Actual: 8
Unordered list indentation


2817-2817: Expected: 4; Actual: 8
Unordered list indentation


2818-2818: Expected: 2; Actual: 4
Unordered list indentation


2819-2819: Expected: 2; Actual: 4
Unordered list indentation


2820-2820: Expected: 2; Actual: 4
Unordered list indentation


2821-2821: Expected: 2; Actual: 4
Unordered list indentation


2822-2822: Expected: 4; Actual: 8
Unordered list indentation


2823-2823: Expected: 4; Actual: 8
Unordered list indentation


2825-2825: Expected: 2; Actual: 4
Unordered list indentation


2826-2826: Expected: 2; Actual: 4
Unordered list indentation


2829-2829: Expected: 2; Actual: 4
Unordered list indentation


2830-2830: Expected: 2; Actual: 4
Unordered list indentation


2831-2831: Expected: 2; Actual: 4
Unordered list indentation


2832-2832: Expected: 2; Actual: 4
Unordered list indentation


2833-2833: Expected: 4; Actual: 8
Unordered list indentation


2834-2834: Expected: 4; Actual: 8
Unordered list indentation


2835-2835: Expected: 4; Actual: 8
Unordered list indentation


2836-2836: Expected: 4; Actual: 8
Unordered list indentation


2837-2837: Expected: 4; Actual: 8
Unordered list indentation


2838-2838: Expected: 4; Actual: 8
Unordered list indentation


2839-2839: Expected: 4; Actual: 8
Unordered list indentation


2840-2840: Expected: 4; Actual: 8
Unordered list indentation


2841-2841: Expected: 4; Actual: 8
Unordered list indentation


2842-2842: Expected: 4; Actual: 8
Unordered list indentation


2843-2843: Expected: 2; Actual: 4
Unordered list indentation


2844-2844: Expected: 2; Actual: 4
Unordered list indentation


2849-2849: Expected: 2; Actual: 4
Unordered list indentation


2850-2850: Expected: 2; Actual: 4
Unordered list indentation


2851-2851: Expected: 2; Actual: 4
Unordered list indentation


2852-2852: Expected: 2; Actual: 4
Unordered list indentation


2853-2853: Expected: 2; Actual: 4
Unordered list indentation


2854-2854: Expected: 2; Actual: 4
Unordered list indentation


2856-2856: Expected: 2; Actual: 4
Unordered list indentation


2858-2858: Expected: 2; Actual: 4
Unordered list indentation


2872-2872: Expected: 2; Actual: 4
Unordered list indentation


2873-2873: Expected: 2; Actual: 4
Unordered list indentation


2874-2874: Expected: 2; Actual: 4
Unordered list indentation


2879-2879: Expected: 2; Actual: 4
Unordered list indentation


2880-2880: Expected: 2; Actual: 4
Unordered list indentation


2881-2881: Expected: 2; Actual: 4
Unordered list indentation


2885-2885: Expected: 2; Actual: 4
Unordered list indentation


2886-2886: Expected: 2; Actual: 4
Unordered list indentation


2887-2887: Expected: 2; Actual: 4
Unordered list indentation


2888-2888: Expected: 2; Actual: 4
Unordered list indentation


2889-2889: Expected: 2; Actual: 4
Unordered list indentation


2890-2890: Expected: 2; Actual: 4
Unordered list indentation


2893-2893: Expected: 2; Actual: 4
Unordered list indentation


2894-2894: Expected: 2; Actual: 4
Unordered list indentation


2895-2895: Expected: 2; Actual: 4
Unordered list indentation


2896-2896: Expected: 2; Actual: 4
Unordered list indentation


2897-2897: Expected: 2; Actual: 4
Unordered list indentation


2898-2898: Expected: 2; Actual: 4
Unordered list indentation


2899-2899: Expected: 2; Actual: 4
Unordered list indentation


2900-2900: Expected: 2; Actual: 4
Unordered list indentation


2901-2901: Expected: 2; Actual: 4
Unordered list indentation


2903-2903: Expected: 2; Actual: 4
Unordered list indentation


2905-2905: Expected: 2; Actual: 4
Unordered list indentation


2907-2907: Expected: 2; Actual: 4
Unordered list indentation


2912-2912: Expected: 2; Actual: 4
Unordered list indentation


2913-2913: Expected: 2; Actual: 4
Unordered list indentation


2914-2914: Expected: 2; Actual: 4
Unordered list indentation


2915-2915: Expected: 2; Actual: 4
Unordered list indentation


2916-2916: Expected: 2; Actual: 4
Unordered list indentation


2917-2917: Expected: 4; Actual: 8
Unordered list indentation


2918-2918: Expected: 4; Actual: 8
Unordered list indentation


2919-2919: Expected: 2; Actual: 4
Unordered list indentation


2920-2920: Expected: 4; Actual: 8
Unordered list indentation


2921-2921: Expected: 4; Actual: 8
Unordered list indentation


2922-2922: Expected: 4; Actual: 8
Unordered list indentation


2923-2923: Expected: 2; Actual: 4
Unordered list indentation


2924-2924: Expected: 2; Actual: 4
Unordered list indentation


2925-2925: Expected: 2; Actual: 4
Unordered list indentation


2926-2926: Expected: 4; Actual: 8
Unordered list indentation


2927-2927: Expected: 4; Actual: 8
Unordered list indentation


2928-2928: Expected: 2; Actual: 4
Unordered list indentation


2929-2929: Expected: 2; Actual: 4
Unordered list indentation


2930-2930: Expected: 2; Actual: 4
Unordered list indentation


2931-2931: Expected: 2; Actual: 4
Unordered list indentation


2932-2932: Expected: 2; Actual: 4
Unordered list indentation


189-189: Expected: 0 or 2; Actual: 1
Trailing spaces


212-212: Expected: 0 or 2; Actual: 1
Trailing spaces


43-43: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines


66-66: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines


44-44: null
Lists should be surrounded by blank lines


67-67: null
Lists should be surrounded by blank lines


1658-1658: null
Bare URL used


1688-1688: null
Bare URL used


2635-2635: null
Spaces inside emphasis markers


2723-2723: null
Spaces inside emphasis markers


2725-2725: null
Spaces inside emphasis markers


2730-2730: null
Spaces inside emphasis markers


2732-2732: null
Spaces inside emphasis markers


2742-2742: null
Spaces inside emphasis markers


2744-2744: null
Spaces inside emphasis markers


2749-2749: null
Spaces inside emphasis markers


2757-2757: null
Spaces inside emphasis markers


2774-2774: null
Spaces inside emphasis markers


2776-2776: null
Spaces inside emphasis markers


2784-2784: null
Spaces inside emphasis markers


2790-2790: null
Spaces inside emphasis markers


2860-2860: null
Spaces inside emphasis markers


2863-2863: null
Spaces inside emphasis markers


2866-2866: null
Spaces inside emphasis markers


2868-2868: null
Spaces inside emphasis markers


2908-2908: null
Spaces inside emphasis markers


1029-1029: null
Spaces inside code span elements


2676-2676: null
Spaces inside code span elements


2676-2676: null
Spaces inside code span elements

Additional comments not posted (7)
.github/workflows/sims.yml (3)

55-67: The job test-sim-deterministic is newly added. Verify that the corresponding make command (test-sim-nondeterminism-streaming) is correctly set up and functional.

Verification successful

The test-sim-nondeterminism-streaming target is defined in the Makefile, as evidenced by the search results. This confirms that the corresponding make command is correctly set up and functional.

  • Makefile contains the test-sim-nondeterminism-streaming target.
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the make command for the new deterministic simulation test.

# Test: Search for the make command in the Makefile. Expect: Definition and correct setup of `test-sim-nondeterminism-streaming`.
rg --type makefile --glob '*Makefile' 'test-sim-nondeterminism-streaming'

Length of output: 106



Script:

#!/bin/bash
# Description: Verify the make command for the new deterministic simulation test.

# Test: Search for the make command in the Makefile. Expect: Definition and correct setup of `test-sim-nondeterminism-streaming`.
rg --type make --glob '*Makefile' 'test-sim-nondeterminism-streaming'

Length of output: 262


18-18: Ensure the runner large-sdk-runner is properly configured and available.


29-29: All simulation jobs now use the large-sdk-runner. Confirm that this runner has the necessary resources and permissions for all the tasks.

Also applies to: 43-43, 55-55, 69-69, 85-85, 113-113

simapp/sim_test.go (4)

57-58: Review the changes in the test functions to ensure they align with the new simulation setup and parameters. Check for sufficient coverage and correct use of the new simulation features.

Also applies to: 69-104, 112-146, 152-203, 244-257


6-6: New imports (encoding/binary, io, sync) have been added. Verify that these are used effectively in the tests and there are no unused imports.

Also applies to: 9-9, 12-12

Verification successful

The new imports encoding/binary, io, and sync are indeed used in the simapp/sim_test.go file. Here are the specific usages:

  • binary: Used in FuzzFullAppSimulation function.
  • io: Used in interBlockCachingAppFactory function.
  • sync: Used in a variable declaration (var mx sync.Mutex).

This confirms that the new imports are utilized effectively in the tests.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Check for usage of new imports in `simapp/sim_test.go`.

# Test: Search for usage of `binary`, `io`, and `sync` in the file. Expect: At least one usage of each import.
rg --type go --glob 'sim_test.go' 'binary|io|sync'

Length of output: 2990


244-257: The new fuzz test FuzzFullAppSimulation has been added. Ensure that the fuzzing setup is correctly implemented and that it effectively tests the application.

Verification successful

The gathered information provides the full implementations of FuzzFullAppSimulation and its dependencies: RunWithSeeds, NewSimApp, and setupStateFactory. Here's a summary of the findings:

  1. FuzzFullAppSimulation:

    • This function sets up a fuzz test using f.Fuzz.
    • It skips the test if the rawSeed length is less than 8.
    • It calls RunWithSeeds with the appropriate parameters.
  2. RunWithSeeds:

    • This function runs simulations with the provided seeds.
    • It initializes configuration and runs tests in parallel for each seed.
  3. NewSimApp:

    • There are two implementations found in app_di.go and app.go.
    • Both functions initialize the SimApp with necessary parameters like logger, database, trace store, etc.
  4. setupStateFactory:

    • This function sets up the state factory for the simulation.
    • It returns a SimStateFactory with codec, app state function, and blocked addresses.

The implementations appear to be correctly set up for fuzz testing. The RunWithSeeds function ensures that the application is tested with different seeds, and the setupStateFactory prepares the necessary state for the simulation.

Based on this analysis, the fuzzing setup in FuzzFullAppSimulation is correctly implemented and should effectively test the application.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the setup and effectiveness of the fuzz test.

# Test: Check for the setup and usage of fuzzing in `FuzzFullAppSimulation`. Expect: Correct setup and effective testing.
rg --type go --glob 'sim_test.go' 'FuzzFullAppSimulation'

Length of output: 117



Script:

#!/bin/bash
# Description: Gather implementation details of `FuzzFullAppSimulation` and its dependencies.

# Fetch the implementation of `FuzzFullAppSimulation`
rg --type go --glob 'sim_test.go' -A 20 'func FuzzFullAppSimulation'

# Fetch the implementation of `RunWithSeeds`
rg --type go 'func RunWithSeeds'

# Fetch the implementation of `NewSimApp`
rg --type go 'func NewSimApp'

# Fetch the implementation of `setupStateFactory`
rg --type go 'func setupStateFactory'

Length of output: 924



Script:

#!/bin/bash
# Description: Gather full implementations of `RunWithSeeds`, `NewSimApp`, and `setupStateFactory`.

# Fetch the full implementation of `RunWithSeeds`
rg --type go --glob 'runner.go' -A 20 'func RunWithSeeds'

# Fetch the full implementation of `NewSimApp` from both locations
rg --type go --glob 'app_di.go' -A 20 'func NewSimApp'
rg --type go --glob 'app.go' -A 20 'func NewSimApp'

# Fetch the full implementation of `setupStateFactory`
rg --type go --glob 'sim_test.go' -A 20 'func setupStateFactory'

Length of output: 4265


57-58: The function TestFullAppSimulation has been simplified. Ensure that the new Run function adequately covers all necessary test scenarios.

Verification successful

The Run function in simapp/runner.go is a helper function that runs a simulation test with the given parameters by calling the RunWithSeeds function. It sets up the environment, creates an instance of the simulation app, and runs the simulation test for each seed in parallel. This implementation builds upon the Go standard library test framework and ensures deterministic execution, which can be used for fuzz tests as well.

  • Run function definition: simapp/runner.go

Based on this information, it appears that the Run function adequately covers the necessary test scenarios by setting up the environment and running the simulation tests in a deterministic manner.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the coverage of `TestFullAppSimulation`.

# Test: Check for test scenarios covered by `Run` in `TestFullAppSimulation`. Expect: Comprehensive coverage.
rg --type go --glob 'sim_test.go' 'TestFullAppSimulation'

Length of output: 117



Script:

#!/bin/bash
# Description: Locate the definition of the `Run` function and examine its implementation.

# Step 1: Locate the definition of the `Run` function.
rg --type go --pattern 'func Run' 

# Step 2: Examine the parameters passed to `Run` in `TestFullAppSimulation`.
rg --type go --glob 'sim_test.go' 'Run(t, NewSimApp, setupStateFactory)'

Length of output: 520



Script:

#!/bin/bash
# Description: Locate the definition of the `Run` function and examine its implementation.

# Step 1: Locate the definition of the `Run` function.
rg --type go 'func Run' 

# Step 2: Examine the parameters passed to `Run` in `TestFullAppSimulation`.
rg --type go --glob 'sim_test.go' 'Run(t, NewSimApp, setupStateFactory)'

Length of output: 258



Script:

#!/bin/bash
# Description: Extract the implementation of the `Run` function from `simapp/runner.go`.

# Step 1: Extract the `Run` function implementation.
rg --type go --context 10 'func Run' simapp/runner.go

Length of output: 1662

CHANGELOG.md Outdated Show resolved Hide resolved
CHANGELOG.md Outdated Show resolved Hide resolved
simapp/runner.go Outdated Show resolved Hide resolved
x/simulation/client/cli/flags.go Show resolved Hide resolved
simapp/sim_bench_test.go Outdated Show resolved Hide resolved
alpe added 3 commits June 3, 2024 15:10
* main:
  docs: add docs on permissions (#20526)
  refactor(x/gov): set environment in context for legacy proposals (#20521)
  docs: migrate diagrams to mermaidjs (#20503)
  refactor(tools/hubl): don't use nil panic (#20515)
  refactor(x/authz): set environment in context (#20502)
  build(deps): Bump github.com/spf13/viper from 1.18.2 to 1.19.0 (#20519)
  feat(x/bank): Placing SendRestriction before Deduction of Coins in SendCoins (#20517)
  chore: sonar ignore directories with their own go.mods  (#20509)
  ci: run action in merge queue (#20508)
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: 7

Outside diff range and nitpick comments (1)
x/simulation/simulate.go (1)

63-63: Ensure proper documentation for the new logger parameter.

Consider adding a comment above the logger parameter to explain its usage within the function, enhancing code readability and maintainability.

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 07f99cc and 5cab600.

Files selected for processing (1)
  • x/simulation/simulate.go (14 hunks)
Additional context used
Path-based instructions (1)
x/simulation/simulate.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

Additional comments not posted (2)
x/simulation/simulate.go (2)

81-81: Potential source of non-determinism should be addressed.

The use of time.Now() introduces a potential source of non-determinism which is critical in a blockchain context. Verify if this can be replaced or if its impact can be mitigated.


95-95: Improve error messaging for clarity.
[REFACTOR_SUGGESTion]
Refine the error message to provide more context about why at least two genesis accounts are required, which could help developers understand the simulation setup better.

- return params, fmt.Errorf("at least two genesis accounts are required")
+ return params, fmt.Errorf("simulation initialization failed: at least two genesis accounts are required to ensure diverse transaction scenarios")

x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Outdated Show resolved Hide resolved
x/simulation/simulate.go Outdated Show resolved Hide resolved
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: 1

Outside diff range and nitpick comments (1)
x/simulation/simulate.go (1)

63-63: Ensure proper documentation for the logger parameter.

Adding a comment explaining the role of the logger parameter would enhance code readability and maintainability.

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 5cab600 and 647b220.

Files selected for processing (1)
  • x/simulation/simulate.go (14 hunks)
Additional context used
Path-based instructions (1)
x/simulation/simulate.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

Learnings (1)
x/simulation/simulate.go (1)
User: alpe
PR: cosmos/cosmos-sdk#20490
File: x/simulation/simulate.go:78-78
Timestamp: 2024-06-07T07:40:09.804Z
Learning: The use of `math/rand` instead of `crypto/rand` in `x/simulation/simulate.go` is intentional as per user `alpe`.
Additional comments not posted (8)
x/simulation/simulate.go (8)

78-78: Use of weak random number generator noted.

As previously flagged by the security bot, the use of math/rand for randomness in blockchain-related code could lead to vulnerabilities. Consider using crypto/rand for enhanced security.


81-81: Calling the system time may introduce non-determinism.

Using system time (time.Now()) in simulations can lead to non-deterministic behavior, which is generally undesirable in testing environments.


106-106: Improve error handling strategy.

Instead of returning the error directly, consider logging the error and continuing with a default or safe operation if possible. This can prevent the simulation from stopping abruptly due to minor issues.


161-161: Enhance the panic recovery process by adding more detailed logging.

This could help in diagnosing issues post-mortem.

- logger.Error("simulation halted due to panic", "height", blockHeight)
+ logger.Error("simulation halted due to panic", "height", blockHeight, "error", r)

182-182: Ensure detailed error handling during block finalization.

Improve the error handling during block finalization to provide more detailed error messages and possible recovery options.

- return params, fmt.Errorf("block finalization failed at height %d: %w", blockHeight, err)
+ return params, fmt.Errorf("block finalization failed at height %d: %w", blockHeight, err)

230-230: Ensure commit operations are error-checked.

Add error handling for the app.Commit() operation to ensure that any issues during commit are properly logged and handled.

- _, err := app.Commit()
+ if _, err := app.Commit(); err != nil {
+     logger.Error("commit failed", "error", err)
+     return params, fmt.Errorf("commit failed at height %d: %w", blockHeight, err)
+ }

235-235: Clarify the early stop condition in the simulation.

Enhance the log message to provide more context about why the simulation stops early when all validators are unbonded.

- logger.Info("Simulation stopped early as all validators have been unbonded; nobody left to propose a block", "height", blockHeight)
+ logger.Info("Simulation stopped early due to lack of validators: all have been unbonded, leaving no one to propose new blocks", "height", blockHeight)

254-255: Improve the final log message for clarity and completeness.

Refine the final log message to include more details about the simulation's outcome, which can be useful for debugging and analysis.

- logger.Info("Simulation complete", "height", blockHeight, "block-time", blockTime, "opsCount", opCount, "run-time", time.Since(startTime), "app-hash", hex.EncodeToString(app.LastCommitID().Hash))
+ logger.Info("Simulation complete: Details", "Total Blocks Simulated", blockHeight, "Final Block Time", blockTime, "Total Operations", opCount, "Total Run Time", time.Since(startTime), "App Hash", hex.EncodeToString(app.LastCommitID().Hash))

* main:
  refactor(distribution)!: add cometinfo (#20588)
  refactor(hubl): handle the case when grpc endpoints is nil (#20603)
test-sim-fuzz:
@echo "Running application fuzz for numBlocks=2, blockSize=20. This may take awhile!"
#ld flags are a quick fix to make it work on current osx
@cd ${CURRENT_DIR}/simapp && go test -mod=readonly -json -tags='sims' -ldflags="-extldflags=-Wl,-ld_classic" -timeout=60m -fuzztime=60m -run=^$$ -fuzz=FuzzFullAppSimulation -GenesisTime=1714720615 -NumBlocks=2 -BlockSize=20
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@ggrieco-tob this target contains a 1h timeout. It is probably not related to the issues that you were facing but I want to highlight this setting, just in case.
I used 1h for fuzz tests on CI but this can be configured somewhere else, too. Please let me know if other default timeout values make sense.

Copy link
Contributor

Choose a reason for hiding this comment

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

I'm testing removing the 1 hour timeout parameters but still fails for longer campaign. Either the timeout is enforced anyway or there is another issue.

alpe added 2 commits June 12, 2024 13:17
* main:
  refactor(x/auth): Fix system test (#20531)
  feat(crypto): add blst (#20296)
  docs: Update high level overview and introduction (#20535)
  refactor(x/core): remove test (#20624)
  feat(x/mint)!: Replace InflationCalculationFn with MintFn + simple epoch minting (#20363)
  docs: remove duplicate words (#20622)
  feat: prep for errors v2 (#20539)
  chore: reduce default inflation (#20606)
  refactor(store): add miss defer (#20602)
  chore: use comet api pkg instead of comet alias (#20614)
  chore: write gentx info to cmd.ErrOrStderr (#20616)
  docs: ADR 073: update to accepted and add to README.md (#20619)
  chore(proto): change future extracted modules version from v1.0.0 to v0.2.0 (#20600)
  fix: remove some duplicate words (#20605)
  feat(stf): port simappv2 changes (#20587)
  chore: bring patch changelogs to main (#20599)
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: 13

Outside diff range and nitpick comments (1)
x/simulation/log.go (1)

Line range hint 42-57: The locking mechanism using sync.Mutex ensures that log writing is thread-safe, which is crucial in a concurrent environment. However, consider handling the error from f.Close() in a deferred function to ensure resources are properly released even if writing fails.

defer func() {
  if err := f.Close(); err != nil {
    log.Println("Failed to close file:", err)
  }
}()
Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 647b220 and 1eccdec.

Files selected for processing (12)
  • CHANGELOG.md (1 hunks)
  • Makefile (6 hunks)
  • baseapp/baseapp.go (1 hunks)
  • simapp/sim_bench_test.go (3 hunks)
  • simapp/sim_test.go (4 hunks)
  • tests/sims/gov/operations_test.go (3 hunks)
  • testutils/sims/runner.go (1 hunks)
  • x/gov/simulation/operations.go (14 hunks)
  • x/group/simulation/operations.go (20 hunks)
  • x/simulation/log.go (4 hunks)
  • x/simulation/operation.go (2 hunks)
  • x/simulation/simulate.go (20 hunks)
Files skipped from review as they are similar to previous changes (3)
  • Makefile
  • baseapp/baseapp.go
  • simapp/sim_bench_test.go
Additional context used
Path-based instructions (9)
x/simulation/log.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/simulation/operation.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

testutils/sims/runner.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/sim_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/simulation/simulate.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

tests/sims/gov/operations_test.go (3)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern tests/**/*: "Assess the integration and e2e test code assessing sufficient code coverage for the changes associated in the pull request"


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/gov/simulation/operations.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/group/simulation/operations.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

CHANGELOG.md (1)

Pattern **/*.md: "Assess the documentation for misspellings, grammatical errors, missing documentation and correctness"

Learnings (1)
x/simulation/simulate.go (1)
User: alpe
PR: cosmos/cosmos-sdk#20490
File: x/simulation/simulate.go:78-78
Timestamp: 2024-06-07T07:40:09.804Z
Learning: The use of `math/rand` instead of `crypto/rand` in `x/simulation/simulate.go` is intentional as per user `alpe`.
Markdownlint
CHANGELOG.md

70-70: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


71-71: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


75-75: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


76-76: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


77-77: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


78-78: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


83-83: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


125-125: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


126-126: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


127-127: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


131-131: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


134-134: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


135-135: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


136-136: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


143-143: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


153-153: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


155-155: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


158-158: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


177-177: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


178-178: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


180-180: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


181-181: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


233-233: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


234-234: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


235-235: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


399-399: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


402-402: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


424-424: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


425-425: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


438-438: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


470-470: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


471-471: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


472-472: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


473-473: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


475-475: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


476-476: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


477-477: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


478-478: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


492-492: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


494-494: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


496-496: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


498-498: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


501-501: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


502-502: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


503-503: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


511-511: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


512-512: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


514-514: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


515-515: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


517-517: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


518-518: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


519-519: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


521-521: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


522-522: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


530-530: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


541-541: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


542-542: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


543-543: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


549-549: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


550-550: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


551-551: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


557-557: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


573-573: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


574-574: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


575-575: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


576-576: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


577-577: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


578-578: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


583-583: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


584-584: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


585-585: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


586-586: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


593-593: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


594-594: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


595-595: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


629-629: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


630-630: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


631-631: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


632-632: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


637-637: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


638-638: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


786-786: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


929-929: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


950-950: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


953-953: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1035-1035: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1036-1036: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1037-1037: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1038-1038: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1039-1039: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1040-1040: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1137-1137: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1223-1223: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1269-1269: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1275-1275: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1276-1276: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1277-1277: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1278-1278: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1279-1279: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1280-1280: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1380-1380: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1505-1505: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1506-1506: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1507-1507: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1508-1508: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1509-1509: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1510-1510: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1511-1511: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1512-1512: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1515-1515: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1516-1516: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1517-1517: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1518-1518: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1519-1519: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1520-1520: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1769-1769: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1770-1770: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1771-1771: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1772-1772: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1773-1773: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1774-1774: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1884-1884: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2221-2221: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2222-2222: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2223-2223: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2226-2226: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2227-2227: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2228-2228: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2250-2250: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2251-2251: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2252-2252: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2253-2253: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2254-2254: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2262-2262: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2263-2263: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2264-2264: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2265-2265: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2266-2266: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2268-2268: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2269-2269: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2270-2270: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2597-2597: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2598-2598: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2599-2599: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2600-2600: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2601-2601: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2603-2603: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2605-2605: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2606-2606: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2607-2607: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2608-2608: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2609-2609: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2610-2610: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2612-2612: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2613-2613: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2614-2614: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2617-2617: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2618-2618: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2619-2619: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2620-2620: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2621-2621: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2624-2624: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2627-2627: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2630-2630: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2631-2631: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2634-2634: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2641-2641: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2642-2642: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2643-2643: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2644-2644: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2645-2645: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2647-2647: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2648-2648: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2649-2649: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2650-2650: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2651-2651: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2652-2652: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2653-2653: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2654-2654: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2655-2655: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2658-2658: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2659-2659: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2660-2660: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2661-2661: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2662-2662: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2663-2663: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2670-2670: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2671-2671: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2672-2672: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2673-2673: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2680-2680: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2682-2682: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2684-2684: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2685-2685: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2686-2686: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2687-2687: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2688-2688: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2689-2689: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2690-2690: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2691-2691: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2692-2692: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2693-2693: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2694-2694: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2695-2695: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2696-2696: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2697-2697: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2698-2698: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2699-2699: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2700-2700: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2701-2701: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2702-2702: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2703-2703: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2704-2704: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2705-2705: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2706-2706: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2707-2707: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2708-2708: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2709-2709: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2710-2710: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2712-2712: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2713-2713: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2715-2715: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2716-2716: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2717-2717: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2718-2718: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2719-2719: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2720-2720: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2721-2721: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2724-2724: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2725-2725: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2727-2727: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2728-2728: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2731-2731: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2732-2732: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2733-2733: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2734-2734: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2735-2735: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2736-2736: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2737-2737: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2738-2738: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2740-2740: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2741-2741: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2742-2742: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2748-2748: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2751-2751: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2757-2757: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2765-2765: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2766-2766: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2767-2767: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2768-2768: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2776-2776: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2783-2783: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2784-2784: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2791-2791: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2793-2793: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2797-2797: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2798-2798: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2800-2800: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2808-2808: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2810-2810: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2811-2811: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2817-2817: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2825-2825: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2826-2826: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2827-2827: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2828-2828: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2829-2829: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2830-2830: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2831-2831: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2832-2832: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2833-2833: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2834-2834: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2835-2835: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2836-2836: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2837-2837: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2838-2838: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2840-2840: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2841-2841: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2843-2843: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2844-2844: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2845-2845: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2846-2846: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2847-2847: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2848-2848: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2849-2849: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2850-2850: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2851-2851: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2852-2852: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2854-2854: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2855-2855: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2858-2858: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2859-2859: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2860-2860: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2861-2861: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2862-2862: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2863-2863: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2864-2864: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2865-2865: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2866-2866: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2867-2867: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2868-2868: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2869-2869: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2870-2870: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2871-2871: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2872-2872: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2873-2873: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2878-2878: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2879-2879: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2880-2880: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2881-2881: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2882-2882: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2883-2883: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2885-2885: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2887-2887: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2901-2901: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2902-2902: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2903-2903: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2908-2908: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2909-2909: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2910-2910: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2914-2914: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2915-2915: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2916-2916: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2917-2917: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2918-2918: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2919-2919: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2922-2922: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2923-2923: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2924-2924: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2925-2925: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2926-2926: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2927-2927: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2928-2928: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2929-2929: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2930-2930: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2932-2932: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2934-2934: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2936-2936: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2941-2941: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2942-2942: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2943-2943: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2944-2944: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2945-2945: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2946-2946: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2947-2947: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2948-2948: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2949-2949: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2950-2950: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2951-2951: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2952-2952: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2953-2953: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2954-2954: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2955-2955: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2956-2956: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2957-2957: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2958-2958: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2959-2959: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2960-2960: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2961-2961: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


187-187: Expected: 0 or 2; Actual: 1 (MD009, no-trailing-spaces)
Trailing spaces


230-230: Expected: 0 or 2; Actual: 1 (MD009, no-trailing-spaces)
Trailing spaces


1139-1139: null (MD024, no-duplicate-heading)
Multiple headings with the same content


1929-1929: null (MD024, no-duplicate-heading)
Multiple headings with the same content


1687-1687: null (MD034, no-bare-urls)
Bare URL used


1717-1717: null (MD034, no-bare-urls)
Bare URL used


2664-2664: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2752-2752: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2754-2754: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2759-2759: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2761-2761: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2771-2771: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2773-2773: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2778-2778: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2786-2786: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2803-2803: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2805-2805: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2813-2813: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2819-2819: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2889-2889: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2892-2892: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2895-2895: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2897-2897: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2937-2937: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


1058-1058: null (MD038, no-space-in-code)
Spaces inside code span elements


2705-2705: null (MD038, no-space-in-code)
Spaces inside code span elements


2705-2705: null (MD038, no-space-in-code)
Spaces inside code span elements

Additional comments not posted (26)
x/simulation/log.go (2)

28-32: The addition of Seed, wMtx, and written fields in StandardLogWriter struct is a good practice for managing state and concurrency in logging.


60-66: The method createLogFile uses a dynamic file naming scheme based on the seed and timestamp, which is useful for traceability in simulations. However, ensure that the environment variable $HOME is always set as expected in your deployment environments.

Verification successful

The $HOME environment variable is set as expected in the deployment environment.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Check if $HOME environment variable is set
echo "HOME environment variable is set to: $HOME"

Length of output: 112

x/simulation/operation.go (2)

26-35: Adding BlockTime to OperationEntry enhances the logging detail by including temporal context, which is beneficial for debugging and auditing simulation runs.


41-57: The methods BeginBlockEntry, EndBlockEntry, MsgEntry, and QueuedMsgEntry now include blockTime, improving the granularity of operation logs. Ensure that all callers of these functions are updated to pass the correct blockTime.

Verification successful

The calls to BeginBlockEntry, EndBlockEntry, MsgEntry, and QueuedMsgEntry in x/simulation/simulate.go are correctly passing the blockTime parameter. Here are the relevant lines:

  • logWriter.AddEntry(BeginBlockEntry(blockTime, blockHeight))
  • logWriter.AddEntry(EndBlockEntry(blockTime, blockHeight))
  • logWriter.AddEntry(MsgEntry(header.Time, header.Height, int64(i), opMsg))
  • logWriter.AddEntry(QueuedMsgEntry(blockTime, int64(height), opMsg))
  • logWriter.AddEntry(QueuedMsgEntry(currentTime, int64(height), opMsg))

These lines confirm that the blockTime parameter is being correctly passed to the modified functions.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Search for usages of the modified functions to ensure they are called with the correct parameters.
ast-grep --lang go --pattern $'func $_($_, $_, $_, $_, $_) {
  $$$
}'

Length of output: 12316



Script:

#!/bin/bash
# Search for calls to the modified functions to ensure they are called with the correct parameters.
rg 'BeginBlockEntry\(|EndBlockEntry\(|MsgEntry\(|QueuedMsgEntry\(' --glob '*.go'

Length of output: 1008



Script:

#!/bin/bash
# Display the relevant lines from x/simulation/simulate.go to verify the parameters passed to the modified functions.
rg -A 3 -B 3 'BeginBlockEntry\(|EndBlockEntry\(|MsgEntry\(|QueuedMsgEntry\(' x/simulation/simulate.go

Length of output: 1055

testutils/sims/runner.go (2)

59-74: The Run function correctly delegates to RunWithSeeds using default seeds. Adding t.Helper() is a good practice for clearer test output. Ensure that the RunWithSeeds function is robust and handles all edge cases as it's central to simulation testing.


167-209: The NewSimulationAppInstance function sets up a new simulation app instance with detailed logging and database management. Ensure that the database cleanup in t.Cleanup is tested to handle potential errors during closure.

simapp/sim_test.go (2)

54-55: The TestFullAppSimulation function is a straightforward entry point for running full app simulations. Ensure that the NewSimApp and setupStateFactory functions are correctly implemented as they are critical to the test's setup.

Verification successful

The setupStateFactory function is implemented in simapp/sim_test.go and appears to be correctly setting up the simulation state factory using the provided SimApp instance.

  • NewSimApp is implemented in simapp/app_di.go and simapp/app.go, and it sets up various components and modules of the application.
  • setupStateFactory is implemented in simapp/sim_test.go and sets up the simulation state factory using the SimApp instance.

Both functions are implemented correctly and are critical to the test's setup.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Verify the implementation of NewSimApp and setupStateFactory.
ast-grep --lang go --pattern $'func NewSimApp($_, $_, $_, $_, $_, $_) $_ {
  $$$
}'

Length of output: 38822



Script:

#!/bin/bash
# Verify the implementation of setupStateFactory.
ast-grep --lang go --pattern $'func setupStateFactory($_) $_ {
  $$$
}'

Length of output: 576


66-101: The TestAppImportExport function tests the import and export functionality of the app state. The detailed logging and error handling are commendable. However, ensure that the GenesisState type is defined and correctly used in the unmarshalling process.

Verification successful

The import statements in simapp/sim_test.go do not explicitly import a GenesisState type. Given the context, it is likely that the GenesisState type is being used from one of the imported modules, particularly those related to the Cosmos SDK.

To ensure that the correct GenesisState type is being used in the TestAppImportExport function, we should verify the usage of GenesisState within the file and trace its origin.


The GenesisState type is used in simapp/sim_test.go, but its origin is not clear from the import statements or the direct usage. To trace its origin, we need to identify where GenesisState is defined or imported in the context of this file.

Let's search for the definition or import of GenesisState within the file to ensure it is correctly used.


The search results show the usage of GenesisState but do not provide information about its definition or import. Since GenesisState is a common type name and is used across multiple modules, it is crucial to identify its exact origin to ensure it is correctly used in the TestAppImportExport function.

To achieve this, we should search for the GenesisState type definition across the entire codebase and correlate it with the context of simapp/sim_test.go.


The GenesisState type is defined in multiple files across different modules. To pinpoint the exact GenesisState type used in simapp/sim_test.go, we need to correlate the imports in simapp/sim_test.go with the modules where GenesisState is defined.

Given the import statements and the common usage of GenesisState in Cosmos SDK modules, it is likely that the GenesisState type is imported from one of the modules related to staking, slashing, or other core functionalities.

To confirm this, let's search for the usage of GenesisState in the files where it is defined and see if any of these files are imported in simapp/sim_test.go.


The GenesisState type is defined in multiple files across different modules, and it is crucial to identify the correct one used in simapp/sim_test.go. Given the import statements and the context of the test function, it is likely that the GenesisState type is related to one of the core modules such as staking, slashing, or another core functionality.

To confirm this, we should search for the GenesisState type usage within the simapp directory to see if it provides any clues about its origin.


The search results indicate that GenesisState is defined within the simapp directory itself, specifically in simapp/genesis.go as:

// GenesisState of the blockchain is represented here as a map of raw json
type GenesisState map[string]json.RawMessage

This confirms that the GenesisState used in simapp/sim_test.go is a local definition within the simapp package and not imported from another module.

Therefore, the review comment's concern about ensuring the GenesisState type is defined and correctly used in the unmarshalling process is addressed. The GenesisState type is indeed defined locally and used appropriately.

  • simapp/genesis.go: type GenesisState map[string]json.RawMessage
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Check for the definition and usage of GenesisState.
ast-grep --lang go --pattern $'type GenesisState struct {
  $$$
}'

Length of output: 48440



Script:

#!/bin/bash
# Check the import statements in simapp/sim_test.go to identify the source of GenesisState.
rg 'import' simapp/sim_test.go

Length of output: 107



Script:

#!/bin/bash
# Correctly capture the import statements in simapp/sim_test.go to identify the source of GenesisState.
sed -n '/import (/,/)/p' simapp/sim_test.go

Length of output: 1036



Script:

#!/bin/bash
# Search for the usage of GenesisState in simapp/sim_test.go to trace its origin.
rg 'GenesisState' simapp/sim_test.go

Length of output: 68



Script:

#!/bin/bash
# Search for the definition or import of GenesisState within simapp/sim_test.go.
rg 'GenesisState' -A 5 simapp/sim_test.go

Length of output: 401



Script:

#!/bin/bash
# Search for the definition of GenesisState across the entire codebase to identify its origin.
rg 'type GenesisState struct' --files-with-matches

Length of output: 1551



Script:

#!/bin/bash
# Search for the usage of GenesisState in the files where it is defined to correlate with simapp/sim_test.go.
rg 'GenesisState' x/staking/types/genesis.pb.go x/slashing/types/genesis.pb.go x/protocolpool/types/genesis.pb.go x/mint/types/genesis.pb.go x/group/genesis.pb.go x/nft/genesis.pb.go x/gov/types/v1/genesis.pb.go x/gov/types/v1beta1/genesis.pb.go x/feegrant/genesis.pb.go x/evidence/types/genesis.pb.go x/genutil/types/genesis.pb.go x/distribution/types/genesis.pb.go x/crisis/types/genesis.pb.go x/bank/types/genesis.pb.go x/circuit/types/types.pb.go x/auth/types/genesis.pb.go x/authz/genesis.pb.go

Length of output: 38995



Script:

#!/bin/bash
# Search for the usage of GenesisState within the simapp directory to identify its origin.
rg 'GenesisState' simapp/

Length of output: 1536

x/simulation/simulate.go (3)

Line range hint 63-76: Refactor to maintain backward compatibility while introducing enhanced logging and error handling.

The refactoring of SimulateFromSeed to maintain backward compatibility while delegating to the new SimulateFromSeedX function is well-handled. This approach ensures that existing codebases that depend on this function can continue to operate without modification.


78-93: Introduced a more robust simulation testing function with enhanced parameters.

The introduction of SimulateFromSeedX provides a more robust and flexible framework for simulation testing, accommodating a wider range of parameters and improving the overall structure and readability of the code.


180-180: Enhance the panic recovery process by adding more detailed logging.

- logger.Error("simulation halted due to panic", "height", blockHeight)
+ logger.Error("simulation halted due to panic", "height", blockHeight, "error", r)

This enhancement in logging during panic recovery could help in diagnosing issues post-mortem by providing more detailed information about the context and nature of the error.

Likely invalid or redundant comment.

x/gov/simulation/operations.go (8)

47-57: Introduced sharedState with atomic operations for thread-safe ID management. This is a good practice for concurrent simulations.


135-148: Initialization and usage of sharedState in simulation operations are correctly implemented. This ensures that the proposal ID is managed consistently across different simulation operations.


343-350: The integration of sharedState in SimulateMsgDeposit for managing proposal IDs is correctly implemented. This helps in maintaining consistency in proposal ID usage across simulations.


Line range hint 410-422: The integration of sharedState in SimulateMsgVote is correctly implemented, ensuring consistent proposal ID management across voting simulations.


Line range hint 479-491: The integration of sharedState in SimulateMsgVoteWeighted is correctly implemented. This ensures consistent proposal ID management across weighted voting simulations.


680-684: The randomProposalID function correctly uses sharedState to manage the range of proposal IDs, ensuring that simulations do not accidentally reuse or conflict with existing proposal IDs.


Line range hint 1-684: Overall, the file is well-structured and follows the Uber Golang style guide. The use of sharedState enhances the modularity and safety of the simulation operations.


22-22: Ensure that the value of unsetProposalID is appropriately large to avoid conflicts with actual proposal IDs.

Verification successful

The search results indicate that proposal IDs are used in various parts of the codebase, but there is no evidence of actual proposal IDs reaching the magnitude of 100000000000000. The highest range observed in the simulation code is within the hundreds.

  • x/gov/simulation/genesis.go: startingProposalID := uint64(simState.Rand.Intn(100))

Given this context, the value of unsetProposalID set to 100000000000000 is appropriately large and should not conflict with any actual proposal IDs used in the system.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `unsetProposalID` is not used as a real proposal ID in the database.

# Test: Search for the `unsetProposalID` in the database. Expect: No occurrences.
rg --type go $'100000000000000' --files-with-matches | xargs cat | grep 'ProposalID'

Length of output: 1059



Script:

#!/bin/bash
# Description: Verify the range of actual proposal IDs used in the system to ensure no conflict with `unsetProposalID`.

# Test: Search for the usage of proposal IDs in the codebase to understand their range.
rg --type go 'ProposalID' | grep -E '(\d+)' | sort -u

Length of output: 4670

x/group/simulation/operations.go (6)

25-25: The constant unsetGroupID is defined correctly and follows Go naming conventions.


82-92: Introduced a sharedState struct with atomic operations for thread-safe manipulation of minGroupID. This is a good use of atomic operations to ensure thread safety in a concurrent environment.


163-165: Initialization of sharedState and setting minGroupID to unsetGroupID is correctly implemented. This ensures that the initial state is set up properly before any operations are performed.


171-171: The simulation operations for various group-related messages are correctly set up with the new sharedState parameter. This change is crucial for maintaining state consistency across different simulation runs.

Also applies to: 182-182, 193-193, 197-197, 201-201, 205-205, 209-209, 213-213, 217-217, 221-221, 225-225, 229-229


366-366: The addition of sharedState to the function parameters across various simulation operations is consistent and necessary for the new simulation architecture. This ensures that all operations can access and modify the shared state as needed.

Also applies to: 438-438, 525-525, 599-599, 660-660, 751-751, 825-825, 899-899, 960-960, 1076-1076, 1189-1189, 1274-1274


1341-1343: The logic to set minGroupID if it is unset or to adjust it based on the current group sequence is correctly implemented using atomic operations. This is a critical part of ensuring that the simulation state remains consistent and accurate.

CHANGELOG.md (1)

197-197: Ensure proper markdown formatting by adding blank lines around headings and lists.

+ * (perf)[#20490](https://github.com/cosmos/cosmos-sdk/pull/20490) Sims: Replace runsim command with Go stdlib testing. CLI: `Commit` default true, `Lean`, `SimulateEveryOperation`, `PrintAllInvariants`, `DBBackend` params removed
+
### CLI Breaking Changes
+ * (server) [#18303](https://github.com/cosmos/cosmos-sdk/pull/18303) `appd export` has moved with other genesis commands, use `appd genesis export` instead.
+
### Deprecated

tests/sims/gov/operations_test.go Outdated Show resolved Hide resolved
tests/sims/gov/operations_test.go Outdated Show resolved Hide resolved
tests/sims/gov/operations_test.go Outdated Show resolved Hide resolved
testutils/sims/runner.go Outdated Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
x/simulation/simulate.go Show resolved Hide resolved
simapp/sim_test.go Show resolved Hide resolved
Copy link
Contributor

@raynaudoe raynaudoe left a comment

Choose a reason for hiding this comment

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

LGTM!
left a few minor comments

simtypes.RandomAccounts, // Replace with own random account function if using keys other than secp256k1
simtestutil.SimulationOperations(app, app.AppCodec(), config),
simtypes.RandomAccounts,
simtestutil.SimulationOperations(app, app.AppCodec(), config, app.txConfig),
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe this can be simplified to just passing app and config ?
There's a getter for txConfig inside app if I'm not mistaken

Copy link
Contributor Author

@alpe alpe Jun 13, 2024

Choose a reason for hiding this comment

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

Good 👁️
It could be simplified for simapp but creates new dependencies. This would also make it hard to re-use in other projects.
A common approach is to copy from the simapp folder and replace the simapp type with the custom app type. AuthKeeper and StakingKeeper don't have getters in app.

simapp/sim_test.go Outdated Show resolved Hide resolved
AppStateBytes: exported.AppState,
ChainId: sims.SimAppChainID,
})
if IsEmptyValidatorSetErr(err) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Shouldn't this be a config value defined somewhere, so it can be known in advanced if the test is running without validators? should somehow retry this test?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

There are multiple seeds executed. Some may cause all the validators to undelegate/ jail. In fuzz tests, this is not necessarily a failure scenario. We accept that the test run is not realistic and can not be completed as defined. We just skip this seed and move on. It would only be a problem, when all seed get into this state.

if config.Commit {
simtestutil.PrintStats(db)
func TestAppStateDeterminism(t *testing.T) {
const numTimesToRunPerSeed = 3
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe this value can be externally set, for example CI for releases could use a higher value for a more "secure" coverage.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The 3 was in the original code. Not sure if a higher value is the best way for a higher probability of collusions. You can also argue, adding more TX or blocks increases the probability.
I don't have a strong opinion but I want to avoid adding another CLI flag in this PR. Let's iterate on this.

appSimLogger := make(map[int64][]simulation.LogWriter)
captureAndCheckHash := func(t *testing.T, ti sims.TestInstance[*SimApp]) {
seed, appHash := ti.Cfg.Seed, ti.App.LastCommitID().Hash
mx.Lock()
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 lock be set before getting the seed and appHash since are shared resources among the test instances?

Copy link
Contributor Author

@alpe alpe Jun 13, 2024

Choose a reason for hiding this comment

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

The TestInstance object and their data is not shared between instances. It is created for each seed in the runner.

types/simulation/config.go Outdated Show resolved Hide resolved
alpe added 3 commits June 13, 2024 16:25
* main:
  fix(x/staking): stop validators from rotating to the same key on the same block (#20649)
  perf: add cache to address codec (#20122)
  build(deps): Bump google.golang.org/protobuf from 1.34.1 to 1.34.2 (#20632)
  fix: remove recipient amount from map (#20625)
  fix(proto): remove conditional preventing proper generated file placement (#20650)
  (serverv2/cometbft) Read config from commands & handle `FlagNode` (#20621)
  fix(x/consensus): fix .proto file placement (#20646)
  fix(store): avoid nil error on not exhausted payload stream (#20644)
  fix (x/accounts): Fix genesis condition check (#20645)
  feat(accounts): add genesis account initialization (#20642)
  fix(x/gov): limit execution in gov (#20348)
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: 13

Outside diff range and nitpick comments (5)
x/simulation/simulate.go (1)

Line range hint 78-283: The SimulateFromSeedX function is comprehensive and handles various simulation scenarios. However, consider adding detailed documentation to explain its functionality and parameters for better maintainability and understanding.

tests/sims/gov/operations_test.go (1)

Line range hint 36-36: Add t.Helper() at the beginning of the createTestSuite function to improve test failure reporting.

func createTestSuite(t *testing.T, isCheckTx bool) (suite, sdk.Context) {
+  t.Helper()
   res := suite{}
   ...
}
x/group/simulation/operations_test.go (1)

Line range hint 36-36: Please add t.Helper() at the start of the SetupTest method to mark it as a helper function. This improves error reporting in test cases by attributing errors to the calling function rather than inside the helper.

func (suite *SimTestSuite) SetupTest() {
+ t.Helper()
  app, err := simtestutil.Setup(
    depinject.Configs(
      grouptestutil.AppConfig,
      depinject.Supply(log.NewNopLogger()),
    ),
    &suite.codec,
    &suite.interfaceRegistry,
    &suite.txConfig,
    &suite.accountKeeper,
    &suite.bankKeeper,
    &suite.groupKeeper,
  )
  suite.Require().NoError(err)
x/group/simulation/operations.go (2)

25-25: Define the purpose of unsetGroupID constant clearly in a comment.

Adding a comment explaining the purpose and usage of unsetGroupID will improve code readability and maintainability.


Line range hint 36-36: Add t.Helper() at the beginning of the test helper function.

+ t.Helper()

Per the golangci-lint hint, adding t.Helper() will make the output of failing tests more informative by marking the function as a helper, which improves debugging.

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 1eccdec and e79d9cf.

Files selected for processing (8)
  • simapp/sim_test.go (4 hunks)
  • tests/sims/gov/operations_test.go (3 hunks)
  • testutils/sims/runner.go (1 hunks)
  • types/simulation/config.go (2 hunks)
  • x/gov/simulation/operations.go (14 hunks)
  • x/group/simulation/operations.go (20 hunks)
  • x/group/simulation/operations_test.go (12 hunks)
  • x/simulation/simulate.go (20 hunks)
Files not summarized due to errors (2)
  • types/simulation/config.go: Error: Server error. Please try again later.
  • x/group/simulation/operations_test.go: Error: Server error. Please try again later.
Additional context used
Path-based instructions (8)
types/simulation/config.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

testutils/sims/runner.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

simapp/sim_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/simulation/simulate.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

tests/sims/gov/operations_test.go (3)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern tests/**/*: "Assess the integration and e2e test code assessing sufficient code coverage for the changes associated in the pull request"


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/gov/simulation/operations.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

x/group/simulation/operations_test.go (2)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.


Pattern **/*_test.go: "Assess the unit test code assessing sufficient code coverage for the changes associated in the pull request"

x/group/simulation/operations.go (1)

Pattern **/*.go: Review the Golang code for conformity with the Uber Golang style guide, highlighting any deviations.

Learnings (1)
x/simulation/simulate.go (2)
User: alpe
PR: cosmos/cosmos-sdk#20490
File: x/simulation/simulate.go:78-78
Timestamp: 2024-06-07T07:40:09.804Z
Learning: The use of `math/rand` instead of `crypto/rand` in `x/simulation/simulate.go` is intentional as per user `alpe`.
User: alpe
PR: cosmos/cosmos-sdk#20490
File: x/simulation/simulate.go:248-249
Timestamp: 2024-06-13T13:11:15.318Z
Learning: Error handling for `app.Commit()` in `x/simulation/simulate.go` is implemented correctly and should not be flagged as an issue in future reviews.
golangci-lint
types/simulation/config.go

36-36: test helper function should start from t.Helper() (thelper)

testutils/sims/runner.go

36-36: test helper function should start from t.Helper() (thelper)

simapp/sim_test.go

36-36: test helper function should start from t.Helper() (thelper)

x/simulation/simulate.go

36-36: test helper function should start from t.Helper() (thelper)

tests/sims/gov/operations_test.go

36-36: test helper function should start from t.Helper() (thelper)

x/gov/simulation/operations.go

36-36: test helper function should start from t.Helper() (thelper)

x/group/simulation/operations_test.go

36-36: test helper function should start from t.Helper() (thelper)

x/group/simulation/operations.go

36-36: test helper function should start from t.Helper() (thelper)

Additional comments not posted (36)
testutils/sims/runner.go (1)

59-59: Good use of generics to abstract the simulation app type, enhancing code reusability across different simulation scenarios.

simapp/sim_test.go (1)

54-54: Ensure that the NewSimApp function is defined and correctly handles the simulation app's instantiation.

Verification successful

The NewSimApp function is defined in both simapp/app_di.go and simapp/app.go. Both implementations appear to correctly handle the instantiation and setup of the simulation app, including initializing necessary components and modules.

  • simapp/app_di.go:120-307
  • simapp/app.go:195-607
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Search for the definition of `NewSimApp` to ensure it's correctly implemented.
ast-grep --lang go --pattern $'func NewSimApp($_, $_, $_, $_, $_, $_) $_ { $$$ }' ./simapp/*

Length of output: 39355

x/simulation/simulate.go (7)

99-99: The use of math/rand is intentional here for non-cryptographic purposes, as previously discussed with alpe. This is suitable for the simulation's context.


127-127: Proper error handling is implemented here. The function returns an error if the address conversion fails, which is a good practice.


181-181: The error handling for panic recovery here is adequate, ensuring that the simulation halts and logs are printed. This aids in diagnosing issues effectively.


202-202: The error message here is clear and follows best practices by wrapping the underlying error, which aids in debugging.


249-250: The error handling for the app.Commit() operation is implemented correctly as previously discussed with alpe. This ensures that any issues during commit are properly logged and handled.


Line range hint 61-77: The SimulateFromSeed function is marked for backward compatibility only. Ensure that all references in the codebase are updated to use SimulateFromSeedX to leverage the enhanced functionality.

Verification successful

All references to SimulateFromSeed have been updated to SimulateFromSeedX, except for the function definition itself in x/simulation/simulate.go, which is expected.

  • x/simulation/simulate.go: Function definition of SimulateFromSeed.
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that all references to `SimulateFromSeed` are updated to `SimulateFromSeedX`.

# Test: Search for references to `SimulateFromSeed`. Expect: No occurrences except in the declaration.
rg --type go $'SimulateFromSeed'

Length of output: 970


18-18: Please update the logger import path to match the suggested import by tac0turtle for consistency and to leverage the correct logger functionalities.

- "cosmossdk.io/core/log"
+ "cosmossdk.io/core/log"

Likely invalid or redundant comment.

tests/sims/gov/operations_test.go (3)

271-271: Correctly passed simulation.NewSharedState() in SimulateMsgDeposit function.


315-315: Correctly passed simulation.NewSharedState() in SimulateMsgVote function.


357-357: Correctly passed simulation.NewSharedState() in SimulateMsgVoteWeighted function.

x/gov/simulation/operations.go (9)

22-22: Introducing unsetProposalID as a constant is a good practice for code clarity and maintainability.


47-65: Introduced a SharedState struct to manage the minimum proposal ID across simulations. This encapsulation enhances modularity and thread safety with atomic operations.


143-155: Refactored simulation operations to use the new SharedState. This change improves the consistency of proposal ID handling across different simulation functions.


350-357: The SimulateMsgDeposit function now correctly uses the shared state for proposal ID management. This change is crucial for maintaining state consistency across simulation runs.


Line range hint 417-429: The SimulateMsgVote function's refactoring to use SharedState is a positive change, ensuring that the proposal ID is managed consistently.


Line range hint 486-498: Similar to the SimulateMsgVote, the SimulateMsgVoteWeighted function's use of SharedState for managing proposal IDs improves the reliability and maintainability of the simulation tests.


550-550: The SimulateMsgCancelProposal function appears to be well-implemented with checks for proposal existence and status. This careful handling ensures that the function behaves as expected under various conditions.


687-691: The randomProposalID function's integration with SharedState for managing the proposal ID range is a smart design choice, providing a more robust mechanism for ID generation.


336-336: The operation operationSimulateMsgVote should use t.Helper() at the start of the function to mark it as a test helper. This is a best practice for clearer test failure messages.

336a337,338
> 	t.Helper()
>

Likely invalid or redundant comment.

x/group/simulation/operations_test.go (12)

196-196: The introduction of simulation.NewSharedState() improves modularity by managing shared state across simulations. This is a good practice as it helps maintain the state consistency and isolates the state management.


243-243: The addition of simulation.NewSharedState() in SimulateMsgSubmitProposal is consistent with other operations, ensuring that all simulation functions use a shared state appropriately.


303-303: Using simulation.NewSharedState() in SimulateMsgWithdrawProposal enhances the function's ability to handle shared state effectively, which is crucial for maintaining consistency in simulation outcomes.


364-364: In SimulateMsgVote, the use of simulation.NewSharedState() aligns with the pattern used in other simulation operations, promoting consistency and better state management.


433-433: The consistent use of simulation.NewSharedState() in SimulateMsgExec aligns with the improvements made across other simulation operations, ensuring that state management is handled uniformly.


469-469: The addition of simulation.NewSharedState() in SimulateMsgUpdateGroupAdmin is a positive change, ensuring that state is managed effectively across different simulation operations.


505-505: In SimulateMsgUpdateGroupMetadata, the introduction of simulation.NewSharedState() helps in managing the simulation state more effectively, which is critical for achieving consistent simulation results.


541-541: The use of simulation.NewSharedState() in SimulateMsgUpdateGroupMembers is a good practice, ensuring that the simulation state is managed consistently across operations.


588-588: SimulateMsgUpdateGroupPolicyAdmin using simulation.NewSharedState() demonstrates a consistent approach to state management across simulation operations, which is crucial for maintaining the integrity of simulation results.


635-635: The introduction of simulation.NewSharedState() in SimulateMsgUpdateGroupPolicyDecisionPolicy aligns with the improvements in state management seen in other parts of the simulation operations.


682-682: Using simulation.NewSharedState() in SimulateMsgUpdateGroupPolicyMetadata ensures consistent state management across simulations, which is crucial for maintaining the accuracy and reliability of the simulations.


745-745: The consistent application of simulation.NewSharedState() in SimulateMsgLeaveGroup aligns with the pattern used in other simulation operations, promoting effective and uniform state management.

x/group/simulation/operations.go (3)

82-92: Introduced SharedState struct for managing group IDs across simulations.

This change aligns with the PR's objective to enhance the simulation framework by using shared state management.


Line range hint 1344-1386: Refactored randomGroup and randomGroupPolicy to utilize SharedState.

These refactoring changes enhance the modularity and reusability of the simulation functions by integrating shared state management, which is crucial for maintaining consistent state across simulations.


Line range hint 171-236: Ensure that SharedState is properly utilized in all operations that require group ID management.

Verification successful

The search results show that SharedState is indeed referenced multiple times within the x/group/simulation/operations.go file. This suggests that SharedState is actively used in the relevant operations.

  • SharedState is defined and instantiated.
  • It is passed to multiple functions, indicating its usage.

Given these findings, it appears that SharedState is properly utilized in the operations that require group ID management within the x/group/simulation/operations.go file.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `SharedState` is used consistently across all relevant operations.

# Test: Search for operations that should use `SharedState` but don't.
rg --type go $'func SimulateMsg.*\(.*\) \{.*SharedState.*\}'

Length of output: 61



Script:

#!/bin/bash
# Step 1: List all SimulateMsg functions in the codebase.
rg --type go --no-heading -o -N 'func SimulateMsg\w+\('

# Step 2: Check for SharedState usage in these functions.
rg --type go --no-heading 'SharedState' | grep -E 'func SimulateMsg\w+\('

Length of output: 3356



Script:

#!/bin/bash
# Step 1: Check for SharedState usage in the x/group/simulation/operations.go file.
rg --no-heading 'SharedState' x/group/simulation/operations.go

Length of output: 685

types/simulation/config.go Show resolved Hide resolved
@@ -1,5 +1,7 @@
package simulation

import "testing"
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider grouping imports for better readability and maintenance.

import (
+ "testing"
)

Committable suggestion was skipped due to low confidence.

Comment on lines +27 to +29
FuzzSeed []byte
T testing.TB
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Adding the FuzzSeed and T directly to the Config struct might expose testing structures in production configurations. Consider encapsulating these within a struct that is only built with testing tags.

type Config struct {
  ...
+ // FuzzSeed used for testing purposes
+ FuzzSeed    []byte `json:"-"` // Exclude from JSON operations
+ // T is the testing object
+ T           testing.TB `json:"-"` // Exclude from JSON operations
}

Committable suggestion was skipped due to low confidence.

params := RandomParams(r)

fmt.Fprintf(w, "Starting SimulateFromSeed with randomness created with seed %d\n", int(config.Seed))
fmt.Fprintf(w, "Randomized simulation params: \n%s\n", mustMarshalJSONIndent(params))
startTime := time.Now()
Copy link
Contributor

Choose a reason for hiding this comment

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

The use of time.Now() here introduces non-determinism which is critical in blockchain simulations. Consider replacing it with a deterministic time source or making it configurable.

- startTime := time.Now()
+ startTime := // Add deterministic or configurable time source

Committable suggestion was skipped due to low confidence.

}

if proposerAddress == nil {
fmt.Fprintf(w, "\nSimulation stopped early as all validators have been unbonded; nobody left to propose a block!\n")
stopEarly = true
logger.Info("Simulation stopped early as all validators have been unbonded; nobody left to propose a block", "height", blockHeight)
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider refining this log message to be more concise while still conveying the essential information. This can improve the readability and effectiveness of the logs.

- logger.Info("Simulation stopped early as all validators have been unbonded; nobody left to propose a block", "height", blockHeight)
+ logger.Info("Simulation halted: no validators left to propose blocks", "height", blockHeight)
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
logger.Info("Simulation stopped early as all validators have been unbonded; nobody left to propose a block", "height", blockHeight)
logger.Info("Simulation halted: no validators left to propose blocks", "height", blockHeight)

32, 123, 124, 582, 1893, 2989,
3012, 4728, 37827, 981928, 87821, 891823782,
989182, 89182391, 11, 22, 44, 77, 99, 2020,
3232, 123123, 124124, 582582, 18931893,
Copy link
Contributor

Choose a reason for hiding this comment

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

Ensure t.Helper() is called at the start of helper functions to improve error reporting in tests.

func RunWithSeeds[T SimulationApp](
  t *testing.T,
  ...
) {
+ t.Helper()
  ...
}

Committable suggestion was skipped due to low confidence.

Tools
golangci-lint

36-36: test helper function should start from t.Helper() (thelper)

for i := range seeds {
seed := seeds[i]
t.Run(fmt.Sprintf("seed: %d", seed), func(t *testing.T) {
t.Parallel()
Copy link
Contributor

Choose a reason for hiding this comment

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

Tip

Codebase Verification

The code around t.Parallel() indicates that there are instances of shared resources being used, such as the runLogger. The use of t.Parallel() in this context could potentially introduce race conditions, especially if these shared resources are accessed or modified concurrently.

  • Line 106: t.Parallel()
  • Shared resource: runLogger

This confirms the potential issue raised in the review comment.

  • : The use of t.Parallel() in testutils/sims/runner.go at line 106 can introduce race conditions due to shared resources like runLogger.
Analysis chain

Consider the implications of using t.Parallel() in fuzzing scenarios as discussed in previous comments. It may not be effective and could potentially introduce race conditions.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Check for potential race conditions when using t.Parallel() in fuzzing scenarios.
grep -rn "t.Parallel()" ./testutils/sims/runner.go

Length of output: 72



Script:

#!/bin/bash
# Search for variable declarations in testutils/sims/runner.go to identify potential shared state or resources.
grep -rnE 'var |const |type ' ./testutils/sims/runner.go

# Search for function calls and method invocations in testutils/sims/runner.go to identify potential concurrent access points.
grep -rnE '\w+\(' ./testutils/sims/runner.go

Length of output: 3322



Script:

#!/bin/bash
# Extract lines 100-120 of testutils/sims/runner.go to analyze the context around t.Parallel().
sed -n '100,120p' ./testutils/sims/runner.go

Length of output: 689

t.Log("importing genesis...\n")
newTestInstance := sims.NewSimulationAppInstance(t, ti.Cfg, NewSimApp)
newApp := newTestInstance.App
var genesisState GenesisState
Copy link
Contributor

Choose a reason for hiding this comment

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

Correctly define or import the GenesisState type used in JSON unmarshalling to avoid runtime errors.

- var genesisState GenesisState
+ var genesisState <correct_type>

Committable suggestion was skipped due to low confidence.


if config.Commit {
simtestutil.PrintStats(db)
func setupStateFactory(app *SimApp) sims.SimStateFactory {
Copy link
Contributor

Choose a reason for hiding this comment

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

Define or correct the SimApp type used in the setupStateFactory function signature.

- func setupStateFactory(app *SimApp) sims.SimStateFactory {
+ func setupStateFactory(app <correct_type>) sims.SimStateFactory {

Committable suggestion was skipped due to low confidence.

"non-determinism in seed %d: %d/%d, attempt: %d/%d\n", config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
)
}
func FuzzFullAppSimulation(f *testing.F) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider adding a minimum length check for rawSeed in FuzzFullAppSimulation to ensure sufficient entropy for the tests.

f.Fuzz(func(t *testing.T, rawSeed []byte) {
+ if len(rawSeed) < 8 {
+   t.Skip("Insufficient seed length")
+   return
+ }
  ...
})
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
func FuzzFullAppSimulation(f *testing.F) {
func FuzzFullAppSimulation(f *testing.F) {
f.Fuzz(func(t *testing.T, rawSeed []byte) {
if len(rawSeed) < 8 {
t.Skip("Insufficient seed length")
return
}
...
})
}

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: 1

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between e79d9cf and faccd45.

Files selected for processing (1)
  • CHANGELOG.md (1 hunks)
Additional context used
Path-based instructions (1)
CHANGELOG.md (1)

Pattern **/*.md: "Assess the documentation for misspellings, grammatical errors, missing documentation and correctness"

@@ -195,6 +195,7 @@ Every module contains its own CHANGELOG.md. Please refer to the module you are i

### CLI Breaking Changes

* (perf)[#20490](https://github.com/cosmos/cosmos-sdk/pull/20490) Sims: Replace runsim command with Go stdlib testing. CLI: `Commit` default true, `Lean`, `SimulateEveryOperation`, `PrintAllInvariants`, `DBBackend` params removed
Copy link
Contributor

Choose a reason for hiding this comment

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

Ensure proper markdown formatting by adding blank lines around headings and lists.

+ * (perf)[#20490](https://github.com/cosmos/cosmos-sdk/pull/20490) Sims: Replace runsim command with Go stdlib testing. CLI: `Commit` default true, `Lean`, `SimulateEveryOperation`, `PrintAllInvariants`, `DBBackend` params removed
+ * (server) [#18303](https://github.com/cosmos/cosmos-sdk/pull/18303) `appd export` has moved with other genesis commands, use `appd genesis export` instead.
+
### Deprecated

Committable suggestion was skipped due to low confidence.

Copy link
Contributor

@lucaslopezf lucaslopezf left a comment

Choose a reason for hiding this comment

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

Great work, just a comment, I'll leave it up to you

x/group/simulation/operations.go Show resolved Hide resolved
* main:
  feat(tx): port simappv2 changes (#20648)
  build(deps): Bump github.com/spf13/cobra from 1.8.0 to 1.8.1 (#20682)
  chore(proto): fix comments (#20679)
  (serverv2/cometbft) Commands support both json and yaml output (#20670)
  fix(x/staking,x/auth):  regenerate mock to fix test (#20684)
  docs: ADR 074: Msg v2 (#20618)
  fix: nested multisig signatures using CLI (#20438)
  chore: fix spelling errors (#20674)
  fix: align Dockerfile for build-push-action (#20672)
  fix: avoid build fail when make localnet-build-env (#20671)
  build(deps): Bump bufbuild/buf-setup-action from 1.32.2 to 1.33.0 (#20669)
  chore: make function comment match function names (#20666)
  chore(consensus): add cometInfo to consensus  (#20615)
  chore: fix typos (#20662)
  fix: Properly parse json in the wait-tx command. (#20631)
  fix(sims): check before sending RotateConsPubKey (#20659)
  test(types/address): add unit tests for the file types/address.go  (#20237)
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: 0

Review details

Configuration used: .coderabbit.yml
Review profile: CHILL

Commits

Files that changed from the base of the PR and between faccd45 and b74ab29.

Files selected for processing (1)
  • CHANGELOG.md (1 hunks)
Additional context used
Path-based instructions (1)
CHANGELOG.md (1)

Pattern **/*.md: "Assess the documentation for misspellings, grammatical errors, missing documentation and correctness"

Markdownlint
CHANGELOG.md

71-71: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


72-72: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


76-76: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


77-77: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


78-78: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


79-79: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


84-84: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


127-127: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


128-128: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


129-129: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


133-133: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


136-136: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


137-137: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


138-138: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


145-145: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


155-155: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


157-157: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


160-160: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


179-179: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


180-180: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


182-182: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


183-183: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


235-235: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


236-236: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


237-237: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


401-401: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


404-404: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


426-426: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


427-427: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


440-440: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


472-472: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


473-473: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


474-474: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


475-475: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


477-477: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


478-478: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


479-479: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


480-480: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


494-494: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


496-496: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


498-498: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


500-500: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


503-503: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


504-504: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


505-505: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


513-513: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


514-514: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


516-516: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


517-517: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


519-519: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


520-520: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


521-521: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


523-523: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


524-524: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


532-532: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


543-543: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


544-544: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


545-545: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


551-551: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


552-552: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


553-553: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


559-559: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


575-575: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


576-576: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


577-577: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


578-578: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


579-579: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


580-580: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


585-585: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


586-586: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


587-587: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


588-588: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


595-595: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


596-596: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


597-597: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


631-631: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


632-632: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


633-633: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


634-634: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


639-639: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


640-640: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


788-788: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


931-931: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


952-952: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


955-955: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1037-1037: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1038-1038: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1039-1039: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1040-1040: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1041-1041: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1042-1042: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1139-1139: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1225-1225: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1271-1271: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1277-1277: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1278-1278: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1279-1279: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1280-1280: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1281-1281: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1282-1282: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1382-1382: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1507-1507: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1508-1508: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1509-1509: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1510-1510: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1511-1511: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1512-1512: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1513-1513: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1514-1514: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1517-1517: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1518-1518: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1519-1519: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1520-1520: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1521-1521: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1522-1522: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


1771-1771: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1772-1772: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1773-1773: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1774-1774: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1775-1775: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1776-1776: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


1886-1886: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2223-2223: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2224-2224: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2225-2225: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2228-2228: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2229-2229: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2230-2230: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2252-2252: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2253-2253: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2254-2254: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2255-2255: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2256-2256: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2264-2264: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2265-2265: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2266-2266: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2267-2267: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2268-2268: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2270-2270: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2271-2271: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2272-2272: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2599-2599: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2600-2600: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2601-2601: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2602-2602: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2603-2603: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2605-2605: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2607-2607: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2608-2608: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2609-2609: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2610-2610: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2611-2611: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2612-2612: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2614-2614: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2615-2615: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2616-2616: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2619-2619: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2620-2620: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2621-2621: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2622-2622: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2623-2623: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2626-2626: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2629-2629: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2632-2632: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2633-2633: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2636-2636: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2643-2643: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2644-2644: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2645-2645: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2646-2646: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2647-2647: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2649-2649: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2650-2650: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2651-2651: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2652-2652: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2653-2653: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2654-2654: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2655-2655: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2656-2656: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2657-2657: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2660-2660: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2661-2661: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2662-2662: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2663-2663: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2664-2664: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2665-2665: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2672-2672: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2673-2673: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2674-2674: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2675-2675: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2682-2682: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2684-2684: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2686-2686: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2687-2687: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2688-2688: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2689-2689: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2690-2690: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2691-2691: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2692-2692: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2693-2693: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2694-2694: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2695-2695: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2696-2696: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2697-2697: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2698-2698: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2699-2699: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2700-2700: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2701-2701: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2702-2702: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2703-2703: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2704-2704: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2705-2705: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2706-2706: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2707-2707: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2708-2708: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2709-2709: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2710-2710: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2711-2711: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2712-2712: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2714-2714: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2715-2715: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2717-2717: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2718-2718: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2719-2719: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2720-2720: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2721-2721: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2722-2722: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2723-2723: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2726-2726: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2727-2727: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2729-2729: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2730-2730: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2733-2733: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2734-2734: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2735-2735: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2736-2736: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2737-2737: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2738-2738: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2739-2739: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2740-2740: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2742-2742: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2743-2743: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2744-2744: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2750-2750: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2753-2753: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2759-2759: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2767-2767: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2768-2768: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2769-2769: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2770-2770: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2778-2778: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2785-2785: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2786-2786: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2793-2793: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2795-2795: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2799-2799: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2800-2800: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2802-2802: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2810-2810: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2812-2812: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2813-2813: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2819-2819: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2827-2827: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2828-2828: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2829-2829: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2830-2830: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2831-2831: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2832-2832: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2833-2833: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2834-2834: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2835-2835: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2836-2836: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2837-2837: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2838-2838: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2839-2839: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2840-2840: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2842-2842: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2843-2843: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2845-2845: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2846-2846: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2847-2847: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2848-2848: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2849-2849: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2850-2850: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2851-2851: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2852-2852: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2853-2853: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2854-2854: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2856-2856: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2857-2857: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2860-2860: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2861-2861: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2862-2862: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2863-2863: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2864-2864: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2865-2865: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2866-2866: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2867-2867: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2868-2868: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2869-2869: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2870-2870: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2871-2871: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2872-2872: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2873-2873: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2874-2874: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2875-2875: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2880-2880: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2881-2881: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2882-2882: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2883-2883: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2884-2884: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2885-2885: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2887-2887: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2889-2889: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2903-2903: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2904-2904: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2905-2905: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2910-2910: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2911-2911: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2912-2912: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2916-2916: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2917-2917: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2918-2918: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2919-2919: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2920-2920: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2921-2921: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2924-2924: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2925-2925: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2926-2926: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2927-2927: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2928-2928: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2929-2929: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2930-2930: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2931-2931: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2932-2932: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2934-2934: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2936-2936: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2938-2938: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2943-2943: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2944-2944: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2945-2945: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2946-2946: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2947-2947: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2948-2948: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2949-2949: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2950-2950: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2951-2951: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2952-2952: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2953-2953: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2954-2954: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2955-2955: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2956-2956: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2957-2957: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2958-2958: Expected: 4; Actual: 8 (MD007, ul-indent)
Unordered list indentation


2959-2959: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2960-2960: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2961-2961: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2962-2962: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


2963-2963: Expected: 2; Actual: 4 (MD007, ul-indent)
Unordered list indentation


189-189: Expected: 0 or 2; Actual: 1 (MD009, no-trailing-spaces)
Trailing spaces


232-232: Expected: 0 or 2; Actual: 1 (MD009, no-trailing-spaces)
Trailing spaces


1141-1141: null (MD024, no-duplicate-heading)
Multiple headings with the same content


1931-1931: null (MD024, no-duplicate-heading)
Multiple headings with the same content


1689-1689: null (MD034, no-bare-urls)
Bare URL used


1719-1719: null (MD034, no-bare-urls)
Bare URL used


2666-2666: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2754-2754: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2756-2756: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2761-2761: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2763-2763: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2773-2773: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2775-2775: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2780-2780: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2788-2788: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2805-2805: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2807-2807: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2815-2815: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2821-2821: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2891-2891: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2894-2894: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2897-2897: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2899-2899: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


2939-2939: null (MD037, no-space-in-emphasis)
Spaces inside emphasis markers


1060-1060: null (MD038, no-space-in-code)
Spaces inside code span elements


2707-2707: null (MD038, no-space-in-code)
Spaces inside code span elements


2707-2707: null (MD038, no-space-in-code)
Spaces inside code span elements

Additional comments not posted (1)
CHANGELOG.md (1)

199-199: Ensure proper markdown formatting by adding blank lines around headings and lists.

+ * (perf)[#20490](https://github.com/cosmos/cosmos-sdk/pull/20490) Sims: Replace runsim command with Go stdlib testing. CLI: `Commit` default true, `Lean`, `SimulateEveryOperation`, `PrintAllInvariants`, `DBBackend` params removed
+ * (server) [#18303](https://github.com/cosmos/cosmos-sdk/pull/18303) `appd export` has moved with other genesis commands, use `appd genesis export` instead.
+
### Deprecated

@alpe alpe added this pull request to the merge queue Jun 17, 2024
Merged via the queue into main with commit 6335631 Jun 17, 2024
71 of 72 checks passed
@alpe alpe deleted the alex/sims_runner branch June 17, 2024 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants