Changelog
All notable changes to this project should be documented in this file.
The format is based on Keep a Changelog, and this project follows versioned releases.
[Unreleased]
Changed
- Replaced asset-biased curve key-node identity with typed
source_reference={"type": "asset" | "index", "identifier": "..."}provenance. Added the sharedFixedIncomeCurveKeyNodebase across deposit, OIS, futures, bond, FX, and cross-currency basis helper models, updated the reconstruction example to demonstrate asset- and index-sourced inputs, and rejected top-levelasset_identifier/index_identifierkey-node fields. - Implemented the repository-side ADR 0038 typed Index catalog/lifecycle service
and thin FastAPI surface: Index-type reads, counted list filters,
create/update/detail/summary, methodology history, cadence-specific dataset
discovery, bounded value frames, declared and inferred related MetaTables,
non-mutating deletion preview, and reviewed bulk execution. Canonical
datasets are accepted only when identifier, cadence, physical table, grain,
required columns, and the actual SQLAlchemy/Alembic
index_identifier -> IndexTable.unique_identifierforeign key agree. Added extension relationship providers without DataNode inheritance, signed five-minute actor/scope tokens, exact phrases and warning acknowledgements, scopeddelete_after_date(...)value removal, stale-scope protection, request-bound FastAPI actors, durable idempotency/partial-step journal model, Adapter from API operation registration, tests, a non-destructive example, tutorial/API documentation, and the expanded Index workflow skill. Direct publicIndex.delete(...)and compatibility HTTP deletion no longer provide an unreviewed bypass;DerivedIndex.upsert(...)compensation uses the private repository primitive. The execution-journal model is registered, but its SDK-generated migration and deployed-resource verification remain pending because the configured local Main Sequence migration service was unavailable. - Revised ADR 0037 so the cadence-configured
IndexValuesTS.<cadence>family is the domain-neutral canonical value contract for plain and calculated Indexes, withIndexValuesStorageretained as its column-schema anchor and nullable calculation-definition and observation-status provenance. Revision0012preserves existing rows while renamingcalculation_statustoobservation_statusand makingdefinition_uidnullable. Addedconfigured_index_values_storage(cadence=...), rejection of cadence-less publication, and aUSD_SWAP_10Yexample proving that one Index identity uses separate 1-minute and daily DataNodes, MetaTables, and physical tables (...__t_1mand...__t_1d). Also added an example dynamic migration provider, plain/derived publication validation, and a general example proving that extensions may own richer Index-indexed storage and producer implementations without inheriting the core Index DataNode base. The ADR includes diagrams distinguishing observation frequency from Index identity and prospective definition versioning from coexisting calculation methods. The packaged Index skill now defines the complete classification, identity, cadence, methodology-lifecycle, calculation, provenance, publication, extension, migration, and validation workflow, including the strict Index-versus-Asset-versus-Portfolio boundary. - Implemented the core derived-index framework from ADR 0037: the built-in
derivedIndex type, immutable effective-dated definition and ordered leg models, canonical value and resolved-leg storage, typedDerivedIndexAPI, pure operators and strict unit/alignment/missing/coefficient/selector registries, incremental publication DataNodes, SDK-managed revision0011, the original five derived-methodology examples, concept/tutorial/API documentation, and the packaged derived-index workflow skill. Generic pair-spread primitives now live inmsm.analytics.indices.spreads; existingmsm_pricing.analytics.spreadsimports are compatibility delegates while pricing-specific analytics remain pricing-owned. The concept documentation and packaged skill now include the canonical relationship diagram and an explicit Index-versus-Portfolio ownership decision table. - Changed floating-rate bond and swap pricing to resolve projection and
discount curves independently through market-data-set curve bindings.
Projection curves build floating indexes and forecast coupons; discount
curves feed QuantLib discounting engines. The floating bond example, tutorial,
and pricing docs now demonstrate separate projection and discount curves.
Both role bindings must exist even when they point to the same physical
curve_uid. - Changed
MSDataInterface.get_historical_discount_curve_observations(...)to read multi-curve latest-as-of observations through a backend window query instead of scanning full curve history into pandas. - Changed asset snapshot enrichment services to resolve latest rows through backend queries instead of scanning history and choosing the latest row in Python.
- Removed the legacy
MSDataInterfaceprocess-wide latest-observation environment flag; callers must use explicit latest-curve APIs or bounded historical reads. - Added
msm_pricing.pricing_engine.apply_z_spread_to_curve(...)for strict runtime z-spread overlays that matchBond.z_spread(...)'s continuous decimal spread convention without mutating persisted curve observations. - Added
PreparedInstrument.z_spread(...)so valuation-context prepared instruments propagate the selected market-data set and curve quote side when solving z-spreads. - Added
msm_pricing.valuation.build_valuation_position(...)for strict construction of transient valuation baskets from normalized instrument/unit rows. - Added reusable
latest_portfolio_weights(...),portfolio_values(...), andasset_reference_details(...)services for package-owned portfolio output and asset reference reads. - Added
msm_pricing.scenarios.curveswith typed curve scenario models, key-node basis-point bump helpers, runtime scenario curve-handle construction, andprice_curve_scenario(...)delegation to the preparedprice_scenario(...)path. - Added
price_resolved_curve_scenario(...),prepare_resolved_curve_scenario_runtime_overrides(...), andLineCurveResolutionInputfor caller-resolved curve scenarios that already have explicit base/scenario handles per valuation line, with selected base/scenario handle maps exposed for downstream analytics/reporting reuse. - Added
msm_pricing.scenarios.valuationwith typed valuation scenario workflow orchestration, partial-success line pricing, line/carry impacts, optional analytics and cashflows, observed dirty-price z-spread overlays, and an offline workflow example. - Added
msm_pricing.analytics.spreadswith cross-asset spread primitives, fixed-income DV01 spread metrics, optional dependency diagnostics, and an offline fixed-income spread analytics example. - Added
msm_pricing.pricing_engine.curveswith generic QuantLib rate-helper specs/builders, helper-key-node adapters, helper-based curve reconstruction, and curve observation export, plus resolver/scenario support forbuilder_type="rate_helper_curve"without importing connector-specific code. - Extended generic OIS helper reconstruction to expose QuantLib OIS
schedule/convention fields and to require persisted
builder_payload.helper_schema="rate_helpers@v1"for helper-based curve adapters. - Added generic interest-rate futures helper reconstruction with
sofr_future_rate_helperkey-node support and explicit futures price-unit validation. - Added generic zero-coupon and fixed-rate bond helper reconstruction under
msm_pricing.pricing_engine.curves, including bond-helper key-node parsing,rate_helpers@v1reconstruction support, observation export tests, and strict diagnostics for unsupported yield shocks on price-quoted bond helpers. - Added generic cross-currency helper reconstruction under
msm_pricing.pricing_engine.curves, including FX swap helpers, constant-notional cross-currency basis helpers, context/provenance nodes under the existingrate_helpers@v1schema, explicit FX forward-points and basis-spread normalization,JointCalendardecoding, runtime dependency resolvers, and stable helper quote-error diagnostics. - Added
BondInstrumentTermsandbuild_bond_instrument_from_terms(...)for provider-neutral construction of existing zero-coupon, fixed-rate, and floating-rate bond instrument models without source-row parsing or connector dependencies. - Added
CurveObservationExportConfig.from_curve_building_details(...)so helper-reconstructed curves can export compounded annual zero-rate nodes with explicit front-node days and pillar-date inclusion, using term-structure reconstruction functions when QuantLib pillar dates are required. - Extended
price_curve_scenario(...)to forwardovernight_indexandovernight_index_resolverinto helper-reconstructed scenario curve builds. - Updated swap and floating-bond scenario repricing to use explicit
reset_curves(projection_curve=..., discount_curve=...)role handles. - Added
get_many_by_unique_identifier(...)on typed row APIs such asAssetfor batch canonical-identifier resolution. - Added reusable
command_centerhelpers for ms-markets Command Center tabular frames and Asset Monitor workspace documents, plus theapps/v1getAssetMonitorFramereference endpoint. - Added project-local namespace defaults for ms-markets extension models through
__metatable_namespace__plus__markets_base_identifier__, while keepingMSM_AUTO_REGISTER_NAMESPACEas the test/example override. - Added
msm_pricing.api.add_many_pricing_details(...)andAssetPricingDetails.add_many(...)for chunked bulk persistence of asset/instrument pricing details. - Changed pricing-detail batch writes to set per-operation SDK
max_rowslimits from the submitted chunk size instead of carrying a local response pagination loop. - Removed the obsolete pricing schema-creation bootstrap entrypoint; pricing
startup now uses the attach-only
msm_pricing.bootstrap.attach_pricing_schemas(...)API. - Removed the unused
msm_pricing.streamlithelper package and thepricing-streamlitoptional extra. - Added ADR 0033 to document the pricing valuation-position boundary and the
planned replacement for the legacy in-memory
Positionsurface. - Added ADR 0035 to document the target pricing curve identity model, curve building details, and market-data-set curve binding layer.
- Added ADR 0036 to document the prepared pricing valuation context target, including the requirement that portfolio/scenario valuation use bulk SQLAlchemy-backed resolution instead of hiding per-line backend lookup loops behind a public API, and that prepared instruments are copied or wrapped rather than mutating caller-owned instrument objects.
- Added an implementation task plan for reusable valuation input construction, portfolio and asset read services, curve-keyed scenario pricing, and optional fixed-income spread analytics without copying project-local adapter code into the library.
- Added an implementation task plan for upstreaming generic curve
reconstruction and observation export machinery from Valmer connector code
into
msm_pricing.pricing_engine.curves. - Implemented
PricingValuationContextwith a publicPreparedInstrumentwrapper, frozenPricingValuationContextSpecinput contract, fixed prepared-instrument universe, package-level exports, context-awareValuationPositionmethods,price_scenario(...), set-based row API helpers for pricing market-data bindings, index rows, index convention details, curve bindings, curves, and curve-building details, bulk curve/fixing observation reads, context-owned QuantLib curve handles/indexes, hot-loop resolver injection for prepared floating-rate bond pricing, and a runnable mock curve/fixing valuation-context example. - Implemented ADR 0035 phase-one pricing curve infrastructure with
CurveBuildingDetails,PricingMarketDataSetCurveBinding, nullable legacyCurve.index_uid, resolver cutover to explicit curve bindings, and Alembic revision0007. - Replaced the legacy in-memory
msm_pricing.Positionexport withValuationLineandValuationPositionfor explicit instrument-plus-units valuation. - Added
msm_pricing.api.load_instruments_from_assets(...)for chunked current-instrument loading from asset rows, and documented the account and portfolio normalization boundary for valuation baskets. - Added
MSDataInterface.get_latest_discount_curve(...)for explicit latest discount-curve lookup by curve identity. - Added
DiscountCurvesStorage.key_nodesand rowmetadata_jsoncolumns, withkey_nodestreated as producer-owned JSON construction provenance at publisher/API boundaries and compressed text at rest. - Added the optional
msm_pricing.data_nodes.CurveKeyNodehelper as the recommended key-node shape, including raw quote fields and yield-nativeyieldserialization for discount-curve producers. - Added
DiscountCurvesNode.normalize_key_nodes(...)andset_key_nodes_validator(...)so curve DataNode producers can enforce source-specific key-node provenance schemas without tightening the shared storage contract. - Tightened
DiscountCurvesStorage.curveto a required non-null payload and made discount-curve builders reject missing, null, or empty curve mappings. - Added observation-level discount-curve reads carrying
nodes,key_nodes, andmetadata_json, and exposed those provenance fields in the pricing curve API response. - Refactored the
migrations:migrationprovider, Alembic environment, model registry, and dynamic portfolio example provider onto the SDK-owned MetaTable migration helpers, with revision directories treated as generated Alembic output rather than pre-existing documentation state. - Renamed account allocation APIs and schemas around their actual domain:
AccountModelPortfoliobecameAccountAllocationModel,AccountTargetPortfoliobecameAccountTargetAllocation, and the related fields now useaccount_allocation_model_uidandaccount_target_allocation_uid. - Moved
PortfolioTableidentity and account target-position storage into coremsm;msm_portfoliosnow owns portfolio calculation workflows, while coremsmowns virtual-fund identity, virtual-fund holdings storage, and account allocation planning. - Added the account holdings to virtual-fund allocation planner with
proportional_attributionandstrict_feasiblepolicies, plus an apply step that converts feasible plans intoVirtualFundHoldingsStorageframes. - Extended the account virtual-fund planner with deterministic
position_set_uidinput resolution, notional target conversion through the valuation resolver, deterministic virtual-fund identity helpers, and resolver-level tests plus a dry-run-first account virtual-fund allocation example. - Moved virtual-fund knowledge documentation under the Accounts section as a standalone account allocation document.
- Reorganized DataNode storage contracts by concept: account storage now lives
under
msm.data_nodes.accounts, asset storage undermsm.data_nodes.assets, execution storage undermsm.data_nodes.execution, and portfolio/pricing storage under their matching concept packages. - Renamed the one-pass account and portfolio example to
examples/msm/accounts/account_portfolio_full_workflow.pyand moved the PyCharm run configuration under Accounts because the workflow prepares the reusable portfolio sleeve and then publishes account target positions and holdings. The same full workflow now exposes the virtual-fund allocation extension through dry-run and apply flags. - Added the
apps/v1target-allocation candidate search endpoint for account target-position assignment, returning one paginated asset and portfolio candidate list backed by a compiled MetaTable read. - Added the
apps/v1account target-position write endpoint, deriving parent allocation rows from the account uid and replacing target-position snapshots through one scoped MetaTable upsert operation. - Tightened account target-position validation so portfolio target rows cannot
use
single_asset_quantity. - Tightened
PortfoliosDataNode.run(update_pointers=True)so portfolio pointer updates use explicit DataNodeUpdate UIDs, preserve the existing executed weights pointer when no new weights are produced, and no longer cache a hiddenPortfolioWeightshelper on the portfolio node. - Changed portfolio update-window calculation so the start date comes from this
portfolio's own
PortfoliosStorage.portfolio_identifier, and valuation-source coverage is applied only after reading the actual signal frame. - Added the
apps/v1pricing curve registry list endpoint backed bymsm_pricing.api.Curveand the shared limit-offset pagination envelope. - Added the
apps/v1index delete-impact preflight endpoint so clients can inspect restrictive dependencies, cascade effects, and SET NULL effects before calling the individual index delete route. - Added the FastAPI v1 reusable delete-impact contract and migrated the index
preflight route to the shared
DeleteImpactResponseserializer before additional delete routes copy the index-specific shape. - Added the FastAPI v1 curve-selection reverse lookup endpoint for pricing
curves, removed the curve list
index_uidfilter, and changed index delete-impact to countPricingMarketDataSetCurveBindingindex selectors. - Clarified missing discount-curve API errors so a curve with registry and
market-data binding but no published
DiscountCurvesStorageobservations is reported as missing data, not a generic latest-observation lookup failure. - Changed pricing curve construction to honor
CurveBuildingDetails.interpolation_methodwith native QuantLib curve constructors and reject deprecated methods such aslog_linear_zeroandMonotonicLogCubicDiscountCurve. - Promoted virtual-fund allocation strategy to the first-class
VirtualFundHoldingsStorage.allocation_strategycolumn; low-level explicit publications writeexplicit, and planner-applied rows write the allocation policy mode. - Refactored portfolio construction to consume an explicit
valuation_source_instanceinstead of havingPortfoliosDataNodeconstructInterpolatedPricesfrom portfolioAssetsConfiguration/PricesConfiguration, and updated the equal-weight portfolio example to show the explicit source valuations -> interpolation when needed -> signal -> portfolio dependency graph. - Replaced deprecated builder terminology with portfolio construction wording across README, portfolio docs, ADRs, and internal portfolio logger helper names.
- Changed core portfolio storage identity so portfolio weights, values, FastAPI
latest-weight reads, delete cleanup, and account virtual-fund expansion use
PortfolioTable.unique_identifierasportfolio_identifier; optionalpublished_index_uidremains publication metadata only. - Added nullable
PortfolioTable.signal_uidas a foreign-key pointer toSignalMetadataTable.signal_uid; portfolio workflow pointer updates now persist the resolved signal UID, and portfolio signal-weight API reads use that first-class pointer instead of inferring from shared storage. - Changed portfolio core construction to consume
valuation_source_instanceplus arbitraryvaluation_column: str, replacing the OHLC-boundprice_source_instanceandPriceTypeNamesprice-column contract while keeping bar-specific helpers in contributed price workflows. - Added core portfolio group MetaTables, typed row helpers, FastAPI v1 routes,
docs, examples, and tests for many-to-many portfolio classification through
PortfolioGroupTableandPortfolioGroupMembershipTable. - Extended the full account portfolio example to assign the generated target
sleeve portfolio to an example
PortfolioGroupthrough the public portfolio group API. - Changed portfolio execution to raise a clear calendar materialization error when the rebalance calendar has no sessions for the requested update range, instead of reporting a misleading empty portfolio-weight no-op.
- Changed
msm copy-msm-skillsto delegate its filesystem copy mechanics to the Main Sequence SDK scaffold-skill helper while keeping the same public command UX. Successful copies now write.agents/skills/ms_markets/PINNED_FROM.txt.
Fixed
- Fixed the
apps/v1asset-category detail endpoint soresponse_format=frontend_detailreturns membership-backed detail metadata, includingnumber_of_assetsand the nested asset-listcategories__uidfilter, instead of a bareAssetCategoryrow. - Fixed category-filtered asset lists so
categories__uidresolves membership asset UIDs directly instead of filtering only the first scanned asset page. - Fixed portfolio value row normalization so
PortfoliosDataNoderesolves a real portfolio identifier instead of stringifying its_unique_identifiermethod, and declared thePortfoliosStorage.portfolio_identifierforeign key toPortfolioTable.unique_identifier. - Reworked pricing-details writes so user-facing instrument attachment upserts
AssetPricingDetailsStorage; calls withoutpricing_details_dateusenow()and updateAssetCurrentPricingDetailsTable, while calls with an explicit date upsert only that timestamped snapshot. - Clarified account and portfolio example console output with section titles, corrected portfolio workflow step numbering, and cleaner virtual-fund allocation frame rendering.
- Fixed account virtual-fund planning for portfolio targets so portfolio
sleeves expand from the latest
PortfolioWeightsStoragesnapshot at or before valuation time instead of requiring exact timestamp equality. - Normalized
InterpolatedPrices.update()output time indexes and timestamp columns back todatetime64[ns, UTC]so backend-read microsecond timestamps do not fail SDK DataNode update validation. - Fixed the equal-weight portfolio schema-preparation workflow so it derives the
dynamic revision from the active migration namespace and runs the dynamic
provider upgrade before
--run-after, even when a stale metadata row already exists for the configured interpolation table. - Fixed
PortfoliosDataNodeforced reruns when the latest stored portfolio value is already ahead of usable valuation-source coverage; the portfolio update now returns no new rows before calling calendar scheduling with a reversed date range. - Fixed
ImmediateSignalso portfolio valuation sources only need the configured valuation column; missingvolumenow produces nullable portfolio-weight volume fields instead of failing the rebalance calculation. - Fixed
msm_pricing.api.add_pricing_details(...)so omittingpricing_details_datedelegates the no-date current-update behavior toAssetPricingDetails.add(...)instead of pre-filling a timestamp too early. - Fixed explicit-date pricing detail writes so current pricing details are updated when no current row exists, when the new date is newer than current, or when the same timestamp is being replaced.
- Fixed portfolio update-window selection so source valuation coverage is evaluated only for assets required by the portfolio, instead of taking the oldest progress timestamp across every asset in a large upstream valuation table.
- Fixed portfolio update-window selection for
APIDataNodevaluation sources by loading the API source table update statistics before required asset progress is evaluated. - Made portfolio update-window selection strict when no required asset scope can be determined, instead of falling back to table-wide source progress.
- Fixed portfolio output progress lookup so a shared
PortfoliosStoragetable-wide max from anotherportfolio_identifiercannot move the current portfolio's update start date. - Fixed contributed portfolio signal cursors so shared
SignalWeightsStorageprogress from anothersignal_uidcannot move the current signal's source window.
Removed
- Removed the internal markets MetaTable catalog table, generic
/api/v1/catalogroutes, catalog service layer, and migration catalog refresh hooks. Runtime attachment now stays on direct backendMetaTable/TimeIndexMetaTablelookup by SQLAlchemy table name.
[0.0.39] - 2026-06-06
Highlights
- Split the library into clear package boundaries:
msmfor core market data,msm_portfoliosfor portfolio and virtual-fund workflows, andmsm_pricingfor pricing instruments, pricing market data, curves, fixings, and QuantLib-backed engines. - Completed the storage-first DataNode architecture: DataNode outputs are now
backed by
PlatformTimeIndexMetaTablestorage classes, with schema, dtypes, index grain, metadata, and foreign keys owned by SQLAlchemy/SDK table contracts instead of DataNode-side mirrors. - Moved MetaTable schema lifecycle to the SDK-managed Alembic provider flow and made runtime startup attach to already-registered tables by physical table name rather than using the maintenance catalog as runtime control.
- Reworked portfolio examples into explicit schema-preparation and runtime stages so configured interpolation storage is registered before normal portfolio execution.
- Added cohesive account, asset, portfolio, and pricing documentation, examples, and packaged agent skills that reflect the current package boundaries.
Changed
- Reorganized examples under
examples/msm/,examples/msm_portfolios/, andexamples/msm_pricing/; reorganized knowledge docs under the same package boundaries. - Standardized asset extension naming: public API rows use domain names such as
Bond,Future, andCurrencySpot, while one-to-one MetaTables use<Domain>AssetDetailsTablewithasset_uidas the primary key and FK toAssetTable.uid. - Normalized asset-indexed storage identity columns to explicit names such as
asset_identifier,index_identifier,curve_identifier, andportfolio_identifier, while preserving unique MetaTable business keys such asAssetTable.unique_identifier. - Updated markets, portfolio, and pricing bootstraps to use
start_engine(...)as the public runtime attachment surface. - Replaced deprecated SDK foreign-key helper declarations with normal
SQLAlchemy
ForeignKey(...)declarations. - Added inline SQLAlchemy column labels and descriptions across built-in MetaTables and storage tables.
- Reworked accounts around
Account,AccountGroup,AccountAllocationModel,AccountTargetAllocation,PositionSet, and storage-backed holdings and target positions. - Reworked virtual funds as account-owned allocation views instead of synthetic asset rows.
- Reworked pricing market-data configuration around UID-backed market-data sets and bindings, plus index convention details, index fixings, and curve rows.
- Moved QuantLib pricing engine code under
msm_pricing.pricing_enginesomsm_pricing.modelsremains MetaTable-only. - Raised the Main Sequence SDK dependency floor to
mainsequence>=4.3.8.
Fixed
- Fixed runtime table attachment to resolve
MetaTableandTimeIndexMetaTableresources through POST body filters on physical table names. - Fixed configured
InterpolatedPricesstorage identity so schema preparation and runtime construction derive the same dynamic table from registered source TimeIndexMetaTable UID, source cadence, upsample frequency, and interpolation rule. - Fixed stale source-cadence handling in the equal-weight portfolio schema-preparation workflow.
- Fixed string asset scopes in
InterpolatedPrices.update()so portfolio configurations using asset identifiers work consistently. - Fixed account holdings validation for signed quantity exposure through
quantity * direction. - Blocked
msm copy-msm-skills --path .from running inside the ms-markets source checkout.
Removed
- Removed legacy DataNode schema-bootstrap/fake-row APIs, DataNode-side dtype maps, record definitions, duplicate index-name constants, and compatibility shims that mirrored storage metadata.
- Removed the local
msm migrationscommand group and old migration runner in favor of the SDK Alembic provider flow. - Removed duplicated row-oriented execution fact MetaTables and APIs; execution facts are now storage-first.
- Removed obsolete asset reference-list, pricing, portfolio, account, execution, and utility shims that no longer match the current package boundaries.
- Removed core dependencies that now belong to optional extras, including
QuantLib under
pricingand FastAPI/Uvicorn underpublic_api.
[0.0.1] - 2026-05-25
Added
- Scaffolded the
ms-marketsPython project with the import packagemsm. - Added MkDocs documentation, ADRs, tutorial scaffold, and GitHub Pages deployment workflow.
- Migrated market-domain code from the SDK into
src/msm. - Migrated market-domain examples into
examples/. - Migrated market-domain agent skills into
.agents/skills/. - Added a future CLI package scaffold under
src/cli. - Added the initial
docs/knowledgeconcept documentation area formsmpackage concepts. - Added Apache-2.0 licensing metadata and the full project license.
- Added the
.agents/skills/library_maintenanceOpen Agent skill to enforce library maintenance workflows across implementation, documentation, examples, tutorials, changelog, and validation.
Changed
- Moved asset DataNode schemas from the obsolete
msm.assetspackage boundary intomsm.data_nodes.assets. - Moved OpenFIGI provider helpers into
msm.services.assets.openfigiand kept asset identity on themsm.models.assets.AssetMetaTable model. - Made
msm.servicesandmsm.data_nodespackage exports lazy so provider helpers and lightweight package imports do not initialize unrelated platform dependencies. - Reworked the README into the public project overview, including logo, badges, documentation map, quick start, development commands, metadata, and license information.
- Made README links PyPI-safe by pointing package-page readers to the public documentation site and GitHub project files.
- Added explicit source distribution include rules so PyPI source artifacts do not ship local IDE, workflow, or agent-maintenance files.
- Declared the first release version directly in
pyproject.tomlas0.0.1. - Refactored instrument valuation code into
msm_pricing. - Renamed pricing model helpers from the old
pricing_modelspackage tomsm_pricing.models.
Removed
- Removed migrated market-domain code, examples, and skills from the SDK tree.