axis-synome 0.1.0.dev61__tar.gz → 0.1.0.dev63__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- axis_synome-0.1.0.dev63/AGENTS.md +58 -0
- axis_synome-0.1.0.dev63/CLAUDE.md +1 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/PKG-INFO +1 -1
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/_version.py +2 -2
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/tokens.py +1 -6
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/asc_collateral_ratio.py +6 -4
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/asc_incentive.py +8 -5
- axis_synome-0.1.0.dev63/src/axis_synome/spec/asc/formulas/dab.py +25 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/PKG-INFO +1 -1
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/SOURCES.txt +2 -1
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/conftest.py +2 -2
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/mocks.py +6 -6
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc_collateral_ratio.py +15 -2
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc_incentive.py +11 -6
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_dab.py +4 -3
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_latent_asc.py +3 -3
- axis_synome-0.1.0.dev61/src/axis_synome/spec/asc/README.md +0 -419
- axis_synome-0.1.0.dev61/src/axis_synome/spec/asc/formulas/dab.py +0 -24
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/.flake8 +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/README.md +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/WRITING_SPECS.md +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/pyproject.toml +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/setup.cfg +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/export_entities.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/all_entities/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/all_entities/lending_markets.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/alm_proxies.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/asset_categories.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/assets.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/assets_by_prime.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/networks.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/primes.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/protocol_sets.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/types.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/latent_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/ratio_latent_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/resting_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/codegen_test/entities/agents.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/formulas/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/formulas/lif.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/audit_firms.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/protocol_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/smart_contract_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/administrative_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/administrative_rrc/administrative_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/audit_factor.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/lending_protocol.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/precomputed_crr.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/financial_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/financial_rrc/entities.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/financial_rrc/perpetual_positions.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/asset_correlation_coefficient.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/capital_requirement_without_buffers.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/exposure_caps.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/fixed_crr_rrc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/instance_financial_rrc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/lending_rrc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/pipeline.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/precomputed_crr_rrc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/financial_rrc/probability_of_default.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/required_risk_capital.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/lindy_factor.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/smart_contract_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/smart_contract_rrc/exceptions.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/smart_contract_rrc/smart_contract_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/README.md +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/assessor_score.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/assets.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/mappings.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/formulas/crr.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/formulas/scoring.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/correlation_matrix.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/evm_address.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/math_protocol.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/pendle_validation.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/references/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/references/graph.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/base.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/math.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/reference.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/validated_dataclass.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/validated_str.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/check_source_uuids.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/checker.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/flake8_plugin.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/python_subset.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/dependency_links.txt +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/entry_points.txt +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/requires.txt +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/top_level.txt +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_alm_proxies.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asset_categories.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_evm_address.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_prime_agent_data_validation.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_ratio_latent_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_resting_asc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/administrative_rrc/test_administrative_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/financial_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/financial_rrc/test_lending_rrc.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/financial_rrc/test_perpetual_positions.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/formulas/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/formulas/test_correlation_matrix.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/formulas/test_loss_given_default.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/smart_contract_rrc/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/smart_contract_rrc/test_exceptions.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/smart_contract_rrc/test_smart_contract_risk.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/scripts/test_export_entities.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/references/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/references/test_graph.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/test_base.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/test_math.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_check_source_uuids.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_checker.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_flake8_plugin.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/entities/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/entities/test_assessor_score.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/test_crr.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/test_scoring.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/crr_mapping.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/penalty.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_1_scores.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_2_scores.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/scorecards/Assessor_3_scores.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/weights.csv +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/__init__.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/suraf_client.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/test_suraf_client.py +0 -0
- {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/uv.lock +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# axis-synome — Agent Instructions
|
|
2
|
+
|
|
3
|
+
`axis-synome` is a Python framework that encodes Sky Atlas calculation rules as
|
|
4
|
+
machine-verifiable specs. This file documents agent rules that apply when working
|
|
5
|
+
inside `axis-synome/`.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
From the repo root, run **`make setup`** once after cloning. This installs Python
|
|
10
|
+
deps, lefthook git hooks, and the Claude/Codex skills — all of which further guide
|
|
11
|
+
and constrain agent work. Run **`make check-all`** before opening or updating a PR
|
|
12
|
+
(it is what CI runs).
|
|
13
|
+
|
|
14
|
+
## Where to find what
|
|
15
|
+
|
|
16
|
+
- **`WRITING_SPECS.md`** — authoritative guide for writing axis-synome specs. Read
|
|
17
|
+
it before editing anything under `spec/`.
|
|
18
|
+
|
|
19
|
+
## Editing axis-synome specs (`spec/`)
|
|
20
|
+
|
|
21
|
+
Highlights from `WRITING_SPECS.md` that are not auto-discoverable from the code:
|
|
22
|
+
|
|
23
|
+
- Specs are **pure, declarative Python**: no I/O, no mutable state, no side effects.
|
|
24
|
+
- The spec language subset is enforced by the `AXS` flake8 plugin
|
|
25
|
+
(`axis_synome.spec_validator`); read its rules in `python_subset.py` and `checker.py`
|
|
26
|
+
rather than restating them here. In short: no reassignment, no conditional assignment,
|
|
27
|
+
no imperative control flow, no mutation, imports limited to the spec, `math`, and
|
|
28
|
+
approved support packages.
|
|
29
|
+
- **Provenance lives in docstrings as reST fields**, e.g. `:source_uuid: <uuid>`. In
|
|
30
|
+
`**/formulas/*.py`, public functions are treated as formulas by convention; outside
|
|
31
|
+
formula modules, `:source_uuid:` is the explicit opt-in marker. Parameters are
|
|
32
|
+
module-level `Final[...]` constants with a trailing string-literal docstring carrying
|
|
33
|
+
the description and `:source_uuid:`. The `check-spec-uuids` tool resolves every
|
|
34
|
+
`:source_uuid:` against the `content/` document tree on every `make check-all`.
|
|
35
|
+
- **Entities** use `pydantic.dataclasses.dataclass` (frozen) with closed-world `Enum`
|
|
36
|
+
fields; encode eligibility via Enum membership (e.g. `EligiblePrimeAgentASC`) rather
|
|
37
|
+
than booleans or runtime checks.
|
|
38
|
+
- **Start entities formula-local** (`spec/<domain>/entities/`); only uplift to a shared
|
|
39
|
+
location when ≥3 independent formulas reuse them. Moving entities is a breaking
|
|
40
|
+
change.
|
|
41
|
+
|
|
42
|
+
## Reviewing axis-synome PRs
|
|
43
|
+
|
|
44
|
+
The shared review focus / non-focus list lives in
|
|
45
|
+
[`../.github/copilot-instructions.md`](../.github/copilot-instructions.md) so Copilot
|
|
46
|
+
and humans use the same list. Subtree-specific review rules for `axis-synome/**` live
|
|
47
|
+
in
|
|
48
|
+
[`../.github/instructions/axis-synome.instructions.md`](../.github/instructions/axis-synome.instructions.md)
|
|
49
|
+
(in particular: spec-review patterns AXS cannot enforce, Atlas-alignment guidance,
|
|
50
|
+
and the no-defensive-error-handling rule). Read both before reviewing.
|
|
51
|
+
|
|
52
|
+
## What belongs in this AGENTS.md
|
|
53
|
+
|
|
54
|
+
Only rules that an agent **cannot reasonably discover on its own** by reading the
|
|
55
|
+
axis-synome subtree (e.g. `pyproject.toml`, the root `Makefile`, `lefthook.yml`).
|
|
56
|
+
Things that *can* be discovered — make-target catalogues, dependency lists,
|
|
57
|
+
type-checker choice, lint rule sets — drift out of date and belong in their config
|
|
58
|
+
of origin, not here.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1, 0, '
|
|
21
|
+
__version__ = version = '0.1.0.dev63'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 1, 0, 'dev63')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
{axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/tokens.py
RENAMED
|
@@ -56,14 +56,9 @@ class Token(Enum):
|
|
|
56
56
|
WETH = "WETH"
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
CASH_STABLECOINS = {Token.USDC, Token.
|
|
59
|
+
CASH_STABLECOINS = {Token.USDC, Token.USDT, Token.PYUSD}
|
|
60
60
|
"""Tokens treated as Cash Stablecoins for ASC/DAB calculations.
|
|
61
61
|
|
|
62
|
-
Note: The Atlas (A.3.3.2.1.3) currently defines Cash Stablecoins as
|
|
63
|
-
USDC, USDT, and pyUSD. This constant differs (includes USDS and DAI;
|
|
64
|
-
omits PYUSD) and the discrepancy should be reconciled — either by
|
|
65
|
-
amending the Atlas or by updating this set.
|
|
66
|
-
|
|
67
62
|
:source_uuid: 066a4d9f-13ed-4ac3-a55a-df7bf3429649
|
|
68
63
|
"""
|
|
69
64
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from axis_synome.spec.asc.entities.primes import EligiblePrimeAgentASC
|
|
2
|
+
from axis_synome.spec.asc.entities.tokens import Token
|
|
2
3
|
from axis_synome.spec.asc.entities.types import Position
|
|
3
4
|
from axis_synome.spec.asc.formulas.latent_asc import latent_asc
|
|
4
5
|
from axis_synome.spec.asc.formulas.resting_asc import resting_asc
|
|
@@ -7,13 +8,14 @@ from axis_synome.spec.asc.formulas.resting_asc import resting_asc
|
|
|
7
8
|
def collateral_portfolio(
|
|
8
9
|
positions: list[Position],
|
|
9
10
|
) -> float:
|
|
10
|
-
"""Total
|
|
11
|
+
"""Total capital deployed by the Prime Agent from Sky through the Allocation System, excluding USDS.
|
|
12
|
+
|
|
13
|
+
Positions are all assets the Prime has deployed via the Allocation System Primitive.
|
|
14
|
+
Any portion held in USDS is excluded per Atlas A.3.3.1.3.1.
|
|
11
15
|
|
|
12
16
|
:source_uuid: 64e1390f-68a1-43ec-87a8-8ae7b990f7ec
|
|
13
|
-
:ambiguity: collateral_portfolio sums all positions including USDS — Atlas
|
|
14
|
-
A.3.3.1.3.1 explicitly excludes USDS from the Agent Collateral Portfolio.
|
|
15
17
|
"""
|
|
16
|
-
return sum(p.value_usd for p in positions)
|
|
18
|
+
return sum(p.value_usd for p in positions if p.asset.underlying_asset != Token.USDS)
|
|
17
19
|
|
|
18
20
|
|
|
19
21
|
def asc_collateral_ratio(prime: EligiblePrimeAgentASC, positions: list[Position]) -> float:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from axis_synome.spec.asc.entities.primes import EligiblePrimeAgentASC
|
|
2
2
|
from axis_synome.spec.asc.entities.types import Position
|
|
3
|
+
from axis_synome.spec.asc.formulas.asc_collateral_ratio import collateral_portfolio
|
|
3
4
|
from axis_synome.spec.asc.formulas.latent_asc import latent_asc
|
|
4
5
|
from axis_synome.spec.asc.formulas.resting_asc import resting_asc
|
|
5
6
|
|
|
@@ -12,11 +13,13 @@ def asc_incentive(
|
|
|
12
13
|
) -> float:
|
|
13
14
|
"""ASC incentive payment: eligible ASC times (base_rate - treasury_bill_rate).
|
|
14
15
|
|
|
16
|
+
Eligible ASC is the lesser of actual ASC and minimum required ASC.
|
|
17
|
+
|
|
15
18
|
:source_uuid: 693330d6-9072-4054-bd61-d788537e34e8
|
|
16
|
-
:ambiguity: eligible_asc_usd = actual ASC with no min() cap — Atlas
|
|
17
|
-
A.3.3.2.2.4.1.1 defines Eligible ASC as the lesser of actual ASC and
|
|
18
|
-
Minimum ASC; the cap is absent, causing over-payment when actual ASC
|
|
19
|
-
exceeds the required minimum.
|
|
20
19
|
"""
|
|
21
|
-
|
|
20
|
+
actual_asc_usd: float = resting_asc(positions) + latent_asc(prime, positions)
|
|
21
|
+
agent = prime.value
|
|
22
|
+
portfolio_usd: float = collateral_portfolio(positions)
|
|
23
|
+
minimum_required_asc_usd: float = portfolio_usd * agent.min_pct_asc_of_collateral
|
|
24
|
+
eligible_asc_usd: float = min(actual_asc_usd, minimum_required_asc_usd)
|
|
22
25
|
return eligible_asc_usd * (base_rate - treasury_bill_rate)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from typing import Final
|
|
2
|
+
|
|
3
|
+
from axis_synome.spec.asc.entities.primes import EligiblePrimeAgentASC
|
|
4
|
+
from axis_synome.spec.asc.entities.types import Position
|
|
5
|
+
from axis_synome.spec.asc.formulas.asc_collateral_ratio import collateral_portfolio
|
|
6
|
+
|
|
7
|
+
DAB_REQUIRED_PCT: Final[float] = 0.25
|
|
8
|
+
"""Required DAB as a fraction of minimum required ASC.
|
|
9
|
+
|
|
10
|
+
:source_uuid: 1e129119-a2ce-4978-b235-c50f2a1c5e2e
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def dab_required(
|
|
15
|
+
prime: EligiblePrimeAgentASC,
|
|
16
|
+
positions: list[Position],
|
|
17
|
+
) -> float:
|
|
18
|
+
"""Required DAB: DAB_REQUIRED_PCT of minimum required ASC.
|
|
19
|
+
|
|
20
|
+
:source_uuid: 1e129119-a2ce-4978-b235-c50f2a1c5e2e
|
|
21
|
+
"""
|
|
22
|
+
agent = prime.value
|
|
23
|
+
portfolio_usd: float = collateral_portfolio(positions)
|
|
24
|
+
minimum_required_asc_usd: float = portfolio_usd * agent.min_pct_asc_of_collateral
|
|
25
|
+
return minimum_required_asc_usd * DAB_REQUIRED_PCT
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
.flake8
|
|
2
|
+
AGENTS.md
|
|
3
|
+
CLAUDE.md
|
|
2
4
|
README.md
|
|
3
5
|
WRITING_SPECS.md
|
|
4
6
|
pyproject.toml
|
|
@@ -15,7 +17,6 @@ src/axis_synome.egg-info/top_level.txt
|
|
|
15
17
|
src/axis_synome/spec/__init__.py
|
|
16
18
|
src/axis_synome/spec/all_entities/__init__.py
|
|
17
19
|
src/axis_synome/spec/all_entities/lending_markets.py
|
|
18
|
-
src/axis_synome/spec/asc/README.md
|
|
19
20
|
src/axis_synome/spec/asc/entities/__init__.py
|
|
20
21
|
src/axis_synome/spec/asc/entities/alm_proxies.py
|
|
21
22
|
src/axis_synome/spec/asc/entities/asset_categories.py
|
|
@@ -27,7 +27,7 @@ def spark_positions():
|
|
|
27
27
|
"pool_paired_with_usds": True,
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
"token": "
|
|
30
|
+
"token": "USDT",
|
|
31
31
|
"protocol": "Uniswap",
|
|
32
32
|
"network": "Ethereum Mainnet",
|
|
33
33
|
"value_usd": 250.0,
|
|
@@ -55,7 +55,7 @@ def spark_positions():
|
|
|
55
55
|
"value_usd": 200.0,
|
|
56
56
|
},
|
|
57
57
|
{"token": "USDT", "protocol": "Aave", "network": "Ethereum Mainnet", "value_usd": 150.0},
|
|
58
|
-
{"token": "
|
|
58
|
+
{"token": "PYUSD", "protocol": "Morpho", "network": "Ethereum Mainnet", "value_usd": 300.0},
|
|
59
59
|
]
|
|
60
60
|
# Map as the second step: convert raw records into typed Position objects
|
|
61
61
|
return mocks.positions_from_records(raw_data)
|
|
@@ -37,7 +37,7 @@ def spark_resting_positions() -> list[Position]:
|
|
|
37
37
|
- USDC in PSM3 on Arbitrum (L2 PSM) = 200.0
|
|
38
38
|
- USDC in PSM3 on Base (L2 PSM) = 150.0
|
|
39
39
|
- USDC in Curve paired with USDS = 300.0
|
|
40
|
-
-
|
|
40
|
+
- USDT in Uniswap paired with USDS = 250.0
|
|
41
41
|
- USDC in GUNI at 0.01% fee tier = 400.0
|
|
42
42
|
total = 1 400.0
|
|
43
43
|
"""
|
|
@@ -97,11 +97,11 @@ def spark_resting_positions() -> list[Position]:
|
|
|
97
97
|
),
|
|
98
98
|
Position(
|
|
99
99
|
asset=Asset(
|
|
100
|
-
token=Token.
|
|
100
|
+
token=Token.USDT,
|
|
101
101
|
protocol=Protocol.UNISWAP,
|
|
102
102
|
network=Network.ETHEREUM_MAINNET,
|
|
103
103
|
address=MOCK_ADDRESS,
|
|
104
|
-
underlying_asset=Token.
|
|
104
|
+
underlying_asset=Token.USDT,
|
|
105
105
|
underlying_asset_address=MOCK_ADDRESS,
|
|
106
106
|
underlying_asset_source="",
|
|
107
107
|
categories={AssetCategory.LENDING_MARKET},
|
|
@@ -133,7 +133,7 @@ def spark_latent_positions() -> list[Position]:
|
|
|
133
133
|
- USDC in Curve NOT paired with USDS = 100.0
|
|
134
134
|
- USDC in SparkLend (lending) = 200.0
|
|
135
135
|
- USDT in Aave (lending) = 150.0
|
|
136
|
-
-
|
|
136
|
+
- PYUSD in Morpho (lending) = 300.0
|
|
137
137
|
total = 750.0
|
|
138
138
|
"""
|
|
139
139
|
return [
|
|
@@ -179,11 +179,11 @@ def spark_latent_positions() -> list[Position]:
|
|
|
179
179
|
),
|
|
180
180
|
Position(
|
|
181
181
|
asset=Asset(
|
|
182
|
-
token=Token.
|
|
182
|
+
token=Token.PYUSD,
|
|
183
183
|
protocol=Protocol.MORPHO,
|
|
184
184
|
network=Network.ETHEREUM_MAINNET,
|
|
185
185
|
address=MOCK_ADDRESS,
|
|
186
|
-
underlying_asset=Token.
|
|
186
|
+
underlying_asset=Token.PYUSD,
|
|
187
187
|
underlying_asset_address=MOCK_ADDRESS,
|
|
188
188
|
underlying_asset_source="",
|
|
189
189
|
categories={AssetCategory.LENDING_MARKET},
|
|
@@ -19,8 +19,8 @@ from .mocks import MOCK_ADDRESS, MOCK_CATEGORIES
|
|
|
19
19
|
SPARK = EligiblePrimeAgentASC.SPARK
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def
|
|
23
|
-
#
|
|
22
|
+
def test_collateral_portfolio_excludes_usds():
|
|
23
|
+
# USDS position is excluded per Atlas A.3.3.1.3.1; non-USDS positions are summed.
|
|
24
24
|
positions = [
|
|
25
25
|
Position(
|
|
26
26
|
asset=Asset(
|
|
@@ -48,6 +48,19 @@ def test_collateral_portfolio_sums_all_positions():
|
|
|
48
48
|
),
|
|
49
49
|
value_usd=900.0,
|
|
50
50
|
),
|
|
51
|
+
Position(
|
|
52
|
+
asset=Asset(
|
|
53
|
+
token=Token.USDS,
|
|
54
|
+
protocol=Protocol.UNISWAP,
|
|
55
|
+
network=Network.ETHEREUM_MAINNET,
|
|
56
|
+
address=MOCK_ADDRESS,
|
|
57
|
+
underlying_asset=Token.USDS,
|
|
58
|
+
underlying_asset_address=MOCK_ADDRESS,
|
|
59
|
+
underlying_asset_source="",
|
|
60
|
+
categories=MOCK_CATEGORIES,
|
|
61
|
+
),
|
|
62
|
+
value_usd=500.0,
|
|
63
|
+
),
|
|
51
64
|
]
|
|
52
65
|
assert collateral_portfolio(positions) == 1000.0
|
|
53
66
|
|
{axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc_incentive.py
RENAMED
|
@@ -16,8 +16,9 @@ SPARK = EligiblePrimeAgentASC.SPARK
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def test_positive_incentive_when_base_above_tbill():
|
|
19
|
-
#
|
|
20
|
-
#
|
|
19
|
+
# portfolio=1000, min_required_asc = 1000*0.05 = 50
|
|
20
|
+
# actual_asc=1000 > min_required, so eligible=50
|
|
21
|
+
# incentive = 50*0.02 = 1.0
|
|
21
22
|
positions = [
|
|
22
23
|
Position(
|
|
23
24
|
asset=Asset(
|
|
@@ -35,7 +36,7 @@ def test_positive_incentive_when_base_above_tbill():
|
|
|
35
36
|
]
|
|
36
37
|
assert asc_incentive(
|
|
37
38
|
SPARK, positions, base_rate=0.05, treasury_bill_rate=0.03
|
|
38
|
-
) == pytest.approx(
|
|
39
|
+
) == pytest.approx(1.0)
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
def test_zero_incentive_when_rates_equal():
|
|
@@ -61,6 +62,8 @@ def test_zero_incentive_when_rates_equal():
|
|
|
61
62
|
|
|
62
63
|
def test_negative_incentive_when_base_below_tbill():
|
|
63
64
|
# Can occur when the treasury bill rate exceeds the base rate.
|
|
65
|
+
# eligible = min(actual_asc=1000, min_required=50) = 50
|
|
66
|
+
# incentive = 50*(0.03-0.05) = -1.0
|
|
64
67
|
positions = [
|
|
65
68
|
Position(
|
|
66
69
|
asset=Asset(
|
|
@@ -78,7 +81,7 @@ def test_negative_incentive_when_base_below_tbill():
|
|
|
78
81
|
]
|
|
79
82
|
assert asc_incentive(
|
|
80
83
|
SPARK, positions, base_rate=0.03, treasury_bill_rate=0.05
|
|
81
|
-
) == pytest.approx(-
|
|
84
|
+
) == pytest.approx(-1.0)
|
|
82
85
|
|
|
83
86
|
|
|
84
87
|
def test_incentive_scales_with_asc_amount():
|
|
@@ -122,11 +125,13 @@ def test_incentive_scales_with_asc_amount():
|
|
|
122
125
|
def test_bridge_asc_incentive(spark_positions):
|
|
123
126
|
"""Shows asc_incentive against user-fetched positions.
|
|
124
127
|
|
|
125
|
-
|
|
128
|
+
portfolio=2150, min_required_asc = 2150*0.05 = 107.5
|
|
129
|
+
actual_asc=2150 > min_required, so eligible=107.5
|
|
130
|
+
incentive = 107.5*0.02 = 2.15
|
|
126
131
|
|
|
127
132
|
The rate parameters (base_rate, treasury_bill_rate) are supplied by the
|
|
128
133
|
caller — they come from a separate governance or market data source,
|
|
129
134
|
not from the position records.
|
|
130
135
|
"""
|
|
131
136
|
result = asc_incentive(SPARK, spark_positions, base_rate=0.05, treasury_bill_rate=0.03)
|
|
132
|
-
assert result == pytest.approx(
|
|
137
|
+
assert result == pytest.approx(2.15)
|
|
@@ -15,8 +15,9 @@ SPARK = EligiblePrimeAgentASC.SPARK
|
|
|
15
15
|
|
|
16
16
|
# dab_required
|
|
17
17
|
def test_dab_required_is_fraction_of_asc():
|
|
18
|
-
#
|
|
19
|
-
#
|
|
18
|
+
# portfolio = 200 + 100 = 300
|
|
19
|
+
# min_required_asc = portfolio * 0.05 = 15
|
|
20
|
+
# dab = min_required_asc * 0.25 = 3.75
|
|
20
21
|
positions = [
|
|
21
22
|
Position(
|
|
22
23
|
asset=Asset(
|
|
@@ -45,4 +46,4 @@ def test_dab_required_is_fraction_of_asc():
|
|
|
45
46
|
value_usd=100.0,
|
|
46
47
|
),
|
|
47
48
|
]
|
|
48
|
-
assert dab_required(SPARK, positions) == pytest.approx(75
|
|
49
|
+
assert dab_required(SPARK, positions) == pytest.approx(3.75)
|
{axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_latent_asc.py
RENAMED
|
@@ -81,11 +81,11 @@ def test_cash_stablecoin_in_morpho_counts():
|
|
|
81
81
|
positions = [
|
|
82
82
|
Position(
|
|
83
83
|
asset=Asset(
|
|
84
|
-
token=Token.
|
|
84
|
+
token=Token.PYUSD,
|
|
85
85
|
protocol=Protocol.MORPHO,
|
|
86
86
|
network=Network.ETHEREUM_MAINNET,
|
|
87
87
|
address=MOCK_ADDRESS,
|
|
88
|
-
underlying_asset=Token.
|
|
88
|
+
underlying_asset=Token.PYUSD,
|
|
89
89
|
underlying_asset_address=MOCK_ADDRESS,
|
|
90
90
|
underlying_asset_source="",
|
|
91
91
|
categories=MOCK_CATEGORIES,
|
|
@@ -169,7 +169,7 @@ def test_pool_with_unknown_pairing_counts_as_latent():
|
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
def test_non_cash_stablecoin_in_lending_is_excluded():
|
|
172
|
-
# Only CASH_STABLECOINS (USDC,
|
|
172
|
+
# Only CASH_STABLECOINS (USDC, USDT, pyUSD) qualify.
|
|
173
173
|
positions = [
|
|
174
174
|
Position(
|
|
175
175
|
asset=Asset(
|