sdr-visualizer 1.2.2__tar.gz → 1.2.3__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.
- sdr_visualizer-1.2.3/AGENTS.md +194 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/CHANGELOG.md +28 -1
- sdr_visualizer-1.2.3/CONTRIBUTING.md +15 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/PKG-INFO +9 -22
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/README.md +7 -20
- sdr_visualizer-1.2.3/docs/DEPENDABOT_AUTOMATION.md +116 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/LINEAGE.md +5 -2
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/PERFORMANCE.md +6 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/RELEASE_EVIDENCE_TEMPLATE.md +17 -6
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/RELEASING.md +19 -6
- sdr_visualizer-1.2.3/docs/SHOWCASE.md +52 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/WORKSPACE_USAGE.md +1 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/pyproject.toml +3 -2
- sdr_visualizer-1.2.3/scripts/capture_screenshot.py +346 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_workflow_policy.py +7 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/corpus_check.py +8 -7
- sdr_visualizer-1.2.3/scripts/dependabot_review.py +377 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_browser_check.py +10 -10
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_check.py +38 -31
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/__init__.py +1 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer.js +17 -2
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer_trend.js +8 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/normalize.py +1 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/sdk_worker.py +12 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_browser_functional.py +82 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_corpus_check.py +24 -0
- sdr_visualizer-1.2.3/tests/test_dependabot_review.py +428 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_performance.py +2 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_package_smoke_check.py +2 -1
- sdr_visualizer-1.2.3/tests/test_perf.py +162 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_perf_browser_check.py +47 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_release_documentation.py +7 -4
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workflow_policy.py +25 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_aa_sdk.py +1 -1
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_sdk.py +89 -0
- sdr_visualizer-1.2.2/CONTRIBUTING.md +0 -97
- sdr_visualizer-1.2.2/scripts/capture_screenshot.py +0 -60
- sdr_visualizer-1.2.2/tests/test_perf.py +0 -76
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/.gitignore +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/CODE_OF_CONDUCT.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/LICENSE +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/SECURITY.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/THIRD_PARTY_LICENSES +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ADAPTER_CORRECTNESS_1.1.2.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ADAPTER_GUIDE.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ARCHITECTURE.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/EMBEDDED_DATA_FORMAT.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/PRODUCT_CONTRACT.md +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/payload-schema.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/workspace-usage-schema.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_color_pack_parity.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_markdown_links.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_aa_large_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_cja_lineage_poc.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_examples.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_large_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/mutate_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/package_smoke_check.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_lineage_poc.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/workspace_usage_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/__main__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/aa.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/base.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/cja.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/cja_lineage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/diff.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/formula_tree.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/lineage_layout.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/references.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/segment_tree.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/trend.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/exit_codes.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/lineage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/lineage_output.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/main.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/output_safety.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/workspace_usage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/exceptions.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/lineage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/models.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/structure_limits.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/visualizer.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/workspace_usage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/detect.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/lineage_discovery.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/loader.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/series.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/shell_out.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/workspace_usage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/color_packs.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/data_payload.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/lineage_payload.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/lineage_renderer.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/renderer.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage.css +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage.js +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage_graph.js +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage_roles.js +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/d3.min.js +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer.css +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/catalog.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/changes.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/cja_lineage.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/graph.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/index.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/trend.html.j2 +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/trend_charts.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/workspace_usage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/aa_api.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/aa_sdk.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/auth.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/cja_api.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/cja_sdk.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/collector.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/transport.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/adapter_cases.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/browser_support.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/conftest.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/__init__.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/aa_snapshot_clean.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/aa_snapshot_messy.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_degraded.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_enriched.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_hostile.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_shared.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_clean.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_hostile.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_messy.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_minimal.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/workspace_usage_aa_all_types.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/workspace_usage_cja_all_types.json +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapter_correctness.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapter_fuzz.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapters_aa.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapters_cja.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_diff.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_formula_tree.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_references.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_segment_tree.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_trend.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_browser_support.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cja_lineage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cja_lineage_driver.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cli.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cli_flags.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_color_pack_parity.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_color_packs.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_data_payload.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_entrypoint.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_generate_examples.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_input_modes.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_input_series.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_browser.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_cli.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_discovery.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_renderer.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_markdown_links.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_minimal_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_mutate_fixture.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_output_safety.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_payload_schema.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer_anatomy.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer_graph.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_semantic_properties.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_structure_limits.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_trend_charts.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_auth.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_cja_sdk.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_cli.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_collection.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_offline.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_payload.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_perf.py +0 -0
- {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_transport.py +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Repository guidance
|
|
2
|
+
|
|
3
|
+
This is the canonical working guide for contributors and AI coding agents across
|
|
4
|
+
this repository. Keep shared setup, validation, architecture, and contribution
|
|
5
|
+
instructions here; `CLAUDE.md` and `CONTRIBUTING.md` point here instead of maintaining
|
|
6
|
+
parallel copies. Detailed feature contracts remain in the linked documents.
|
|
7
|
+
|
|
8
|
+
## Project and authority
|
|
9
|
+
|
|
10
|
+
`sdr-visualizer` is a Python static-output visual catalog generator for Adobe
|
|
11
|
+
Customer Journey Analytics (CJA) and Adobe Analytics (AA). It consumes JSON
|
|
12
|
+
snapshots from `cja_auto_sdr` / `aa_auto_sdr` and emits one self-contained HTML
|
|
13
|
+
report with catalog, reference graph, anatomy, comparison, and trend views.
|
|
14
|
+
The package also installs the independent CJA-only `cja-lineage` command.
|
|
15
|
+
There are no LLM calls or agent loops in the product.
|
|
16
|
+
|
|
17
|
+
Read these documents for the area you are changing:
|
|
18
|
+
|
|
19
|
+
- [Product contract](docs/PRODUCT_CONTRACT.md): supported inputs, stable public
|
|
20
|
+
surfaces, integrity/resource bounds, confidentiality, and compatibility. Read
|
|
21
|
+
before changing public behavior; do not silently expand or weaken the contract.
|
|
22
|
+
- [Architecture](docs/ARCHITECTURE.md): data flow, module responsibilities, and
|
|
23
|
+
adding views or platforms.
|
|
24
|
+
- [Adapter guide](docs/ADAPTER_GUIDE.md): snapshot shapes and sibling parity.
|
|
25
|
+
- [Embedded data format](docs/EMBEDDED_DATA_FORMAT.md) and
|
|
26
|
+
[payload schema](docs/payload-schema.json): catalog payload contract.
|
|
27
|
+
- [Workspace usage](docs/WORKSPACE_USAGE.md): optional collection/replay boundaries
|
|
28
|
+
and [usage schema](docs/workspace-usage-schema.json).
|
|
29
|
+
- [Lineage](docs/LINEAGE.md): separate discovery input, CLI, and report contract.
|
|
30
|
+
- [Performance](docs/PERFORMANCE.md): CI-gated Python and browser budgets.
|
|
31
|
+
- [Releasing](docs/RELEASING.md): candidate, publication, and announcement evidence.
|
|
32
|
+
|
|
33
|
+
## Setup and everyday development
|
|
34
|
+
|
|
35
|
+
Requires Python 3.11+ and [uv](https://github.com/astral-sh/uv). Run from the repo root:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
uv sync --locked --all-extras --dev --group browser
|
|
39
|
+
uv run playwright install chromium webkit
|
|
40
|
+
uv run pytest
|
|
41
|
+
uv run ruff check
|
|
42
|
+
uv run ruff format --check
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The extras install the pinned AA/CJA SDKs for collection tests; base/offline use
|
|
46
|
+
only requires Jinja2. The `dev` group supplies Python test/lint tooling and
|
|
47
|
+
`browser` supplies Playwright. On Linux, use
|
|
48
|
+
`uv run playwright install --with-deps chromium webkit` if browser system libraries
|
|
49
|
+
are missing. `tests/conftest.py` generates missing large CJA/AA fixtures on demand.
|
|
50
|
+
Do not commit generated performance fixtures or caches.
|
|
51
|
+
|
|
52
|
+
Use `uv run ruff format` to format changes. Use a focused `uv run pytest tests/test_*.py`
|
|
53
|
+
selection while iterating, then complete the PR checks below. Offline CLI smoke:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
uv run sdr-visualizer tests/fixtures/cja_snapshot_clean.json --output /tmp/sdr-visualizer-check.html
|
|
57
|
+
uv run sdr-visualizer --help
|
|
58
|
+
uv run cja-lineage --help
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Validation before a PR
|
|
62
|
+
|
|
63
|
+
Every PR needs a green suite, clean lint/format, and at least 99% combined line
|
|
64
|
+
and branch coverage from the non-browser Python suite. Behavior changes need
|
|
65
|
+
focused tests. Run both browser suites with Chromium and WebKit installed;
|
|
66
|
+
skipped browser tests do not establish browser validation.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
uv run pytest --ignore=tests/test_browser_functional.py --ignore=tests/test_lineage_browser.py \
|
|
70
|
+
--cov=sdr_visualizer --cov-branch --cov-report=term-missing \
|
|
71
|
+
--cov-report=json --cov-fail-under=99
|
|
72
|
+
uv run pytest tests/test_browser_functional.py tests/test_lineage_browser.py -v
|
|
73
|
+
uv run ruff check
|
|
74
|
+
uv run ruff format --check
|
|
75
|
+
uv run python scripts/check_markdown_links.py
|
|
76
|
+
uv run python scripts/check_workflow_policy.py
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The Markdown checker uses Git's tracked-file list. Stage newly added documents
|
|
80
|
+
before running it so new links are validated against content that will ship.
|
|
81
|
+
|
|
82
|
+
When a change could affect build size, rendering, or browser performance, run the
|
|
83
|
+
performance gates. Generate their fixture sizes as CI does:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
uv run python scripts/generate_large_fixture.py --scale 0.083 --output tests/fixtures/cja_snapshot_small.json
|
|
87
|
+
uv run python scripts/generate_large_fixture.py --scale 0.417 --output tests/fixtures/cja_snapshot_medium.json
|
|
88
|
+
uv run python scripts/generate_large_fixture.py
|
|
89
|
+
uv run python scripts/generate_aa_large_fixture.py
|
|
90
|
+
uv run python scripts/generate_large_fixture.py --scale 1.67 --output tests/fixtures/cja_snapshot_xl.json
|
|
91
|
+
uv run python scripts/perf_check.py
|
|
92
|
+
uv run python scripts/perf_lineage_poc.py
|
|
93
|
+
uv run python scripts/perf_browser_check.py
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
If rendered output changes, run `uv run python scripts/generate_examples.py` and
|
|
97
|
+
commit the refreshed `examples/*.html` in the same PR. CI verifies deterministic
|
|
98
|
+
example drift and never pushes directly to `main`.
|
|
99
|
+
|
|
100
|
+
For packaging changes, build and check the independently installed wheel and
|
|
101
|
+
source distribution outside the checkout:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
uv build --out-dir dist/packages
|
|
105
|
+
uv run python scripts/package_smoke_check.py dist/packages/ --browser
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Use an output directory containing exactly one wheel and one source distribution.
|
|
109
|
+
Keep runtime dependencies limited to imports used by shipped code; tooling-only
|
|
110
|
+
dependencies belong in `dev`. The sdist has an explicit allowlist in
|
|
111
|
+
`pyproject.toml`; include new public documents there when needed. Release
|
|
112
|
+
qualification requires the full [release checklist](docs/RELEASING.md), including
|
|
113
|
+
fresh private-corpus/live-generator and explicit-commit sibling evidence; local
|
|
114
|
+
fixtures and CI do not substitute for that evidence.
|
|
115
|
+
|
|
116
|
+
## Architecture and invariants
|
|
117
|
+
|
|
118
|
+
- Catalog pipeline: `cli/main.py` orchestrates `input/` loading/detection and
|
|
119
|
+
`adapters/` normalization into `core/models.py::Implementation`; `analysis/`
|
|
120
|
+
computes references, anatomy, diff, and trend; `render/data_payload.py`, render
|
|
121
|
+
helpers, Jinja templates, and embedded assets produce the report.
|
|
122
|
+
- Lineage uses `cli/lineage.py`, `input/lineage_discovery.py`, `adapters/cja_lineage.py`,
|
|
123
|
+
`core/lineage.py`, `analysis/lineage_layout.py`, and the lineage render modules.
|
|
124
|
+
Its discovery input and internal payload are separate from catalog snapshots.
|
|
125
|
+
- Workspace collection uses `cli/workspace_usage.py` and `usage/`; offline replay
|
|
126
|
+
uses `input/workspace_usage.py`. Binding lives in `core/workspace_usage.py` and
|
|
127
|
+
presentation in `render/workspace_usage.py`. Project evidence stays separate
|
|
128
|
+
from component references, graph, diff, and trend.
|
|
129
|
+
- Python precomputes analysis and chart geometry. The browser reads embedded JSON,
|
|
130
|
+
filters data, and renders bounded DOM; it does not analyze raw snapshots.
|
|
131
|
+
- Reports embed JSON, CSS, JavaScript, and vendored D3: no browser fetches, CDNs,
|
|
132
|
+
application server, or consumer build step. Live exporter invocation and explicit
|
|
133
|
+
optional Python-side Workspace collection follow their documented boundaries;
|
|
134
|
+
saved-input generation and replay stay offline.
|
|
135
|
+
- Use vanilla JavaScript, with D3 confined to graph rendering. Do not add a frontend
|
|
136
|
+
framework or new JS dependencies. Preserve lazy initialization and display bounds.
|
|
137
|
+
- The visualizer is descriptive: no grades, findings, or recommendations. Those
|
|
138
|
+
belong in [sdr-grader](https://github.com/brian-a-au/sdr-grader).
|
|
139
|
+
- Preserve catalog exit codes: `0` success, `1` runtime failure, `3` invalid input;
|
|
140
|
+
never introduce catalog code `2`. The separate `cja-lineage` command retains
|
|
141
|
+
its documented argument-error code `2`. Treat snapshots as untrusted and retain
|
|
142
|
+
output-alias, structure-limit, Unicode, escaping, and non-finite JSON guards.
|
|
143
|
+
- Color packs affect HTML presentation only, not the embedded/sidecar payload.
|
|
144
|
+
|
|
145
|
+
## Sibling parity
|
|
146
|
+
|
|
147
|
+
The normalized model, `adapters/{base,cja,aa}.py`, and
|
|
148
|
+
`input/{loader,detect,shell_out}.py` originated in `sdr-grader`. Shared defensive
|
|
149
|
+
behavior must be evaluated and mirrored in the same release cycle; a PR touching
|
|
150
|
+
it must explain how parity is met. `input/series.py` is visualizer-only.
|
|
151
|
+
When vendoring, rewrite `sdr_grader` imports to `sdr_visualizer`. Fixtures may
|
|
152
|
+
intentionally diverge to exercise each project's features.
|
|
153
|
+
|
|
154
|
+
Read [Vendoring parity with sdr-grader](docs/ADAPTER_GUIDE.md#vendoring-parity-with-sdr-grader)
|
|
155
|
+
before syncing: shared coercion helpers stay behavior-identical, while grader-only
|
|
156
|
+
evaluative helpers, visualizer numeric coercion, typed-reference metadata, and
|
|
157
|
+
output protection have documented intentional differences. Do not copy over
|
|
158
|
+
those differences indiscriminately. Color-pack source/accessibility contracts
|
|
159
|
+
also require the explicit-SHA comparator described in
|
|
160
|
+
[Sibling parity](docs/RELEASING.md#sibling-parity); derived role values are local.
|
|
161
|
+
|
|
162
|
+
## Contribution and release discipline
|
|
163
|
+
|
|
164
|
+
Keep changes focused and reviewable; preserve unrelated working-tree changes.
|
|
165
|
+
Do not combine correctness, browser performance, automation, documentation, or
|
|
166
|
+
community changes merely because they share a release target. Discuss non-trivial
|
|
167
|
+
features in an issue first and surface unresolved contract questions there.
|
|
168
|
+
Prefer a tighter feature set executed well over unnecessary scope expansion.
|
|
169
|
+
|
|
170
|
+
Follow [CONTRIBUTING.md](CONTRIBUTING.md), the
|
|
171
|
+
[code of conduct](CODE_OF_CONDUCT.md), and the [PR template](.github/PULL_REQUEST_TEMPLATE.md).
|
|
172
|
+
PRs should describe resulting behavior, relevant validation, and any parity
|
|
173
|
+
obligation. Maintainer self-review is permitted and independent approvals are
|
|
174
|
+
currently not required; required checks still apply. Release maintainers
|
|
175
|
+
re-inspect repository settings and record evidence before each release.
|
|
176
|
+
|
|
177
|
+
Never add customer snapshots, identifiers, names, owners, formulas, source paths,
|
|
178
|
+
credentials, or private corpus evidence to public commits/issues/PRs. Generated
|
|
179
|
+
reports inherit their source's confidentiality. Report vulnerabilities privately
|
|
180
|
+
as directed by [SECURITY.md](SECURITY.md). Do not run live collection or read
|
|
181
|
+
maintainer credential sources as an unannounced test.
|
|
182
|
+
|
|
183
|
+
Keep changes under `Unreleased` during development. The release commit bumps
|
|
184
|
+
`pyproject.toml`, `src/sdr_visualizer/__init__.py`, and `uv.lock` together. In the
|
|
185
|
+
same commit, rename `Unreleased` to the version and release date, add that version's
|
|
186
|
+
link definition, update the comparison target, and add a fresh empty `Unreleased`
|
|
187
|
+
section. Tag the release commit itself; never tag a commit containing `[skip ci]`.
|
|
188
|
+
|
|
189
|
+
Follow [RELEASING.md](docs/RELEASING.md) for separately authorized tags, publication,
|
|
190
|
+
and announcement gates. PyPI publication precedes the GitHub release; both verify
|
|
191
|
+
the same `SHA256SUMS` manifest. If publication succeeds but the GitHub-release job
|
|
192
|
+
fails, rerun only the failed `github-release` job against the retained artifact;
|
|
193
|
+
never rerun successful publication or republish the same version. A green PR is
|
|
194
|
+
not release or announcement authorization.
|
|
@@ -4,6 +4,32 @@ All notable changes to `sdr-visualizer` will be documented here. The format foll
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.2.3] - 2026-10-16
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Enforce the published performance budgets with decimal UTF-8 byte limits
|
|
12
|
+
and strict build, render, and filter timing boundaries in verification tools.
|
|
13
|
+
- Preserve keyboard focus when paging Changes and Trend, and keep expanded
|
|
14
|
+
comparison details open as additional changes appear.
|
|
15
|
+
- Preserve completed and partial Workspace SDK matches when process-group
|
|
16
|
+
signaling races with worker exit. Cleanup still fails if the worker does not
|
|
17
|
+
exit within the existing bounded wait.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Make live AA Workspace collection and manual assistive-technology testing
|
|
22
|
+
optional release evidence, retain automated accessibility and keyboard checks,
|
|
23
|
+
and scope release license signoff to project and vendored D3 notices.
|
|
24
|
+
|
|
25
|
+
- Update the optional AA Workspace SDK to `aanalytics2==0.5.5.post2` and align
|
|
26
|
+
its collection version guard with the package pin.
|
|
27
|
+
- Automatically review and merge verified, lockfile-only patch updates to
|
|
28
|
+
Ruff, pytest, and pytest-cov after all protected CI gates pass. Keep other
|
|
29
|
+
dependency changes on the manual-review path.
|
|
30
|
+
- Replace the README catalog screenshot with a feature slideshow covering search,
|
|
31
|
+
references, anatomy, comparisons, trends, and offline reports across AA and CJA.
|
|
32
|
+
|
|
7
33
|
## [1.2.2] - 2026-09-21
|
|
8
34
|
|
|
9
35
|
### Changed
|
|
@@ -713,7 +739,8 @@ The following are explicitly internal and may change without notice:
|
|
|
713
739
|
- Workspace project visualization (v0.4)
|
|
714
740
|
- Schema map view (v0.5)
|
|
715
741
|
|
|
716
|
-
[Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.
|
|
742
|
+
[Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.3...HEAD
|
|
743
|
+
[1.2.3]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.3
|
|
717
744
|
[1.2.2]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.2
|
|
718
745
|
[1.2.1]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.1
|
|
719
746
|
[1.2.0]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.0
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Contributing to sdr-visualizer
|
|
2
|
+
|
|
3
|
+
Thanks for your interest. This project has a deliberately tight scope. Read
|
|
4
|
+
[AGENTS.md](AGENTS.md), the canonical guide for contributors and coding agents,
|
|
5
|
+
before making changes. It covers setup, development, required validation,
|
|
6
|
+
architecture, sibling parity, and contribution discipline.
|
|
7
|
+
|
|
8
|
+
Discuss non-trivial features in an issue before implementation. Use the
|
|
9
|
+
[PR template](.github/PULL_REQUEST_TEMPLATE.md) to describe your change and record
|
|
10
|
+
validation. By participating, you agree to follow the
|
|
11
|
+
[code of conduct](CODE_OF_CONDUCT.md). Report security issues privately as described
|
|
12
|
+
in [SECURITY.md](SECURITY.md).
|
|
13
|
+
|
|
14
|
+
For maintainer release work, use the full candidate, publication, and announcement
|
|
15
|
+
checklist in [docs/RELEASING.md](docs/RELEASING.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sdr-visualizer
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.3
|
|
4
4
|
Summary: Static-output visual catalog generator for Adobe Customer Journey Analytics and Adobe Analytics implementations.
|
|
5
5
|
Project-URL: Homepage, https://brian-a-au.github.io/sdr-visualizer/
|
|
6
6
|
Project-URL: Documentation, https://github.com/brian-a-au/sdr-visualizer#documentation
|
|
@@ -14,7 +14,7 @@ License-File: THIRD_PARTY_LICENSES
|
|
|
14
14
|
Requires-Python: >=3.11
|
|
15
15
|
Requires-Dist: jinja2>=3.1
|
|
16
16
|
Provides-Extra: workspace-aa
|
|
17
|
-
Requires-Dist: aanalytics2==0.5.
|
|
17
|
+
Requires-Dist: aanalytics2==0.5.5.post2; extra == 'workspace-aa'
|
|
18
18
|
Requires-Dist: requests>=2.32; extra == 'workspace-aa'
|
|
19
19
|
Provides-Extra: workspace-cja
|
|
20
20
|
Requires-Dist: cjapy==0.3.1; extra == 'workspace-cja'
|
|
@@ -41,7 +41,10 @@ Static-output visual catalog generator for Adobe Customer Journey Analytics (CJA
|
|
|
41
41
|
- Per-calculated-metric formula trees with click-through to referenced metrics
|
|
42
42
|
- Snapshot-to-snapshot Changes and multi-snapshot Trend views
|
|
43
43
|
|
|
44
|
-
](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.png)
|
|
45
|
+
|
|
46
|
+
28.5-second loop · Actual report excerpts from synthetic AA and CJA snapshots.
|
|
47
|
+
Click the animation for a still image.
|
|
45
48
|
|
|
46
49
|
**Live examples:** [CJA report](https://brian-a-au.github.io/sdr-visualizer/cja-typical.html) · [AA report](https://brian-a-au.github.io/sdr-visualizer/aa-typical.html)
|
|
47
50
|
|
|
@@ -337,25 +340,7 @@ Warnings (snapshot generator newer than the tested version; 5,000+ component rep
|
|
|
337
340
|
|
|
338
341
|
## Develop
|
|
339
342
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
```bash
|
|
343
|
-
uv sync --all-extras --dev --group browser # Full test environment, including SDK tests
|
|
344
|
-
uv run playwright install chromium webkit
|
|
345
|
-
uv run pytest # Run tests (auto-generates the large fixture on first run)
|
|
346
|
-
uv run ruff check # Lint
|
|
347
|
-
uv run ruff format # Auto-format
|
|
348
|
-
|
|
349
|
-
uv run python scripts/generate_examples.py # Regenerate examples/
|
|
350
|
-
uv run python scripts/check_color_pack_parity.py \
|
|
351
|
-
--visualizer-sha <candidate-commit-sha> \
|
|
352
|
-
--grader-root ../sdr-grader --grader-sha <linked-grader-commit-sha>
|
|
353
|
-
uv run python scripts/perf_check.py # Run the perf gate
|
|
354
|
-
uv run python scripts/check_markdown_links.py
|
|
355
|
-
uv run python scripts/check_workflow_policy.py
|
|
356
|
-
uv build --out-dir dist/packages
|
|
357
|
-
uv run python scripts/package_smoke_check.py dist/packages/
|
|
358
|
-
```
|
|
343
|
+
See [AGENTS.md](https://github.com/brian-a-au/sdr-visualizer/blob/main/AGENTS.md) for the canonical contributor and AI-agent guide: Python/uv setup, development commands, validation, architecture, and contribution instructions.
|
|
359
344
|
|
|
360
345
|
## CJA dataset lineage
|
|
361
346
|
|
|
@@ -396,6 +381,8 @@ component catalogs for either CJA or Adobe Analytics (AA).
|
|
|
396
381
|
|
|
397
382
|
## Documentation
|
|
398
383
|
|
|
384
|
+
- [`AGENTS.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/AGENTS.md) — canonical contributor and coding-agent working guide.
|
|
385
|
+
|
|
399
386
|
- [`docs/WORKSPACE_USAGE.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md) — optional AA/CJA collection, generated usage files, offline replay, and evidence limits.
|
|
400
387
|
|
|
401
388
|
- [`docs/LINEAGE.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/LINEAGE.md) — CJA-only lineage generation, navigation, compatibility, and limits.
|
|
@@ -18,7 +18,10 @@ Static-output visual catalog generator for Adobe Customer Journey Analytics (CJA
|
|
|
18
18
|
- Per-calculated-metric formula trees with click-through to referenced metrics
|
|
19
19
|
- Snapshot-to-snapshot Changes and multi-snapshot Trend views
|
|
20
20
|
|
|
21
|
-
](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.png)
|
|
22
|
+
|
|
23
|
+
28.5-second loop · Actual report excerpts from synthetic AA and CJA snapshots.
|
|
24
|
+
Click the animation for a still image.
|
|
22
25
|
|
|
23
26
|
**Live examples:** [CJA report](https://brian-a-au.github.io/sdr-visualizer/cja-typical.html) · [AA report](https://brian-a-au.github.io/sdr-visualizer/aa-typical.html)
|
|
24
27
|
|
|
@@ -314,25 +317,7 @@ Warnings (snapshot generator newer than the tested version; 5,000+ component rep
|
|
|
314
317
|
|
|
315
318
|
## Develop
|
|
316
319
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
```bash
|
|
320
|
-
uv sync --all-extras --dev --group browser # Full test environment, including SDK tests
|
|
321
|
-
uv run playwright install chromium webkit
|
|
322
|
-
uv run pytest # Run tests (auto-generates the large fixture on first run)
|
|
323
|
-
uv run ruff check # Lint
|
|
324
|
-
uv run ruff format # Auto-format
|
|
325
|
-
|
|
326
|
-
uv run python scripts/generate_examples.py # Regenerate examples/
|
|
327
|
-
uv run python scripts/check_color_pack_parity.py \
|
|
328
|
-
--visualizer-sha <candidate-commit-sha> \
|
|
329
|
-
--grader-root ../sdr-grader --grader-sha <linked-grader-commit-sha>
|
|
330
|
-
uv run python scripts/perf_check.py # Run the perf gate
|
|
331
|
-
uv run python scripts/check_markdown_links.py
|
|
332
|
-
uv run python scripts/check_workflow_policy.py
|
|
333
|
-
uv build --out-dir dist/packages
|
|
334
|
-
uv run python scripts/package_smoke_check.py dist/packages/
|
|
335
|
-
```
|
|
320
|
+
See [AGENTS.md](https://github.com/brian-a-au/sdr-visualizer/blob/main/AGENTS.md) for the canonical contributor and AI-agent guide: Python/uv setup, development commands, validation, architecture, and contribution instructions.
|
|
336
321
|
|
|
337
322
|
## CJA dataset lineage
|
|
338
323
|
|
|
@@ -373,6 +358,8 @@ component catalogs for either CJA or Adobe Analytics (AA).
|
|
|
373
358
|
|
|
374
359
|
## Documentation
|
|
375
360
|
|
|
361
|
+
- [`AGENTS.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/AGENTS.md) — canonical contributor and coding-agent working guide.
|
|
362
|
+
|
|
376
363
|
- [`docs/WORKSPACE_USAGE.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md) — optional AA/CJA collection, generated usage files, offline replay, and evidence limits.
|
|
377
364
|
|
|
378
365
|
- [`docs/LINEAGE.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/LINEAGE.md) — CJA-only lineage generation, navigation, compatibility, and limits.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Dependabot review and auto-merge
|
|
2
|
+
|
|
3
|
+
The repository automatically reviews and merges **patch updates to `ruff`,
|
|
4
|
+
`pytest`, and `pytest-cov`** when all required CI checks pass on an up-to-date
|
|
5
|
+
branch. Other dependency updates remain available for manual review and merge.
|
|
6
|
+
This is a deterministic policy review; it does not claim to review arbitrary
|
|
7
|
+
upstream source code or to provide an AI review.
|
|
8
|
+
|
|
9
|
+
## Review policy
|
|
10
|
+
|
|
11
|
+
`scripts/dependabot_review.py` checks the PR author is the Dependabot bot, both
|
|
12
|
+
branches belong to this repository, the target is `main`, and the source is a
|
|
13
|
+
`dependabot/uv/` branch. Only an existing `uv.lock` may change.
|
|
14
|
+
|
|
15
|
+
The reviewer parses the base and head lockfiles and requires:
|
|
16
|
+
|
|
17
|
+
- Only allowlisted, direct development dependencies change. A dependency
|
|
18
|
+
reachable from the runtime or any optional extra is excluded.
|
|
19
|
+
- Versions move forward within the same major and minor version. Prereleases,
|
|
20
|
+
postreleases, downgrades, and nonstandard versions are excluded.
|
|
21
|
+
- Dependency metadata, all other packages, and lockfile settings are unchanged.
|
|
22
|
+
Transitive updates and new packages require manual review. Unchanged alternative
|
|
23
|
+
platform/Python resolutions are retained exactly; runtime exclusion traverses
|
|
24
|
+
every alternative. Changes to a multiply resolved package require manual review.
|
|
25
|
+
- Artifacts use the expected PyPI URLs and filenames with SHA-256 hashes. Every
|
|
26
|
+
URL, hash, and size must match PyPI's release metadata; yanked files are rejected.
|
|
27
|
+
|
|
28
|
+
Malformed lockfiles and API failures fail the check. A well-formed PR outside
|
|
29
|
+
the policy passes the check with a **manual merge required** decision and receives
|
|
30
|
+
no automatic approval or merge request. SDK updates and GitHub Actions updates
|
|
31
|
+
are outside the allowlist.
|
|
32
|
+
|
|
33
|
+
## Workflow and trust boundary
|
|
34
|
+
|
|
35
|
+
`dependabot-policy.yml` runs on every PR with a read-only token and checks out
|
|
36
|
+
the **base commit's** review script. It reads PR lockfiles as data through the
|
|
37
|
+
GitHub API; it never installs PR dependencies or executes PR code.
|
|
38
|
+
|
|
39
|
+
After a successful required CI workflow run, `dependabot-auto-merge.yml` runs the **main-branch**
|
|
40
|
+
script with narrowly scoped write permissions. It resolves the current PR from
|
|
41
|
+
the triggering head SHA and repeats the review, including registry verification.
|
|
42
|
+
Stale events are ignored. Before approving, it verifies required branch gates, confirms every required
|
|
43
|
+
check succeeded, rechecks both base and head SHAs, and verifies the reviewed
|
|
44
|
+
head contains current main through the comparison API. The review is attached
|
|
45
|
+
to the reviewed commit; `gh pr merge --squash --match-head-commit` uses no
|
|
46
|
+
administrator bypass. GitHub enforces the required tests and up-to-date-branch
|
|
47
|
+
rule. A pending or failed check causes no write; the next successful workflow
|
|
48
|
+
completion retries the review. The bot does not leave a persistent auto-merge
|
|
49
|
+
request that could apply to a subsequently changed PR.
|
|
50
|
+
|
|
51
|
+
The privileged workflow does not consume PR artifacts or caches. Both workflows
|
|
52
|
+
use only the Python standard library and pinned actions. No additional secret,
|
|
53
|
+
Adobe credential, or external review service is needed.
|
|
54
|
+
|
|
55
|
+
## Repository settings
|
|
56
|
+
|
|
57
|
+
The deployment enables **Allow auto-merge** and adds `dependabot-policy` to the
|
|
58
|
+
existing required checks, with the GitHub Actions app as the check source:
|
|
59
|
+
|
|
60
|
+
`lint`, `test (3.11)`, `test (3.12)`, `test (3.14)`, `browser-perf`, `check`, `verify`, `analyze (python, none)`, `analyze (javascript-typescript, none)`, `dependency-review`, `actionlint`, `lockfile`, `dependabot-policy`.
|
|
61
|
+
|
|
62
|
+
Branch protection continues to require up-to-date branches and enforce the
|
|
63
|
+
requirements for administrators. Existing review requirements are preserved;
|
|
64
|
+
this setup does not introduce a second-maintainer requirement for human PRs.
|
|
65
|
+
The dependency-review check rejects newly introduced vulnerabilities of moderate
|
|
66
|
+
severity or higher. The test gates cover Python 3.11/3.12/3.14 tests with 99% combined line/branch coverage, Chromium and WebKit functional tests, browser performance, example drift, version identity, and Python/JavaScript CodeQL. Required CI sync and run commands use `--locked`.
|
|
67
|
+
|
|
68
|
+
Install the workflow through a normal PR before requiring its new check. Its
|
|
69
|
+
first installation PR is explicitly treated as a manual bootstrap because the
|
|
70
|
+
trusted base does not contain the review script yet.
|
|
71
|
+
|
|
72
|
+
## Existing PRs and maintenance
|
|
73
|
+
|
|
74
|
+
To evaluate an existing PR without changes:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
uv run --no-project --python 3.14 python scripts/dependabot_review.py \
|
|
78
|
+
--repo brian-a-au/sdr-visualizer --pr 74
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
After installation, dispatch the workflow to review an existing PR under the
|
|
82
|
+
same policy and merge if eligible and all required checks have passed:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
gh workflow run dependabot-auto-merge.yml --ref main -f pr=74
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
An old PR must also receive the new required `dependabot-policy` check before
|
|
89
|
+
it can merge. Updating its branch through GitHub or a Dependabot rebase triggers
|
|
90
|
+
fresh PR checks. If another PR merges first, GitHub requires the remaining PR
|
|
91
|
+
to update and retest; automation never bypasses that requirement.
|
|
92
|
+
|
|
93
|
+
The built-in `GITHUB_TOKEN` does not trigger ordinary push workflows when it
|
|
94
|
+
merges a PR. Validation therefore happens before merging; main-branch badge
|
|
95
|
+
refresh workflows may need a manual dispatch. Use a separately configured GitHub
|
|
96
|
+
App if triggering those downstream workflows becomes necessary.
|
|
97
|
+
|
|
98
|
+
To pause automatic merging, disable `dependabot-auto-merge.yml`. Keep the policy and existing required CI checks.
|
|
99
|
+
Change the allowlist only through a reviewed repository PR.
|
|
100
|
+
|
|
101
|
+
## Consistency across the SDR repositories
|
|
102
|
+
|
|
103
|
+
This policy matches `aa_auto_sdr` and `cja_auto_sdr`: the same patch-only
|
|
104
|
+
allowlist, trusted-base reviewer, PyPI artifact verification, required-check
|
|
105
|
+
verification, and commit-bound protected squash merge. Runtime and optional-extra
|
|
106
|
+
dependencies (including downstream optional dependencies), transitive changes,
|
|
107
|
+
GitHub Actions, manifest changes, and updates outside the allowlist require
|
|
108
|
+
manual review. Repository names, root package names, and CI contexts differ.
|
|
109
|
+
|
|
110
|
+
Python updates are individual PRs so manual-review packages cannot hold an
|
|
111
|
+
otherwise eligible patch in a mixed group. GitHub Actions updates remain grouped.
|
|
112
|
+
No package version bump, tag, or publication is triggered by this automation.
|
|
113
|
+
|
|
114
|
+
Automatic Copilot review is supplementary, requested on new PRs and each new
|
|
115
|
+
push through a repository ruleset, subject to availability and quota. It does not
|
|
116
|
+
replace policy review or CI, and no Copilot approval-counting feature is required.
|
|
@@ -153,5 +153,8 @@ uv run python scripts/perf_lineage_poc.py
|
|
|
153
153
|
```
|
|
154
154
|
|
|
155
155
|
Release review also needs full Python coverage, browser/performance gates,
|
|
156
|
-
isolated wheel and sdist smoke checks, and
|
|
157
|
-
|
|
156
|
+
isolated wheel and sdist smoke checks, and automated browser accessibility and
|
|
157
|
+
keyboard checks. Manual assistive-technology testing, including VoiceOver or
|
|
158
|
+
another screen reader, is optional and does not block release. Automated
|
|
159
|
+
assertions do not certify accessibility, visual appearance, or actual
|
|
160
|
+
screen-reader use.
|
|
@@ -29,6 +29,12 @@ visualizer must hit all four targets for the applicable tier:
|
|
|
29
29
|
| 1,000 components | < 6 s | < 4 MB | < 1 s | < 150 ms |
|
|
30
30
|
| 2,000 components | < 12 s | < 8 MB | < 2 s | < 300 ms |
|
|
31
31
|
|
|
32
|
+
All table boundaries are strict: a measurement equal to its limit fails.
|
|
33
|
+
HTML size is measured in UTF-8 bytes using decimal units (1 KB = 1,000 bytes;
|
|
34
|
+
1 MB = 1,000,000 bytes), so the four limits are 500,000, 2,000,000,
|
|
35
|
+
4,000,000, and 8,000,000 bytes. The comparison/trend allowance is 500,000
|
|
36
|
+
bytes, applied once.
|
|
37
|
+
|
|
32
38
|
In plain terms:
|
|
33
39
|
|
|
34
40
|
- **Build time** is how long Python takes to adapt the snapshot, analyze it,
|
|
@@ -64,7 +64,7 @@ recorded.
|
|
|
64
64
|
| Live CJA and AA | pending | operator authorization, privacy controls, credentials, and current generators | pending |
|
|
65
65
|
| Compare and Trend | pending | qualified sanitized input set | pending |
|
|
66
66
|
| CJA lineage | pending | qualified discovery input and authorized live access | pending |
|
|
67
|
-
| Workspace usage | pending | explicit collection authorization, privacy controls, and
|
|
67
|
+
| Workspace usage | pending | explicit CJA collection authorization, privacy controls, and CJA credentials; AA live access optional | pending |
|
|
68
68
|
| Fresh and historical corpus | pending | corpus operator and privacy reviewer assigned | pending |
|
|
69
69
|
| Hosted settings and security | pending | exact-SHA runs and settings access | pending |
|
|
70
70
|
| Artifact and publication | pending | candidate GO and separate tag authorization | pending |
|
|
@@ -75,6 +75,14 @@ recorded.
|
|
|
75
75
|
Record commands, results, and durable exact-SHA evidence separately for each
|
|
76
76
|
surface. Use `pending` until the required work has actually completed.
|
|
77
77
|
|
|
78
|
+
Automated browser accessibility and keyboard checks are required for catalog and
|
|
79
|
+
lineage reports. Manual assistive-technology testing, including VoiceOver, is
|
|
80
|
+
optional; its absence is not a blocker or a pending required approval. Results do
|
|
81
|
+
not certify accessibility or screen-reader use. License signoff covers the project
|
|
82
|
+
LICENSE and vendored D3 ISC notices; no separate resolved or optional Python
|
|
83
|
+
license review or license-owner approval is required. Third-party license
|
|
84
|
+
obligations still apply.
|
|
85
|
+
|
|
78
86
|
### CLI and package surface
|
|
79
87
|
|
|
80
88
|
| Evidence | Value |
|
|
@@ -83,8 +91,10 @@ surface. Use `pending` until the required work has actually completed.
|
|
|
83
91
|
| Lock, lint, format, documentation-link, and workflow-policy results | pending |
|
|
84
92
|
| Focused input-boundary result | pending |
|
|
85
93
|
| Non-browser suite and coverage result | pending |
|
|
86
|
-
| Package metadata, dependency export, audit, and
|
|
94
|
+
| Package metadata, dependency export, audit, and project LICENSE / vendored D3 ISC notice signoff | pending |
|
|
87
95
|
| Wheel and source-distribution smoke result | pending |
|
|
96
|
+
| Catalog automated browser accessibility and keyboard result | pending |
|
|
97
|
+
| Manual assistive-technology testing (optional; no release blocker) | not performed (optional) |
|
|
88
98
|
| Durable evidence permalink | pending |
|
|
89
99
|
|
|
90
100
|
### Live CJA and AA
|
|
@@ -125,7 +135,7 @@ surface. Use `pending` until the required work has actually completed.
|
|
|
125
135
|
| Evidence | Value |
|
|
126
136
|
|---|---|
|
|
127
137
|
| Saved and live discovery result | pending |
|
|
128
|
-
| Layout, payload, renderer, CLI, and accessibility result | pending |
|
|
138
|
+
| Layout, payload, renderer, CLI, and automated accessibility/keyboard result | pending |
|
|
129
139
|
| Chromium and WebKit result | pending |
|
|
130
140
|
| Performance result | pending |
|
|
131
141
|
| Durable evidence permalink | pending |
|
|
@@ -138,8 +148,9 @@ surface. Use `pending` until the required work has actually completed.
|
|
|
138
148
|
| AA fake-HTTP/actual-SDK result | pending |
|
|
139
149
|
| Saved-evidence replay and binding result | pending |
|
|
140
150
|
| Collection bounds, privacy, packaging, and optional-extra review | pending |
|
|
141
|
-
| CJA
|
|
142
|
-
| Authorized CJA
|
|
151
|
+
| CJA live-qualification authorization (pending blocks qualification) | pending |
|
|
152
|
+
| Authorized CJA live-qualification result | pending |
|
|
153
|
+
| AA live Workspace collection (optional; no release blocker) | not performed (optional) |
|
|
143
154
|
| Durable evidence permalink | pending |
|
|
144
155
|
|
|
145
156
|
## Fresh and historical corpus aggregate
|
|
@@ -237,7 +248,7 @@ renumber these requirements.
|
|
|
237
248
|
| R11 immutable action pins | workflow-policy check | pending |
|
|
238
249
|
| R12 PyPI-before-GitHub ordering | workflow-policy check + authorized tag run | pending |
|
|
239
250
|
| R13 installed artifacts | wheel/sdist smoke + digests | pending |
|
|
240
|
-
| R14 minimal runtime dependencies | metadata/export/audit/
|
|
251
|
+
| R14 minimal runtime dependencies | metadata/export/audit and project/D3 notice evidence | pending |
|
|
241
252
|
| R15 shipped, consistent docs | Markdown links + source-distribution check | pending |
|
|
242
253
|
| R16 safe sharing guidance | README review | pending |
|
|
243
254
|
| R17 current compatibility | privacy-safe fresh/corpus record | pending |
|
|
@@ -128,6 +128,11 @@ temporary environments are removed. It requires both engines, checks offline
|
|
|
128
128
|
operation and navigation, and fails on browser errors or subresource requests.
|
|
129
129
|
Browser tooling stays in the development environment.
|
|
130
130
|
|
|
131
|
+
Automated browser accessibility and keyboard checks in both browser suites are
|
|
132
|
+
required release evidence. Manual assistive-technology testing, including
|
|
133
|
+
VoiceOver or another screen reader, is optional and does not block release.
|
|
134
|
+
Automated results do not certify accessibility or actual screen-reader use.
|
|
135
|
+
|
|
131
136
|
Record the wheel and source-distribution filenames and SHA-256 digests. Inspect
|
|
132
137
|
their metadata and confirm Jinja2 is the only base direct runtime dependency,
|
|
133
138
|
required public documents are in the source distribution, and ignored specs,
|
|
@@ -137,8 +142,13 @@ characterized SDK pins and are not required by base/offline installs. The usage
|
|
|
137
142
|
schema and [Workspace guide](WORKSPACE_USAGE.md) must be in the sdist. Run the
|
|
138
143
|
fake-HTTP/actual-SDK collection tests independently for both platforms; these
|
|
139
144
|
are not fresh live Adobe qualification. Review optional-extra dependency exports
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
before publication. Fresh, explicitly authorized CJA Workspace collection remains
|
|
146
|
+
required for release qualification. Live AA Workspace access or collection is
|
|
147
|
+
optional and does not block release; retain the AA fake-HTTP/actual-SDK tests and
|
|
148
|
+
saved-evidence replay checks. This exception does not remove fresh AA catalog
|
|
149
|
+
qualification below or alter collection authorization and privacy requirements.
|
|
150
|
+
Never run live collection as an unannounced test or read a maintainer's credential
|
|
151
|
+
sources.
|
|
142
152
|
Extract the wheel and source distribution long descriptions and confirm their
|
|
143
153
|
repository-owned links are absolute, map to tracked content, and match the
|
|
144
154
|
source README. Inspect built metadata for the expected Homepage, Documentation,
|
|
@@ -161,9 +171,12 @@ uvx --python 3.12 pip-audit --disable-pip --no-deps \
|
|
|
161
171
|
|
|
162
172
|
The audit must report no known vulnerabilities. Record the `pip-audit`
|
|
163
173
|
version, vulnerability database date if reported, exact exported dependency
|
|
164
|
-
set, and result.
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
set, and result. Release license signoff covers the project `LICENSE` and the
|
|
175
|
+
vendored D3 ISC notice in
|
|
176
|
+
[`THIRD_PARTY_LICENSES`](../THIRD_PARTY_LICENSES), including their presence in
|
|
177
|
+
shipped artifacts. No separate resolved or optional Python dependency license
|
|
178
|
+
review or license-owner approval is a release gate. This signoff scope does not
|
|
179
|
+
change third-party license obligations.
|
|
167
180
|
|
|
168
181
|
## Upstream compatibility and private corpus
|
|
169
182
|
|
|
@@ -320,7 +333,7 @@ checklist remains authoritative.
|
|
|
320
333
|
| R11 immutable action pins | workflow-policy check | pending |
|
|
321
334
|
| R12 PyPI-before-GitHub ordering | workflow-policy check + authorized tag run | pending |
|
|
322
335
|
| R13 installed artifacts | wheel/sdist smoke + digests | pending |
|
|
323
|
-
| R14 minimal runtime dependencies | metadata/export/audit/
|
|
336
|
+
| R14 minimal runtime dependencies | metadata/export/audit and project/D3 notice evidence | pending |
|
|
324
337
|
| R15 shipped, consistent docs | Markdown links + source-distribution check | pending |
|
|
325
338
|
| R16 safe sharing guidance | README review | pending |
|
|
326
339
|
| R17 current compatibility | privacy-safe fresh/corpus record | pending |
|