Skip to content

release: to prod - #1867

Merged
joelorzet merged 53 commits into
prodfrom
staging
Aug 1, 2026
Merged

release: to prod#1867
joelorzet merged 53 commits into
prodfrom
staging

Conversation

@joelorzet

Copy link
Copy Markdown
Contributor

No description provided.

joelorzet added 30 commits July 29, 2026 13:02
Open by default, mark the current plan's column, and drop the zebra
striping. Add Executions / month and Per extra execution rows (folding
pay-as-you-go and the paid overage rates into the comparison), show green
upgrade gains on executions and sponsored gas, list EVM + Solana for every
tier, and remove the misleading unlimited-workflows row.
Pay-as-you-go now renders at the bottom of the Current Plan card instead
of a standalone box. Spend caps show as read-only labels; enabling and
editing them happen in a modal.
Deriving the plan with an unchecked `as PlanName` cast left `PLANS[plan]`
undefined for an unexpected subscription plan value on org switch, crashing
the Current Plan card at `planDef.name`. Parse it through `parsePlanName`
so it falls back to free.
The free tier is free plus pay-as-you-go, so label it "Free + PAYG" in the
comparison header and the plan card, and replace the plan card's stale
"hard cap at limit" line with the live per-execution price. Also render
non-current comparison cells in the normal foreground instead of muted.
An info button in the pay-as-you-go section opens a modal explaining that
extra executions are paid in USDC from the organization wallet, and shows
the funding wallet (checksummed address with copy), its live USDC balance,
and how to top it up.
When a free org has pay-as-you-go enabled, reaching the monthly limit does
not block execution, so the over-limit bar no longer turns destructive or
tells them to upgrade; it notes that extra runs are charged via
pay-as-you-go instead.
enforceExecutionLimit admits free plans with pay-as-you-go past their included limit, but the in-process execute and webhook routes never charged them, so those runs executed for free. Charge chargePaygIfBillable before dispatch on both routes and resolve the run to a billing error when the charge is blocked.

Also fix the settlement path so the charge completes: serialize EIP-712 typed data with toJsonSafe so bigint fields do not break Turnkey signing, checksum the org wallet before signWith, and wrap the exact-scheme payload with the accepted requirements and resource to match the facilitator x402 v2 settle schema.
Recent charges loaded every payment at once inside the status payload. Move it to a dedicated GET /api/billing/payg/charges endpoint with offset pagination served by the (organization_id, created_at) index, plus a numbered pager. Each row now joins to the workflow execution that was charged and links to that workflow, shows the settlement date and time in the viewer's local timezone, and renders the truncated tx hash with copy and block-explorer actions.
…able

Add a debounced, server-side search over the charges list (execution id, tx hash, workflow id, workflow name) with an AbortController so only the latest request resolves as the user types. Give the execution its own column with a copyable execution id next to the workflow link, and replace the loading dim with skeleton rows plus a no-results state.
…reset

Change the expanded run error box from a solid destructive fill to the softer destructive Alert variant with a light tint, and give it bottom padding when no step logs follow (e.g. a pay-as-you-go block). Add a tooltip on the daily spend cap noting it resets at 00:00 UTC.
Lead the free-card footer with the enable action (Enable pay-as-you-go: $0.01 / extra execution) so it is clear pay-as-you-go is opt-in beyond the 5,000 free executions, and center the wrapped pill text.
…-as-you-go

# Conflicts:
#	drizzle/meta/_journal.json
Staging landed migration 0136 (two-factor lockout) after this branch, so the hand-authored 0136 payg migration collided in the journal. Regenerate it as 0137 with drizzle-kit generate (snapshots fixed) so payg_config and payg_payments apply as the latest migration.
The recent charges list is now hidden behind a toggle in the PAYG
section header, showing the charge count and a chevron. It expands to
reveal the search, table, and pagination on demand.
When a run fails on a pay-as-you-go block (cap, funds, or payment), the
run-error alert now shows an Adjust spending caps link to the billing
page so the user can raise their limits without leaving the run view.
The link only appears for billing-category failures.
Rename the free card to Pay per execution with a $0.01 headline, drop
/mo from the metric headers, group them under an Includes per month
label inside a bordered box, and collapse the free overage note to a
single-line 5,000 free / mo, then pay-as-you-go badge.
checkAndReserveExecution and the webhook route now settle the PAYG
per-execution charge after reserving a run, so their tests hit
chargePaygIfBillable -> getPaygConfig -> db.select, which the db mocks
did not provide (db.select is not a function; webhook 500). Mock the
charge boundary as a no-op for the existing cases and add coverage for
the applicable-and-blocked path: the reserved row is marked failed and
the caller is denied (402 on the webhook).
Condition node failures (no expression configured, invalid expression)
matched no rule in the execution error classifier and fell through to the
system default, so they were labeled system/workflow_engine. These are
workflow-author configuration faults, so classify them as user errors and
keep them out of the system-error signal used for alerting. Adds the two
classifier rules and unit coverage.
Replace the app's PlanCard grid and comparison table with PricingCards and
PricingComparisonTable from keeperhub-pricing-ui. Checkout, confirm-plan
dialog, downgrade, current-plan detection, tier selection (controlled via
tierKey so the subscriber's tier is preselected), gas credits, and the live
PAYG price on the free card are all preserved. Adds the package to the
release-age exclude list.
Rename the section to Pay per execution and show the funding wallet
balance and top-up address directly in the section instead of only in
the info dialog (now removed). A hover popover on the balance explains it
is the Base USDC only and links to See all balances (wallet overlay).
Balance and top-up are laid out as an aligned two-column grid.
…-classification

fix: classify condition node misconfiguration as user error
@joelorzet
joelorzet merged commit 03720f8 into prod Aug 1, 2026
50 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants