All notable changes to fragment-dev will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Releases prior to 2.0.0 were published before this changelog was added and
are not documented here.
createPaymentnow also returns the Payment'sid,ik,amount,mode, andcurrency, so itspaymentcan be passed to<PaymentSession>in@fragment-dev/payment-elementsas-is.LedgerLinesFilterSetacceptsexternalTxIds, which filters Ledger Lines by the external IDs of their linked transactions.
PaymentStatusnow usesacceptedinstead ofapproved. Payments are experimental, so this API may change in a future release.
getPaymentfetches a Payment on a Ledger. Pass anikand aledgerIk; it returns the Payment'samount,currency,status,type,typeVersion,mode,parameters, andcreatedtime.listPaymentslists the Payments on a Ledger. Pass aledgerIk, along with optional pagination (first,after,before) and afilter.instantiateLedgerAccountcreates a Ledger Account from a schema template. Pass aledger, a templatepath, and optionalparameters.
createPaymentnow requirestypeVersion, and its response nests the Payment: readclientSecretandstatusfrom thepaymentfield instead of the top level. Payments are experimental, so this API may change in a future release.
createPaymentcreates a Payment on a Ledger. Pass anik, aledgerIk, and a Paymenttype, along with optionaltypeVersionandparameters. It returns the Payment'sclientSecretandstatus. Payments are experimental, so this API may change in a future release.
typeVersiononLedgerEntryInputis now supported and defaults to1. It was previously reserved for an upcoming feature.PaymentStatusnow usesneeds_payment_methodinstead ofrequires_confirmation.SchemaPaymentEntryStatusis now namedSchemaPaymentTypeStatus, andSchemaPaymentEntryInputnow takesneeds_payment_method_to_processinginstead ofneeds_confirmation_to_processing.
-
add_ledger_entriesposts a batch of Ledger Entries atomically. It accepts rawAddLedgerEntryInputhashes, typed payloads, or both in one batch, and preserves their order. -
Strongly-typed batch payloads.
FragmentClient::TypedEntries.loadderives one payload class per(Ledger Entry type, typeVersion)from the per-entry-typeaddLedgerEntryoperations the Fragment CLI generates for your Schema. Because a batch mutation takes one list of one input type, GraphQL cannot type each entry'sparametersfield individually; these payloads do. Payload names always carry the entry type version, defaulting toV1:fragment.add_ledger_entries(entries: [ FragmentClient::Entries::UserFundsAccountV1.new( ik: 'some-ik', ledger_ik: 'your-ledger-ik', user_id: 'user-1', funding_amount: '200' ) ])
Payloads are registered automatically from
extra_queries_filenames. A field you did not set is omitted from the request rather than sent asnull. -
Sorbet support, via three Tapioca DSL compilers. Run
bundle exec tapioca dslafter loading your operations and Sorbet checks both the typed payloads and every query method --client.create_ledger(...)previously reportedMethod 'create_ledger' does not exist, because those methods are defined per instance. Response fields are typed too, from each operation's selection set and the Schema, soclient.get_ledger(...).data&.ledger&.nameis checked and reading a field the operation did not select is a type error rather than a runtime one. See the README's Sorbet section. -
FragmentClient.load_queries, which registers a.graphqldocument's operations and typed payloads without credentials, for use in an initializer. -
bundle exec rake coverage, writingcoverage/index.html. -
docs/spec-conformance.md, mapping this SDK onto the sharedtyped-batch-entriesspecification section by section, with its deviations.
lib/fragment.schema.jsonrefreshed. AddsAddLedgerEntriesErrorandAddLedgerEntryError, without whichaddLedgerEntriescould not be parsed at all, pluscreatePaymentandPaymentfrom upstream.oauth_urlandoauth_scopenow treat an explicitnilas "use the default", where before it raised aTypeErrorfrom the type assertion in the constructor.- An unusable
oauth_urlnow raisesArgumentErrorfromFragmentClient.new, naming the argument and its value. This changes the exception class in two cases. A non-HTTP URL previously failed later, inside the token request, asNoMethodError: undefined method 'request_uri'; a malformed one escaped asURI::InvalidURIError. Both were constructor-time failures on a misconfigured URL rather than handled paths, which is why this is a minor rather than a major release — but if you rescueURI::InvalidURIErroraround client construction, rescueArgumentErrorinstead. lib/fragment_client.rbtypechecks under Sorbet (# typed: true), andsrb tcruns in CI. The checked-in gem RBIs were several major versions stale and have been regenerated.
GetLedgerAccountBalancenow returns totalbalance(self + children) instead ofownBalance.ListLedgerAccountBalancesandListMultiCurrencyLedgerAccountBalancesnow acceptconsistencyModeonchildBalance,childBalances,balance, andbalances.
GetLedgerAccountBalanceWithChildRolluphas been removed.
-
Upgrade your schema to use the total balance consistency feature:
- Add the path to your schema JSON or the JSON itself to the top of the prompt below and give it to your LLM of choice. It'll make some small changes to your consistency configs and conditions.
- Deploy the new schema
Fragment schema JSON path or full schema: <YOUR_SCHEMA_OR_PATH>
Above is a Fragment schema JSON file or the path to it. Transform it to use total balances by following
the rules below, then validate the result. If a file path is provided, edit the file in place — do not
create a copy or temporary file.
Rules
1. Entry conditions
Replace ownBalance with totalBalance in all entry conditions.
2. Default consistency config
In the schema's defaultConsistencyConfig, replace ownBalanceUpdates with totalBalanceUpdates.
3. Ledger account consistency config
For each ledger account (not groups — groups keep ownBalanceUpdates unchanged), determine the new
consistency value using these three questions:
- (A) Is this account a leaf on any entry line? Check whether any entry in the schema references this
account as a line target.
- (B) Is this account strongly consistent? Either it has an explicit ownBalanceUpdates: "strong", or it
inherits "strong" from defaultConsistencyConfig.
- (C) Does this account have an entry condition? Check whether any entry condition references this
account.
Then apply:
- (A) Yes + (B) Yes → totalBalanceUpdates: "strong"
- (C) Yes → totalBalanceUpdates: "strong"
- (A) No + (B) Yes + (C) No → totalBalanceUpdates: "eventual"
- (B) No + (C) No → totalBalanceUpdates: "eventual"
In short: an account gets totalBalanceUpdates: "strong" if it is either a leaf on an entry line and was
already strongly consistent, or has an entry condition. Everything else becomes "eventual".
4. Groups are excluded
Do not change ownBalanceUpdates on groups. This migration only applies to ledger accounts.
Pre-Validation
Validate the transformed schema before returning it:
- If the input was a file path, run: fragment verify-schema --path <path-to-schema> --verbose
- If the input was pasted schema JSON, write it to a temporary file and run: fragment verify-schema --path
<temp-file> --verbose
- If you don't have access to a shell, skip this step.
-
Upgrade your Fragment SDK to the latest version:
GetLedgerAccountBalancenow returns totalbalance(self + children) instead ofownBalance.- Change
$ownBalanceConsistencyModeto$balanceConsistencyMode
- Change
- Use
GetLedgerAccountBalanceinstead ofGetLedgerAccountBalanceWithChildRollup.