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.
- cometric-0.1.0/.hypothesis/constants/c0553da3badd1746 → cometric-0.2.0/.hypothesis/constants/052e28aa39cf014b +1 -1
- cometric-0.2.0/.hypothesis/constants/6f3f7dda3bd02709 +4 -0
- cometric-0.2.0/.hypothesis/constants/8263d258dca94122 +4 -0
- cometric-0.1.0/.hypothesis/constants/3d80302e16570458 → cometric-0.2.0/.hypothesis/constants/b428358d86c25f38 +1 -1
- cometric-0.2.0/.hypothesis/constants/f33d5940d4c83207 +4 -0
- cometric-0.2.0/.hypothesis/constants/fbe7b640dc5ad53e +4 -0
- cometric-0.2.0/CHANGELOG.md +34 -0
- {cometric-0.1.0 → cometric-0.2.0}/PKG-INFO +9 -5
- {cometric-0.1.0 → cometric-0.2.0}/README.md +8 -4
- cometric-0.2.0/docs/COMETRIC_SPEC_v0.3.md +1193 -0
- cometric-0.2.0/docs/RECONCILIATION.md +63 -0
- {cometric-0.1.0 → cometric-0.2.0}/docs/STATUS.md +3 -3
- {cometric-0.1.0 → cometric-0.2.0}/pyproject.toml +1 -1
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/__init__.py +2 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/cli.py +55 -3
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/api.py +236 -15
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/engine.py +211 -90
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/periods.py +23 -6
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/tiers.py +25 -12
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/validation.py +18 -3
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/server.py +28 -0
- cometric-0.2.0/tests/test_engine_review_fixes.py +375 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_mcp.py +12 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_pricing.py +32 -2
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_properties.py +5 -1
- cometric-0.2.0/tests/test_reconcile.py +164 -0
- {cometric-0.1.0 → cometric-0.2.0}/uv.lock +1 -1
- cometric-0.1.0/.hypothesis/constants/27de4e79debf7d27 +0 -4
- cometric-0.1.0/.hypothesis/constants/409846769d39f76d +0 -4
- cometric-0.1.0/.hypothesis/constants/dfa4cfacb990ae1e +0 -4
- cometric-0.1.0/.hypothesis/constants/f96f4f1e759b7abf +0 -4
- cometric-0.1.0/CHANGELOG.md +0 -13
- {cometric-0.1.0 → cometric-0.2.0}/.github/workflows/ci.yml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.github/workflows/publish.yml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.gitignore +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/.gitignore +0 -0
- /cometric-0.1.0/.hypothesis/constants/60b43c062745c280 → /cometric-0.2.0/.hypothesis/constants/0a08468b27ab0e2b +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/1b52f94ff1d6e987 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/31846ac0f55db7cc +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/3570e270a2e92983 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/37d175425d95aff7 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/3faf924fe60f71dc +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/4145014522d2ff1a +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/457af5fc346a4d40 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/64a2c31fcab5443b +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/6ab7a80f708d05c3 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/78ed34a18774f2d3 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/bddcf7e0e0af1f28 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/da39a3ee5e6b4b0d +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/.hypothesis/constants/e3a40f74a8e72704 +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/LICENSE +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/docs/ALSP_COMMERCIAL_ONTOLOGY_SPEC_v0.1.pdf +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/docs/COMETRIC_SPEC_v0.2.md +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/scripts/build_consulting.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/scripts/build_fixtures.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/__init__.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/enums.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/fingerprint.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/issues.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/ledger.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/models.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/money.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/packs.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/predicates.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/quantities.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/schema.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/core/templates.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_a.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_b.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_c.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_d.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_e.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_f.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_g.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/case_h.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/examples/spec_example.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/__init__.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/mcp/__main__.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/provider_types.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/service_categories.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/concepts/unit_templates.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/coverage.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/evidence/claims.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/evidence/sources.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/levers.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/mechanisms.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/metrics.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/overlays/pricing_models.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/pack.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/alsp/rules/rules.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/automation_structures.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/billing_bases.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/cost_categories.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/dimensions.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/fee_components.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/layers.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/levers.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/mechanisms.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/metrics.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/negotiation_exchanges.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/offers.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/pricing_models.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/schema_map.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/selection_framework.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/concepts/selection_heuristics.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/coverage.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/evidence/claims.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/evidence/sources.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/excluded.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/pack.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/base/rules/rules.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/consulting_concepts.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/provider_types.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/service_categories.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/concepts/unit_templates.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/coverage.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/overlays/pricing_models.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/pack.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/rules/rules.yaml +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/capped_tm.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/fixed_fee_plus_success.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/phased_fixed_fee.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/retainer_hours_drawdown.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/packs/consulting/templates/role_based_tm.json +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/src/cometric/py.typed +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/builders.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/conftest.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_casebook.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_outcome_and_realization.py +0 -0
- {cometric-0.1.0 → cometric-0.2.0}/tests/test_packs_and_templates.py +0 -0
- {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']
|
|
@@ -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.
|
|
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
|
-
|
|
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
|
+
[](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:
|
|
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 --
|
|
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
|
|
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
|
-
|
|
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
|
+
[](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:
|
|
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 --
|
|
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
|
|
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
|
|