Conversation
Convert plain map to enforced struct with @type t() spec for compile-time key validation in the session hijacking detection path. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Adds defstruct with @enforce_keys and @type t() for compile-time validation. Adds get_spec/1 returning typed struct per country. Internal @iban_specs stays as plain maps due to module attribute compile order. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Mark SessionFingerprint and IbanData as done, add to completed structs table, update summary counts (2/21 complete). Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
New struct alongside UrlEntry with @enforce_keys [:filename, :url_count] and @type t(). All 3 construction sites in generator.ex updated, @SPEC annotations use SitemapFile.t(). Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
New struct with @enforce_keys [:type], typed event_type() union of 10 event atoms, and @type t(). All 10 construction sites in helpers.ex updated. Template dot-access works identically. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
New LegalFramework struct (7 fields) and PageType struct (4 fields) with enforce_keys, type specs, and from_map/1 boundary converters. Internal module attributes stay as plain maps; public accessors convert at the boundary. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
…ync, emails, AI, and dashboard modules Completes the Tier 1 cross-module struct conversions from the struct vs map audit: - Billing: CheckoutSession, SetupSession, WebhookEventData, PaymentMethodInfo, ChargeResult, RefundResult, ProviderInfo - Entities: FieldType with from_map/1 boundary conversion - Dashboard: Group (extends Tab/Badge/ContextSelector family) - Sync: TableSchema + ColumnInfo for wire protocol documentation - Emails: EmailLogData (16-field struct for tracking pipeline) - AI: AIModel with atom keys converted from JSON string keys at normalize boundary All provider implementations (Stripe, PayPal, Razorpay) updated to return structs. All consumer sites updated (templates, LiveViews, specs). Backward-compatible map fallback clauses retained in AI module. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- endpoint_form.ex: find_model used string key m["id"] on AIModel atom-key struct - group.ex: Add missing icon and collapsible fields used by sidebar templates - registry.ex: Convert config groups to Group structs via Group.new/1 - user_dashboard_categories.ex: Return Group structs from to_groups/1 - data_importer.ex: Handle TableSchema struct in get_primary_keys/1 - billing.ex: Use dot access session.id/session.url on CheckoutSession struct - subscription_renewal_worker.ex: Use charge_result.provider_transaction_id Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Sidebar templates used @group[:label], @group[:icon], @group[:collapsible] bracket notation which silently returns nil on structs. Changed all to dot notation. Also fixed info[:lastmod] on SitemapFile in sitemap generator. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Languages: normalize Language structs to maps before adding :country metadata key in get_languages_grouped_by_continent/0 - UserToken: extract fingerprint attrs via multi-clause helper that handles SessionFingerprint structs, plain maps, and nil - modules.html.heex: switch @languages_default from bracket to dot access - Tests: fix doctest compilation, bracket-access assertion, add grouped languages coverage Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- actions.ex: match {:ok, checkout_url} string instead of {:ok, %{url: _}}
- uuid_fk_columns.ex: remove dead nil branch (prefix is always a string)
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
ddon
pushed a commit
that referenced
this pull request
Feb 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
double checked the changes with codex