Skip to content

Dev - #2164

Merged
brunod-e merged 123 commits into
mainfrom
dev
Sep 15, 2026
Merged

Dev#2164
brunod-e merged 123 commits into
mainfrom
dev

Conversation

@LeonardoVieira1630

Copy link
Copy Markdown
Member

No description provided.

brunod-e and others added 30 commits August 30, 2026 16:01
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…manizers

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…king and summaries

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lldata

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… cards

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…controls

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d oversized permalinks

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r edge cases

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…parallelize batch decodes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…stic

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e whole tree

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…med tuple components

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ding

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rmalink length

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…llapsed rows

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ETH on collapsed rows

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…distribution

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
anticapture-storybook Ready Ready Preview Sep 15, 2026 8:16pm UTC
1 Skipped Deployment
Project Deployment Actions Updated
anticapture (dev) Ignored Ignored Sep 15, 2026 8:16pm UTC

Request Review

@railway-app

railway-app Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the anticapture-pr-2164 environment in anticapture-infra

Service Status Web Updated
nouns-api ✅ Success (View Logs) Sep 15, 2026 at 8:20 pm UTC
scroll-api ✅ Success (View Logs) Sep 15, 2026 at 8:20 pm UTC
fluid-api ✅ Success (View Logs) Sep 15, 2026 at 8:19 pm UTC
compound-api ✅ Success (View Logs) Sep 15, 2026 at 8:19 pm UTC
ens-relayer ✅ Success (View Logs) Sep 15, 2026 at 8:18 pm UTC
lil-nouns-api ✅ Success (View Logs) Sep 15, 2026 at 8:18 pm UTC
otelcol ✅ Success (View Logs) Sep 15, 2026 at 8:18 pm UTC
tornado-api ✅ Success (View Logs) Sep 15, 2026 at 8:18 pm UTC
aave-api ✅ Success (View Logs) Sep 15, 2026 at 8:17 pm UTC
gitcoin-api ✅ Success (View Logs) Sep 15, 2026 at 8:17 pm UTC
tempo ✅ Success (View Logs) Sep 15, 2026 at 8:17 pm UTC
uniswap-api ✅ Success (View Logs) Sep 15, 2026 at 8:17 pm UTC
shutter-api ✅ Success (View Logs) Sep 15, 2026 at 8:17 pm UTC
grafana ✅ Success (View Logs) Web Sep 15, 2026 at 8:17 pm UTC
loki ✅ Success (View Logs) Sep 15, 2026 at 8:16 pm UTC
alertmanager ✅ Success (View Logs) Web Sep 15, 2026 at 8:16 pm UTC
gateful ✅ Success (View Logs) Web Sep 15, 2026 at 8:16 pm UTC
ens-api ✅ Success (View Logs) Sep 15, 2026 at 8:16 pm UTC
obol-api ✅ Success (View Logs) Sep 15, 2026 at 8:16 pm UTC
prometheus ✅ Success (View Logs) Sep 15, 2026 at 8:16 pm UTC
docs ✅ Success (View Logs) Web Sep 15, 2026 at 8:15 pm UTC
authful ✅ Success (View Logs) Web Sep 15, 2026 at 8:15 pm UTC
mcp ✅ Success (View Logs) Web Sep 15, 2026 at 8:15 pm UTC
ens-indexer-offchain ✅ Success (View Logs) Sep 15, 2026 at 7:02 pm UTC
uniswap-indexer-offchain ✅ Success (View Logs) Sep 15, 2026 at 7:02 pm UTC
compound-indexer-offchain ✅ Success (View Logs) Sep 15, 2026 at 7:02 pm UTC
shutter-indexer-offchain ✅ Success (View Logs) Sep 15, 2026 at 6:59 pm UTC
gitcoin-indexer-offchain ✅ Success (View Logs) Sep 15, 2026 at 6:55 pm UTC
address-enrichment ✅ Success (View Logs) Web Sep 15, 2026 at 6:15 pm UTC
gitcoin-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
obol-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
tornado-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
lil-nouns-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
shutter-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
aave-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
ens-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
compound-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
uniswap-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
fluid-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
nouns-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
scroll-indexer ✅ Success (View Logs) Sep 15, 2026 at 6:15 pm UTC
erpc ✅ Success (View Logs) Sep 15, 2026 at 6:14 pm UTC
nodeful ✅ Success (View Logs) Sep 15, 2026 at 6:14 pm UTC
user-api ✅ Success (View Logs) Web Sep 15, 2026 at 6:10 pm UTC

@railway-app
railway-app Bot temporarily deployed to anticapture-infra / anticapture-pr-2164 September 15, 2026 18:03 Destroyed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b20ba4b540

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +92 to +94
// Fire-and-forget: the response must not wait for the broadcast.
void enactment
.enact(proposalId.toString())

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Queue webhook work durably before acknowledging it

When the process restarts or enact() encounters a transient RPC/API failure after this fire-and-forget call, the handler has already returned 202 and the catch path only logs the failure. The webhook sender therefore considers the one-shot proposal event delivered, while the proposal is never queued or executed automatically. Persist the job before returning 202, or add an internal retry mechanism so accepted events cannot be silently lost.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator

🎨 UI Review

Automated review · Figma: Anticapture Product Design — sections "🔍 Calldata Visualization (Decoder + AI Summary)" (node 3412:136491) and "📬 Proposal Improvements (Creation Flow)" (node 3569:136267), found via the linked ClickUp specs · Spec: Calldata Visualization · Proposal Improvements · Preview: not reachable (see caveat)

⚠️ Mixed-coverage caveat. This PR is a dev→main bulk sync (162 files, 105 commits), not a single feature. Two of the touched surfaces — the new Calldata Decoder and the field-message pattern in the create-proposal modals — matched a Figma spec found via ClickUp, so those sections below are Figma-validated. The rest (the gasless queue/execute flow in GovernanceActionModal, the sidebar/mobile nav entry) had no matching spec in the two ClickUp Features lists or a workspace search, so those are [Code-only]/[UX-heuristic], grounded in diff reading and UX judgment.
⚠️ Preview unreachable. Vercel skipped the dashboard's own PR preview for this custom dev environment (shows "Ignored" in the bot comment); only anticapture-storybook.vercel.app deployed, and that was blocked by this environment's egress proxy. No live before/after comparison was possible — regression check below is diff-level only.


Calldata Decoder (/tools/decoder, embedded Actions tab)

Validated against Figma — no change needed

  • Field-message color mapping (DecoderInputPanel.tsx's HelperText, AbiInput.tsx's error span): helper → text-secondary, warning → text-warning, error → text-error. Matches Figma "01 — Field message component" (node 3569:136268) exactly, including "error also sets the border, warning never touches the border" (AbiInput's Textarea gets error={Boolean(error)} only on the error path). [Figma-confirmed]
  • Empty / decoding / ABI-unknown / error state machine (DecoderTool.tsx + useDelayedFlag): raw hex never hidden, 300ms skeleton threshold before showing a loading state, AI/summary layer absent rather than shown broken when no trusted decode exists. Matches Figma node 3412:136498 state-by-state. [Figma-confirmed]
  • DecodedActionCard / ChipCluster / AddressChip / CollapsedActionRow structure (header chip cluster with ABI-source badge, target identity chip, human-first param rows with type badge + humanized value + raw annotation, Decoded | Raw segmented footer) matches the "IN PRODUCTION" reference frame (node 3460:21732) closely, down to the //action NN mono label style (MONO_LABEL constant is explicitly documented as "Figma Alternative/xSmall"). [Figma-confirmed]
  • Standalone tool's empty state ("Nothing to decode yet" / "Paste the input data of any transaction…") uses different copy than the Figma empty state ("NO CALLDATA YET" / "Paste hex above, or open any proposal action."). This is a justified adaptation, not a bug: the Figma copy assumes the embedded-in-a-proposal context ("open any proposal action"), which doesn't exist on the standalone /tools/decoder route — the shipped copy is more accurate for its actual context. No change needed.

Nice-to-have — component reuse

  • DecoderInputPanel.tsx defines a local HelperText component that reimplements the exact "shared field-message component" the linked spec calls for as a to-be-built DS primitive ("One shared field-message component with reserved space, used everywhere an error or warning appears in the flow"). The same helper/warning/error pattern also appears inline in AddTransferModal.tsx and AddCustomActionModal.tsx. Worth promoting HelperText to shared/components/design-system/form/field-message/FieldMessage so all three call sites (and future ones) share one implementation instead of three copies of the same three-color mapping. [Code-only]

Nice-to-have — touch target

  • ExpandToggle's chevron button is size-5 (20×20px), below the 44×44px recommended minimum touch target. In CollapsedActionRow this is mitigated by the whole row being one large click target (role="button" with p-3), and in SubcallList the adjacent label text shares the same expand handler and fills the remaining row width — so it's tappable in practice, but a reader aiming precisely at the chevron on a small screen has a small target. [UX-heuristic]

Governance action modal — gasless queue/execute (GovernanceActionModal.tsx)

No matching Figma spec was found for this flow (not covered by either ClickUp task this review located).

Must-fix — color semantics

  • The "idle" entry state — Checking whether this action can be sponsored... — renders <SpinIcon className="text-warning size-4 animate-spin" />. text-warning signals caution/an issue; this is a neutral loading check with no problem to flag yet. Suggest text-secondary (matching the copy's own color) so a plain "still loading" moment doesn't read as a warning state. (features/governance/components/modals/GovernanceActionModal.tsx) [UX-heuristic]

Validated — good pattern reuse

  • GaslessBadge (bg-success/80 text-inverted, extracted into ProposalHeader.tsx) consolidates a "Free" badge className that was previously duplicated verbatim in DelegateButton.tsx and the pre-PR ProposalHeader.tsx — a genuine de-duplication, not a new one-off. No change needed.

Navigation (HeaderSidebar.tsx / HeaderMobile.tsx)

  • New "Decoder" entry (icon: Braces, path tools/decoder, isGlobal: true) is added identically to both desktop sidebar and mobile header, with matching icon and label — good parity. ButtonHeaderSidebar.tsx's active-state matcher was also updated to full-pathname matching for global pages, so a nested global route like tools/decoder highlights correctly instead of falling through to the DAO-page last-segment matcher. No issues found.

Mobile

  • TabsSection.tsx's sticky-tabs offset was corrected from top-29.5 to top-13.75 with a code comment explaining the fixed mobile header is 55px, not the old proposal-header height — this fixes exactly the "sticky element pinning under the wrong offset" class of bug called out in this review's own checklist. [Code-only, confirmed via the diff's own before/after and comment]
  • DecoderInputPanel's three ABI-source tabs scroll horizontally on narrow viewports instead of wrapping or overflowing the card (overflow-x-auto with a code comment acknowledging the phone-width constraint) — correct mobile pattern. No issues found.

Findings summary

3 substantive findings — 1 must-fix (idle spinner color), 2 nice-to-have (shared FieldMessage component, ExpandToggle touch target) — plus 4 items validated against Figma with no change needed. The decoder feature (the bulk of this PR's new UI surface) is unusually well-built: consistent design-token usage throughout (text-primary/text-secondary/text-warning/text-error/border-border-*), no hardcoded hex colors, and structure that matches the linked Figma spec closely enough that most "looks different" candidates turned out to be intentional (see "Validated" sections above).


Generated by Claude Code

brunod-e and others added 4 commits September 15, 2026 15:38
…e and harden fallbacks

Upstream failures are logged as a description (status, code, redacted url,
cause chain capped at three) instead of the raw AxiosError, whose config
carried the CoinGecko and Dune API keys. DegradedUpstreamData gains an arm
for counter series born inside the window, so the first fallback of a new
label set pages. Dune month values must be real calendar dates before they
are cached. The empty Dune fallback is leased like the stale one, for
transport and status failures only. The NFT spot price is quoted in the
requested currency so its stale tag is truthful. The total treasury refuses
a half that degraded to nothing instead of serving a token-only sum, joins
the two halves by date rather than by position, and a DAO holding none of
its token no longer loses its liquid half in a CoinGecko outage. The stale
treasury test runs through the real provider factory with MSW.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…osals-endpoint

# Conflicts:
#	infra/monitoring/alerts.yml
…t NFT results whole

A DAO with neither in-window transfers nor a carried balance has nothing to
price, yet the token treasury still waited on CoinGecko and recorded a
degraded treasury on outage before discarding the result. Fetch the balances
first and return before asking the provider.

The NFT price happy-path tests destructured `degraded` away, so a regression
flagging every healthy response as degraded would have passed. Assert the
full `{ data, degraded: false }` object.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…dpoint

fix(api): serve stale or empty data instead of 5xx when Dune or CoinGecko fail (DEV-1163)
@railway-app
railway-app Bot temporarily deployed to anticapture-infra / dev September 15, 2026 19:04 Inactive
@railway-app
railway-app Bot temporarily deployed to anticapture-infra / anticapture-pr-2164 September 15, 2026 19:04 Destroyed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4229b084b3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +81 to +84
this.lastGoodPrices.setIf(
prices,
(current) => prices.length >= current.length,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Scope cached NFT histories to their requested page

The last-good NFT series is shared across every (limit, offset) request, but this write does not record the offset. For example, a successful skip=100 request can replace the cached skip=0 page (equal-length pages satisfy this predicate), after which a CoinGecko outage causes the default request to return the older page's timestamps and prices from line 89. Key the fallback by pagination window, or only serve it when the cached window matches the current request.

Useful? React with 👍 / 👎.

@railway-app
railway-app Bot temporarily deployed to anticapture-infra / dev September 15, 2026 20:14 Inactive
@railway-app
railway-app Bot temporarily deployed to anticapture-infra / anticapture-pr-2164 September 15, 2026 20:14 Destroyed
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Vercel preview: https://anticapture-mgt58af94-ful.vercel.app

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9a983026b8

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +329 to +332
return;
}
if (this.consecutiveFailures >= this.consecutiveFailureThreshold) {
this.openTheCircuit();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Defer the low-traffic streak rule during concurrent bursts

When a concurrent burst has five fast failures while at least five successful requests are still in flight, total contains only the settled failures and remains below minimumRequests, so this branch opens the route immediately. The generation change then discards the later successful outcomes, meaning a 5/10 partially failing burst opens the circuit despite the configured 50% rate policy. Include started/in-flight requests when deciding whether traffic is low, or defer the streak rule until the burst settles.

Useful? React with 👍 / 👎.

@brunod-e
brunod-e merged commit 325de8e into main Sep 15, 2026
67 of 69 checks passed

This branch had an error being deployed

1 failed, 1 active, and 1 inactive deployments
Preview – anticapture-storybook — 9a983026 Deployed Sep 15, 2026 by vercel[bot]
anticapture-infra / anticapture-pr-2164 — 9a983026 Deployed Sep 15, 2026 by railway-app[bot]
anticapture-infra / dev — 9a983026 Deployed Sep 15, 2026 by railway-app[bot]
dev — 9a983026 Deployed Sep 15, 2026 by brunod-e via Deploy Vercel (dev) #143
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants