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.
Files changed (148) hide show
  1. axis_synome-0.1.0.dev63/AGENTS.md +58 -0
  2. axis_synome-0.1.0.dev63/CLAUDE.md +1 -0
  3. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/PKG-INFO +1 -1
  4. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/_version.py +2 -2
  5. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/tokens.py +1 -6
  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
  7. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/asc_incentive.py +8 -5
  8. axis_synome-0.1.0.dev63/src/axis_synome/spec/asc/formulas/dab.py +25 -0
  9. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/PKG-INFO +1 -1
  10. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/SOURCES.txt +2 -1
  11. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/conftest.py +2 -2
  12. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/mocks.py +6 -6
  13. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc_collateral_ratio.py +15 -2
  14. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc_incentive.py +11 -6
  15. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_dab.py +4 -3
  16. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_latent_asc.py +3 -3
  17. axis_synome-0.1.0.dev61/src/axis_synome/spec/asc/README.md +0 -419
  18. axis_synome-0.1.0.dev61/src/axis_synome/spec/asc/formulas/dab.py +0 -24
  19. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/.flake8 +0 -0
  20. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/README.md +0 -0
  21. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/WRITING_SPECS.md +0 -0
  22. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/pyproject.toml +0 -0
  23. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/setup.cfg +0 -0
  24. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/__init__.py +0 -0
  25. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/export_entities.py +0 -0
  26. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/__init__.py +0 -0
  27. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/all_entities/__init__.py +0 -0
  28. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/all_entities/lending_markets.py +0 -0
  29. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/__init__.py +0 -0
  30. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/alm_proxies.py +0 -0
  31. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/asset_categories.py +0 -0
  32. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/assets.py +0 -0
  33. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/assets_by_prime.py +0 -0
  34. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/networks.py +0 -0
  35. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/primes.py +0 -0
  36. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/protocol_sets.py +0 -0
  37. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/entities/types.py +0 -0
  38. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/asc.py +0 -0
  39. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/latent_asc.py +0 -0
  40. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/ratio_latent_asc.py +0 -0
  41. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/asc/formulas/resting_asc.py +0 -0
  42. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/codegen_test/entities/agents.py +0 -0
  43. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/__init__.py +0 -0
  44. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/formulas/__init__.py +0 -0
  45. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/crypto_lending/formulas/lif.py +0 -0
  46. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/__init__.py +0 -0
  47. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/audit_firms.py +0 -0
  48. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/protocol_risk.py +0 -0
  49. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/entities/smart_contract_risk.py +0 -0
  50. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/__init__.py +0 -0
  51. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/administrative_rrc/__init__.py +0 -0
  52. {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
  53. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/audit_factor.py +0 -0
  54. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/__init__.py +0 -0
  55. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/lending_protocol.py +0 -0
  56. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/entities/precomputed_crr.py +0 -0
  57. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/financial_rrc/__init__.py +0 -0
  58. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/financial_rrc/entities.py +0 -0
  59. {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
  60. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/formulas/__init__.py +0 -0
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/risk_capital/lindy_factor.py +0 -0
  73. {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
  74. {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
  75. {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
  76. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/README.md +0 -0
  77. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/assessor_score.py +0 -0
  78. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/assets.py +0 -0
  79. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/entities/mappings.py +0 -0
  80. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/formulas/crr.py +0 -0
  81. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec/suraf/formulas/scoring.py +0 -0
  82. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/__init__.py +0 -0
  83. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/correlation_matrix.py +0 -0
  84. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/evm_address.py +0 -0
  85. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/math_protocol.py +0 -0
  86. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/pendle_validation.py +0 -0
  87. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/references/__init__.py +0 -0
  88. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/references/graph.py +0 -0
  89. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/__init__.py +0 -0
  90. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/base.py +0 -0
  91. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/math.py +0 -0
  92. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/runtime/reference.py +0 -0
  93. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/validated_dataclass.py +0 -0
  94. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_support/validated_str.py +0 -0
  95. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/__init__.py +0 -0
  96. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/check_source_uuids.py +0 -0
  97. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/checker.py +0 -0
  98. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/flake8_plugin.py +0 -0
  99. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome/spec_validator/python_subset.py +0 -0
  100. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/dependency_links.txt +0 -0
  101. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/entry_points.txt +0 -0
  102. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/requires.txt +0 -0
  103. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/src/axis_synome.egg-info/top_level.txt +0 -0
  104. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/__init__.py +0 -0
  105. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_alm_proxies.py +0 -0
  106. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asc.py +0 -0
  107. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_asset_categories.py +0 -0
  108. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_evm_address.py +0 -0
  109. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_prime_agent_data_validation.py +0 -0
  110. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_ratio_latent_asc.py +0 -0
  111. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/asc/test_resting_asc.py +0 -0
  112. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/__init__.py +0 -0
  113. {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
  114. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/financial_rrc/__init__.py +0 -0
  115. {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
  116. {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
  117. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/formulas/__init__.py +0 -0
  118. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/formulas/test_correlation_matrix.py +0 -0
  119. {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
  120. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/risk_capital/smart_contract_rrc/__init__.py +0 -0
  121. {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
  122. {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
  123. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/scripts/test_export_entities.py +0 -0
  124. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/__init__.py +0 -0
  125. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/references/__init__.py +0 -0
  126. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/references/test_graph.py +0 -0
  127. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/__init__.py +0 -0
  128. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/test_base.py +0 -0
  129. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_support/runtime/test_math.py +0 -0
  130. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_check_source_uuids.py +0 -0
  131. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_checker.py +0 -0
  132. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/spec_validator/test_flake8_plugin.py +0 -0
  133. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/__init__.py +0 -0
  134. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/entities/__init__.py +0 -0
  135. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/entities/test_assessor_score.py +0 -0
  136. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/__init__.py +0 -0
  137. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/test_crr.py +0 -0
  138. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/formulas/test_scoring.py +0 -0
  139. {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
  140. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/penalty.csv +0 -0
  141. {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
  142. {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
  143. {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
  144. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/static/aave_ausdc/v1/weights.csv +0 -0
  145. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/__init__.py +0 -0
  146. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/suraf_client.py +0 -0
  147. {axis_synome-0.1.0.dev61 → axis_synome-0.1.0.dev63}/tests/axis_synome/suraf/suraf_client/test_suraf_client.py +0 -0
  148. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: axis-synome
3
- Version: 0.1.0.dev61
3
+ Version: 0.1.0.dev63
4
4
  Summary: Axis specification modules (entities, formulas, validators)
5
5
  Author-email: Archon Tech <hello@archontech.ai>
6
6
  License: MIT
@@ -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.dev61'
22
- __version_tuple__ = version_tuple = (0, 1, 0, 'dev61')
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
@@ -56,14 +56,9 @@ class Token(Enum):
56
56
  WETH = "WETH"
57
57
 
58
58
 
59
- CASH_STABLECOINS = {Token.USDC, Token.USDS, Token.DAI, Token.USDT}
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 Collateral Portfolio value for a prime: sum of all positions.
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
- eligible_asc_usd: float = resting_asc(positions) + latent_asc(prime, positions)
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: axis-synome
3
- Version: 0.1.0.dev61
3
+ Version: 0.1.0.dev63
4
4
  Summary: Axis specification modules (entities, formulas, validators)
5
5
  Author-email: Archon Tech <hello@archontech.ai>
6
6
  License: MIT
@@ -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": "USDS",
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": "DAI", "protocol": "Morpho", "network": "Ethereum Mainnet", "value_usd": 300.0},
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
- - USDS in Uniswap paired with USDS = 250.0
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.USDS,
100
+ token=Token.USDT,
101
101
  protocol=Protocol.UNISWAP,
102
102
  network=Network.ETHEREUM_MAINNET,
103
103
  address=MOCK_ADDRESS,
104
- underlying_asset=Token.USDS,
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
- - DAI in Morpho (lending) = 300.0
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.DAI,
182
+ token=Token.PYUSD,
183
183
  protocol=Protocol.MORPHO,
184
184
  network=Network.ETHEREUM_MAINNET,
185
185
  address=MOCK_ADDRESS,
186
- underlying_asset=Token.DAI,
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 test_collateral_portfolio_sums_all_positions():
23
- # Includes both ASC-qualifying and non-qualifying assets.
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
 
@@ -16,8 +16,9 @@ SPARK = EligiblePrimeAgentASC.SPARK
16
16
 
17
17
 
18
18
  def test_positive_incentive_when_base_above_tbill():
19
- # asc=1000, base=0.05, tbill=0.03
20
- # incentive = 1000*0.02 = 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(20.0)
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(-20.0)
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
- asc=2150, base=0.05, tbill=0.03 // incentive = 2150*0.02 = 43.0
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(43.0)
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
- # asc = resting(USDC LitePSM=200) + latent(USDC SparkLend=100) = 300
19
- # required = 300 * 0.25 = 75
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.0)
49
+ assert dab_required(SPARK, positions) == pytest.approx(3.75)
@@ -81,11 +81,11 @@ def test_cash_stablecoin_in_morpho_counts():
81
81
  positions = [
82
82
  Position(
83
83
  asset=Asset(
84
- token=Token.DAI,
84
+ token=Token.PYUSD,
85
85
  protocol=Protocol.MORPHO,
86
86
  network=Network.ETHEREUM_MAINNET,
87
87
  address=MOCK_ADDRESS,
88
- underlying_asset=Token.DAI,
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, USDS, DAI, USDT) qualify.
172
+ # Only CASH_STABLECOINS (USDC, USDT, pyUSD) qualify.
173
173
  positions = [
174
174
  Position(
175
175
  asset=Asset(