Feature/vlm benchmark#1
Closed
fedor-konovalenko wants to merge 13 commits into
Closed
Conversation
* Fix: intersection * use previous active participant set * version
* Upgrade template * Use a portable build of BLST for macos (test) builds (gonka-ai#697) Running the binaries with the blst binary will cause a SIGILL error when run in an AMD64 container on an ARM64 machine. But we still want native perf for production, so we added a flag so the portable build is only for local/test builds * fix: avoid rewriting config on every startup (gonka-ai#644) * fix: avoid rewriting config on every startup * chore: use standard logging --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * fix: minor bugs (gonka-ai#545) * fix: division by zero ShouldValidate * fix: add http timeout * fix: ticker instead timer checkStatusRoutine * fix: use inference epoch for GetEpochModel in validation GetEpochModel in validation should use the inference's epoch ID instead of the current epoch to ensure correct model snapshot is retrieved, especially for validations from previous epochs. * fix: based on PR comments * remove slog usage --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * security: add request body size limit to prevent DoS (gonka-ai#634) Add MaxRequestBodySize constant (10 MB) and use http.MaxBytesReader in readRequestBody to prevent memory exhaustion attacks from oversized request bodies. An attacker could previously send arbitrarily large request bodies to /v1/chat/completions, causing nodes to allocate unbounded memory and crash from OOM. Changes: - Add MaxRequestBodySize constant (10 MB) - Wrap request body with http.MaxBytesReader in readRequestBody - Add unit tests for size limit enforcement Co-authored-by: Alexey Samosadov <alexey@192.168.1.113> Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * perf(poc): optimize artifact storage throughput (gonka-ai#666) Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: John Long <john.long@productscience.ai> * Model assignment: check if participants got reward for previous epoch (gonka-ai#659) * Added check if nodes got reward for previous epoch to filter them for POC_SLOT=true eligability * Fix for issue658 * removed doc of the issue * Added log on filtering out participant without reward, to do not get POC_SLOT = true Fixed condition to work out edge case when participant could ve rewarded in some epoch before * Fixed the tests, as now we need reward for POC_SLOT Added test to check fltering based on settement works correctly --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * fix: sanitize from nil participants in executor selection (gonka-ai#643) * fix: guard nil participants in executor selection * add test * remove redundant sanitizeMembers --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * fix: don't crash API in case of network drop during tryClaimingTaskToAssign (gonka-ai#661) Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * Add unit tests for node version management (gonka-ai#467) (gonka-ai#640) Add comprehensive tests for: - SetCurrentNodeVersion: verify version updates correctly - ShouldRefreshClients: verify refresh logic when versions differ - SyncVersionFromChain: verify chain sync updates version appropriately - TestVersionUpdateTriggersRefresh: end-to-end version change flow These tests ensure node version is properly tracked and updated when chain version changes. Co-authored-by: Alexey Samosadov <alexey@192.168.1.100> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: John Long <john.long@productscience.ai> * fix: add missing return after error in tryClaimingTaskToAssign (gonka-ai#639) Fixes gonka-ai#422 The function logged an error when chain RPC was unavailable but continued execution, causing a nil pointer dereference crash when trying to access chainStatus.SyncInfo. Added return statement after the error log to prevent the crash. Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: Alexey Samosadov <alexey@192.168.1.100> Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * fix(poc): use chain stat test params instead of hardcoded defaults (gonka-ai#711) Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> * security: fix unsafe type assertions in request processing (gonka-ai#638) Co-authored-by: AlexeySamosadov <alexey@samosadov.com> * Fix poc weight function name: calculateInferenceServingWeight > calculatePocParticipatingNodesWeight (gonka-ai#716) --------- Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * IBC Upgrade to v8.7.0 (gonka-ai#708) * testermint IntDeserializer * ibc update to v8.7.0 * fix merge change --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * Testnet: bridge setup scripts (gonka-ai#723) * Punishment statistics based on on-chain data: dynamic table selection (gonka-ai#561) (gonka-ai#688) * dynamic table selection (gonka-ai#561) * dynamic p0 selection (gonka-ai#561) * fix lookup table * fix comment * fix tests --------- Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * Require proto-go generation matches committed code (gonka-ai#712) * Require proto-go generation matches committed code * ci: fix ignite v28 install target * ci: install ignite from correct package path * ci: install ignite v28.10.0 from release tarball * ci: disable ignite telemetry prompt in ci * ci: run ignite generation non-interactively * ci: build ignite cli from v28 source * ci: use full checkout history for ignite * test: modify proto without regeneration * Revert, should pass now * Update, should pass * Missing added, should fail * New generated files, should pass * See if _extra_ files causes an issue * See if leftover files causes an issue * Remove leftover files * Restrict to pushes of .proto files and generated files * Final reverts * ci: pin go setup and verify ignite checksum * ci: pin verify proto workflow runner image --------- Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * fix(inference): propagate refund error in InvalidateInference (gonka-ai#622) * fix(inference): propagate refund error in InvalidateInference refundInvalidatedInference swallows IssueRefund errors and always returns nil. Executor balance gets deducted before the refund attempt, so when escrow is underfunded both sides lose - executor balance down, payer never gets refund, no error returned. Fix: attempt refund first, only deduct balance after success, return error if it fails. * Update inference-chain/x/inference/keeper/msg_server_invalidate_inference.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> --------- Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * PoC Validation Sampling Optimization (gonka-ai#710) * Initial upgrade boilerplate * PoC v2 Fixes/TA Agent Whitelist (gonka-ai#673) Full PoC V2 activation with model consolidation and access controls. - PoC V2 fully enabled (tracking mode from v0.2.8 -> full enforcement) - Network consolidated to single model: `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` - Transfer Agent whitelist for request gating - Guardian tiebreaker for undecided PoC V2 votes - 24 suspicious participants removed from allowlist **PoC V2 Activation** - `PocV2Enabled=true`, `ConfirmationPocV2Enabled=true` - `WeightScaleFactor=0.262`, `InferenceValidationCutoff=2`, `PocValidationDuration=480` - All nodes' `POC_SLOT` allocations reset (both `ActiveParticipants` and `EpochGroupData`) - First V2 epoch runs in grace mode, full enforcement begins the following epoch **Guardian Tiebreaker** - When neither valid nor invalid votes reach majority, guardians can break the tie - Requires: no majority exists, guardians enabled, at least one guardian voted, all voting guardians agree **Transfer Agent Whitelist** - New `TransferAgentAccessParams.AllowedTransferAddresses` in params - Validation in `StartInference` and `FinishInference` messages - Empty whitelist = all TAs allowed; non-empty = only listed TAs **Model Consolidation** - All governance models except `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` deleted during migration **Suspicious Participant Removal** - 24 addresses removed from allowlist (completed POC generation but did not vote at validation) **Enforced Model Auto-Switch** - Auto-switches nodes to qwen235B with `--tensor-parallel-size 4 --max-model-len 240000` - Config enforcement overwrites node model config on load - Runtime verification queries vLLM `/v1/models` endpoint, triggers redeploy on mismatch - Disabled via `ENFORCED_MODEL_ID=none` **Transfer Agent Whitelist** - Early enforcement in `/chat/completion` before expensive operations - Cache synced from chain on every new block for O(1) lookups **[gonka-ai#674](gonka-ai#674) Missed inferences fix** - Don't punish for missed inferences of non-preserved nodes during PoC - Don't punish if participant doesn't support the model **[gonka-ai#678](gonka-ai#678) CPoC downtime penalty redistribution** - Lower confirmation reward penalty transferred to community pool instead of being lost **Inference expiry during PoC/CPoC** - New `InferenceExpiryContext` tracks latest PoC or CPoC range - Inferences started during PoC/CPoC not punished for expiry **Bitcoin rewards weight calculation** - Full weights used for denominator (prevents redistribution of invalidated participants' shares) - CPoC reductions and invalidated shares go to governance pool * feat(poc): add validation sampling to reduce complexity from O(N²) to O(N*N_SLOTS) - add GetSlots algorithm for deterministic weighted random sampling - store PoCValidationSnapshot on-chain at validation phase start - filter DAPI validation to only assigned participants - count slots instead of weight for consensus (weight encoded in slot distribution) - add ValidationSlots parameter to PocParams (0 = disabled, fallback to O(N²)) - support both regular PoC and confirmation PoC * fix(poc): harden validation sampling edge cases and add testermint params - skip negative/zero weights in GetSlots to prevent undefined behavior - return nil snapshot when not found in query handler - log fallback to O(N^2) when snapshot missing on chain - fallback instead of return on DAPI snapshot query error - add validation_slots and stat_test to testermint AppExport - add comprehensive unit tests for slots edge cases * fix(poc): fix concurrent artifact read race causing data corruption - Use ReadAt instead of Seek+ReadFull for thread-safe concurrent reads - Add signed response with signer_address, timestamp, signature fields - Report participants as invalid when validation retries exhausted * set slots amount * Fix * Fix: key * fix: remove duplicate reportInvalidParticipant function after rebase * Rever main behaviour * Review fixes * clean up * Optimization * Better esimtations * Update security model * fix tests * Fix test * fix(poc): address review feedback Co-authored-by: Cursor <cursoragent@cursor.com> * Add missing generated proto files --------- Co-authored-by: johnlong <john.long@productscience.ai> Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> * Create upgrade description * Add MsgTransferWithVesting for vesting transfers (gonka-ai#641) * Add unit tests for node version management (gonka-ai#467) Add comprehensive tests for: - SetCurrentNodeVersion: verify version updates correctly - ShouldRefreshClients: verify refresh logic when versions differ - SyncVersionFromChain: verify chain sync updates version appropriately - TestVersionUpdateTriggersRefresh: end-to-end version change flow These tests ensure node version is properly tracked and updated when chain version changes. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add MsgTransferWithVesting message for vesting transfers (gonka-ai#631) Add a new message type MsgTransferWithVesting to the streamvesting module that allows transferring tokens with a vesting schedule. Features: - Transfer tokens from sender to recipient with vesting over N epochs - Default vesting period of 180 epochs if not specified - Tokens vest linearly with remainder going to first epoch - Full validation of sender/recipient addresses and amount - CLI command: transfer-with-vesting [recipient] [amount] [vesting-epochs] Files changed: - proto/inference/streamvesting/tx.proto: Add message definition - x/streamvesting/types/tx.pb.go: Generated protobuf code - x/streamvesting/types/codec.go: Register new message - x/streamvesting/types/events.go: Add event types - x/streamvesting/keeper/msg_transfer_with_vesting.go: Handler - x/streamvesting/keeper/msg_transfer_with_vesting_test.go: Tests - x/streamvesting/module/autocli.go: CLI configuration Closes gonka-ai#631 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: address review feedback for MsgTransferWithVesting - Add MaxVestingEpochs (3650) and MaxCoinsInAmount (10) limits to prevent DoS - Replace int with int64 for explicit type safety - Remove unrelated config_test.go changes Addresses review comments from @patimen. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: regenerate protobuf files for TransferWithVesting RPC method The API-layer gRPC files were not regenerated after adding the new TransferWithVesting RPC method, causing panic on startup: "rpc method TransferWithVesting not found for service inference.streamvesting.Msg" Regenerated using: buf generate --template buf.gen.pulsar.yaml Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * test: add comprehensive assertions and edge case tests for vesting Verify actual coin amounts per epoch, test remainder distribution, max epochs limit, and max coins limit. Authored-by: Alexey Samosadov Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Regenerating pulsar.go and pb.go files with `ignite` 28.10.0 This is our current version and approved way of generating new proto files * Add a testermint test for MsgTransferWithVesting Using the 'gov' account via a governance proposal, specifically, as this will be an important scenario in production. * test: add comprehensive assertions and edge case tests for vesting Verify actual coin amounts per epoch, test remainder distribution, max epochs limit, and max coins limit. Authored-by: Alexey Samosadov --------- Co-authored-by: Alexey Samosadov <alexey@192.168.1.100> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Alexey Samosadov <alexey@MacBook-Air-Alexey.local> Co-authored-by: John Long <john.long@productscience.ai> Co-authored-by: AlexeySamosadov <alexey@samosadov.com> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * gonka-ai#641 description * POC weight normalization on real POC time (gonka-ai#725) * Initial upgrade boilerplate * PoC v2 Fixes/TA Agent Whitelist (gonka-ai#673) Full PoC V2 activation with model consolidation and access controls. - PoC V2 fully enabled (tracking mode from v0.2.8 -> full enforcement) - Network consolidated to single model: `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` - Transfer Agent whitelist for request gating - Guardian tiebreaker for undecided PoC V2 votes - 24 suspicious participants removed from allowlist **PoC V2 Activation** - `PocV2Enabled=true`, `ConfirmationPocV2Enabled=true` - `WeightScaleFactor=0.262`, `InferenceValidationCutoff=2`, `PocValidationDuration=480` - All nodes' `POC_SLOT` allocations reset (both `ActiveParticipants` and `EpochGroupData`) - First V2 epoch runs in grace mode, full enforcement begins the following epoch **Guardian Tiebreaker** - When neither valid nor invalid votes reach majority, guardians can break the tie - Requires: no majority exists, guardians enabled, at least one guardian voted, all voting guardians agree **Transfer Agent Whitelist** - New `TransferAgentAccessParams.AllowedTransferAddresses` in params - Validation in `StartInference` and `FinishInference` messages - Empty whitelist = all TAs allowed; non-empty = only listed TAs **Model Consolidation** - All governance models except `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` deleted during migration **Suspicious Participant Removal** - 24 addresses removed from allowlist (completed POC generation but did not vote at validation) **Enforced Model Auto-Switch** - Auto-switches nodes to qwen235B with `--tensor-parallel-size 4 --max-model-len 240000` - Config enforcement overwrites node model config on load - Runtime verification queries vLLM `/v1/models` endpoint, triggers redeploy on mismatch - Disabled via `ENFORCED_MODEL_ID=none` **Transfer Agent Whitelist** - Early enforcement in `/chat/completion` before expensive operations - Cache synced from chain on every new block for O(1) lookups **[gonka-ai#674](gonka-ai#674) Missed inferences fix** - Don't punish for missed inferences of non-preserved nodes during PoC - Don't punish if participant doesn't support the model **[gonka-ai#678](gonka-ai#678) CPoC downtime penalty redistribution** - Lower confirmation reward penalty transferred to community pool instead of being lost **Inference expiry during PoC/CPoC** - New `InferenceExpiryContext` tracks latest PoC or CPoC range - Inferences started during PoC/CPoC not punished for expiry **Bitcoin rewards weight calculation** - Full weights used for denominator (prevents redistribution of invalidated participants' shares) - CPoC reductions and invalidated shares go to governance pool * feat(poc): add validation sampling to reduce complexity from O(N²) to O(N*N_SLOTS) - add GetSlots algorithm for deterministic weighted random sampling - store PoCValidationSnapshot on-chain at validation phase start - filter DAPI validation to only assigned participants - count slots instead of weight for consensus (weight encoded in slot distribution) - add ValidationSlots parameter to PocParams (0 = disabled, fallback to O(N²)) - support both regular PoC and confirmation PoC * fix(poc): harden validation sampling edge cases and add testermint params - skip negative/zero weights in GetSlots to prevent undefined behavior - return nil snapshot when not found in query handler - log fallback to O(N^2) when snapshot missing on chain - fallback instead of return on DAPI snapshot query error - add validation_slots and stat_test to testermint AppExport - add comprehensive unit tests for slots edge cases * fix(poc): fix concurrent artifact read race causing data corruption - Use ReadAt instead of Seek+ReadFull for thread-safe concurrent reads - Add signed response with signer_address, timestamp, signature fields - Report participants as invalid when validation retries exhausted * set slots amount * Fix * Fix: key * fix: remove duplicate reportInvalidParticipant function after rebase * Rever main behaviour * Review fixes * clean up * Optimization * Better esimtations * Update security model * normalize POC * Lost snapshots * normalize POC * feat(poc): add poc_normalization_enabled parameter to control time-based weight normalization * proper decimal * Comment * Update pulsar.go files * Fix governance test * Minor review fixes: 1. Log result of participant weight calculation 2. Update comments for params 3. If we find an incomplete PoCValidationSnapshot, treat it as not found (for the `ValidateAll` query) * make broker test more robust --------- Co-authored-by: johnlong <john.long@productscience.ai> Co-authored-by: dima <dima.orekhov@productscience.ai> * gonka-ai#634 follow-up: pass in response writer into the http.MaxBytesReader (gonka-ai#727) * pass in the writer * fix post_chat_handler_test.go * Update upgrade description to include PoC Weight Normalization * gonka-ai#727 description * Distribute bounty (gonka-ai#733) * Add proposed bounties to README (gonka-ai#732) * Add proposed bounties to README Added proposed bounties section with details on rewards for various PRs and issues. Signed-off-by: mtvnastya <mtvnastya@gmail.com> * Refine proposed bounties formatting in README.md Updated the proposed bounties section for clarity and consistency. Signed-off-by: mtvnastya <mtvnastya@gmail.com> --------- Signed-off-by: mtvnastya <mtvnastya@gmail.com> Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> * POC Params (gonka-ai#734) * POC Params * Longer validation * Upgrade v0.2.10 finalize readme (gonka-ai#735) --------- Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> * Review fixes (gonka-ai#738) * ignore nonces without distribution * Use snapshots * 0.2.10 review fixes: msg transfer (gonka-ai#743) * Fix missing error handling * add amount comment * Update inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> --------- Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix PoC and CPoC intersection bug (gonka-ai#752) Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> * 0.2.10 merge w 0.2.9-post3 hotfix (gonka-ai#762) * Fix: v0.2.9-post3 (gonka-ai#748) * Fix: intersection * use previous active participant set * version * post merge codegen * fix pulsar files * remove epoch 170 handling --------- Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> * bounty for previous upgrade pr reviews (gonka-ai#745) * Update README with new PR entries and reviews Added new entries for PR gonka-ai#641, PR gonka-ai#622, and PR gonka-ai#688, along with a review section for previous upgrades. Signed-off-by: mtvnastya <mtvnastya@gmail.com> * Add bounty payments Signed-off-by: mtvnastya <mtvnastya@gmail.com> * Fix formatting issue in upgrade v0.2.10 Signed-off-by: mtvnastya <mtvnastya@gmail.com> * Add new address for review of 0.2.8 Signed-off-by: mtvnastya <mtvnastya@gmail.com> --------- Signed-off-by: mtvnastya <mtvnastya@gmail.com> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> * Remove epoch 170 edge special handling * Tools & Phases (gonka-ai#767) * Enable tools * feat(upgrade): add grace epoch for relaxed punishment during upgrade * fix(poc): align API artifact acceptance with chain exchange windows Deprecate poc_exchange_duration (set to 0 in v0.2.10 upgrade). API now accepts artifacts until poc_generation_end using IsPoCExchangeWindow and IsInBatchSubmissionWindow checks instead of relying on phase alone. * desciption * Versions * Versions * check validationParams != nil * use DefaultValidationParams when not found --------- Co-authored-by: dima <dima.orekhov@productscience.ai> * # Adjust CPoC ratio and weight scale factor (gonka-ai#768) * Adjust multiplicator * POC * Add PoC vector verification on `api` side (gonka-ai#769) * fix(poc): reject NaN and Infinity in FP16 vectors --------- Signed-off-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Signed-off-by: mtvnastya <mtvnastya@gmail.com> Co-authored-by: x0152 <45021974+x0152@users.noreply.github.com> Co-authored-by: DimaOrekhovPS <dima.orekhov@productscience.ai> Co-authored-by: AlexeySamosadov <37549796+AlexeySamosadov@users.noreply.github.com> Co-authored-by: Alexey Samosadov <alexey@192.168.1.113> Co-authored-by: Fedor Ignatov <ignatov.fedor@gmail.com> Co-authored-by: Alexander Kuprin <ak@neonavigation.com> Co-authored-by: Alexey Samosadov <alexey@192.168.1.100> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Gleb Morgachev <morgachev.g@gmail.com> Co-authored-by: AlexeySamosadov <alexey@samosadov.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: GLiberman <gabriel@liberman.net> Co-authored-by: 0xMayoor <0xmayor@quartiers.io> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Alexey Samosadov <alexey@MacBook-Air-Alexey.local> Co-authored-by: mtvnastya <mtvnastya@gmail.com>
* disable fastnode * bump container
Made-with: Cursor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.