hypertopos 0.7.2__tar.gz → 0.8.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.
- {hypertopos-0.7.2 → hypertopos-0.8.0}/CHANGELOG.md +39 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/LICENSE.md +1 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/PKG-INFO +2 -2
- {hypertopos-0.7.2 → hypertopos-0.8.0}/README.md +5 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/ROADMAP.md +25 -10
- {hypertopos-0.7.2 → hypertopos-0.8.0}/SECURITY.md +1 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/api-reference.md +4 -2
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/configuration.md +71 -0
- hypertopos-0.8.0/docs/container-deployment.md +112 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/data-format.md +1 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/__init__.py +1 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/builder.py +291 -14
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/derived.py +30 -6
- hypertopos-0.8.0/hypertopos/cli/main.py +221 -0
- hypertopos-0.8.0/hypertopos/cli/sphere_ops.py +554 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/aggregation.py +113 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/geometry.py +56 -0
- hypertopos-0.8.0/hypertopos/engine/graph.py +285 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/topology.py +182 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/model/sphere.py +58 -2
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/navigation/navigator.py +1057 -20
- hypertopos-0.8.0/hypertopos/storage/_tag_timestamps.py +162 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/calibration_history.py +80 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/reader.py +127 -92
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/writer.py +56 -5
- {hypertopos-0.7.2 → hypertopos-0.8.0}/pyproject.toml +2 -2
- hypertopos-0.8.0/tests/test_chain_signed_confidence_rollup.py +304 -0
- hypertopos-0.8.0/tests/test_cli_mcp_contract.py +197 -0
- hypertopos-0.8.0/tests/test_cli_subprocess.py +632 -0
- hypertopos-0.8.0/tests/test_cluster_a_label_aware_depth.py +435 -0
- hypertopos-0.8.0/tests/test_cluster_c1_sphere_overview_ergonomics.py +476 -0
- hypertopos-0.8.0/tests/test_cluster_c3_detector_closures.py +217 -0
- hypertopos-0.8.0/tests/test_cluster_d1_graph_phase3.py +315 -0
- hypertopos-0.8.0/tests/test_cluster_d2_influencer_auto_discovery.py +346 -0
- hypertopos-0.8.0/tests/test_count_geometry_rows_missing.py +88 -0
- hypertopos-0.8.0/tests/test_incremental.py +692 -0
- hypertopos-0.8.0/tests/test_local_trajectory_shape.py +88 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_m1_1_builder_wiring.py +19 -1
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_navigation.py +110 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_observability.py +6 -0
- hypertopos-0.8.0/tests/test_perf_budget.py +182 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_storage.py +61 -2
- hypertopos-0.8.0/tests/test_tag_timestamps.py +118 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_trajectory_ann.py +97 -1
- hypertopos-0.8.0/tests/test_vector_index_health.py +227 -0
- hypertopos-0.7.2/docs/patent-implementation-map.md +0 -123
- hypertopos-0.7.2/hypertopos/cli/main.py +0 -119
- hypertopos-0.7.2/hypertopos/storage/_tag_timestamps.py +0 -125
- hypertopos-0.7.2/tests/test_incremental.py +0 -234
- hypertopos-0.7.2/tests/test_tag_timestamps.py +0 -88
- {hypertopos-0.7.2 → hypertopos-0.8.0}/.github/workflows/publish-pypi.yml +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/.gitignore +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/README.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/architecture.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/LICENSE +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/README.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/README.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r4/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r5/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/results/0.1.0/r6/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_accounts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_cpty_banks.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_districts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_loan_accounts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_operations.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_orders.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_transactions.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/prepare_tx_types.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/berka/sphere/sphere.yaml +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/README.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/_layer2_cross_eval.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/_layer3_cross_eval.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/hi_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/hi_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/layer1_passive_scan.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/layer2_xgboost_sweep.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/layer3_typology_filter.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_accounts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_currencies.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_payment_formats.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/li_small_sphere/prepare_transactions.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/li_small_sphere/sphere.yaml +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/ibm-aml/passive-scan-calibration.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/README.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/SUMMARY.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r1/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r2/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-a-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-b-scoring.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-exp-c-report.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/results/0.1.0/r3/0.1.0-settings.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/sphere/prepare_trips.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmark/nyc-taxi/sphere/sphere.yaml +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/benchmarks.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/concepts.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/external-chains-as-anchor-line.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/build-pipeline.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/core-objects.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/cutting-plane.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/directory-layout.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/hypertopos-overview.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/model-lifecycle.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/navigation-primitives.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/images/three-scales.svg +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/introduction.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/quickstart.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/docs/refutations.md +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_bootstrap.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_bregman.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_scatter.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_stats.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_theta_sensitivity.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/_writer.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/conformance.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/conformance_mapping.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/dim_blocks.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/mapping.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/builder/temporal_bucket.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/__main__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/build.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/info.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/schema.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/cli/sources.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/adjacency.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/calibration.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/calibration_label_aware.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/chains.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/composition.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/conformance.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/counterfactual.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/density_gaps.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/diagnostics.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/dim_audit.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/edge_features.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/explanation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/fdr.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/forecast.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/graph_algorithms.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/heredity.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/hop_predicate.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/invalidation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/investigation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/lance_sql_agg.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/p_value_calibration.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/selection.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/engine/structuring.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/model/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/model/manifest.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/model/objects.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/navigation/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/navigation/scanner.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/sphere.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/_lance_versions.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/_schemas.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/cache.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/exceptions.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/storage/topology_cache.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/utils/__init__.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/hypertopos/utils/arrow.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/.gitkeep +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/conftest.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/fixtures/generate_fixtures.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/fixtures/synthetic_chain_sphere.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_adjacency.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_adjacency_vectorized.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_aggregation_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_anomaly_propagation_in_chain.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_arrow_utils.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_audit_label_alignment.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_bootstrap.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_bregman.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_alias.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_chunking.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_contagion.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_derived.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_edges.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_fdr_hierarchy.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_fdr_hierarchy_inject.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_fdr_yaml_end_to_end.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_rolling_z.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_scatter.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_temporal_bucket.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_builder_temporal_perf.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_cache.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration_drift.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration_history.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration_history_builder.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration_history_reader.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_calibration_label_aware.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_coherent_anomaly.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_coherent_synthetic.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_drift_trajectory.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_edge_potentials.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_investigation_summary.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_typology_and_extend.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chain_witness_intersection.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_chains.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_cli.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_cli_alias.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_cli_label_aware_flag.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_cli_sources.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_compaction.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_composition.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_conformance.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_conformance_mapping.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_conftest_magicmock_restore.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_continuous_event_dims.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_counterfactual.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_counterfactual_frozen_trajectory.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_data_quality_prop.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_decompose_drift.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_delta_dim_aggregation_consumers.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_delta_norm_signed.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_density_gaps_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_detection.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_diagnostics.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_dim_audit.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_dim_blocks.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_dim_quality_warnings.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_distinct_neighbor_count.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dim_aggregations.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dim_aggregations_builder.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dim_aggregations_chain.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dim_aggregations_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dim_aggregations_roundtrip.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dimensions_builder.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_dimensions_yaml.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_features.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_features_reader.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_potential.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_edge_table.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_fdr.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_fdr_multi_resolution.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_fdr_per_dim.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_calibration_influencers.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_density_gaps.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_diverse_explanations.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_lead_lag.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_lead_lag_significance.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_find_motif_by_hops.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_forecast.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_fts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_generate_sar_rationale.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_geometric_path.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_geometry_stats.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_gradient_alignment.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_graph_algorithms.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_graph_geometry_tension.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_heredity.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_hop_predicate_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_hub_safety_caps.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_hybrid_search.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_invalidation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_investigate_chain.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_investigate_entity.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_investigation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_kind_detect.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_kind_tag_mismatch_warning.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_label_audit_schema.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_lance_sql_agg.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_mapping.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_model.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_motif.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_mvcc_session.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_native_mvcc_geometry.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_navigator_alerts.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_navigator_fdr_resolution.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_navigator_fdr_select.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_neighbors_window.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_p_value_calibration.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_pattern_fdr_hierarchy.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_precision_stack.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_profile_motif_perf_smoke.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_reliability_flags.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_reputation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_root_cause_trace.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_row_id_cache.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_scanner.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_schema_chain_eda_validation.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_selection.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_signed_confidence_ranking.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_simulate_dimension_change.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_sphere.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_sphere_format_version.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_sphere_overview_perf.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_sphere_validation_cheap_tier.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_stats_guard.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_streaming_reads.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_structuring_engine.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_temporal_centroids.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_theta_sensitivity.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_topology.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_topology_anomalies.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_topology_cache.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_topology_trajectory_anomalies.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_witness_cohort.py +0 -0
- {hypertopos-0.7.2 → hypertopos-0.8.0}/tests/test_witness_set.py +0 -0
|
@@ -7,6 +7,45 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] — 2026-05-30
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `hypertopos sphere health <path>` — composes the population summary with the geometric health checks into a single status (`ok` / `warning` / `critical`); `--exit-code-on-critical` exits `2` on a critical status so a CI shell gate can fail a deploy, and `--json` emits a `{status, sphere_path, overview, alerts}` document.
|
|
15
|
+
- `hypertopos sphere validate <path> [--strict] [--json]` — structural integrity check over a built sphere (sphere.json parses, each materialized line has a points directory, each pattern has a geometry directory); `--strict` promotes calibration-health and dimension-quality warnings to errors, exiting `1` when invalid.
|
|
16
|
+
- `hypertopos sphere diff <old> <new> [--json]` — pre-deploy diff reporting the pattern-inventory delta (added / removed / common) and per-shared-pattern calibration drift between two built spheres; patterns whose calibration schema differs are marked `not_comparable`.
|
|
17
|
+
- `hypertopos sphere ingest <sphere> --points <file>` — incremental ingest CLI: append a new-/changed-entities table (Arrow IPC, Parquet, or CSV) to one pattern's geometry without a full rebuild. `--pattern` selects the target pattern (optional when the sphere has a single one); `--reindex` forces an immediate ANN index rebuild; `--finalize` recomputes the global rank percentile and rebuilds the ANN index once at the end of a batched ingest session; `--json` emits an `{added, modified, deleted, population_size, drift_pct, geometry_version_before, geometry_version_after, reindexed, finalized}` summary for pipeline consumption.
|
|
18
|
+
- Production-ready incremental ingest: `GDSBuilder.incremental_update` adds, modifies, and deletes entities on an existing sphere without a full rebuild, and newly added entities are immediately visible to anomaly search. Patterns whose dimensions are relations, event dimensions, edge-dim aggregations, and tracked properties are now fully supported (previously such patterns raised a width-mismatch error). The appended rows now also enter the ANN vector index — pass `reindex=True` to rebuild it immediately. For batched ingestion of many small appends, pass `recompute_ranks=False` to defer the population percentile recompute and call the new `GDSBuilder.finalize_incremental` once at the end of the session.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Per-tag calibration-epoch timestamps now resolve directly from the dataset tag listing (a single lookup) instead of scanning version history, with read-side fallback for spheres written by older tooling.
|
|
23
|
+
- Batch point reads (`read_points_batch`) issue a single indexed lookup over the whole key set on a reused dataset handle, replacing the per-key access loop — repeated lookups of the same entities are dramatically faster.
|
|
24
|
+
- `pylance` dependency floor bumped to 7.x — Lance dataset reads, writes, scalar-index builds, and `merge_insert` upsert behavior verified equivalent to the prior 6.x floor.
|
|
25
|
+
- Builder skips the trajectory ANN index when a pattern has too few rows to train it, shortening sphere builds for patterns with few entities; `attract_trajectory` (π10) and `find_drifting_similar` still return correct nearest-trajectory results via an exact full-scan fallback when no index is present.
|
|
26
|
+
|
|
27
|
+
## [0.7.3] — 2026-05-27
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- `GDSNavigator.π12_attract_regime_change` (and its cache fast-path) — each detected changepoint now carries a `near_data_boundary: bool` field. Fires `True` when the changepoint timestamp index falls in the first two or last two temporal buckets of the filtered range — agents can suppress these as low-confidence detections sitting on insufficient one-sided context (the buckets at the data range edges have asymmetric neighbours, which inflates the shift magnitude). Applies to both the cache fast-path (`_pi12_from_cache`) and the cold-scan path; no schema change.
|
|
32
|
+
- `Pattern.signed_percentiles` — per-pattern percentile cache (`p1`, `p5`, `p50`, `p95`, `p99`) over the `delta_norm_signed` Lance column, populated at build time when label-aware calibration fires. Drives the new `signed_tail_concentration` dim_quality warning that flags one-sided extreme tails (`|p99| / max(|p50|, 1e-9) > 50`) on the Fisher LDA-projected delta distribution; suppressed when `Pattern.label_aware_n_pos < 30` to avoid noise from undersampled positive classes.
|
|
33
|
+
- `GDSEngine.decompose_displacement(delta, label_direction)` — pure-math helper that splits a polygon delta vector along (`intrinsic`) and orthogonal to (`extrinsic`) any label-discriminating axis, satisfying `intrinsic^2 + extrinsic^2 == ||delta||^2`. Pattern-level means `intrinsic_displacement_mean` / `extrinsic_displacement_mean` are persisted on `Pattern` at build time when label-aware calibration fires.
|
|
34
|
+
- `Pattern.label_aware_n_pos` / `Pattern.label_aware_n_neg` — positive / negative labelled sample counts captured at build time, co-populated with `label_aware_calibration`.
|
|
35
|
+
- `GDSNavigator.chain_signed_confidence_rollup(chain_id, chain_pattern=..., anchor_pattern=...)` — chain-level reliability rollup derived from per-member `signed_confidence` ranking on the anchor pattern. Returns `chain_mean_signed_confidence`, `chain_n_low_confidence_members`, `chain_n_single_dim_driven_members`, and `chain_confidence_verdict` ∈ {high, medium, low, label-aware-unavailable}. Falls back cleanly with verdict `"label-aware-unavailable"` and null numeric fields when the anchor pattern lacks `label_aware_calibration`.
|
|
36
|
+
- `GDSNavigator.aggregate` per-entity result rows gain `anomaly_rate: float | null` — fraction of an entity's events flagged anomalous (`delta_norm >= theta_diag`). `null` when entity has zero events or pattern lacks anomaly threshold.
|
|
37
|
+
- `GDSNavigator.sphere_overview` gains `cross_pattern_discrepancy: dict | null` — pairwise Jaccard overlap of anomalous primary_keys across cover-overlapping patterns. Lists pairs with `pattern_a`, `pattern_b`, `shared_line`, the four anomaly-bucket counts, and `jaccard_anomaly_overlap`. `null` on spheres with fewer than two cover-overlapping patterns.
|
|
38
|
+
- `GDSNavigator.find_anomalies(..., sample_size: int | None = None, boundary_aware: bool = False)` — opt-in sampling for the in-process scan path. `sample_size` caps geometry rows scored; `boundary_aware=True` allocates half the budget to entities within the `[0.8 * theta_norm, 1.2 * theta_norm]` band around the decision threshold, the other half drawn from the rest of the population. Defaults preserve the existing full-scan behaviour. `boundary_aware=True` requires `sample_size` to be set.
|
|
39
|
+
- `engine.topology.classify_trajectory(solid_table, *, sample_size=10000)` — wraps `trajectory_continuous_score` with a deterministic 4-category classifier (`outlier` / `lagging` / `leading` / `typical`). Combines DTW distance against the population-median trajectory with a first-derivative slope comparison via `scipy.stats.linregress`. Returns a list of `{primary_key, dtw_distance, category, category_evidence}` per entity, with `category_evidence` carrying the signed deviation that drove the classification.
|
|
40
|
+
- `GDSNavigator.classify_trajectory(primary_key, pattern_id, sample_size=10000)` — per-entity navigator wrapper that streams temporal `shape_snapshot` rows, projects to `delta_snapshot` via the pattern's `(mu, sigma_diag)`, and returns the classification for the requested entity.
|
|
41
|
+
- `sphere.yaml` `graph_features.features:` accepts a new token — `community_id` — Louvain modularity-optimizing community detection on the anchor-pattern graph. `igraph.Graph.community_multilevel` when igraph is installed; `networkx.algorithms.community.louvain_communities` otherwise; gracefully emits an empty mapping (caller fills nulls) when neither backend is available. Community IDs are renumbered so the largest community is `0`.
|
|
42
|
+
- `graph_features.features:` `pagerank` and `connected_component` now route through pure-numpy helpers (damped PageRank with damping `0.85`, max `100` iterations, L2 convergence threshold `1e-6`; Union-Find connected components with path compression and union-by-rank). No external graph library is required for these two; igraph remains optional and is used only for the other features in the block.
|
|
43
|
+
- `engine.graph.compute_pagerank`, `compute_louvain_community`, `compute_connected_components`, `compute_from_adjacency` — pure helpers exposed for direct use on an `AdjacencyIndex`. PageRank parameters (`damping`, `max_iter`, `tol`) are configurable per call.
|
|
44
|
+
- `GDSNavigator.find_calibration_influencers(..., auto_discover: bool = False, auto_k: int = 10)` — auto-discovery mode runs k-means on the pattern's geometry, surfaces top-K candidate influencers from cluster centroids, then ranks each by existing μ-impact algorithm. Returns the existing shape extended with per-candidate `cluster_size` and `cluster_centroid_distance`. Default `auto_discover=False` preserves manual mode requiring caller-supplied candidate_keys.
|
|
45
|
+
- `GDSNavigator.calibration_influencer_history(primary_key, *, pattern_id)` — per-epoch μ-impact history for a known influencer. Lazily populated write-through cache at `_gds_meta/calibration_history/<pattern>/influencer_<primary_key>.json`. Returns chronological list of `{epoch, calibrated_at, mu_impact, delta_norm_impact}` entries. Empty list + warning when cache absent.
|
|
46
|
+
- `engine.topology.local_trajectory_shape(delta_norms)` — pure-function classifier that categorises an entity's own `delta_norm` time-series as `arch` / `V` / `linear` / `flat` without requiring a population reference. Returns `None` when fewer than three samples are available. Used by `dive_solid` to surface trajectory shape on the entity's temporal slices.
|
|
47
|
+
- `Navigator.find_similar_entities(..., with_neighbor_anomaly=False)` — opt-in flag triggers a single point lookup over the returned top-N neighbour keys and populates the `SimilarityResult.is_anomaly_map` sidecar with stored anomaly flags. Existing 2-tuple iteration is preserved.
|
|
48
|
+
|
|
10
49
|
## [0.7.2] — 2026-05-21
|
|
11
50
|
|
|
12
51
|
### Added
|
|
@@ -26,7 +26,7 @@ For purposes of this License:
|
|
|
26
26
|
- **Internal use** within an organization is not a competitive offering. Your
|
|
27
27
|
organization includes entities under common control.
|
|
28
28
|
|
|
29
|
-
**Change Date:** 2029-05-
|
|
29
|
+
**Change Date:** 2029-05-30
|
|
30
30
|
|
|
31
31
|
**Change License:** Apache License, Version 2.0
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hypertopos
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Understand the structure of your data — without training machine learning models
|
|
5
5
|
Project-URL: Homepage, https://github.com/hypertopos/hypertopos-py
|
|
6
6
|
Project-URL: Documentation, https://github.com/hypertopos/hypertopos-py/tree/main/docs
|
|
@@ -14,7 +14,7 @@ Requires-Dist: numpy>=1.26
|
|
|
14
14
|
Requires-Dist: packaging>=23.0
|
|
15
15
|
Requires-Dist: pandas>=2.0
|
|
16
16
|
Requires-Dist: pyarrow>=14.0
|
|
17
|
-
Requires-Dist: pylance<
|
|
17
|
+
Requires-Dist: pylance<8.0,>=7.0
|
|
18
18
|
Requires-Dist: pyyaml>=6.0
|
|
19
19
|
Requires-Dist: scipy>=1.11
|
|
20
20
|
Provides-Extra: dev
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
[](https://arrow.apache.org/docs/python/)
|
|
10
10
|
[](https://github.com/lance-format/lance)
|
|
11
11
|
[](https://modelcontextprotocol.io)
|
|
12
|
-
[](pyproject.toml)
|
|
13
13
|
|
|
14
14
|
hypertopos is not a database, and not a machine learning model. It is a layer that turns relational data into a coordinate system where every entity gets a position derived from its relationships and the population around it.
|
|
15
15
|
|
|
@@ -85,6 +85,10 @@ Each capability below emerges from treating entities as points in a shared, popu
|
|
|
85
85
|
| Counterfactual: dimension override | `simulate_dimension_change(primary_key, pattern_id, line_id, set_dimension)` — what-if recomputation of `delta_norm` under hypothetical raw shape-vector values for one or more dimensions; reports the before/after norms, the anomaly-flag flip, and the new top witness dims. Companion to `simulate_edge_removal` for non-edge dimensions | Manual reconstruction of `shape = delta * sigma + mu`, point-edit, and norm recompute against the right cholesky path | `0.7.1` |
|
|
86
86
|
| Multi-hypothesis anomaly explainer | `find_diverse_explanations(primary_key, pattern_id, n_hypotheses=3)` — K strict-disjoint dim sets explaining the anomaly via greedy selection over per-dim Bregman contributions (each dim in at most one hypothesis); graceful degradation when an entity is single-dim driven; `validate=True` opt-in counterfactual confirmation | Single explanation from `explain_anomaly` only — investigator manually picks "what else could explain this" from the full dim ranking | `0.7.0` |
|
|
87
87
|
| Declarative compliance rules + violations query | `Pattern.conformance_rules` (AST predicate language in `sphere.yaml`) + `find_conformance_violations(pattern_id, rule_id, severity_min, top_n)` — builder evaluates rules vectorized at build time, sidecar Lance dataset persists violations, query primitive returns ranked violations with sub-second filter pushdown | Manual SQL ad-hoc on entity table + bespoke compliance scripts; no integration with anomaly geometry | `0.7.0` |
|
|
88
|
+
| Incremental ingest | `GDSBuilder.incremental_update` adds, modifies, and deletes entities on an existing sphere without a full rebuild; new entities are immediately visible to anomaly search; `reindex=True` rebuilds the ANN vector index, and `recompute_ranks=False` + `GDSBuilder.finalize_incremental` batch the percentile recompute across many small appends. Works on the existing sphere format — no migration | Full rebuild from source on every new batch of entities | `0.8.0` |
|
|
89
|
+
| Agent-correctness reports | Five composer tools synthesise a verdict an agent can act on: `assess_anomaly_certainty` (calibrated certainty + rationale), `consensus_classification` (multi-detector agreement), `calibration_drift_report` (cross-epoch drift verdict), `diverse_explanations` (multi-cause robustness verdict), `theta_sensitivity_report` (recalibration-safety verdict) | Manual stitching of several lower-level tool calls plus bespoke interpretation logic | `0.8.0` |
|
|
90
|
+
| Vector-index health observability | `audit_pattern_dims` returns a `vector_index_health` block (index presence, indexed/unindexed row counts, staleness flag, reindex recommendation) and `check_alerts` emits a `stale_vector_index` alert, so an agent knows whether recently-added entities are covered by the ANN index before relying on trajectory tools | No agent-visible signal that the ANN index lagged behind incrementally-added rows | `0.8.0` |
|
|
91
|
+
| Cloud-ops CLI | `hypertopos sphere health` (composes population summary + geometric checks into an `ok`/`warning`/`critical` status with `--exit-code-on-critical` for CI gates and `--json` output), `hypertopos sphere validate [--strict] [--json]` (structural integrity check), and `hypertopos sphere diff [--json]` (pattern-inventory + calibration drift between two built spheres) | Hand-rolled validation scripts and no built-in CI deploy gate | `0.8.0` |
|
|
88
92
|
|
|
89
93
|
### What changes in practice
|
|
90
94
|
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
# hypertopos — Roadmap
|
|
2
2
|
|
|
3
3
|
> Planned direction. Priorities may change based on feedback.
|
|
4
|
+
> See [CHANGELOG](CHANGELOG.md) for the full feature list per release.
|
|
5
|
+
|
|
6
|
+
## 0.8.0
|
|
7
|
+
|
|
8
|
+
Lance 7.0 single-process performance, incremental ingest, agent-correctness composers, and operations tooling — on the existing sphere format 3.x, no rebuild required.
|
|
9
|
+
|
|
10
|
+
- **0.8.0** — Lance 7.0 storage with native batched reads; incremental sphere ingest (`hypertopos sphere ingest`) without a full rebuild; agent-correctness composers (`assess_anomaly_certainty`, `consensus_classification`, `calibration_drift_report`, `diverse_explanations`, `theta_sensitivity_report`); vector-index health in `audit_pattern_dims`; cloud-ops CLI (`sphere health` / `validate` / `diff`); trajectory ANN index auto-skipped on small populations.
|
|
11
|
+
|
|
12
|
+
---
|
|
4
13
|
|
|
5
14
|
## 0.7.0
|
|
6
15
|
|
|
7
16
|
Detector composition and counterfactual primitives on native Lance MVCC — multi-detector consensus, per-edge / joint / per-counterparty influence math, topological cycle persistence, multi-resolution FDR, and the entity-side investigation orchestrator land on a modernized Lance 6.0 storage substrate with sphere format 3.0.
|
|
8
17
|
|
|
9
|
-
- **0.7.0** — Lance
|
|
10
|
-
|
|
11
|
-
|
|
18
|
+
- **0.7.0** — Lance 6.0 + sphere format 3.0; detector consensus (Wilson HMP), counterfactual family, topological cycle persistence, multi-resolution FDR, `investigate_entity` orchestrator.
|
|
19
|
+
- **0.7.1** — label-aware calibration foundation: `label_audit:` YAML, per-class Cohen's d + Fisher LDA on `Pattern`, `delta_norm_signed` Lance column.
|
|
20
|
+
- **0.7.2** — composition orchestrators: `find_anomalies(rank_by="signed_confidence")`, `chain_full_loop_summary`, `audit_label_alignment`, counterfactual frozen-population on `dive_solid`.
|
|
21
|
+
- **0.7.3** — investigation-orchestrator surface: per-dim AUROC, intrinsic/extrinsic decomposition, chain reliability rollup, DTW trajectory classifier, Louvain `community_id`, calibration-influencer auto-discovery, MCP ergonomics on `passive_scan` / `find_similar_entities` / `dive_solid`.
|
|
12
22
|
|
|
13
23
|
---
|
|
14
24
|
|
|
@@ -25,8 +35,6 @@ Architecture-emergent analytics, properly enabled — calibration is now version
|
|
|
25
35
|
- **0.6.6** — agent-side close of the chain investigative loop: smart-mode chain routing, `sphere_overview.suggested_queries` entry-point, R9 cheatsheet; `theta_sensitivity` calibration introspection; length- and volume-stratified correlation gates.
|
|
26
36
|
- **0.6.7** — close the investigation→SAR pipeline: `dimension_weights` runtime override on `find_anomalies`, `chain_investigation_summary` triage, `investigate_chain` one-shot R9 orchestrator, `generate_sar_rationale` template-based SAR narrative draft; `dim_quality_warnings` (dead / sparse dim) on `sphere_overview`; external-chains-as-anchor-line cookbook.
|
|
27
37
|
|
|
28
|
-
See [CHANGELOG](CHANGELOG.md) for the full feature list.
|
|
29
|
-
|
|
30
38
|
---
|
|
31
39
|
|
|
32
40
|
## 0.5.0
|
|
@@ -77,12 +85,19 @@ First public release — full GDS stack, π1–π12, builder, MCP server, valida
|
|
|
77
85
|
|
|
78
86
|
## Future
|
|
79
87
|
|
|
88
|
+
> Next major direction (planned): **0.9.0 — cloud foundations**, making hypertopos hostable. Priorities may change based on feedback.
|
|
89
|
+
|
|
90
|
+
**Cloud foundations (0.9.0 direction)**
|
|
91
|
+
- Session-keyed MCP server state with per-session isolation, so concurrent HTTP clients and multi-tenant hosting are safe.
|
|
92
|
+
- URI-addressable object storage (S3 / ADLS / GCS) for spheres, with a credential profile and a read-path prefetch cache.
|
|
93
|
+
- Cold-open scalar-index caches for faster first-query latency, with no on-disk format change.
|
|
94
|
+
- Production-path architecture decision records (data freshness, multi-tenancy, permission passthrough) and a committed surface model: MCP for agents, library API for embedding, CLI for ops / batch / cloud-compute.
|
|
95
|
+
|
|
96
|
+
**Adoption & product**
|
|
97
|
+
- `scan <file>` auto-builder for one-command onboarding, plus a deterministic (no-LLM) interpretation layer producing human-readable, audit-ready anomaly explanations.
|
|
98
|
+
|
|
80
99
|
**Detection quality**
|
|
81
100
|
- Robust estimators, multi-scale resolution — trimmed means / MAD-based σ, hierarchical build at daily/weekly/full granularity.
|
|
82
|
-
- Chains as first-class geometric entities — external chains declared as anchor lines with a membership table, plus chain-aware geometric primitives (anomaly propagation inside a chain, coherent-anomaly filter, chain drift trajectory).
|
|
83
|
-
|
|
84
|
-
**Builder evolution**
|
|
85
|
-
- Incremental rebuild — geometry-only without `--force` wipe.
|
|
86
101
|
|
|
87
102
|
**PassiveScanner evolution**
|
|
88
103
|
- Native temporal source support for direct temporal inputs, without requiring manual dataset plumbing in benchmark scripts.
|
|
@@ -90,7 +105,7 @@ First public release — full GDS stack, π1–π12, builder, MCP server, valida
|
|
|
90
105
|
- **SphereProfiler** — autonomous sphere scanner that profiles all patterns, runs calibration sweeps across source combinations, proposes optimal PassiveScanner composition for Layer 1 surveillance.
|
|
91
106
|
|
|
92
107
|
**Code refactoring**
|
|
93
|
-
- Break up oversized modules into smaller, domain-focused components
|
|
108
|
+
- Break up oversized modules into smaller, domain-focused components — `navigator.py` is now well over 20k lines and is the primary target for a mixin-based split that preserves the public single-class API.
|
|
94
109
|
- Consolidate repeated orchestration logic into shared helpers.
|
|
95
110
|
|
|
96
111
|
**Cross-sphere capabilities**
|
|
@@ -218,7 +218,8 @@ is the always-available primary path.
|
|
|
218
218
|
| `anomaly_summary(pattern_id, max_clusters)` | Anomaly population breakdown with geometric clustering |
|
|
219
219
|
| `aggregate_anomalies(pattern_id, group_by)` | Group anomalies by a property column with per-group rates |
|
|
220
220
|
| `aggregate(event_pattern_id, group_by_line)` | Aggregate event polygons by group with metric computation |
|
|
221
|
-
| `check_alerts(pattern_id=None)` | Implicit health checks: anomaly rate spikes, population shocks, calibration staleness |
|
|
221
|
+
| `check_alerts(pattern_id=None)` | Implicit health checks: anomaly rate spikes, population shocks, calibration staleness, stale ANN vector index |
|
|
222
|
+
| `vector_index_health(pattern_id, line_id=None)` | ANN (IVF) index staleness for a pattern's geometry: indexed/unindexed row counts, `is_stale`, recommendation (metadata-only read) |
|
|
222
223
|
| `hub_score_stats(pattern_id)` | Hub score distribution statistics |
|
|
223
224
|
| `check_anomaly_batch(pattern_id, primary_keys)` | Batch anomaly status check for multiple entities |
|
|
224
225
|
| `temporal_quality_summary(pattern_id)` | Temporal anomaly persistence metrics |
|
|
@@ -256,7 +257,8 @@ builder = GDSBuilder(
|
|
|
256
257
|
| `add_chain_line(line_id, chains, features)` | Create anchor line from extracted chain dicts |
|
|
257
258
|
| `add_alias(alias_id, base_pattern_id, cutting_plane_dimension, cutting_plane_threshold)` | Register an alias with a cutting plane for sub-population analysis |
|
|
258
259
|
| `build(temporal_configs=None)` | Validate, compute statistics, write all files. Pass `temporal_configs` to run geometry→temporal pipeline per pattern. Returns output path |
|
|
259
|
-
| `incremental_update(pattern_id, changed_entities, deleted_keys)` |
|
|
260
|
+
| `incremental_update(pattern_id, changed_entities, deleted_keys, recalibrate, reindex, recompute_ranks)` | Add/modify/delete entities without a full rebuild; new entities are immediately visible to anomaly search. Supports patterns whose dimensions are relations, event dimensions, edge-dim aggregations, and tracked properties. `reindex=True` rebuilds the ANN index immediately; `recompute_ranks=False` defers the global `delta_rank_pct` recompute for batched ingestion |
|
|
261
|
+
| `finalize_incremental(pattern_id)` | Recompute the global `delta_rank_pct` percentile once and rebuild the ANN index. Call at the end of a batched ingestion session that used `recompute_ranks=False` |
|
|
260
262
|
| `build_temporal(time_col, time_window)` | Generate temporal snapshots from time-windowed event data. Call after `build()` when not using pipeline mode |
|
|
261
263
|
|
|
262
264
|
### RelationSpec
|
|
@@ -60,6 +60,77 @@ Print summary of a built sphere.
|
|
|
60
60
|
hypertopos info my_sphere/
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
+
### `hypertopos sphere` — cloud-ops verbs
|
|
64
|
+
|
|
65
|
+
Cloud-ops checks over a **built** sphere directory (the one `info` reads),
|
|
66
|
+
shaped for CI gates and pre-deploy pipelines. Each verb supports `--json`
|
|
67
|
+
for machine-readable output; in JSON mode stdout carries only the JSON
|
|
68
|
+
document (diagnostics and errors go to stderr).
|
|
69
|
+
|
|
70
|
+
#### `hypertopos sphere health`
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
hypertopos sphere health my_sphere/ [--json] [--exit-code-on-critical]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Composes the population summary (per-pattern entity count, anomaly rate,
|
|
77
|
+
calibration health) with the geometric health checks. The derived `status`
|
|
78
|
+
is `critical` when any HIGH-severity alert is present, `warning` for
|
|
79
|
+
MEDIUM-only, else `ok`. With `--exit-code-on-critical` the process exits `2`
|
|
80
|
+
on a critical status (and `0` otherwise) so a `set -e` shell gate can fail a
|
|
81
|
+
deploy. JSON payload: `{status, sphere_path, overview, alerts}`.
|
|
82
|
+
|
|
83
|
+
#### `hypertopos sphere validate`
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
hypertopos sphere validate my_sphere/ [--strict] [--json]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Structural integrity check over a built sphere: `sphere.json` parses, each
|
|
90
|
+
materialized line has a `points/` directory, each pattern has a `geometry/`
|
|
91
|
+
directory. `--strict` additionally promotes calibration-health (`suspect` /
|
|
92
|
+
`poor`) and dimension-quality warnings to errors. Exits `0` when valid, `1`
|
|
93
|
+
when invalid. JSON payload: `{valid, strict, errors, warnings}`.
|
|
94
|
+
|
|
95
|
+
> This validates a **built** sphere on disk; `hypertopos validate --config`
|
|
96
|
+
> validates a `sphere.yaml` before building. They are distinct commands.
|
|
97
|
+
|
|
98
|
+
#### `hypertopos sphere diff`
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
hypertopos sphere diff old_sphere/ new_sphere/ [--json]
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Pre-deploy diff between two built spheres: pattern-inventory delta (`added` /
|
|
105
|
+
`removed` / `common` pattern ids) and per-shared-pattern calibration drift
|
|
106
|
+
(`overall_drift_rms` plus the top-drifted dimensions, comparing each sphere's
|
|
107
|
+
latest calibration epoch). Patterns whose calibration schema differs between
|
|
108
|
+
the two spheres are marked `not_comparable` rather than crashing. Identical
|
|
109
|
+
paths yield `identical: true`.
|
|
110
|
+
|
|
111
|
+
#### `hypertopos sphere ingest`
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
hypertopos sphere ingest my_sphere/ --points changed.arrow \
|
|
115
|
+
[--pattern ID] [--recalibrate {auto,force,never}] \
|
|
116
|
+
[--reindex] [--finalize] [--json]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Incrementally appends a new-/changed-entities table to one pattern's geometry
|
|
120
|
+
without a full rebuild. The points table may be Arrow IPC (`.arrow` /
|
|
121
|
+
`.arrows`), Parquet (`.parquet` / `.pq`), or CSV (`.csv` / `.csv.gz`) and must
|
|
122
|
+
carry a `primary_key` column plus the columns the pattern's dimensions
|
|
123
|
+
reconstruct from (relations, event dimensions, edge-dim aggregations, or
|
|
124
|
+
property columns). `--pattern` is optional when the sphere has a single
|
|
125
|
+
pattern and required otherwise. `--reindex` forces an ANN index rebuild so the
|
|
126
|
+
appended rows are immediately searchable; `--finalize` recomputes the global
|
|
127
|
+
`delta_rank_pct` and rebuilds the ANN index once at the end of a batched
|
|
128
|
+
ingest session. JSON payload: `{pattern_id, added, modified, deleted,
|
|
129
|
+
population_size, drift_pct, geometry_version_before, geometry_version_after,
|
|
130
|
+
reindexed, finalized}`. Patterns carrying generalized dimension blocks (geo /
|
|
131
|
+
metric / semantic) cannot be reconstructed incrementally and exit 1 with a
|
|
132
|
+
clear message directing you to a full rebuild.
|
|
133
|
+
|
|
63
134
|
---
|
|
64
135
|
|
|
65
136
|
## YAML Reference — `sphere.yaml`
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Container Deployment
|
|
2
|
+
|
|
3
|
+
> Running hypertopos CLI verbs as one-shot container jobs.
|
|
4
|
+
|
|
5
|
+
The `hypertopos` CLI is designed to run as a one-shot command inside a
|
|
6
|
+
container — build a sphere, gate a deploy on its health, or diff two
|
|
7
|
+
spheres before promoting one to production. This page covers the
|
|
8
|
+
`ENTRYPOINT ["hypertopos"]` contract and the cloud-ops verbs that pair
|
|
9
|
+
with it.
|
|
10
|
+
|
|
11
|
+
## ENTRYPOINT contract
|
|
12
|
+
|
|
13
|
+
Set the console script as the image entrypoint and pass the verb plus its
|
|
14
|
+
arguments as the container command:
|
|
15
|
+
|
|
16
|
+
```dockerfile
|
|
17
|
+
FROM python:3.11-slim
|
|
18
|
+
|
|
19
|
+
RUN pip install --no-cache-dir hypertopos
|
|
20
|
+
|
|
21
|
+
ENTRYPOINT ["hypertopos"]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
With `ENTRYPOINT ["hypertopos"]`, the container command becomes the verb
|
|
25
|
+
and its flags:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Build a sphere from a mounted config
|
|
29
|
+
docker run --rm -v "$PWD:/work" -w /work my-image \
|
|
30
|
+
build --config sphere.yaml --output gds_sales/
|
|
31
|
+
|
|
32
|
+
# Health-check a built sphere, failing the run on a critical status
|
|
33
|
+
docker run --rm -v "$PWD:/work" -w /work my-image \
|
|
34
|
+
sphere health gds_sales/ --exit-code-on-critical
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Because each invocation is a single short-lived process, no long-running
|
|
38
|
+
server is started — the container runs the verb, prints its result, and
|
|
39
|
+
exits with a meaningful status code.
|
|
40
|
+
|
|
41
|
+
## Exit codes
|
|
42
|
+
|
|
43
|
+
The cloud-ops verbs return process exit codes that shell gates and
|
|
44
|
+
orchestrators (`set -e`, Kubernetes Job `backoffLimit`, Airflow
|
|
45
|
+
`BashOperator`) can act on directly:
|
|
46
|
+
|
|
47
|
+
| Verb | Exit 0 | Exit 1 | Exit 2 |
|
|
48
|
+
|------|--------|--------|--------|
|
|
49
|
+
| `sphere health … --exit-code-on-critical` | status `ok` / `warning` | path is not a sphere | status `critical` (HIGH alert) |
|
|
50
|
+
| `sphere validate …` | sphere valid | sphere invalid or path not a sphere | — |
|
|
51
|
+
| `sphere diff <old> <new>` | diff produced | either path not a sphere | — |
|
|
52
|
+
| `sphere ingest <path> --points <file>` | rows ingested | path not a sphere, points file missing/unsupported, unknown pattern, or unreconstructable geometry | — |
|
|
53
|
+
|
|
54
|
+
Without `--exit-code-on-critical`, `sphere health` always exits 0 on a
|
|
55
|
+
readable sphere (a non-sphere path still exits 1) — useful when you only
|
|
56
|
+
want to capture the JSON report and decide what to do with it yourself.
|
|
57
|
+
|
|
58
|
+
## JSON output for pipelines
|
|
59
|
+
|
|
60
|
+
Every cloud-ops verb accepts `--json`. In JSON mode, stdout carries only
|
|
61
|
+
the JSON document — human-readable diagnostics and error messages go to
|
|
62
|
+
stderr — so a pipeline step can parse the result without scraping log
|
|
63
|
+
lines:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Capture the health report, branch on the status field
|
|
67
|
+
status=$(hypertopos sphere health gds_sales/ --json | jq -r .status)
|
|
68
|
+
if [ "$status" = "critical" ]; then
|
|
69
|
+
echo "Refusing to deploy a critical sphere" >&2
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Pre-deploy: diff the candidate sphere against the live one
|
|
76
|
+
hypertopos sphere diff gds_live/ gds_candidate/ --json > diff.json
|
|
77
|
+
jq '.pattern_inventory' diff.json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Incremental ingest: append a changed-entities table to one pattern's
|
|
82
|
+
# geometry, then finalize the rank recompute + ANN rebuild once at the end
|
|
83
|
+
# of the batch. --pattern is optional when the sphere has a single pattern.
|
|
84
|
+
hypertopos sphere ingest gds_sales/ \
|
|
85
|
+
--points changed_customers.arrow --finalize --json | jq '{added, population_size}'
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The points table may be Arrow IPC (`.arrow`/`.arrows`), Parquet
|
|
89
|
+
(`.parquet`/`.pq`), or CSV (`.csv`/`.csv.gz`) and must carry a
|
|
90
|
+
`primary_key` column. The JSON summary reports `added`, `modified`,
|
|
91
|
+
`deleted`, `population_size`, the geometry Lance dataset version
|
|
92
|
+
before/after, and whether the ANN index was rebuilt (`reindexed`) and the
|
|
93
|
+
batch finalized (`finalized`).
|
|
94
|
+
|
|
95
|
+
## CI gate example
|
|
96
|
+
|
|
97
|
+
A health check as a deploy gate inside a CI job:
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
- name: Gate on sphere health
|
|
101
|
+
run: hypertopos sphere health gds_sales/ --exit-code-on-critical
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The step fails (exit 2) and stops the pipeline when the sphere has a
|
|
105
|
+
critical alert, and passes otherwise.
|
|
106
|
+
|
|
107
|
+
## See also
|
|
108
|
+
|
|
109
|
+
- [Configuration](configuration.md) — the full CLI command reference,
|
|
110
|
+
including `build`, `validate`, `info`, and the `sphere` cloud-ops verbs.
|
|
111
|
+
- [Quick Start](quickstart.md) — building a sphere from a relational
|
|
112
|
+
dataset.
|
|
@@ -15,7 +15,7 @@ gds_{sphere_id}/
|
|
|
15
15
|
├── _gds_meta/
|
|
16
16
|
│ ├── sphere.json # central config (lines, patterns, aliases, storage)
|
|
17
17
|
│ ├── geometry_stats/ # precomputed population summaries
|
|
18
|
-
│ ├── trajectory/ # ANN index for
|
|
18
|
+
│ ├── trajectory/ # per-entity trajectory summary vectors (optional IVF_FLAT ANN index — skipped for too-few-entity patterns, which then use a brute-force scan)
|
|
19
19
|
│ ├── temporal_centroids/ # cached population centroids per time window
|
|
20
20
|
│ ├── edge_stats/ # per-event-pattern edge table summary cache (row count, unique from/to, ts/amount range)
|
|
21
21
|
│ ├── edge_features/ # per-edge derived dim sidecar (event patterns with edge_dimensions: in YAML)
|