Fix Terra Classic / Keplr ADR-036 sign + verify (#1) #23

Merged
PlasticDigits merged 3 commits from 1-fix-terra-classic-keplr-adr-036-verify-correct-frontend-signarbitrary into main 2026-08-10 02:03:30 +00:00
PlasticDigits commented 2026-08-10 00:58:36 +00:00 (Migrated from gitlab.com)

Summary

  • Portal Terra page now calls Keplr signArbitrary(columbus-5, signer, data) (not OfflineSigner 2-arg misuse).
  • API verifies CosmJS-compatible ADR-036 amino sign/MsgSignData digests, with pubkey → terra1… binding and bech32 address validation.
  • Adds ADR-036 unit vectors, Terra wallet integration (happy + abuse), Playwright Keplr mock e2e, and agent invariants in skills/terra-classic-adr036/.
  • Follow-up: full MR/branch CI (lint + test:rust + test:e2e), 64 KiB body limit, portal bech32 canonicalize, e2e CI startup hardening, gap/skill/README sync.

Test plan

  • cd api && cargo test (unit + Terra/EVM integration, including abuse negatives)
  • cd api && cargo fmt --check && cargo clippy --all-targets -- -D warnings
  • cd bot && cargo fmt --check && cargo clippy -- -D warnings
  • cd web && npm run test:e2e -- --workers=5 (includes terra-sign + EVM regression)
  • Manual: real Keplr on local /sign/terra-classic?property=… once (optional; mocked in CI)
  • Confirm CI test:rust + test:e2e green on this MR (pipeline 2745946647)

Closes #1

## Summary - Portal Terra page now calls Keplr `signArbitrary(columbus-5, signer, data)` (not OfflineSigner 2-arg misuse). - API verifies CosmJS-compatible ADR-036 amino `sign/MsgSignData` digests, with pubkey → `terra1…` binding and bech32 address validation. - Adds ADR-036 unit vectors, Terra wallet integration (happy + abuse), Playwright Keplr mock e2e, and agent invariants in `skills/terra-classic-adr036/`. - Follow-up: full MR/branch CI (lint + test:rust + test:e2e), 64 KiB body limit, portal bech32 canonicalize, e2e CI startup hardening, gap/skill/README sync. ## Test plan - [x] `cd api && cargo test` (unit + Terra/EVM integration, including abuse negatives) - [x] `cd api && cargo fmt --check && cargo clippy --all-targets -- -D warnings` - [x] `cd bot && cargo fmt --check && cargo clippy -- -D warnings` - [x] `cd web && npm run test:e2e -- --workers=5` (includes `terra-sign` + EVM regression) - [ ] Manual: real Keplr on local `/sign/terra-classic?property=…` once (optional; mocked in CI) - [x] Confirm CI `test:rust` + `test:e2e` green on this MR ([pipeline 2745946647](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745946647)) Closes #1
PlasticDigits commented 2026-08-10 00:58:52 +00:00 (Migrated from gitlab.com)

added 1 commit

  • 74a80e65 - Fix Terra Classic Keplr signing with ADR-036 verify.

Compare with previous version

added 1 commit <ul><li>74a80e65 - Fix Terra Classic Keplr signing with ADR-036 verify.</li></ul> [Compare with previous version](/PlasticDigits/cl8y-ecosystem-legal/-/merge_requests/5/diffs?diff_id=1951237985&start_sha=523cb191bb7d63a0a747d35f225c916e3b9a8d69)
PlasticDigits commented 2026-08-10 00:58:53 +00:00 (Migrated from gitlab.com)

marked this merge request as ready

marked this merge request as **ready**
PlasticDigits commented 2026-08-10 00:59:03 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-10 00:59:05 +00:00 (Migrated from gitlab.com)

mentioned in issue #1

mentioned in issue #1
PlasticDigits commented 2026-08-10 01:11:27 +00:00 (Migrated from gitlab.com)

RECOMMEND: FIX

Review summary (MR !23 → closes #1)

Thorough security + gap review of the Terra Classic / Keplr ADR-036 fix (portal + API + tests + skill/gap docs). Crypto path looks sound and correctly replaces a production-broken stack (OfflineSigner misuse + raw-byte ECDSA). Not a BLOCK — no forgery bypass, no prompt-injection runtime surface, no DeFi/oracle/tokenomic surface (off-chain legal clickwrap only).

Why FIX (not ACCEPT): issue #1 verification criteria are not fully met on this MR, and the gap note overclaims / contradicts itself in places. Address the required items below before merge (or explicitly waive with a follow-up issue).


Issue #1 acceptance checklist

Criterion Status Evidence
Portal uses keplr.signArbitrary(chainId, signer, data) YES web/src/pages/terra.ts (columbus-5)
API verifies ADR-036 (not raw bytes) YES api/src/verify/terra.rs + rejects_raw_message_signature
Success → signed_latest: true YES Terra integration test + Playwright status assert
Reject wrong pubkey / address / tampered message / skewed ts PARTIAL Unit/crypto + shared validate_timestamp; no Terra HTTP negative integration tests
ADR-036 unit vectors; raw-only removed YES CosmJS + Node crypto vectors; fixture JSON match
Stay on columbus-5 YES Portal + e2e mock
No EVM regressions YES (locally) EVM unit + property-scoped integration retained
Telegram/Solana untouched YES Diff does not touch those paths

Issue #1 verification criteria

Criterion Status Notes
cargo test includes Terra ADR-036 green YES (local) Lib Terra/account tests + integration_terra_classic_adr036_wallet_submit pass here
Real Keplr once / scripted NO Correctly left optional/unchecked; only Node-crypto Keplr mock in CI/e2e
CI test:rust + test:e2e green on this MR NO Head pipeline https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745896703 is “success” but only ran lint:gitleaks (~9s). In .gitlab-ci.yml, only gitleaks has rules for merge_request_event; test:rust / test:e2e do not run on MR pipelines
Gap Terra finding resolved (portal) PARTIAL Code path fixed; gap doc still has stale contradictions (below)

Related #4 (broader testing) is not closed by this MR; Terra coverage here is a solid down-payment, not the full #4 matrix.


Security audit

Applicable / N/A threat classes

  • Smart-contract / reentrancy / auth-bypass on-chain: N/A (no contracts).
  • DeFi / oracle manipulation / tokenomic-economic attacks: N/A (identity proof only; no pricing, liquidity, or settlement).
  • Database leaks / injection: SQLx parameterized inserts; stored proof is public wallet material (expected). No new SQL surface.
  • Access control / privileges: Wallet submit remains public-by-design; authorization is signature + canonical message binding (pre-existing model). No new privilege escalation.
  • Prompt injection: skills/terra-classic-adr036/SKILL.md is repo-controlled agent guidance, not a runtime LLM tool ingesting untrusted user content. No BLOCK-level prompt injection.

Crypto verdict: sound

  • CosmJS-compatible amino sign/MsgSignData serialize (sorted keys + &/</> escapes).
  • k256 Verifier SHA-256s sign-doc bytes (matches CosmJS/Keplr).
  • Compressed 33-byte pubkey + 64-byte compact sig checks; low-S normalize for Keplr interop.
  • Pubkey → terra1 (HRP terra, 20-byte) binding; bech32 checksum (not prefix-only).
  • Cross-impl vectors: CosmJS + Node crypto both verify.
  • Submit path binds property / network / account / terms / timestamp via build_wallet_message + verify_message_matches before verify.
Severity Location Finding
Medium (process) .gitlab-ci.yml + MR pipeline MR “green” CI does not execute test:rust / test:e2e — false confidence vs #1 verification
Low–Med API body limits Issue attack table asked for large-body rejection; no explicit DefaultBodyLimit / field caps on wallet submit (pre-existing; still open)
Low web/src/pages/terra.ts + account.rs API lowercases/re-encodes bech32; portal signs with Keplr address as-is. All-caps bech32 would fail closed (message mismatch), not forge. Prefer client canonicalize before sign
Low api/tests/integration_test.rs Terra happy path only — missing skew / cross-property replay / bad pubkey at HTTP layer
Info ADR-036 chain_id: "" Correct per CosmJS; chain not in amino doc — network bound in legal message text instead
Info normalize_s Accepts high-S by normalizing (Keplr/CosmJS convention); not a forgery vector for this use case

Gap analysis (features / UX / testing / packages / DRY)

Priority Area Gap
P0 (required) CI / verification Make test:rust + test:e2e run on merge_request_event (same rules as gitleaks), or paste a pipeline URL where those jobs are green for this SHA
P0 (required) Docs honesty gaps/GAP_1786322222.md marks Terra Resolved but §5 still says “No Solana/Terra/Telegram end-to-end” and later still lists Terra e2e as missing — update stale sections now that mock Terra e2e exists
P1 Testing Add Terra integration negatives from #1 table: cross-property replay, timestamp skew, wrong pubkey / tampered message at POST /signatures/wallet
P1 Testing E2E is happy-path only — add missing-Keplr / user-reject / API error UI cases
P1 Security Explicit body/field size limits on wallet submit
P1 UI/UX No terms disclosure before sign (tracked by #2); errors are raw String(e); no Keplr install guidance
P2 Scope hygiene Unrelated viem ^2.30 → ^2.55 + large package-lock.json churn — split or justify
P2 DRY ADR-036 serialize duplicated in Rust + web/e2e/helpers/keplr-wallet.ts (TS escape also weaker for rare control chars)
P2 Features users may expect WalletConnect / multi-wallet, already-signed short-circuit, SDK Terra helper beyond redirect URL — out of #1 scope; document as intentional
N/A Gas optimizations No on-chain txs

Packages: api + web changes are appropriate; packages/cl8y-clickwrap only README touch (OK for scope); skill + gap docs are welcome but need consistency.

Playwright: workers: 5 already configured; Terra mock e2e is a good addition.


Required before ACCEPT

  1. CI: Ensure this MR actually runs and passes test:rust and test:e2e (fix job rules, or equivalent evidence).
  2. Gap file: Remove/update contradictory “no Terra e2e” language now that web/e2e/terra-sign.spec.ts exists; keep remaining Solana/Telegram WebApp P0s clear.
  3. (Strongly recommended) At least 2–3 Terra negative integration tests from the #1 abuse table so closing #1 isn’t happy-path-only at the HTTP layer.

Optional / follow-up OK: real Keplr smoke, body limits, client address canonicalize, viem bump split, terms UX (#2), CI breadth (#4).


Bottom line

Ship-quality crypto fix for #1’s core bug, with solid unit vectors and a mocked e2e path. Do not merge yet until MR CI actually exercises Rust + e2e (and the gap note stops contradicting the resolution claim). After that, this can flip to ACCEPT without further crypto changes.

RECOMMEND: FIX ## Review summary (MR !23 → closes #1) Thorough security + gap review of the Terra Classic / Keplr ADR-036 fix (portal + API + tests + skill/gap docs). **Crypto path looks sound** and correctly replaces a production-broken stack (OfflineSigner misuse + raw-byte ECDSA). **Not a BLOCK** — no forgery bypass, no prompt-injection runtime surface, no DeFi/oracle/tokenomic surface (off-chain legal clickwrap only). **Why FIX (not ACCEPT):** issue #1 verification criteria are not fully met on this MR, and the gap note overclaims / contradicts itself in places. Address the required items below before merge (or explicitly waive with a follow-up issue). --- ## Issue #1 acceptance checklist | Criterion | Status | Evidence | |-----------|--------|----------| | Portal uses `keplr.signArbitrary(chainId, signer, data)` | **YES** | `web/src/pages/terra.ts` (`columbus-5`) | | API verifies ADR-036 (not raw bytes) | **YES** | `api/src/verify/terra.rs` + `rejects_raw_message_signature` | | Success → `signed_latest: true` | **YES** | Terra integration test + Playwright status assert | | Reject wrong pubkey / address / tampered message / skewed ts | **PARTIAL** | Unit/crypto + shared `validate_timestamp`; **no Terra HTTP negative integration tests** | | ADR-036 unit vectors; raw-only removed | **YES** | CosmJS + Node crypto vectors; fixture JSON match | | Stay on `columbus-5` | **YES** | Portal + e2e mock | | No EVM regressions | **YES** (locally) | EVM unit + property-scoped integration retained | | Telegram/Solana untouched | **YES** | Diff does not touch those paths | ### Issue #1 verification criteria | Criterion | Status | Notes | |-----------|--------|-------| | `cargo test` includes Terra ADR-036 green | **YES (local)** | Lib Terra/account tests + `integration_terra_classic_adr036_wallet_submit` pass here | | Real Keplr once / scripted | **NO** | Correctly left optional/unchecked; only Node-crypto Keplr mock in CI/e2e | | CI `test:rust` + `test:e2e` green on this MR | **NO** | Head pipeline https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745896703 is “success” but **only ran `lint:gitleaks`** (~9s). In `.gitlab-ci.yml`, **only gitleaks has `rules` for `merge_request_event`**; `test:rust` / `test:e2e` do not run on MR pipelines | | Gap Terra finding resolved (portal) | **PARTIAL** | Code path fixed; gap doc still has stale contradictions (below) | Related #4 (broader testing) is not closed by this MR; Terra coverage here is a solid down-payment, not the full #4 matrix. --- ## Security audit ### Applicable / N/A threat classes - **Smart-contract / reentrancy / auth-bypass on-chain:** N/A (no contracts). - **DeFi / oracle manipulation / tokenomic-economic attacks:** N/A (identity proof only; no pricing, liquidity, or settlement). - **Database leaks / injection:** SQLx parameterized inserts; stored proof is public wallet material (expected). No new SQL surface. - **Access control / privileges:** Wallet submit remains public-by-design; authorization is signature + canonical message binding (pre-existing model). No new privilege escalation. - **Prompt injection:** `skills/terra-classic-adr036/SKILL.md` is repo-controlled agent guidance, not a runtime LLM tool ingesting untrusted user content. No BLOCK-level prompt injection. ### Crypto verdict: **sound** - CosmJS-compatible amino `sign/MsgSignData` serialize (sorted keys + `&`/`<`/`>` escapes). - `k256` `Verifier` SHA-256s sign-doc bytes (matches CosmJS/Keplr). - Compressed 33-byte pubkey + 64-byte compact sig checks; low-S normalize for Keplr interop. - Pubkey → `terra1` (HRP `terra`, 20-byte) binding; bech32 checksum (not prefix-only). - Cross-impl vectors: CosmJS + Node crypto both verify. - Submit path binds property / network / account / terms / timestamp via `build_wallet_message` + `verify_message_matches` before verify. | Severity | Location | Finding | |----------|----------|---------| | Medium (process) | `.gitlab-ci.yml` + MR pipeline | MR “green” CI does not execute `test:rust` / `test:e2e` — false confidence vs #1 verification | | Low–Med | API body limits | Issue attack table asked for large-body rejection; no explicit `DefaultBodyLimit` / field caps on wallet submit (pre-existing; still open) | | Low | `web/src/pages/terra.ts` + `account.rs` | API lowercases/re-encodes bech32; portal signs with Keplr address as-is. All-caps bech32 would **fail closed** (message mismatch), not forge. Prefer client canonicalize before sign | | Low | `api/tests/integration_test.rs` | Terra happy path only — missing skew / cross-property replay / bad pubkey at HTTP layer | | Info | ADR-036 `chain_id: ""` | Correct per CosmJS; chain not in amino doc — network bound in legal message text instead | | Info | `normalize_s` | Accepts high-S by normalizing (Keplr/CosmJS convention); not a forgery vector for this use case | --- ## Gap analysis (features / UX / testing / packages / DRY) | Priority | Area | Gap | |----------|------|-----| | **P0 (required)** | CI / verification | Make `test:rust` + `test:e2e` run on `merge_request_event` (same rules as gitleaks), **or** paste a pipeline URL where those jobs are green for this SHA | | **P0 (required)** | Docs honesty | `gaps/GAP_1786322222.md` marks Terra **Resolved** but §5 still says **“No Solana/Terra/Telegram end-to-end”** and later still lists Terra e2e as missing — update stale sections now that mock Terra e2e exists | | **P1** | Testing | Add Terra integration negatives from #1 table: cross-property replay, timestamp skew, wrong pubkey / tampered message at `POST /signatures/wallet` | | **P1** | Testing | E2E is happy-path only — add missing-Keplr / user-reject / API error UI cases | | **P1** | Security | Explicit body/field size limits on wallet submit | | **P1** | UI/UX | No terms disclosure before sign (tracked by #2); errors are raw `String(e)`; no Keplr install guidance | | **P2** | Scope hygiene | Unrelated `viem` `^2.30` → `^2.55` + large `package-lock.json` churn — split or justify | | **P2** | DRY | ADR-036 serialize duplicated in Rust + `web/e2e/helpers/keplr-wallet.ts` (TS escape also weaker for rare control chars) | | **P2** | Features users may expect | WalletConnect / multi-wallet, already-signed short-circuit, SDK Terra helper beyond redirect URL — out of #1 scope; document as intentional | | **N/A** | Gas optimizations | No on-chain txs | **Packages:** `api` + `web` changes are appropriate; `packages/cl8y-clickwrap` only README touch (OK for scope); skill + gap docs are welcome but need consistency. **Playwright:** `workers: 5` already configured; Terra mock e2e is a good addition. --- ## Required before ACCEPT 1. **CI:** Ensure this MR actually runs and passes `test:rust` and `test:e2e` (fix job `rules`, or equivalent evidence). 2. **Gap file:** Remove/update contradictory “no Terra e2e” language now that `web/e2e/terra-sign.spec.ts` exists; keep remaining Solana/Telegram WebApp P0s clear. 3. **(Strongly recommended)** At least 2–3 Terra negative integration tests from the #1 abuse table so closing #1 isn’t happy-path-only at the HTTP layer. Optional / follow-up OK: real Keplr smoke, body limits, client address canonicalize, viem bump split, terms UX (#2), CI breadth (#4). --- ## Bottom line Ship-quality **crypto fix** for #1’s core bug, with solid unit vectors and a mocked e2e path. **Do not merge yet** until MR CI actually exercises Rust + e2e (and the gap note stops contradicting the resolution claim). After that, this can flip to ACCEPT without further crypto changes.
PlasticDigits commented 2026-08-10 01:11:58 +00:00 (Migrated from gitlab.com)

Addendum — CI failures on branch push (same SHA 74a80e65)

Correction/expansion of the CI section above:

Pipeline Source Result What ran
#2745896703 merge_request_event success only lint:gitleaks
#2745896687 push failed lint:rust + lint:rust-bot failed; all test:* skipped

MR-owned lint breakages (must fix in this MR):

  1. cargo fmt --check diffs in api/src/verify/terra.rs and api/tests/integration_test.rs (run cd api && cargo fmt).
  2. Clippy -D warnings: clippy::useless_concat in api/src/verify/terra.rs CosmJS fixture test (concat!(r#"..."#) → plain string).

Pre-existing (not introduced by Terra diff, but still red on push):

  • lint:rust-bot rustfmt drift across bot/
  • Clippy too_many_arguments on submit_wallet / submit_telegram (and related) when local toolchain is stricter than CI image

Until fmt/clippy are green and test:rust / test:e2e actually execute for this SHA, issue #1 verification remains unmet → FIX stands.

### Addendum — CI failures on branch push (same SHA `74a80e65`) Correction/expansion of the CI section above: | Pipeline | Source | Result | What ran | |----------|--------|--------|----------| | [#2745896703](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745896703) | `merge_request_event` | success | **only** `lint:gitleaks` | | [#2745896687](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745896687) | `push` | **failed** | `lint:rust` + `lint:rust-bot` failed; **all `test:*` skipped** | **MR-owned lint breakages (must fix in this MR):** 1. `cargo fmt --check` diffs in `api/src/verify/terra.rs` and `api/tests/integration_test.rs` (run `cd api && cargo fmt`). 2. Clippy `-D warnings`: `clippy::useless_concat` in `api/src/verify/terra.rs` CosmJS fixture test (`concat!(r#"..."#)` → plain string). **Pre-existing (not introduced by Terra diff, but still red on push):** - `lint:rust-bot` rustfmt drift across `bot/` - Clippy `too_many_arguments` on `submit_wallet` / `submit_telegram` (and related) when local toolchain is stricter than CI image Until fmt/clippy are green and `test:rust` / `test:e2e` actually execute for this SHA, issue #1 verification remains unmet → **FIX** stands.
PlasticDigits commented 2026-08-10 01:31:28 +00:00 (Migrated from gitlab.com)

Follow-up pushed (62d8d76)

Addresses the FIX review items on this MR:

  • CI workflow:rules so MR pipelines run full lint/test (not gitleaks-only)
  • cargo fmt + clippy clean (api + bot); Terra useless_concat fixed
  • Terra abuse integration test (cross-property replay, tampered message, wrong pubkey, timestamp skew)
  • 64 KiB DefaultBodyLimit; portal bech32 canonicalize
  • Unit: high-S normalize, escape roundtrip, uppercase/mixed-case bech32
  • Gap + skills/terra-classic-adr036 + README invariants updated

Local verify: cargo test 30/30; Playwright e2e 13/13 (--workers=5).

## Follow-up pushed (`62d8d76`) Addresses the FIX review items on this MR: - CI `workflow:rules` so MR pipelines run full lint/test (not gitleaks-only) - `cargo fmt` + clippy clean (api + bot); Terra `useless_concat` fixed - Terra abuse integration test (cross-property replay, tampered message, wrong pubkey, timestamp skew) - 64 KiB `DefaultBodyLimit`; portal bech32 canonicalize - Unit: high-S normalize, escape roundtrip, uppercase/mixed-case bech32 - Gap + `skills/terra-classic-adr036` + README invariants updated Local verify: `cargo test` 30/30; Playwright e2e 13/13 (`--workers=5`).
PlasticDigits commented 2026-08-10 01:31:30 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-10 01:40:24 +00:00 (Migrated from gitlab.com)

Pushed e2e CI startup fix (vite host 127.0.0.1, prebuilt API binary, longer webServer timeout). Awaiting green test:e2e.

Pushed e2e CI startup fix (`vite` host `127.0.0.1`, prebuilt API binary, longer webServer timeout). Awaiting green `test:e2e`.
PlasticDigits commented 2026-08-10 01:50:17 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-10 01:50:21 +00:00 (Migrated from gitlab.com)

CI green on 6ec0af6: pipeline 2745946647 — lint:*, test:rust, test:e2e, and builds all success.

Issue #1 verification for automated CI is met. Optional remaining: one manual real-Keplr smoke.

CI green on `6ec0af6`: [pipeline 2745946647](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/pipelines/2745946647) — `lint:*`, `test:rust`, `test:e2e`, and builds all **success**. Issue #1 verification for automated CI is met. Optional remaining: one manual real-Keplr smoke.
PlasticDigits commented 2026-08-10 01:53:55 +00:00 (Migrated from gitlab.com)

added 2 commits

  • 62d8d76c - Harden Terra ADR-036 CI, abuse tests, and portal invariants.
  • 6ec0af69 - Stabilize Playwright e2e startup on CI.

Compare with previous version

added 2 commits <ul><li>62d8d76c - Harden Terra ADR-036 CI, abuse tests, and portal invariants.</li><li>6ec0af69 - Stabilize Playwright e2e startup on CI.</li></ul> [Compare with previous version](/PlasticDigits/cl8y-ecosystem-legal/-/merge_requests/5/diffs?diff_id=1951268615&start_sha=74a80e65e64a7a34e7317114d7b1354dc525a48e)
PlasticDigits commented 2026-08-10 01:54:11 +00:00 (Migrated from gitlab.com)

mentioned in issue #2

mentioned in issue #2
PlasticDigits commented 2026-08-10 01:54:13 +00:00 (Migrated from gitlab.com)

mentioned in issue #3

mentioned in issue #3
PlasticDigits (Migrated from gitlab.com) scheduled this pull request to auto merge when all checks succeed 2026-08-10 01:57:00 +00:00
PlasticDigits commented 2026-08-10 02:03:31 +00:00 (Migrated from gitlab.com)

mentioned in commit 03849d3bed

mentioned in commit 03849d3bed404af9be62c633cc3ee518fd81ac7b
PlasticDigits (Migrated from gitlab.com) merged commit 03849d3bed into main 2026-08-10 02:03:31 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-ecosystem-legal!23
No description provided.