docs: integrator guidance — pair.swap is pool-only; best execution via indexer/router #707

Closed
opened 2026-08-30 05:24:13 +00:00 by PlasticDigits · 11 comments
PlasticDigits commented 2026-08-30 05:24:13 +00:00 (Migrated from gitlab.com)

Summary

Publish clear integrator guidance that direct pair.swap without HybridSwapParams is pool-only, and that best execution (limit book + multi-hop split) goes through the indexer route solver and/or router ops with caller-declared hybrid.

Approved from #704 as the docs/awareness path that can ship now, independent of pair wasm. Product stance (same thread): pool-only direct swaps are intentional so simple bots can trade without off-chain routing; they effectively pay arbs. Operators who want the book must opt into hybrid (Pattern C) or the solver.

Contract follow-up (greedy book-first variant, no caller split): linked design issue from #704. Do not block this docs ticket on that migrate.


Current codebase

The behavior is already implemented and partially documented, but not as a bot-facing warning at the front of integrator docs.

On-chain (do not change in this ticket)

smartcontracts/contracts/pair/src/contract.rs execute_swap: hybrid: None → book_leg = 0. TerraSwap-compatible wallets that Cw20 Send → Swap {} never touch the FIFO book.

HybridSwapParams is required for a book leg: pool_input + book_input = offer, plus max_maker_fills and optional book_start_hint.

Router TerraSwap.hybrid: null is also pool-only on execute (router/src/contract.rs).

Off-chain best execution (already exists)

Path What it does
GET /api/v1/route/solve?token_in=&token_out=&amount_in= Global best execution: paths + per-hop hybrid grid (#209, ADR 0002)
GET .../route/solve/best Same engine, amount_in required (#189)
POST /api/v1/route/solve + hybrid_by_hop Integrator-declared splits
pool_only=true Explicit pool-only ops (custom frontends / this awareness story)
Official dApp Swap + Trade market Always GET solver hybrid (#501, #596)

LCD book for a hint: GET /api/v1/pairs/{addr}/order-book-head (integrators.md).

Docs today (gaps)

Observed: columbus-5 bot ~85 pair-direct swaps/day on CL8Y-cb/cLUNC crossed a better ask by ~1.7% because it never passed HybridSwapParams (#704).


Why this is needed

#596 fixed the official UI. Third-party wallets, vaults, and MM bots still copy TerraSwap Swap {} and systematically miss resting liquidity. That:

  • gives those takers worse prices than the venue can offer;
  • starves makers of flow (same incentive bug as pre-#596 UI);
  • is easy to misread as a contract bug rather than a documented routing choice.

Docs will not make every bot hybrid, but they remove “we didn’t know the book existed” as an excuse and point at the indexer the same way this repo’s dApp does.


Constraints / guardrails

Invariants I704-1–I704-8.

ID Rule
I704-1 — no wasm in this ticket Do not change hybrid: None semantics, pair/router execute, or force a book walk. That remains expected (see #704 product comment).
I704-2 — default story is three rungs (1) Pool-only: omit hybrid / pool_only=true. (2) Declared hybrid: Pattern C pool_input+book_input (hard; need a quote). (3) Best execution: GET /api/v1/route/solve with amount_in, then execute the returned router_operations (or pair-direct single-hop with those hybrid params). Mention greedy in-contract variant only as future / linked design, not as live API until wasm ships.
I704-3 — do not tell bots to invent splits Do not document “guess book_input.” Point at the solver or LCD HybridSimulation with a known split. book_start_hint = first live same-side order (#272, #332).
I704-4 — arb is not best execution for that taker One short paragraph: arbs may close pool vs book later; the pool-only taker still paid the worse price. That is the product tradeoff, not a hidden defect.
I704-5 — quote = execute (L8) Never recommend pair Simulation (removed). Pool-only quotes = HybridSimulation + book_input = 0. Book-inclusive quotes must use the same HybridSwapParams as execute.
I704-6 — retail copy stays out No Swap/Trade UI banners, no #489 cognitive-load dump on the dApp. This is integrator docs (+ agent skills). Official UI already always-on hybrid.
I704-7 — gas / caps Link existing caps (max_maker_fills ≤ 100, MAX_SCAN_STEPS 500, hybrid gas). Do not invent new numbers.
I704-8 — verify without chain make verify-issue-<iid> is doc/skill grep + optional markdown anchors, no LocalTerra, no pair migrate.

Relevant files

Must update:

Should cross-link: docs/contracts-security-audit.md L8 · skills/AGENTS_INDEXER_HYBRID_BEST_EXECUTION.md · skills/AGENTS_BOOK_MATCH_HINT_SECURITY.md · docs/integrators-hybrid-volume.md (measurement: pool_leg_volume / book_leg_volume)

Do not: frontend strings, pair error.rs messages (optional one-line comment in execute_swap only if it stays a comment — prefer docs-only to skip wasm).

Related: #704 · #501 · #596 · #209 · #190


  1. Lead docs/integrators.md with a boxed decision table:

    Goal Call
    Cheapest v2-style swap; miss the book CW20 Send → pair Swap with hybrid omitted
    Best price on this venue (book + hops) GET {INDEXER}/api/v1/route/solve?token_in&token_out&amount_in (+ optional trader) → execute returned ops; 1 hop may still be pair-direct but must include solver hybrid
    Explicit pool quote pool_only=true or HybridSimulation with book_input=0
  2. Minimal execute sketch (JSON shapes only, no new SDK): pointer to router_operations and single-hop Cw20HookMsg::Swap { hybrid } fields. Link OpenAPI / Swagger.

  3. Hint recipe: order-book-head or solver-provided book_start_hint; wrong-side is safe (L17) but expired heads need the first live id (#289).

  4. How to see leakage: indexer trades book_leg_volume vs pool_leg_volume on pair-direct txs (#216).

  5. Skill: 8–12 line “Do not regress” in AGENTS_HYBRID_QUOTING.md so agents do not tell bots “just swap on the pair.”

  6. Verify script: grep the new heading / table strings and the architecture caveat.


Acceptance criteria

  • docs/integrators.md has a first-screen section stating: omit hybrid ⇒ pool-only; best execution ⇒ indexer GET /route/solve (or declared Pattern C).
  • Architecture swap diagram or a note under it states the book is not consulted unless hybrid params are present.
  • docs/README.md index points at that section.
  • limit-orders Pattern C + ADR 0001 + AGENTS_HYBRID_QUOTING.md agree (no contradiction with #596 always-on dApp).
  • Greedy in-contract API is not documented as shipped.
  • Arb vs taker best-execution is stated once (I704-4).
  • make verify-issue-<iid> green without Docker/chain.
  • No dApp copy changes.

Test plan (functional paths)

Docs/static only:

  1. Reader landing on docs/integrators.md can answer in < 1 minute: “Does my TerraSwap Swap {} hit the book?” → No.
  2. Same page names the exact GET URL and amount_in requirement.
  3. Same page distinguishes: (a) pair-direct pool-only, (b) pair-direct with solver hybrid (1 hop), (c) router ≥2 hops, (d) pool_only=true.
  4. Cross-links resolve (anchors for order-book-head, L8, ADR 0002).
  5. Agent skill forbids “pair.swap is best execution.”
  6. make verify-issue-<iid> greps I704 heading + /api/v1/route/solve + hybrid: None / omitted wording.
  7. Optional: python3/rg that architecture.md mentions hybrid or limit book on the swap path.

No contract tests. No Playwright.


Test plan (attack, hack, abuse)

Documentation can be wrong in a way that causes loss. Treat copy as a safety surface.

Vector Expect
D1 Docs imply omitting hybrid still takes the book Forbidden. That would recreate the #704 loss. Grep/review.
D2 Docs tell bots to set random book_input Forbidden (I704-3). Must point at solver or matching HybridSimulation.
D3 Docs tell bots to use removed Simulation Forbidden (L8 / #190).
D4 Docs recommend spoofing trader on pair-direct Forbidden. Router stamps trader; pair-direct trader is ignored unless trusted router.
D5 Docs recommend book_start_hint from the wrong side as an exploit Must state L17 fallback; hint is not a drain primitive.
D6 Docs claim greedy wasm is live Forbidden until the design issue ships.
D7 Docs tell the official UI to add a pool-only toggle Forbidden (#596). Integrator pool_only=true only.
D8 Phishing / fake indexer URL Use indexer.dex.cl8y.com as production example; say LCD/factory provenance (P1) — do not paste random third-party “solver” hosts.
D9 Gas under-estimate Point at existing hybrid gas skill; do not suggest gas = 600000 for book walks.
D10 Volume double-count advice Point at integrators-hybrid-volume.md; do not add limit_order_fills on top of parent swap volume.

Verification criteria

  • make verify-issue-<iid> (new scripts/qa/verify-issue-<iid>.sh) asserts the integrators heading, three-rung table (or equivalent), architecture note, and skill sentence exist.
  • Human read of docs/integrators.md top: pool-only vs solver is unambiguous.
  • No smartcontracts/ or frontend-dapp/src changes (comment-only in pair allowed only if called out; default zero wasm).
  • Linked from #704.
## Summary Publish **clear integrator guidance** that **direct `pair.swap` without `HybridSwapParams` is pool-only**, and that **best execution** (limit book + multi-hop split) goes through the **indexer route solver** and/or **router ops with caller-declared hybrid**. Approved from [#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704) as the **docs/awareness path that can ship now**, independent of pair wasm. Product stance (same thread): pool-only direct swaps are **intentional** so simple bots can trade without off-chain routing; they effectively pay arbs. Operators who want the book must opt into hybrid (Pattern C) or the solver. Contract follow-up (greedy book-first variant, no caller split): linked design issue from [#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704). Do **not** block this docs ticket on that migrate. --- ## Current codebase The behavior is already implemented and **partially** documented, but **not as a bot-facing warning** at the front of integrator docs. ### On-chain (do not change in this ticket) [`smartcontracts/contracts/pair/src/contract.rs`](smartcontracts/contracts/pair/src/contract.rs) `execute_swap`: `hybrid: None` → `book_leg = 0`. TerraSwap-compatible wallets that `Cw20 Send` → `Swap {}` never touch the FIFO book. [`HybridSwapParams`](smartcontracts/packages/dex-common/src/pair.rs) is required for a book leg: `pool_input` + `book_input` = offer, plus `max_maker_fills` and optional `book_start_hint`. Router `TerraSwap.hybrid: null` is also pool-only on execute ([`router/src/contract.rs`](smartcontracts/contracts/router/src/contract.rs)). ### Off-chain best execution (already exists) | Path | What it does | |------|----------------| | `GET /api/v1/route/solve?token_in=&token_out=&amount_in=` | Global best execution: paths + per-hop hybrid grid ([#209](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/209), [ADR 0002](docs/adr/0002-global-best-execution-route-solver.md)) | | `GET .../route/solve/best` | Same engine, `amount_in` required ([#189](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/189)) | | `POST /api/v1/route/solve` + `hybrid_by_hop` | Integrator-declared splits | | `pool_only=true` | Explicit pool-only ops (custom frontends / this awareness story) | | Official dApp Swap + Trade market | Always GET solver hybrid ([#501](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/501), [#596](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/596)) | LCD book for a **hint**: `GET /api/v1/pairs/{addr}/order-book-head` ([integrators.md](docs/integrators.md#on-chain-limit-book-lcd-proxy)). ### Docs today (gaps) - [`docs/integrators.md`](docs/integrators.md) opens on hybrid **hooks (L7)** and book HTTP. It does **not** lead with “omitting `hybrid` skips the book.” - [`docs/limit-orders.md`](docs/limit-orders.md) Pattern C section assumes the caller already passes `hybrid`. - [`docs/architecture.md`](docs/architecture.md) swap sequence is **pool-only** (k, commission, hook) — no book, no solver. - [`docs/adr/0001-hybrid-quoting-and-routing.md`](docs/adr/0001-hybrid-quoting-and-routing.md) / [`skills/AGENTS_HYBRID_QUOTING.md`](skills/AGENTS_HYBRID_QUOTING.md) are accurate for in-repo agents, not a 1-page bot recipe. - [`docs/README.md`](docs/README.md) integrator bullet does not mention pool-only vs best execution. Observed: columbus-5 bot ~85 pair-direct swaps/day on CL8Y-cb/cLUNC crossed a better ask by ~1.7% because it never passed `HybridSwapParams` ([#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704)). --- ## Why this is needed #596 fixed the **official UI**. Third-party wallets, vaults, and MM bots still copy TerraSwap `Swap {}` and systematically miss resting liquidity. That: - gives those takers worse prices than the venue can offer; - starves makers of flow (same incentive bug as pre-#596 UI); - is **easy to misread** as a contract bug rather than a documented routing choice. Docs will not make every bot hybrid, but they remove “we didn’t know the book existed” as an excuse and point at the indexer the same way this repo’s dApp does. --- ## Constraints / guardrails Invariants **I704-1–I704-8**. | ID | Rule | |----|------| | **I704-1 — no wasm in this ticket** | Do **not** change `hybrid: None` semantics, pair/router execute, or force a book walk. That remains expected (see [#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704) product comment). | | **I704-2 — default story is three rungs** | (1) **Pool-only:** omit `hybrid` / `pool_only=true`. (2) **Declared hybrid:** Pattern C `pool_input`+`book_input` (hard; need a quote). (3) **Best execution:** `GET /api/v1/route/solve` with `amount_in`, then execute the returned `router_operations` (or pair-direct single-hop **with those hybrid params**). Mention greedy in-contract variant only as **future / linked design**, not as live API until wasm ships. | | **I704-3 — do not tell bots to invent splits** | Do not document “guess `book_input`.” Point at the solver or LCD `HybridSimulation` with a **known** split. `book_start_hint` = first **live** same-side order ([#272](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/272), [#332](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/332)). | | **I704-4 — arb is not best execution for that taker** | One short paragraph: arbs may close pool vs book **later**; the pool-only taker still paid the worse price. That is the product tradeoff, not a hidden defect. | | **I704-5 — quote = execute (L8)** | Never recommend pair `Simulation` (removed). Pool-only quotes = `HybridSimulation` + `book_input = 0`. Book-inclusive quotes must use the **same** `HybridSwapParams` as execute. | | **I704-6 — retail copy stays out** | No Swap/Trade UI banners, no `#489` cognitive-load dump on the dApp. This is **integrator** docs (+ agent skills). Official UI already always-on hybrid. | | **I704-7 — gas / caps** | Link existing caps (`max_maker_fills` ≤ 100, `MAX_SCAN_STEPS` 500, hybrid gas). Do not invent new numbers. | | **I704-8 — verify without chain** | `make verify-issue-<iid>` is **doc/skill grep + optional markdown anchors**, no LocalTerra, no pair migrate. | --- ## Relevant files **Must update:** - [`docs/integrators.md`](docs/integrators.md) — **new top section** (before L7 hooks): “How to swap (pool-only vs best execution)” - [`docs/README.md`](docs/README.md) — integrator index line - [`docs/limit-orders.md`](docs/limit-orders.md) — Pattern C intro: omitting `hybrid` = pool-only - [`docs/architecture.md`](docs/architecture.md) — swap flow note: book only if `hybrid` set; best execution is indexer/router - [`docs/adr/0001-hybrid-quoting-and-routing.md`](docs/adr/0001-hybrid-quoting-and-routing.md) — short “integrator default” bullet - [`skills/AGENTS_HYBRID_QUOTING.md`](skills/AGENTS_HYBRID_QUOTING.md) — same three-rung table - [`docs/route-solver.md`](docs/route-solver.md) and/or [`docs/indexer-invariants.md`](docs/indexer-invariants.md) — one sentence: this GET is the integrator best-execution API for pair-direct bots too (submit solver `hybrid` on the pair) **Should cross-link:** `docs/contracts-security-audit.md` L8 · `skills/AGENTS_INDEXER_HYBRID_BEST_EXECUTION.md` · `skills/AGENTS_BOOK_MATCH_HINT_SECURITY.md` · `docs/integrators-hybrid-volume.md` (measurement: `pool_leg_volume` / `book_leg_volume`) **Do not:** frontend strings, pair `error.rs` messages (optional one-line comment in `execute_swap` **only if** it stays a comment — prefer docs-only to skip wasm). **Related:** [#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704) · [#501](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/501) · [#596](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/596) · [#209](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/209) · [#190](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/190) --- ## Recommended direction 1. **Lead [`docs/integrators.md`](docs/integrators.md) with a boxed decision table:** | Goal | Call | |------|------| | Cheapest v2-style swap; miss the book | CW20 `Send` → pair `Swap` with `hybrid` omitted | | Best price on this venue (book + hops) | `GET {INDEXER}/api/v1/route/solve?token_in&token_out&amount_in` (+ optional `trader`) → execute returned ops; **1 hop** may still be pair-direct **but must include** solver `hybrid` | | Explicit pool quote | `pool_only=true` or `HybridSimulation` with `book_input=0` | 2. **Minimal execute sketch** (JSON shapes only, no new SDK): pointer to `router_operations` and single-hop `Cw20HookMsg::Swap { hybrid }` fields. Link OpenAPI / Swagger. 3. **Hint recipe:** `order-book-head` or solver-provided `book_start_hint`; wrong-side is safe (**L17**) but expired heads need the first **live** id ([#289](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/289)). 4. **How to see leakage:** indexer trades `book_leg_volume` vs `pool_leg_volume` on pair-direct txs ([#216](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/216)). 5. **Skill:** 8–12 line “Do not regress” in `AGENTS_HYBRID_QUOTING.md` so agents do not tell bots “just swap on the pair.” 6. **Verify script:** grep the new heading / table strings and the architecture caveat. --- ## Acceptance criteria - [ ] `docs/integrators.md` has a **first-screen** section stating: omit `hybrid` ⇒ pool-only; best execution ⇒ indexer `GET /route/solve` (or declared Pattern C). - [ ] Architecture swap diagram or a note under it states the book is **not** consulted unless hybrid params are present. - [ ] `docs/README.md` index points at that section. - [ ] limit-orders Pattern C + ADR 0001 + `AGENTS_HYBRID_QUOTING.md` agree (no contradiction with #596 always-on **dApp**). - [ ] Greedy in-contract API is **not** documented as shipped. - [ ] Arb vs taker best-execution is stated once (I704-4). - [ ] `make verify-issue-<iid>` green without Docker/chain. - [ ] No dApp copy changes. --- ## Test plan (functional paths) Docs/static only: 1. Reader landing on `docs/integrators.md` can answer in &lt; 1 minute: “Does my TerraSwap `Swap {}` hit the book?” → **No.** 2. Same page names the exact GET URL and `amount_in` requirement. 3. Same page distinguishes: (a) pair-direct pool-only, (b) pair-direct **with** solver hybrid (1 hop), (c) router ≥2 hops, (d) `pool_only=true`. 4. Cross-links resolve (anchors for order-book-head, L8, ADR 0002). 5. Agent skill forbids “pair.swap is best execution.” 6. `make verify-issue-<iid>` greps I704 heading + `/api/v1/route/solve` + `hybrid: None` / omitted wording. 7. Optional: `python3`/`rg` that `architecture.md` mentions hybrid or limit book on the swap path. No contract tests. No Playwright. --- ## Test plan (attack, hack, abuse) Documentation can be **wrong in a way that causes loss**. Treat copy as a safety surface. | Vector | Expect | |--------|--------| | **D1 Docs imply omitting hybrid still takes the book** | Forbidden. That would recreate the #704 loss. Grep/review. | | **D2 Docs tell bots to set random `book_input`** | Forbidden (I704-3). Must point at solver or matching `HybridSimulation`. | | **D3 Docs tell bots to use removed `Simulation`** | Forbidden (L8 / #190). | | **D4 Docs recommend spoofing `trader` on pair-direct** | Forbidden. Router stamps `trader`; pair-direct `trader` is ignored unless trusted router. | | **D5 Docs recommend `book_start_hint` from the wrong side as an exploit** | Must state L17 fallback; hint is not a drain primitive. | | **D6 Docs claim greedy wasm is live** | Forbidden until the design issue ships. | | **D7 Docs tell the official UI to add a pool-only toggle** | Forbidden (#596). Integrator `pool_only=true` only. | | **D8 Phishing / fake indexer URL** | Use `indexer.dex.cl8y.com` as production example; say LCD/factory provenance (P1) — do not paste random third-party “solver” hosts. | | **D9 Gas under-estimate** | Point at existing hybrid gas skill; do not suggest `gas = 600000` for book walks. | | **D10 Volume double-count advice** | Point at `integrators-hybrid-volume.md`; do not add `limit_order_fills` on top of parent swap volume. | --- ## Verification criteria - [ ] `make verify-issue-<iid>` (new `scripts/qa/verify-issue-<iid>.sh`) asserts the integrators heading, three-rung table (or equivalent), architecture note, and skill sentence exist. - [ ] Human read of `docs/integrators.md` top: pool-only vs solver is unambiguous. - [ ] No `smartcontracts/` or `frontend-dapp/src` changes (comment-only in pair allowed only if called out; default **zero wasm**). - [ ] Linked from [#704](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/704).
PlasticDigits commented 2026-08-30 05:24:14 +00:00 (Migrated from gitlab.com)

marked as related to #704

marked as related to #704
PlasticDigits commented 2026-08-30 05:24:28 +00:00 (Migrated from gitlab.com)

marked as related to #708

marked as related to #708
PlasticDigits commented 2026-08-30 05:24:29 +00:00 (Migrated from gitlab.com)

mentioned in issue #704

mentioned in issue #704
PlasticDigits commented 2026-08-30 05:24:30 +00:00 (Migrated from gitlab.com)

Sibling contract design (does not block this docs ticket): #708. Parent: #704.

Sibling contract design (does not block this docs ticket): #708. Parent: #704.
PlasticDigits commented 2026-08-30 05:24:31 +00:00 (Migrated from gitlab.com)

mentioned in issue #708

mentioned in issue #708
PlasticDigits commented 2026-08-31 05:09:18 +00:00 (Migrated from gitlab.com)

mentioned in issue #712

mentioned in issue #712
PlasticDigits commented 2026-09-01 08:15:55 +00:00 (Migrated from gitlab.com)

mentioned in issue #718

mentioned in issue #718

/agent implement

/agent implement

/agent implement

/agent implement

Verified and completed: added the first-screen decision table and I707-1–I707-7 in docs/integrators.md, aligned architecture, Pattern C, ADR 0001, route-solver docs, docs index, and third-party skills. make verify-issue-707 passes 21/21 static checks; no LocalTerra, wasm, or dApp source changes.

Since #708–#710 have shipped, the docs describe greedy as the current opt-in path. Newer #718 tracks the separate omitted-parameter default change and owns doc reconciliation when that rollout lands. Closing #707 for current contract behavior. Related: #704, #708, #709, #710, #718.

Verified and completed: added the first-screen decision table and I707-1–I707-7 in `docs/integrators.md`, aligned architecture, Pattern C, ADR 0001, route-solver docs, docs index, and third-party skills. `make verify-issue-707` passes 21/21 static checks; no LocalTerra, wasm, or dApp source changes. Since #708–#710 have shipped, the docs describe greedy as the current opt-in path. Newer #718 tracks the separate omitted-parameter default change and owns doc reconciliation when that rollout lands. Closing #707 for current contract behavior. Related: #704, #708, #709, #710, #718.

PR #1336 merged after refreshed Woodpecker CI remained Pending. Local make verify-issue-707 passed 21/21, including the docs-only scope guard; the issue remains closed.

PR #1336 merged after refreshed Woodpecker CI remained Pending. Local make verify-issue-707 passed 21/21, including the docs-only scope guard; the issue remains closed.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
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-dex-terraclassic#707
No description provided.