feat(frontend): gate mutative actions with CL8Y Legal clickwrap (#134) #156

Merged
PlasticDigits merged 2 commits from feat/gl-134-legal-clickwrap into main 2026-08-31 12:12:01 +00:00
PlasticDigits commented 2026-08-31 05:55:42 +00:00 (Migrated from gitlab.com)

Summary

  • Integrate @plasticdigits/cl8y-clickwrap@0.1.1 (GitLab npm project 82547916, not npmjs) so mutative deposit / hash-submit / Solana execute CTAs require Legal signed_latest for property bridge.cl8y.com.
  • Gate the wallet that signs the action (source on TransferForm, destination on Transfer Status / Verify / Solana execute). Header Connect controls stay outside TermsGate (GL-137).
  • Fail closed on Legal API errors; re-check status immediately before deposit/submit/execute. Redirect uses window.location.href only.

Related #134 (kept open: Legal ops, portal QA, production deploy gate)

Merge is code-complete but production gating needs Legal confirmation:

  • Property bridge.cl8y.com registered
  • API CORS_ORIGINS includes https://bridge.cl8y.com (and http://localhost:3000 for local)
  • Portal VITE_REDIRECT_URI_ALLOWLIST includes https://bridge.cl8y.com
  • Solana /sign/solana production-ready (envelope vs API verify) — not skipped; Solana stays gated until signed_latest

Solana interim policy

Same Network: Solana gate as EVM/Terra. Legal /sign/solana is not production-ready; users remain blocked (fail closed). Do not silently skip Solana.

Test plan

  • npx vitest run (SKIP_INTEGRATION=true) — 672 tests, including new clickwrap unit tests (run twice)
  • npx tsc --noEmit and ESLint on changed files
  • Playwright e2e/clickwrap.spec.ts against local Vite (Legal API mocked; unsigned / error / signed)
  • Existing Playwright transfer suite still green (default mock signed_latest: true)
  • Manual: unsigned EVM → portal → sign → return → deposit CTA
  • Manual: Terra Classic same
  • Manual: API failure shows error and blocks CTA
  • Spot-check INV-UX1 / INV-RCP1 (form still disables CTA on empty/invalid recipient)

Docs

  • docs/FRONTEND_BRIDGE_INVARIANTS.md INV-FE-CLICKWRAP-1
  • skills/agent-frontend-clickwrap.md (cross-linked from invariants + agent-frontend-bridge-chains.md)
  • packages/frontend/README.md, docs/frontend.md, .env.example
## Summary - Integrate `@plasticdigits/cl8y-clickwrap@0.1.1` (GitLab npm project `82547916`, not npmjs) so mutative deposit / hash-submit / Solana execute CTAs require Legal `signed_latest` for property **`bridge.cl8y.com`**. - Gate the **wallet that signs the action** (source on `TransferForm`, destination on Transfer Status / Verify / Solana execute). Header Connect controls stay outside `TermsGate` (GL-137). - Fail closed on Legal API errors; re-check status immediately before deposit/submit/execute. Redirect uses `window.location.href` only. Related #134 (kept open: Legal ops, portal QA, production deploy gate) ## Legal ops (blocked outside this repo) Merge is **code-complete** but production gating needs Legal confirmation: - [ ] Property `bridge.cl8y.com` registered - [ ] API `CORS_ORIGINS` includes `https://bridge.cl8y.com` (and `http://localhost:3000` for local) - [ ] Portal `VITE_REDIRECT_URI_ALLOWLIST` includes `https://bridge.cl8y.com` - [ ] Solana `/sign/solana` production-ready (envelope vs API verify) — **not skipped**; Solana stays gated until `signed_latest` ## Solana interim policy Same `Network: Solana` gate as EVM/Terra. Legal `/sign/solana` is not production-ready; users remain blocked (fail closed). Do **not** silently skip Solana. ## Test plan - [x] `npx vitest run` (`SKIP_INTEGRATION=true`) — 672 tests, including new clickwrap unit tests (run twice) - [x] `npx tsc --noEmit` and ESLint on changed files - [ ] Playwright `e2e/clickwrap.spec.ts` against local Vite (Legal API mocked; unsigned / error / signed) - [ ] Existing Playwright transfer suite still green (default mock `signed_latest: true`) - [ ] Manual: unsigned EVM → portal → sign → return → deposit CTA - [ ] Manual: Terra Classic same - [ ] Manual: API failure shows error and blocks CTA - [ ] Spot-check INV-UX1 / INV-RCP1 (form still disables CTA on empty/invalid recipient) ## Docs - `docs/FRONTEND_BRIDGE_INVARIANTS.md` **INV-FE-CLICKWRAP-1** - `skills/agent-frontend-clickwrap.md` (cross-linked from invariants + `agent-frontend-bridge-chains.md`) - `packages/frontend/README.md`, `docs/frontend.md`, `.env.example`
PlasticDigits commented 2026-08-31 09:14:15 +00:00 (Migrated from gitlab.com)

RECOMMEND: FIX

Reviewed against #134 (P1, security-escalate). The code fails closed correctly and does not silently skip Solana. Merge should wait on Legal ops and a few test/hygiene fixes — this is not a BLOCK (no prompt injection, no fail-open acceptance, no on-chain auth bypass).

Security

Vector Result
Open redirect via redirect_uri Callers pass window.location.href only. Portal allowlist is still the enforcer. sameOriginClickwrapRedirectUri does not actually check origin — it only requires http(s) and no userinfo. Rename or assert url.origin === window.location.origin so a future caller cannot pass https://evil.example.
XSS / dangerouslySetInnerHTML Not used. Terms stay on the portal.
signed_latest from URL / localStorage Not used. Status is Legal API only.
Fail closed on API error MET — allowsMutative requires account && isSigned && !error; requireSignedLatest throws status-error.
Wrong-network reuse (EVM sig for Terra) Network is mapped from the wallet that signs the action (EVM / TerraClassic / Solana).
Property confusion Hardcoded bridge.cl8y.com; not derived from hostname.
Account switch Gate keys off current account; submit-time re-check uses that account. E2E for A→B switch is missing.
Phishing API override Prod ignores http: overrides. HTTPS env override is still a deploy-review item.
Dependency confusion .npmrc pins @plasticdigits:registry to GitLab project 82547916. Lockfile resolves 0.1.1 from that registry. Integrity is sha1, not sha512 — regenerate the lockfile hash. Caret ^0.1.1 is OK if CI always uses npm ci.
Clickjack / iframe portal Redirect, not iframe. Header Connect stays outside TermsGate (GL-137).
Auto-withdraw without T&C useAutoWithdrawSubmit blocks on loading/error/unsigned and calls requireSignedLatest before submit.
Solana silent skip Not skipped; stays gated until signed_latest (documented).
Prompt injection None
DeFi / oracle / DB N/A — UI compliance gate, not on-chain auth

#134 acceptance criteria

Criterion Status
SDK dependency builds MET (@plasticdigits/cl8y-clickwrap@0.1.1)
Property bridge.cl8y.com MET in code
EVM / Terra unsigned → portal → return Code MET; manual staging unchecked
Solana gated or explicit interim MET (fail closed, documented)
Status-page mutative actions gated MET (auto-submit, hash verify, Solana execute)
Disconnected users can connect MET (TermsGate not on header)
Fail closed on status errors MET
No open redirect / no innerHTML PARTIAL (helper does not bind origin)
Legal ops: property, CORS, allowlist, package MISSING / blocked — MR says so
INV + README MET
Unit + Playwright PARTIAL — units exist; e2e/clickwrap.spec.ts not run; EVM/Solana/status-page/account-switch not in e2e

Required before merge

  1. Legal ops (issue verification item 4): property bridge.cl8y.com registered; API CORS_ORIGINS includes https://bridge.cl8y.com (and localhost if needed); portal VITE_REDIRECT_URI_ALLOWLIST includes the bridge. Without this, fail-closed code disables all production deposits. There is no feature flag.
  2. Confirm /sign/solana policy with product (blocked until signed is OK; do not skip).
  3. Run e2e/clickwrap.spec.ts (unsigned / error / signed) and keep default mock signed_latest: true for the rest of the suite.
  4. Tighten sameOriginClickwrapRedirectUri to same-origin (or stop claiming it is).
  5. Lockfile integrity: sha512.

Testing gaps

  • Playwright covers Terra simulated wallet on Transfer only — not EVM source, Solana execute, dest hash-submit, account switch, or terms version bump.
  • allowsMutative does not include !loading; submit-time requireSignedLatest and TermsGate fallback mitigate this. Still worth asserting loading does not enable the CTA.
  • Manual portal round-trip for EVM and Terra Classic is still unchecked.

Do not treat UI gating as cryptographic authorization — the MR documents that correctly. Fix the ops + origin helper + e2e run, then this is an ACCEPT.

RECOMMEND: FIX Reviewed against #134 (P1, security-escalate). The **code** fails closed correctly and does not silently skip Solana. Merge should wait on Legal ops and a few test/hygiene fixes — this is not a BLOCK (no prompt injection, no fail-open acceptance, no on-chain auth bypass). ## Security | Vector | Result | |---|---| | Open redirect via `redirect_uri` | Callers pass `window.location.href` only. Portal allowlist is still the enforcer. **`sameOriginClickwrapRedirectUri` does not actually check origin** — it only requires http(s) and no userinfo. Rename or assert `url.origin === window.location.origin` so a future caller cannot pass `https://evil.example`. | | XSS / `dangerouslySetInnerHTML` | Not used. Terms stay on the portal. | | `signed_latest` from URL / localStorage | Not used. Status is Legal API only. | | Fail closed on API error | MET — `allowsMutative` requires `account && isSigned && !error`; `requireSignedLatest` throws `status-error`. | | Wrong-network reuse (EVM sig for Terra) | Network is mapped from the wallet that signs the action (`EVM` / `TerraClassic` / `Solana`). | | Property confusion | Hardcoded `bridge.cl8y.com`; not derived from hostname. | | Account switch | Gate keys off current account; submit-time re-check uses that account. E2E for A→B switch is missing. | | Phishing API override | Prod ignores `http:` overrides. HTTPS env override is still a deploy-review item. | | Dependency confusion | `.npmrc` pins `@plasticdigits:registry` to GitLab project `82547916`. Lockfile resolves `0.1.1` from that registry. **Integrity is sha1**, not sha512 — regenerate the lockfile hash. Caret `^0.1.1` is OK if CI always uses `npm ci`. | | Clickjack / iframe portal | Redirect, not iframe. Header Connect stays outside TermsGate (GL-137). | | Auto-withdraw without T&C | `useAutoWithdrawSubmit` blocks on loading/error/unsigned and calls `requireSignedLatest` before submit. | | Solana silent skip | Not skipped; stays gated until `signed_latest` (documented). | | Prompt injection | None | | DeFi / oracle / DB | N/A — UI compliance gate, not on-chain auth | ## #134 acceptance criteria | Criterion | Status | |---|---| | SDK dependency builds | MET (`@plasticdigits/cl8y-clickwrap@0.1.1`) | | Property `bridge.cl8y.com` | MET in code | | EVM / Terra unsigned → portal → return | Code MET; **manual staging unchecked** | | Solana gated or explicit interim | MET (fail closed, documented) | | Status-page mutative actions gated | MET (auto-submit, hash verify, Solana execute) | | Disconnected users can connect | MET (TermsGate not on header) | | Fail closed on status errors | MET | | No open redirect / no innerHTML | PARTIAL (helper does not bind origin) | | Legal ops: property, CORS, allowlist, package | **MISSING / blocked** — MR says so | | INV + README | MET | | Unit + Playwright | PARTIAL — units exist; `e2e/clickwrap.spec.ts` **not run**; EVM/Solana/status-page/account-switch not in e2e | ## Required before merge 1. **Legal ops** (issue verification item 4): property `bridge.cl8y.com` registered; API `CORS_ORIGINS` includes `https://bridge.cl8y.com` (and localhost if needed); portal `VITE_REDIRECT_URI_ALLOWLIST` includes the bridge. Without this, fail-closed code **disables all production deposits**. There is no feature flag. 2. Confirm `/sign/solana` policy with product (blocked until signed is OK; do not skip). 3. Run `e2e/clickwrap.spec.ts` (unsigned / error / signed) and keep default mock `signed_latest: true` for the rest of the suite. 4. Tighten `sameOriginClickwrapRedirectUri` to same-origin (or stop claiming it is). 5. Lockfile integrity: sha512. ## Testing gaps - Playwright covers Terra simulated wallet on Transfer only — not EVM source, Solana execute, dest hash-submit, account switch, or terms version bump. - `allowsMutative` does not include `!loading`; submit-time `requireSignedLatest` and TermsGate `fallback` mitigate this. Still worth asserting loading does not enable the CTA. - Manual portal round-trip for EVM and Terra Classic is still unchecked. Do not treat UI gating as cryptographic authorization — the MR documents that correctly. Fix the ops + origin helper + e2e run, then this is an ACCEPT.
PlasticDigits commented 2026-08-31 09:14:53 +00:00 (Migrated from gitlab.com)

mentioned in merge request !159

mentioned in merge request !159
PlasticDigits commented 2026-08-31 09:18:13 +00:00 (Migrated from gitlab.com)

Follow-up (second pass): still RECOMMEND: FIX. Additional items not in the first note:

  1. Medium — Solana execute swallows requireSignedLatest errors. SolanaRecipientExecutePanel catch { return } after the Legal re-check. Fail-closed is right (execute does not run); silent no-op is not. If TermsGate still shows the button (stale signed UI / race / DevTools), the click does nothing with no error. Surface it like TransferForm (setError / panel error).

  2. Low — Fix-transfer BridgeTermsGate uses recorded dest, not fix dest. TransferStatusPage wraps the Fix button with destClickwrapKind from the recorded dest. handleFixTransfer already re-checks fix.fixParams.destType. If those differ, the UI can show Fix while the fix-chain wallet is unsigned (click then fails) or hide Fix while that wallet is already signed. Wrap Fix with bridgeChainKindFromConfigType(fix.fixParams.destType).

  3. Nits: Multiple TermsGate mounts on Transfer Status (auto-submit hook + several wrappers) duplicate /signatures/status on load/focus. Prefer exact @plasticdigits/cl8y-clickwrap@0.1.1 over ^0.1.1. In PROD, allowlist api.terms.cl8y.com / terms.cl8y.com instead of any https:// override.

Playwright remains the merge bar: run e2e/clickwrap.spec.ts and the transfer suite; extend beyond Terra source deposit (unsigned EVM, dest auto-submit blocked, Solana execute gated). Legal ops stay a production-deploy gate: this SPA fails closed if CORS/property/allowlist are missing — do not ship to https://bridge.cl8y.com until Legal confirms those boxes.

Follow-up (second pass): still **RECOMMEND: FIX**. Additional items not in the first note: 1. **Medium — Solana execute swallows `requireSignedLatest` errors.** `SolanaRecipientExecutePanel` `catch { return }` after the Legal re-check. Fail-closed is right (execute does not run); silent no-op is not. If TermsGate still shows the button (stale signed UI / race / DevTools), the click does nothing with no error. Surface it like `TransferForm` (`setError` / panel error). 2. **Low — Fix-transfer `BridgeTermsGate` uses recorded dest, not fix dest.** `TransferStatusPage` wraps the Fix button with `destClickwrapKind` from the **recorded** dest. `handleFixTransfer` already re-checks `fix.fixParams.destType`. If those differ, the UI can show Fix while the fix-chain wallet is unsigned (click then fails) or hide Fix while that wallet is already signed. Wrap Fix with `bridgeChainKindFromConfigType(fix.fixParams.destType)`. 3. **Nits:** Multiple `TermsGate` mounts on Transfer Status (auto-submit hook + several wrappers) duplicate `/signatures/status` on load/focus. Prefer exact `@plasticdigits/cl8y-clickwrap@0.1.1` over `^0.1.1`. In `PROD`, allowlist `api.terms.cl8y.com` / `terms.cl8y.com` instead of any `https://` override. Playwright remains the merge bar: run `e2e/clickwrap.spec.ts` and the transfer suite; extend beyond Terra source deposit (unsigned EVM, dest auto-submit blocked, Solana execute gated). Legal ops stay a **production-deploy** gate: this SPA fails closed if CORS/property/allowlist are missing — do not ship to https://bridge.cl8y.com until Legal confirms those boxes.
PlasticDigits commented 2026-08-31 11:36:53 +00:00 (Migrated from gitlab.com)

mentioned in commit 9bc7d3951a

mentioned in commit 9bc7d3951ab6605eda5867ecda02cbb397d3a8b8
PlasticDigits commented 2026-08-31 11:36:53 +00:00 (Migrated from gitlab.com)

added 1 commit

  • 9bc7d395 - fix(frontend): harden Legal clickwrap gate from MR !156 review (#134)

Compare with previous version

added 1 commit <ul><li>9bc7d395 - fix(frontend): harden Legal clickwrap gate from MR !156 review (#134)</li></ul> [Compare with previous version](/PlasticDigits/cl8y-bridge-monorepo/-/merge_requests/16/diffs?diff_id=1993951369&start_sha=3553667f0eb29361ba92a881f9483cc6f06188a4)
PlasticDigits commented 2026-08-31 11:37:30 +00:00 (Migrated from gitlab.com)

Review follow-up (commit 9bc7d39)

Hardened the GL-134 clickwrap gate from the two RECOMMEND: FIX notes. Legal ops is still out of this repo.

Completed from review

Item Change
Same-origin redirect_uri sameOriginClickwrapRedirectUri(href, expectedOrigin) now asserts url.origin === window.location.origin (http(s) + no-userinfo is not enough).
Prod API/portal allowlist Production VITE_CLICKWRAP_* overrides are accepted only when origin is https://api.terms.cl8y.com / https://terms.cl8y.com. Other https hosts and all http: are ignored.
Exact SDK pin + sha512 @plasticdigits/cl8y-clickwrap is exact 0.1.1 (no caret). Lockfile integrity is sha512-… of the GitLab tarball.
allowsMutative while loading Requires !loading so a stale isSigned cannot enable a CTA mid-fetch.
Solana execute silent catch requireSignedLatest failures surface on the panel (role="alert"), same as TransferForm / Verify.
Fix dest TermsGate Fix button uses bridgeChainKindFromConfigType(fix.fixParams.destType), not recorded dest. brokenTransferFix now sets destType: 'solana' when the correct dest is Solana (execute still unsupported in the handler).
Duplicate status GETs (nit) In-flight coalesce on getSignatureStatus (no result cache; submit re-check still hits the network).
Playwright Ran e2e/clickwrap.spec.ts twice (5 workers). Added unsigned EVM source (swap to Anvil). Default mock remains signed_latest: true.
Docs INV-FE-CLICKWRAP-1, skills/agent-frontend-clickwrap.md, skills/agent-frontend-bridge-chains.md, README, docs/frontend.md, .env.example.

Tests run

  • SKIP_INTEGRATION=true npx vitest run — 676 passed (full suite + focused retest)
  • npx tsc --noEmit + ESLint on changed files (also pre-commit)
  • Playwright e2e/clickwrap.spec.ts — 5/5 passed twice: disconnected, unsigned Terra, API error, signed Terra, unsigned EVM

Not done (intentional)

  • Legal ops (property bridge.cl8y.com, API CORS_ORIGINS, portal VITE_REDIRECT_URI_ALLOWLIST, Solana /sign/solana production-ready) — still blocked outside this repo. Do not ship to https://bridge.cl8y.com until those boxes are confirmed. Fail-closed code will disable production deposits without them.
  • Manual portal round-trip (unsigned EVM/Terra → terms.cl8y.com → return) — needs staging Legal.
  • Playwright dest auto-submit / Solana execute / account A→B — dest status never reaches networkidle (on-chain lookup poll); there is no simulated Solana wallet; wagmi mock has extra accounts but no switch UI. Dest/Solana execute remain covered by unit + submit-time requireSignedLatest. Full-path e2e belongs on the verification project with a real deposited/approved transfer.
  • Solana broken-transfer execute — still shows “not yet supported” after the destType type fix.

Checklist to verify

  • Unsigned Terra source: Accept Terms visible, no submit-transfer
  • Unsigned EVM source (swap to Anvil): same
  • Legal API 5xx: alert + no deposit CTA
  • Signed mock: deposit CTA visible, no Accept Terms
  • Header CONNECT EVM / TC still usable while unsigned (no full-page overlay)
  • Transfer Status Fix: TermsGate follows fix dest, not recorded dest
  • Solana Execute: if TermsGate is bypassed, panel shows the Legal error (does not silently no-op)
  • Production bundle: VITE_CLICKWRAP_API_BASE_URL=https://evil.example is ignored
  • Spot-check INV-UX1 / INV-RCP1 (empty/invalid recipient still disables CTA)
  • Legal ops boxes in the MR description before production deploy
## Review follow-up (commit `9bc7d39`) Hardened the GL-134 clickwrap gate from the two **RECOMMEND: FIX** notes. Legal ops is still out of this repo. ### Completed from review | Item | Change | |------|--------| | Same-origin `redirect_uri` | `sameOriginClickwrapRedirectUri(href, expectedOrigin)` now asserts `url.origin === window.location.origin` (http(s) + no-userinfo is not enough). | | Prod API/portal allowlist | Production `VITE_CLICKWRAP_*` overrides are accepted only when origin is `https://api.terms.cl8y.com` / `https://terms.cl8y.com`. Other https hosts and all `http:` are ignored. | | Exact SDK pin + sha512 | `@plasticdigits/cl8y-clickwrap` is exact `0.1.1` (no caret). Lockfile integrity is `sha512-…` of the GitLab tarball. | | `allowsMutative` while loading | Requires `!loading` so a stale `isSigned` cannot enable a CTA mid-fetch. | | Solana execute silent catch | `requireSignedLatest` failures surface on the panel (`role="alert"`), same as TransferForm / Verify. | | Fix dest TermsGate | Fix button uses `bridgeChainKindFromConfigType(fix.fixParams.destType)`, not recorded dest. `brokenTransferFix` now sets `destType: 'solana'` when the correct dest is Solana (execute still unsupported in the handler). | | Duplicate status GETs (nit) | In-flight coalesce on `getSignatureStatus` (no result cache; submit re-check still hits the network). | | Playwright | Ran `e2e/clickwrap.spec.ts` twice (5 workers). Added **unsigned EVM source** (swap to Anvil). Default mock remains `signed_latest: true`. | | Docs | **INV-FE-CLICKWRAP-1**, `skills/agent-frontend-clickwrap.md`, `skills/agent-frontend-bridge-chains.md`, README, `docs/frontend.md`, `.env.example`. | ### Tests run - `SKIP_INTEGRATION=true npx vitest run` — **676** passed (full suite + focused retest) - `npx tsc --noEmit` + ESLint on changed files (also pre-commit) - Playwright `e2e/clickwrap.spec.ts` — **5/5 passed twice**: disconnected, unsigned Terra, API error, signed Terra, unsigned EVM ### Not done (intentional) - **Legal ops** (property `bridge.cl8y.com`, API `CORS_ORIGINS`, portal `VITE_REDIRECT_URI_ALLOWLIST`, Solana `/sign/solana` production-ready) — still blocked outside this repo. Do not ship to https://bridge.cl8y.com until those boxes are confirmed. Fail-closed code will disable production deposits without them. - **Manual portal round-trip** (unsigned EVM/Terra → terms.cl8y.com → return) — needs staging Legal. - **Playwright dest auto-submit / Solana execute / account A→B** — dest status never reaches `networkidle` (on-chain lookup poll); there is no simulated Solana wallet; wagmi mock has extra accounts but no switch UI. Dest/Solana execute remain covered by unit + submit-time `requireSignedLatest`. Full-path e2e belongs on the verification project with a real deposited/approved transfer. - **Solana broken-transfer execute** — still shows “not yet supported” after the destType type fix. ### Checklist to verify - [ ] Unsigned Terra source: Accept Terms visible, no `submit-transfer` - [ ] Unsigned EVM source (swap to Anvil): same - [ ] Legal API 5xx: alert + no deposit CTA - [ ] Signed mock: deposit CTA visible, no Accept Terms - [ ] Header CONNECT EVM / TC still usable while unsigned (no full-page overlay) - [ ] Transfer Status Fix: TermsGate follows **fix dest**, not recorded dest - [ ] Solana Execute: if TermsGate is bypassed, panel shows the Legal error (does not silently no-op) - [ ] Production bundle: `VITE_CLICKWRAP_API_BASE_URL=https://evil.example` is ignored - [ ] Spot-check INV-UX1 / INV-RCP1 (empty/invalid recipient still disables CTA) - [ ] Legal ops boxes in the MR description before production deploy
PlasticDigits commented 2026-08-31 12:10:00 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-31 12:11:13 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-31 12:12:02 +00:00 (Migrated from gitlab.com)

mentioned in commit a5a7620ccf

mentioned in commit a5a7620ccfe4065ae83abb79d7bef96893dbb776
PlasticDigits (Migrated from gitlab.com) merged commit a5a7620ccf into main 2026-08-31 12:12:02 +00:00
PlasticDigits commented 2026-08-31 12:39:02 +00:00 (Migrated from gitlab.com)

mentioned in issue #134

mentioned in issue #134
PlasticDigits commented 2026-08-31 12:39:09 +00:00 (Migrated from gitlab.com)

mentioned in issue #137

mentioned in issue #137
Sign in to join this conversation.
No description provided.