cometric 0.1.0__tar.gz → 0.2.0__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 (131) hide show
  1. cometric-0.1.0/.hypothesis/constants/c0553da3badd1746 → cometric-0.2.0/.hypothesis/constants/052e28aa39cf014b +1 -1
  2. cometric-0.2.0/.hypothesis/constants/6f3f7dda3bd02709 +4 -0
  3. cometric-0.2.0/.hypothesis/constants/8263d258dca94122 +4 -0
  4. cometric-0.1.0/.hypothesis/constants/3d80302e16570458 → cometric-0.2.0/.hypothesis/constants/b428358d86c25f38 +1 -1
  5. cometric-0.2.0/.hypothesis/constants/f33d5940d4c83207 +4 -0
  6. cometric-0.2.0/.hypothesis/constants/fbe7b640dc5ad53e +4 -0
  7. cometric-0.2.0/CHANGELOG.md +34 -0
  8. {cometric-0.1.0 → cometric-0.2.0}/PKG-INFO +9 -5
  9. {cometric-0.1.0 → cometric-0.2.0}/README.md +8 -4
  10. cometric-0.2.0/docs/COMETRIC_SPEC_v0.3.md +1193 -0
  11. cometric-0.2.0/docs/RECONCILIATION.md +63 -0
  12. {cometric-0.1.0 → cometric-0.2.0}/docs/STATUS.md +3 -3
  13. {cometric-0.1.0 → cometric-0.2.0}/pyproject.toml +1 -1
  14. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/__init__.py +2 -0
  15. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/cli.py +55 -3
  16. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/api.py +236 -15
  17. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/engine.py +211 -90
  18. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/periods.py +23 -6
  19. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/tiers.py +25 -12
  20. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/validation.py +18 -3
  21. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/server.py +28 -0
  22. cometric-0.2.0/tests/test_engine_review_fixes.py +375 -0
  23. {cometric-0.1.0 → cometric-0.2.0}/tests/test_mcp.py +12 -0
  24. {cometric-0.1.0 → cometric-0.2.0}/tests/test_pricing.py +32 -2
  25. {cometric-0.1.0 → cometric-0.2.0}/tests/test_properties.py +5 -1
  26. cometric-0.2.0/tests/test_reconcile.py +164 -0
  27. {cometric-0.1.0 → cometric-0.2.0}/uv.lock +1 -1
  28. cometric-0.1.0/.hypothesis/constants/27de4e79debf7d27 +0 -4
  29. cometric-0.1.0/.hypothesis/constants/409846769d39f76d +0 -4
  30. cometric-0.1.0/.hypothesis/constants/dfa4cfacb990ae1e +0 -4
  31. cometric-0.1.0/.hypothesis/constants/f96f4f1e759b7abf +0 -4
  32. cometric-0.1.0/CHANGELOG.md +0 -13
  33. {cometric-0.1.0 → cometric-0.2.0}/.github/workflows/ci.yml +0 -0
  34. {cometric-0.1.0 → cometric-0.2.0}/.github/workflows/publish.yml +0 -0
  35. {cometric-0.1.0 → cometric-0.2.0}/.gitignore +0 -0
  36. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/.gitignore +0 -0
  37. /cometric-0.1.0/.hypothesis/constants/60b43c062745c280 → /cometric-0.2.0/.hypothesis/constants/0a08468b27ab0e2b +0 -0
  38. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/1b52f94ff1d6e987 +0 -0
  39. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/31846ac0f55db7cc +0 -0
  40. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/3570e270a2e92983 +0 -0
  41. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/37d175425d95aff7 +0 -0
  42. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/3faf924fe60f71dc +0 -0
  43. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/4145014522d2ff1a +0 -0
  44. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/457af5fc346a4d40 +0 -0
  45. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/64a2c31fcab5443b +0 -0
  46. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/6ab7a80f708d05c3 +0 -0
  47. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/78ed34a18774f2d3 +0 -0
  48. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/bddcf7e0e0af1f28 +0 -0
  49. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
  50. {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/e3a40f74a8e72704 +0 -0
  51. {cometric-0.1.0 → cometric-0.2.0}/LICENSE +0 -0
  52. {cometric-0.1.0 → cometric-0.2.0}/docs/ALSP_COMMERCIAL_ONTOLOGY_SPEC_v0.1.pdf +0 -0
  53. {cometric-0.1.0 → cometric-0.2.0}/docs/COMETRIC_SPEC_v0.2.md +0 -0
  54. {cometric-0.1.0 → cometric-0.2.0}/scripts/build_consulting.py +0 -0
  55. {cometric-0.1.0 → cometric-0.2.0}/scripts/build_fixtures.py +0 -0
  56. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/__init__.py +0 -0
  57. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/enums.py +0 -0
  58. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/fingerprint.py +0 -0
  59. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/issues.py +0 -0
  60. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/ledger.py +0 -0
  61. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/models.py +0 -0
  62. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/money.py +0 -0
  63. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/packs.py +0 -0
  64. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/predicates.py +0 -0
  65. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/quantities.py +0 -0
  66. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/schema.py +0 -0
  67. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/templates.py +0 -0
  68. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_a.json +0 -0
  69. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_b.json +0 -0
  70. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_c.json +0 -0
  71. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_d.json +0 -0
  72. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_e.json +0 -0
  73. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_f.json +0 -0
  74. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_g.json +0 -0
  75. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_h.json +0 -0
  76. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/spec_example.json +0 -0
  77. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/__init__.py +0 -0
  78. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/__main__.py +0 -0
  79. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/provider_types.yaml +0 -0
  80. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/service_categories.yaml +0 -0
  81. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/unit_templates.yaml +0 -0
  82. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/coverage.yaml +0 -0
  83. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/evidence/claims.yaml +0 -0
  84. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/evidence/sources.yaml +0 -0
  85. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/levers.yaml +0 -0
  86. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/mechanisms.yaml +0 -0
  87. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/metrics.yaml +0 -0
  88. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/pricing_models.yaml +0 -0
  89. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/pack.yaml +0 -0
  90. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/rules/rules.yaml +0 -0
  91. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/automation_structures.yaml +0 -0
  92. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/billing_bases.yaml +0 -0
  93. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/cost_categories.yaml +0 -0
  94. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/dimensions.yaml +0 -0
  95. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/fee_components.yaml +0 -0
  96. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/layers.yaml +0 -0
  97. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/levers.yaml +0 -0
  98. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/mechanisms.yaml +0 -0
  99. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/metrics.yaml +0 -0
  100. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/negotiation_exchanges.yaml +0 -0
  101. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/offers.yaml +0 -0
  102. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/pricing_models.yaml +0 -0
  103. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/schema_map.yaml +0 -0
  104. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/selection_framework.yaml +0 -0
  105. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/selection_heuristics.yaml +0 -0
  106. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/coverage.yaml +0 -0
  107. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/evidence/claims.yaml +0 -0
  108. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/evidence/sources.yaml +0 -0
  109. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/excluded.yaml +0 -0
  110. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/pack.yaml +0 -0
  111. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/rules/rules.yaml +0 -0
  112. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/consulting_concepts.yaml +0 -0
  113. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/provider_types.yaml +0 -0
  114. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/service_categories.yaml +0 -0
  115. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/unit_templates.yaml +0 -0
  116. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/coverage.yaml +0 -0
  117. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/overlays/pricing_models.yaml +0 -0
  118. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/pack.yaml +0 -0
  119. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/rules/rules.yaml +0 -0
  120. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/capped_tm.json +0 -0
  121. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/fixed_fee_plus_success.json +0 -0
  122. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/phased_fixed_fee.json +0 -0
  123. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/retainer_hours_drawdown.json +0 -0
  124. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/role_based_tm.json +0 -0
  125. {cometric-0.1.0 → cometric-0.2.0}/src/cometric/py.typed +0 -0
  126. {cometric-0.1.0 → cometric-0.2.0}/tests/builders.py +0 -0
  127. {cometric-0.1.0 → cometric-0.2.0}/tests/conftest.py +0 -0
  128. {cometric-0.1.0 → cometric-0.2.0}/tests/test_casebook.py +0 -0
  129. {cometric-0.1.0 → cometric-0.2.0}/tests/test_outcome_and_realization.py +0 -0
  130. {cometric-0.1.0 → cometric-0.2.0}/tests/test_packs_and_templates.py +0 -0
  131. {cometric-0.1.0 → cometric-0.2.0}/tests/test_reproducibility_and_search.py +0 -0
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/cometric/cometric/src/cometric/__init__.py
2
2
  # hypothesis_version: 6.170.14
3
3
 
4
- ['0.0.0', 'ENGINE_VERSION', 'SCHEMA_VERSION', 'break_even', 'calculate_periods', 'cometric', 'compare_arrangements', 'derive_risk_exposure', 'describe_pack', 'describe_schema', 'explain_fee', 'get_template', 'list_packs', 'list_templates', 'list_vocabulary', 'lookup_concept', 'price_floor', 'search_structures', 'validate_engagement']
4
+ ['0.0.0', 'ENGINE_VERSION', 'SCHEMA_VERSION', 'break_even', 'calculate_periods', 'cometric', 'compare_arrangements', 'derive_risk_exposure', 'describe_pack', 'describe_schema', 'explain_fee', 'get_template', 'list_packs', 'list_templates', 'list_vocabulary', 'lookup_concept', 'price_floor', 'reconcile', 'search_structures', 'validate_engagement']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/cometric/cometric/src/cometric/core/engine.py
2
+ # hypothesis_version: 6.170.14
3
+
4
+ ['-', '/calculation_method', '/driver', '/outcome/metric', '/quantity_source', '/scenario/horizon', '0.2.0', ':', 'BACKLOG', 'CAPACITY_BREACH', 'DRIVER_REQUIRED', 'FTE', 'LEDGER_INVARIANT', 'METHOD_NOT_SUPPORTED', 'MISSING_ASSUMPTION', 'OVERFLOW_COST', 'SEGMENTED_MONTH', 'UNKNOWN_WEIGHT_TABLE', 'adjustments', 'allowance_consumed', 'allowance_granted', 'amortized', 'amount', 'amount_unrounded', 'arrangement_versions', 'backlog_end', 'by_category', 'cap', 'cap_use', 'capacity', 'capacity_utilization', 'category', 'collar', 'commitment_shortfall', 'component', 'components', 'contractual_fee', 'contribution_margin', 'contribution_profit', 'cost_components', 'cost_per_unit', 'costs_by_category', 'ctier', 'delivery_plan', 'demand', 'demand_hours', 'direct_delivery_cost', 'discount', 'driver_quantity', 'elig', 'engagement', 'fixed', 'formula', 'full_cost_profit', 'gross_margin', 'gross_profit', 'hours', 'id', 'incurred', 'incurred_adjustment', 'indexation', 'infeasible', 'kind', 'layer', 'layers', 'margin_note', 'min', 'minimum', 'minimum_shortfall', 'months', 'ok', 'one-time fee', 'one_time', 'outcome', 'outcome_fee', 'overage', 'overage_fee', 'overflow', 'overflow_cost_rate', 'performance', 'period', 'periods', 'price', 'productive_hours', 'project_payment', 'quantity', 'rate', 'realization', 'rebate', 'ref', 'resource', 'safe_capacity_hours', 'scenario.', 'segment', 'served', 'stage', 'standard_value', 'step', 'term', 'tier', 'time', 'trigger', 'unit', 'unit_contribution', 'version', 'weighted:', 'worked_hours', 'worked_hours_source', 'write_down', 'years']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/cometric/cometric/src/cometric/mcp/server.py
2
+ # hypothesis_version: 6.170.14
3
+
4
+ [b'Method Not Allowed', b'POST', b'Unauthorized', b'allow', b'authorization', b'content-type', b'text/plain', 401, 405, 8765, ',', '.yaml', '.yml', '/', '/mcp', '0', '0.01', '127.0.0.1', '127.0.0.1:*', 'COMETRIC_MCP_TOKEN', 'Cometric', 'DELETE', 'GET', 'accumulation_period', 'application/json', 'areas', 'body', 'claims', 'cometric', 'cometric://glossary', 'concept', 'concept-scheme', 'contractual_fee', 'contribution_profit', 'cost_policy', 'coverage', 'derived_bearer', 'dominance', 'engagement', 'engine_version', 'evidence_class', 'example', 'examples', 'glossary', 'gross_profit', 'headers', 'http', 'http.response.body', 'http.response.start', 'id', 'label', 'localhost', 'localhost:*', 'margin', 'margin_layer', 'method', 'name', 'origin', 'outcome_fee', 'overlays', 'pack', 'pack-template', 'packs', 'path', 'prevalence', 'price_floor', 'query', 'realization', 'recognition', 'reference', 'results', 'rules', 'schema', 'schema_version', 'search_structures', 'source_records', 'sources', 'status', 'stdio', 'summary', 'template', 'templates', 'terms', 'type', 'validate_engagement', 'values']
@@ -1,4 +1,4 @@
1
1
  # file: /home/runner/work/cometric/cometric/src/cometric/core/tiers.py
2
2
  # hypothesis_version: 6.170.14
3
3
 
4
- ['band_lower_exclusive', 'band_upper_exclusive', 'threshold']
4
+ ['band_lower', 'band_lower_inclusive', 'band_upper_exclusive', 'threshold']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/cometric/cometric/src/cometric/core/api.py
2
+ # hypothesis_version: 6.170.14
3
+
4
+ [10000, '/', '/actuals', '/actuals/term', '/constraints', '/cost_policy', '/driver', '/parameters', '/results', '/risk_premium', '/target_margin', '/tolerance_absolute', '/tolerance_relative', '0', '0.01', '?', 'BAD_CONSTRAINT', 'BAD_POINTER', 'BASE', 'COSTS_NOT_EVALUATED', 'COST_POLICY_REQUIRED', 'INTERNAL_POLICY', 'NO_RESULTS', 'PARAMETER_SPEC', 'PENDING_HUMAN_REVIEW', 'RANGE', 'RISK_MISMATCH', 'RISK_PREMIUM_RANGE', 'SCENARIO_INFEASIBLE', 'SCHEMA', 'TARGET_MARGIN_RANGE', 'TERM', 'UNKNOWN_DRIVER', 'UNKNOWN_METRIC', 'WORST', '_doc', 'absolute', 'actual', 'actuals', 'aggregation', 'approval_state', 'assumptions', 'base', 'base_client_price', 'base_contribution', 'base_scenario', 'base_scenario_id', 'best_under_objective', 'binding_constraints', 'calculate_periods', 'calculated', 'candidates', 'capacity', 'client_downside', 'client_price', 'closest_value_slack', 'code', 'cometric_higher', 'cometric_lower', 'commitment_shortfall', 'compared', 'component', 'computed', 'constraints', 'contract_facts', 'contractual_fee', 'contribution_margin', 'contribution_profit', 'cost_per_unit', 'cost_policy', 'costs', 'costs_by_category', 'costs_evaluated', 'costs_in_floor', 'counts', 'currency', 'current_fee', 'declared_bearer', 'decreasing', 'derived_bearer', 'deviations', 'difference', 'direct_delivery_cost', 'direction', 'discrepancies', 'distribution', 'dominated_by', 'driver', 'engagement', 'engagement_id', 'engine_version', 'enumerated', 'errors', 'evaluated', 'exact', 'explanation', 'failing_constraints', 'feasible', 'fee_change', 'fee_line_items', 'fee_total', 'fees', 'fingerprints', 'flat', 'floors', 'formula', 'from', 'frontier', 'frontier_metrics', 'frontier_truncated', 'full_cost_profit', 'grid_size', 'gross_margin', 'gross_profit', 'gt', 'gte', 'headroom', 'horizon', 'id', 'increasing', 'infeasible', 'input_fingerprint', 'invalid', 'invalid_reasons', 'issues', 'labels', 'ledger', 'line_items', 'lt', 'lte', 'max', 'max_candidates', 'max_returned', 'measured', 'mechanisms_priced', 'message', 'metric', 'metrics', 'min', 'money_policy', 'month', 'must not be negative', 'name', 'non_dominated', 'note', 'nothing_compared', 'objective', 'ok', 'on_frontier', 'op', 'operation', 'origin', 'outcome_fee', 'overage_fee', 'packs', 'parameters', 'path', 'period', 'periods', 'pointer', 'price_floor', 'profile', 'provider_downside', 'publishable_summary', 'range', 'ranking', 'reason', 'reconcile', 'reconciled', 'record_type', 'rejected', 'relative', 'relative_difference', 'results', 'risk_exposure', 'risk_premium', 'rows', 'rules_fired', 'scenario', 'scenario_id', 'scenarios', 'schema_version', 'scope', 'sense', 'standard_value', 'status', 'step', 'summary', 'target_margin', 'term', 'threshold', 'time_period', 'to', 'tolerance', 'unit_contribution', 'unit_floor', 'valid', 'value', 'values', 'volume', 'volume_quantity', 'warnings', 'whole', 'within_tolerance', 'worked_hours', 'years', '~', '~0', '~1']
@@ -0,0 +1,4 @@
1
+ # file: /home/runner/work/cometric/cometric/src/cometric/core/validation.py
2
+ # hypothesis_version: 6.170.14
3
+
4
+ ['/', '/cost_policy', '/engagement', '/horizon', '/mapping', '/scenario', '; ', '<required>', 'ADJUSTMENT_FIELDS', 'APPROVAL_REQUIRED', 'ATTRIBUTION_METHOD', 'ATTRIBUTION_REQUIRED', 'BASELINE_REQUIRED', 'CAP needs amount', 'COMMITMENT_SCOPE', 'COST_FIELDS', 'CURRENCY_MISMATCH', 'DANGLING_DEPENDENCY', 'DATE_ORDER', 'DEPENDENCY_CYCLE', 'DEPENDENCY_MISSING', 'DUPLICATE_ID', 'EMPTY_VERSION', 'ERROR', 'HORIZON_OUTSIDE_TERM', 'INFO', 'METHOD_FIELDS', 'METHOD_NOT_SUPPORTED', 'OUTCOME_FEE_APPROVAL', 'RANGE', 'RECOGNITION_PERIOD', 'REQUIRED_FIELD', 'SCHEMA', 'TIER_CLIFF', 'TIER_INVALID', 'UNCAPPED_OUTCOME_FEE', 'UNIT_MISMATCH', 'UNKNOWN_COMPONENT', 'UNKNOWN_COST_POLICY', 'UNKNOWN_ENTITLEMENT', 'UNKNOWN_SERVICE', 'UNKNOWN_UNIT', 'UNKNOWN_VERSION', 'UNKNOWN_WEIGHT_TABLE', 'VERSION_OVERLAP', 'WARNING', 'adjustments', 'amount', 'applies_to', 'approval_reference', 'approvals_required', 'arrangement_versions', 'attribution_method', 'attribution_percent', 'band_lower', 'band_lower_inclusive', 'band_upper_exclusive', 'baseline', 'billing_basis', 'calculation_method', 'cap_amount', 'cap_percent', 'capacity', 'category', 'charge_cadence', 'commitments', 'component_id', 'component_ids', 'components', 'cost_components', 'currency', 'delivery_plan', 'depends_on', 'driver', 'effective_from', 'entitlement_id', 'entitlements', 'errors', 'fixed_amount', 'granted_by', 'info', 'invalid', 'kind', 'loc', 'lower', 'lower_inclusive', 'mapping', 'msg', 'ok', 'outcome', 'overage_recognition', 'overflow_replaces', 'parties', 'payment_schedule', 'percent', 'proration_policy', 'provider_type', 'quantity_source', 'rate_schedule_id', 'rate_schedules', 'raw_unit', 'recognition', 'resources', 'role_rates', 'roles', 'service_category', 'service_id', 'services', 'share_percent', 'shortfall_rule', 'start_date', 'status', 'step_size', 'supersedes_id', 'target', 'threshold', 'tier_method', 'tiers', 'trigger', 'unit', 'unit_definition_id', 'unit_definitions', 'upper_exclusive', 'valid', 'warnings', 'weight_table_id', 'weight_tables']
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0 (2026-11-05)
4
+
5
+ - `reconcile`: compare computed figures with recorded actuals by month and term, with a publishable summary that carries no amounts, dates, or names (API, CLI, MCP tool). Guide in `docs/RECONCILIATION.md`.
6
+ - Fix: ALL_UNITS cliff detection now reports bands across non-adjacent tiers, with an inclusive lower bound where a band starts at a tier edge. Found by property testing.
7
+ - MCP resource `cometric://packs/{pack}/templates/{id}`; CLI `templates --pack` and `template --pack`.
8
+ - `TIER_CLIFF` warnings: one per threshold with a `bands` list (lower, lower_inclusive, upper_exclusive), replacing the single `band` pair.
9
+ - Fixed from code review of `reconcile`: uncalculated costs are reported as not computed instead of zero (decided once in the shared calculation step); invalid actuals and tolerances return issues instead of raising; infeasible scenarios never report `reconciled`; unknown metrics are errors; the result has its own fingerprint over actuals and tolerances; month numbers count from the engagement start; repeated scans removed.
10
+ - Fixed from the full engine review (calculation changes, so `ENGINE_VERSION` moves to 0.2.0):
11
+ - `FULL_MONTH_FROM_CURRENT` and `FULL_MONTH_FROM_NEXT` now bill the whole month instead of prorating by component dates.
12
+ - A fixed project payment due in a month split between contract versions is no longer dropped.
13
+ - A horizon that starts after the engagement simulates from the engagement start, so allowances, tiers, minimums, caps, and outcome periods carry into it; year and term assumptions spread over the engagement's months.
14
+ - One-time fees are never prorated; quarterly and annual fees keep their declared totals and anchor at the component start.
15
+ - Collars reprice at the cumulative tier position.
16
+ - Indexation applies to period-end overage as well as cumulative overage, not to project payments or outcome fees, and contract years honor the start day.
17
+ - Term costs that start later keep their declared total.
18
+ - The incurred-view adjustment ignores portfolio and overhead costs.
19
+ - A performance trigger missing from the scenario is an error; the price floor reports missing costs as an issue.
20
+ - Components are evaluated in id order, so results never depend on list order.
21
+ - Rebates settled after the horizon raise `TRUE_UP_OUTSIDE_HORIZON`.
22
+ - Spec v0.3.
23
+
24
+ ## 0.1.0 (2026-11-04)
25
+
26
+ First release.
27
+
28
+ - Core engine: deterministic decimal monthly calculation with the specified evaluation order (allowances, tiers, collars, discounts, minimums, performance adjustments, caps), accumulation periods, entitlement ledger with rollover, proration, exact allocation, margin-layer cost policies, capacity breach modes, and input fingerprints.
29
+ - Fee methods: fixed recurring, time, dedicated resource, unit output, weighted unit output, allowance plus overage, fixed project, and outcome adjustment (gain-share, success fee, percent of outcome).
30
+ - Realization against a standard rate card: standard value, realization, write-down, effective billing rate.
31
+ - Operations: validate, calculate, explain, compare (dominance), structure search (frontier), risk exposure, price floor, break-even, and commercial constraint checks.
32
+ - Packs (data only): `base`, `alsp`, and `consulting`, with evidence records and verification status.
33
+ - Interfaces: CLI and a read-only MCP server (stdio and stateless HTTP) with discovery tools, resources, and guided prompts.
34
+ - Casebook fixtures A to H.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cometric
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Commercial Intelligence Engine: model, simulate, and optimize the economics of service engagements.
5
5
  Project-URL: Homepage, https://github.com/mfbaig35r/cometric
6
6
  Project-URL: Repository, https://github.com/mfbaig35r/cometric
@@ -51,10 +51,12 @@ It is built for any service relationship priced through a composite arrangement:
51
51
  ## Install
52
52
 
53
53
  ```bash
54
- uv pip install "cometric[mcp]" # once published
54
+ pip install "cometric[mcp]" # or: uv pip install "cometric[mcp]"
55
55
  uv sync --all-extras # from a checkout
56
56
  ```
57
57
 
58
+ [![PyPI](https://img.shields.io/pypi/v/cometric)](https://pypi.org/project/cometric/)
59
+
58
60
  Python 3.11 or later.
59
61
 
60
62
  ## Quickstart
@@ -66,6 +68,8 @@ cometric explain src/cometric/examples/spec_example.json --period 2027-01
66
68
  cometric break-even src/cometric/examples/case_b.json --driver contracts --scenario base --cost-policy reference
67
69
  cometric floor src/cometric/examples/case_b.json --cost-policy reference --target-margin 0.20
68
70
  cometric template base_plus_overage
71
+ cometric template phased_fixed_fee --pack consulting
72
+ cometric reconcile engagement.json --scenarios actual-quantities.json --actuals actuals.json --cost-policy reference --summary-only
69
73
  cometric lookup PM-023
70
74
  ```
71
75
 
@@ -81,7 +85,7 @@ print(result["term"]["contribution_margin"], result["input_fingerprint"])
81
85
 
82
86
  ## MCP server
83
87
 
84
- Cometric ships a read-only, stateless MCP server: 17 tools, schema and template discovery, resources for the glossary, schemas, concept schemes, rules, coverage, templates, and worked examples, and six guided prompts.
88
+ Cometric ships a read-only, stateless MCP server: 18 tools, schema and template discovery, resources for the glossary, schemas, concept schemes, rules, coverage, templates, and worked examples, and six guided prompts.
85
89
 
86
90
  ```bash
87
91
  cometric mcp # stdio
@@ -92,7 +96,7 @@ cometric mcp --transport http --port 8765 # stateless streamable HTTP at PO
92
96
  Claude Code:
93
97
 
94
98
  ```bash
95
- claude mcp add cometric -- uv run --directory /path/to/cometric cometric mcp
99
+ claude mcp add cometric -- uvx --from "cometric[mcp]" cometric mcp
96
100
  ```
97
101
 
98
102
  The HTTP transport keeps no session state, answers `GET /mcp` with 405, keeps DNS-rebinding protection on (set `COMETRIC_ALLOWED_HOSTS` for your hostname), and checks a bearer token when `COMETRIC_MCP_TOKEN` is set.
@@ -130,7 +134,7 @@ uv run ruff check src tests scripts && uv run ruff format --check src tests scri
130
134
  uv run python scripts/build_fixtures.py # regenerate casebook fixtures
131
135
  ```
132
136
 
133
- The specification is in `docs/COMETRIC_SPEC_v0.2.md`. Implementation status and clarifications are in `docs/STATUS.md`.
137
+ The specification is `docs/COMETRIC_SPEC_v0.3.md` (normative for 0.1.0). Implementation status is in `docs/STATUS.md`; reconciling a real engagement is described in `docs/RECONCILIATION.md`.
134
138
 
135
139
  ## License
136
140
 
@@ -21,10 +21,12 @@ It is built for any service relationship priced through a composite arrangement:
21
21
  ## Install
22
22
 
23
23
  ```bash
24
- uv pip install "cometric[mcp]" # once published
24
+ pip install "cometric[mcp]" # or: uv pip install "cometric[mcp]"
25
25
  uv sync --all-extras # from a checkout
26
26
  ```
27
27
 
28
+ [![PyPI](https://img.shields.io/pypi/v/cometric)](https://pypi.org/project/cometric/)
29
+
28
30
  Python 3.11 or later.
29
31
 
30
32
  ## Quickstart
@@ -36,6 +38,8 @@ cometric explain src/cometric/examples/spec_example.json --period 2027-01
36
38
  cometric break-even src/cometric/examples/case_b.json --driver contracts --scenario base --cost-policy reference
37
39
  cometric floor src/cometric/examples/case_b.json --cost-policy reference --target-margin 0.20
38
40
  cometric template base_plus_overage
41
+ cometric template phased_fixed_fee --pack consulting
42
+ cometric reconcile engagement.json --scenarios actual-quantities.json --actuals actuals.json --cost-policy reference --summary-only
39
43
  cometric lookup PM-023
40
44
  ```
41
45
 
@@ -51,7 +55,7 @@ print(result["term"]["contribution_margin"], result["input_fingerprint"])
51
55
 
52
56
  ## MCP server
53
57
 
54
- Cometric ships a read-only, stateless MCP server: 17 tools, schema and template discovery, resources for the glossary, schemas, concept schemes, rules, coverage, templates, and worked examples, and six guided prompts.
58
+ Cometric ships a read-only, stateless MCP server: 18 tools, schema and template discovery, resources for the glossary, schemas, concept schemes, rules, coverage, templates, and worked examples, and six guided prompts.
55
59
 
56
60
  ```bash
57
61
  cometric mcp # stdio
@@ -62,7 +66,7 @@ cometric mcp --transport http --port 8765 # stateless streamable HTTP at PO
62
66
  Claude Code:
63
67
 
64
68
  ```bash
65
- claude mcp add cometric -- uv run --directory /path/to/cometric cometric mcp
69
+ claude mcp add cometric -- uvx --from "cometric[mcp]" cometric mcp
66
70
  ```
67
71
 
68
72
  The HTTP transport keeps no session state, answers `GET /mcp` with 405, keeps DNS-rebinding protection on (set `COMETRIC_ALLOWED_HOSTS` for your hostname), and checks a bearer token when `COMETRIC_MCP_TOKEN` is set.
@@ -100,7 +104,7 @@ uv run ruff check src tests scripts && uv run ruff format --check src tests scri
100
104
  uv run python scripts/build_fixtures.py # regenerate casebook fixtures
101
105
  ```
102
106
 
103
- The specification is in `docs/COMETRIC_SPEC_v0.2.md`. Implementation status and clarifications are in `docs/STATUS.md`.
107
+ The specification is `docs/COMETRIC_SPEC_v0.3.md` (normative for 0.1.0). Implementation status is in `docs/STATUS.md`; reconciling a real engagement is described in `docs/RECONCILIATION.md`.
104
108
 
105
109
  ## License
106
110