sdr-visualizer 1.2.0__tar.gz → 1.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/CHANGELOG.md +34 -1
  2. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/CONTRIBUTING.md +4 -0
  3. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/PKG-INFO +74 -50
  4. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/README.md +73 -49
  5. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/LINEAGE.md +8 -3
  6. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/PRODUCT_CONTRACT.md +2 -2
  7. sdr_visualizer-1.2.2/docs/RELEASE_EVIDENCE_TEMPLATE.md +363 -0
  8. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/RELEASING.md +4 -3
  9. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/WORKSPACE_USAGE.md +110 -76
  10. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/pyproject.toml +1 -1
  11. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/__init__.py +1 -1
  12. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/adapters/aa.py +1 -1
  13. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/adapters/cja.py +1 -1
  14. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/lineage.py +3 -1
  15. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/lineage_discovery.py +1 -1
  16. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/collector.py +13 -2
  17. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_adapters_cja.py +3 -3
  18. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_lineage_cli.py +4 -1
  19. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_lineage_discovery.py +43 -2
  20. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_release_documentation.py +4 -3
  21. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_collection.py +36 -0
  22. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/.gitignore +0 -0
  23. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/CODE_OF_CONDUCT.md +0 -0
  24. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/LICENSE +0 -0
  25. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/SECURITY.md +0 -0
  26. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/THIRD_PARTY_LICENSES +0 -0
  27. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/ADAPTER_CORRECTNESS_1.1.2.md +0 -0
  28. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/ADAPTER_GUIDE.md +0 -0
  29. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/ARCHITECTURE.md +0 -0
  30. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/EMBEDDED_DATA_FORMAT.md +0 -0
  31. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/PERFORMANCE.md +0 -0
  32. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/payload-schema.json +0 -0
  33. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/docs/workspace-usage-schema.json +0 -0
  34. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/capture_screenshot.py +0 -0
  35. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/check_color_pack_parity.py +0 -0
  36. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/check_markdown_links.py +0 -0
  37. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/check_workflow_policy.py +0 -0
  38. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/corpus_check.py +0 -0
  39. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/generate_aa_large_fixture.py +0 -0
  40. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/generate_cja_lineage_poc.py +0 -0
  41. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/generate_examples.py +0 -0
  42. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/generate_large_fixture.py +0 -0
  43. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/mutate_fixture.py +0 -0
  44. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/package_smoke_check.py +0 -0
  45. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/perf_browser_check.py +0 -0
  46. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/perf_check.py +0 -0
  47. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/perf_lineage_poc.py +0 -0
  48. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/scripts/workspace_usage_fixture.py +0 -0
  49. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/__main__.py +0 -0
  50. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/adapters/__init__.py +0 -0
  51. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/adapters/base.py +0 -0
  52. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/adapters/cja_lineage.py +0 -0
  53. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/__init__.py +0 -0
  54. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/diff.py +0 -0
  55. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/formula_tree.py +0 -0
  56. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/lineage_layout.py +0 -0
  57. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/references.py +0 -0
  58. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/segment_tree.py +0 -0
  59. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/analysis/trend.py +0 -0
  60. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/__init__.py +0 -0
  61. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/exit_codes.py +0 -0
  62. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/lineage_output.py +0 -0
  63. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/main.py +0 -0
  64. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/output_safety.py +0 -0
  65. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/cli/workspace_usage.py +0 -0
  66. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/__init__.py +0 -0
  67. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/exceptions.py +0 -0
  68. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/lineage.py +0 -0
  69. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/models.py +0 -0
  70. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/structure_limits.py +0 -0
  71. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/visualizer.py +0 -0
  72. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/core/workspace_usage.py +0 -0
  73. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/__init__.py +0 -0
  74. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/detect.py +0 -0
  75. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/loader.py +0 -0
  76. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/series.py +0 -0
  77. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/shell_out.py +0 -0
  78. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/input/workspace_usage.py +0 -0
  79. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/__init__.py +0 -0
  80. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/color_packs.py +0 -0
  81. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/data_payload.py +0 -0
  82. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/lineage_payload.py +0 -0
  83. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/lineage_renderer.py +0 -0
  84. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/renderer.py +0 -0
  85. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/cja_lineage.css +0 -0
  86. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/cja_lineage.js +0 -0
  87. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/cja_lineage_graph.js +0 -0
  88. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/cja_lineage_roles.js +0 -0
  89. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/d3.min.js +0 -0
  90. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/visualizer.css +0 -0
  91. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/visualizer.js +0 -0
  92. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/static/visualizer_trend.js +0 -0
  93. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/catalog.html.j2 +0 -0
  94. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/changes.html.j2 +0 -0
  95. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/cja_lineage.html.j2 +0 -0
  96. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/graph.html.j2 +0 -0
  97. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/index.html.j2 +0 -0
  98. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/templates/trend.html.j2 +0 -0
  99. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/trend_charts.py +0 -0
  100. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/render/workspace_usage.py +0 -0
  101. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/__init__.py +0 -0
  102. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/aa_api.py +0 -0
  103. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/aa_sdk.py +0 -0
  104. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/auth.py +0 -0
  105. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/cja_api.py +0 -0
  106. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/cja_sdk.py +0 -0
  107. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/normalize.py +0 -0
  108. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/sdk_worker.py +0 -0
  109. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/src/sdr_visualizer/usage/transport.py +0 -0
  110. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/__init__.py +0 -0
  111. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/adapter_cases.py +0 -0
  112. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/browser_support.py +0 -0
  113. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/conftest.py +0 -0
  114. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/__init__.py +0 -0
  115. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/aa_snapshot_clean.json +0 -0
  116. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/aa_snapshot_messy.json +0 -0
  117. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_lineage_degraded.json +0 -0
  118. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_lineage_enriched.json +0 -0
  119. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_lineage_hostile.json +0 -0
  120. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_lineage_shared.json +0 -0
  121. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_snapshot_clean.json +0 -0
  122. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_snapshot_hostile.json +0 -0
  123. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_snapshot_messy.json +0 -0
  124. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/cja_snapshot_minimal.json +0 -0
  125. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/workspace_usage_aa_all_types.json +0 -0
  126. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/fixtures/workspace_usage_cja_all_types.json +0 -0
  127. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_adapter_correctness.py +0 -0
  128. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_adapter_fuzz.py +0 -0
  129. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_adapters_aa.py +0 -0
  130. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_analysis_diff.py +0 -0
  131. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_analysis_formula_tree.py +0 -0
  132. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_analysis_references.py +0 -0
  133. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_analysis_segment_tree.py +0 -0
  134. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_analysis_trend.py +0 -0
  135. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_browser_functional.py +0 -0
  136. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_browser_support.py +0 -0
  137. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_cja_lineage.py +0 -0
  138. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_cja_lineage_driver.py +0 -0
  139. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_cli.py +0 -0
  140. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_cli_flags.py +0 -0
  141. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_color_pack_parity.py +0 -0
  142. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_color_packs.py +0 -0
  143. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_corpus_check.py +0 -0
  144. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_data_payload.py +0 -0
  145. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_entrypoint.py +0 -0
  146. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_generate_examples.py +0 -0
  147. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_input_modes.py +0 -0
  148. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_input_series.py +0 -0
  149. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_lineage_browser.py +0 -0
  150. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_lineage_performance.py +0 -0
  151. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_lineage_renderer.py +0 -0
  152. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_markdown_links.py +0 -0
  153. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_minimal_fixture.py +0 -0
  154. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_mutate_fixture.py +0 -0
  155. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_output_safety.py +0 -0
  156. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_package_smoke_check.py +0 -0
  157. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_payload_schema.py +0 -0
  158. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_perf.py +0 -0
  159. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_perf_browser_check.py +0 -0
  160. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_renderer.py +0 -0
  161. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_renderer_anatomy.py +0 -0
  162. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_renderer_graph.py +0 -0
  163. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_semantic_properties.py +0 -0
  164. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_structure_limits.py +0 -0
  165. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_trend_charts.py +0 -0
  166. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workflow_policy.py +0 -0
  167. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage.py +0 -0
  168. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_aa_sdk.py +0 -0
  169. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_auth.py +0 -0
  170. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_cja_sdk.py +0 -0
  171. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_cli.py +0 -0
  172. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_offline.py +0 -0
  173. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_payload.py +0 -0
  174. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_perf.py +0 -0
  175. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_sdk.py +0 -0
  176. {sdr_visualizer-1.2.0 → sdr_visualizer-1.2.2}/tests/test_workspace_usage_transport.py +0 -0
@@ -4,6 +4,37 @@ All notable changes to `sdr-visualizer` will be documented here. The format foll
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.2.2] - 2026-09-21
8
+
9
+ ### Changed
10
+
11
+ - Advance the tested-through generator markers to `cja_auto_sdr` 3.12.4 and
12
+ `aa_auto_sdr` 1.21.15. Both were qualified with a fresh production snapshot
13
+ and the full historical private corpus, so snapshots from those versions no
14
+ longer raise a newer-than-tested warning.
15
+ - Carry the streamlined README into the published package so the PyPI project
16
+ description matches the repository.
17
+
18
+ ## [1.2.1] - 2026-09-21
19
+
20
+ ### Fixed
21
+
22
+ - Handle a Workspace worker exit race during process-group cleanup on macOS.
23
+ A rejected signal is accepted only after the child exits within the existing
24
+ two-second wait; a still-running child retains the original error.
25
+ - Accept the exactly qualified `cja_auto_sdr` 3.12.2 and 3.12.4 executables for
26
+ CJA lineage discovery. Other unqualified versions continue to fail closed
27
+ before live acquisition.
28
+
29
+ ### Changed
30
+
31
+ - Correct README and Workspace onboarding guidance for saved snapshots, live
32
+ collection, authentication, supported output, and safe sharing.
33
+ - Add a reusable release-evidence template for exact-candidate qualification,
34
+ publication authorization, public verification, and announcement decisions.
35
+ - Document the repository's current maintainer review model and preserve required
36
+ checks and pre-release settings inspection.
37
+
7
38
  ## [1.2.0] - 2026-09-12
8
39
 
9
40
  ### Added
@@ -682,7 +713,9 @@ The following are explicitly internal and may change without notice:
682
713
  - Workspace project visualization (v0.4)
683
714
  - Schema map view (v0.5)
684
715
 
685
- [Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.0...HEAD
716
+ [Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.2...HEAD
717
+ [1.2.2]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.2
718
+ [1.2.1]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.1
686
719
  [1.2.0]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.0
687
720
  [1.1.7]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.1.7
688
721
  [1.1.6]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.1.6
@@ -61,6 +61,10 @@ Every PR needs: tests for behavior changes, a green suite, clean
61
61
  coverage from the non-browser Python suite, and green browser/perf gates when
62
62
  the change could plausibly affect them.
63
63
 
64
+ Current repository settings permit maintainer self-review and require zero
65
+ independent approvals. Required checks still apply. Maintainers re-inspect these
66
+ settings before each release and record the result in the release evidence.
67
+
64
68
  Release artifacts are not considered usable merely because `uv build`
65
69
  succeeds. The package smoke check installs the wheel and source distribution
66
70
  independently into temporary environments outside the checkout, then verifies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sdr-visualizer
3
- Version: 1.2.0
3
+ Version: 1.2.2
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
@@ -45,10 +45,10 @@ Static-output visual catalog generator for Adobe Customer Journey Analytics (CJA
45
45
 
46
46
  **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
47
 
48
- The output is one HTML file: no server, no consumer-side build step, and no
49
- CDN dependencies. Its JSON, CSS, JavaScript, and D3 runtime are embedded, so it
50
- opens in a modern browser without an internet connection and makes no network
51
- requests.
48
+ The output is one HTML file. There is no server, no consumer-side build step,
49
+ and no CDN dependency. Its JSON, CSS, JavaScript, and D3 runtime are all
50
+ embedded, so it opens in a modern browser with no internet connection and makes
51
+ no network requests.
52
52
 
53
53
  Offline does not mean cleared for distribution. A report can contain
54
54
  implementation and component names, descriptions, segment and
@@ -57,6 +57,22 @@ Treat it as derived from the source snapshot. Move, email, post, or attach it
57
57
  only in authorized locations and in accordance with your organization's
58
58
  confidentiality and data-handling policy.
59
59
 
60
+ ## Public preview scope
61
+
62
+ This project is in public preview. A report describes what is configured in a
63
+ snapshot. It does not grade the implementation, and it does not confirm that a
64
+ configuration is correct, complete, or working at runtime. Review the details
65
+ against the source implementation before you act on them.
66
+
67
+ The report embeds the supported normalized component catalog, not every
68
+ platform-specific field. Optional Workspace project references are unverified
69
+ candidates, and an empty result never means a component is unused. Keep the
70
+ original generator snapshot for anything the report does not embed.
71
+
72
+ The tool is verified on Ubuntu with Python 3.11, 3.12, and 3.14. Other platforms
73
+ and later Python versions are not yet verified. The package installs on Python
74
+ 3.11 or newer.
75
+
60
76
  ## Install
61
77
 
62
78
  Install from PyPI with uv:
@@ -99,7 +115,7 @@ sdr-visualizer snapshot_new.json --compare-to snapshot_old.json
99
115
  sdr-visualizer ./snapshots/ --trend
100
116
  ```
101
117
 
102
- The output lands at `./visualize-{instance_id}-{timestamp}.html` by default. Open it in a browser — that's the whole experience.
118
+ The output lands at `./visualize-{instance_id}-{timestamp}.html` by default. Open it in a browser. That is the whole experience.
103
119
 
104
120
  Standard input is also supported when another process already emits a complete
105
121
  compatible snapshot:
@@ -108,13 +124,16 @@ compatible snapshot:
108
124
  some-snapshot-command | sdr-visualizer -
109
125
  ```
110
126
 
111
- ## Live CJA
127
+ ## Live modes
128
+
129
+ Both live modes call a separate generator that you install and authenticate
130
+ yourself. Follow that project's current setup, then confirm the executable is on
131
+ your `PATH`. Either generator may require a newer Python version than
132
+ sdr-visualizer's Python 3.11 minimum. The upstream repository is authoritative
133
+ for credentials, permissions, and generator compatibility.
112
134
 
113
- Live CJA mode requires the separate
114
- [`cja_auto_sdr`](https://github.com/brian-a-au/cja_auto_sdr) executable. Follow
115
- that project's current installation, configuration, and authentication
116
- instructions, then confirm `cja_auto_sdr` is on your `PATH`. Its generator may
117
- require a newer Python version than sdr-visualizer's Python 3.11 minimum.
135
+ Live CJA mode uses the
136
+ [`cja_auto_sdr`](https://github.com/brian-a-au/cja_auto_sdr) executable:
118
137
 
119
138
  ```bash
120
139
  sdr-visualizer --dataview dv_prod_web
@@ -122,39 +141,37 @@ sdr-visualizer --dataview dv_prod_web
122
141
 
123
142
  sdr-visualizer runs the generator with JSON output, a temporary output
124
143
  directory, and `--include-all-inventory`, then selects the generated snapshot.
125
- The temporary source data is removed after the report is built. This is not a
126
- stdin pipeline: CJA's complete inventory is directory-backed.
144
+ It removes the temporary source data after the report is built. This is not a
145
+ stdin pipeline. CJA's complete inventory comes from a directory of files.
127
146
 
128
- ## Live AA
129
-
130
- Live AA mode likewise requires the separate
131
- [`aa_auto_sdr`](https://github.com/brian-a-au/aa_auto_sdr) executable. Complete
132
- its current setup and authentication steps, and confirm `aa_auto_sdr` is on your
133
- `PATH`. The generator may require a newer Python version than sdr-visualizer.
147
+ Live AA mode uses the
148
+ [`aa_auto_sdr`](https://github.com/brian-a-au/aa_auto_sdr) executable:
134
149
 
135
150
  ```bash
136
151
  sdr-visualizer --rsid prod_us
137
152
  ```
138
153
 
139
- AA live mode reads the generator JSON snapshot from stdout and embeds the
140
- supported normalized component catalog in the report. Retain the original
154
+ AA live mode reads the generator's JSON snapshot from stdout and embeds the
155
+ supported normalized component catalog in the report. Keep the original
141
156
  generator snapshot when you need platform-specific details that the visualizer
142
- does not embed. For both live modes, the upstream repository is authoritative
143
- for credentials, permissions, and generator compatibility.
157
+ does not embed.
144
158
 
145
159
  ## Optional Workspace project usage
146
160
 
147
161
  Add project-usage evidence while generating the HTML. Install the independent
148
- extra for your platform, then opt in to collection using an existing credential
149
- source:
162
+ extra for your platform with uv, then opt in to collection using an existing
163
+ credential source. The CJA and AA extras are independent; use the one that
164
+ matches your snapshot:
150
165
 
151
166
  ```bash
152
- pip install 'sdr-visualizer[workspace-cja]'
167
+ uv tool install 'sdr-visualizer[workspace-cja]'
153
168
  sdr-visualizer snapshots/cja.json --collect-workspace-usage \
154
169
  --workspace-usage-org 'EXAMPLE@AdobeOrg' \
155
170
  --workspace-usage-config ../credentials/adobe.json --output cja.html
171
+ ```
156
172
 
157
- pip install 'sdr-visualizer[workspace-aa]'
173
+ ```bash
174
+ uv tool install 'sdr-visualizer[workspace-aa]'
158
175
  sdr-visualizer snapshots/aa.json --collect-workspace-usage \
159
176
  --workspace-usage-org 'EXAMPLE@AdobeOrg' --workspace-usage-company example-company \
160
177
  --workspace-usage-config ../credentials/adobe.json --output aa.html
@@ -164,7 +181,8 @@ Each command automatically writes HTML and `<html-stem>.workspace-usage.json`.
164
181
  Existing snapshots and live exporter modes work without exporter changes.
165
182
  The catalog shows possible project references separately from component
166
183
  dependencies, with check time and coverage limits. SDK matches remain
167
- unverified candidates; empty results never mean unused or safe to delete.
184
+ unverified candidates. Empty results never mean a component is unused or safe
185
+ to delete.
168
186
  Opening the HTML and replaying the saved usage file need no credentials or
169
187
  network access. See the
170
188
  [Workspace usage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md)
@@ -176,6 +194,8 @@ for collection scopes, offline replay, identity binding, limits, and privacy.
176
194
  |---|---|
177
195
  | `--output PATH` | Write HTML somewhere specific. |
178
196
  | `--json PATH` | Also emit the embedded payload as a separate JSON file (useful for downstream tooling). |
197
+ | `--collect-workspace-usage` | Collect optional Workspace project-usage evidence; see the [Workspace usage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md). |
198
+ | `--workspace-usage PATH` | Replay saved Workspace usage evidence with the original snapshot. |
179
199
  | `--title TEXT` | Override the document title. |
180
200
  | `--color-pack CODE` | Select `default`, `ADBE`, `OMTR`, or `BLUE` for HTML presentation (case-sensitive). |
181
201
  | `--exclude-orphans` | Default the catalog's references filter to "Referenced" — hides components nothing depends on. |
@@ -206,9 +226,9 @@ Color-pack selection changes HTML presentation only. It does not add to or
206
226
  alter the embedded JSON or a `--json` sidecar. The pack CSS, report data, and
207
227
  runtime remain embedded in the single offline HTML file.
208
228
 
209
- The named packs are palette-inspired alternatives, not official brand assets
210
- or claims of affiliation or endorsement, and they contain no company or
211
- product logos. Each pack is checked against the project's declared WCAG text
229
+ The named packs are alternative palettes. They are not official brand assets or
230
+ claims of affiliation or endorsement, and they contain no company or product
231
+ logos. Each pack is checked against the project's declared WCAG text
212
232
  and essential-graphics contrast pairs. Text labels and other non-color cues
213
233
  continue to communicate state, and reviewed print colors keep reports legible
214
234
  when printed.
@@ -222,9 +242,14 @@ Every report has two base top-level views:
222
242
 
223
243
  Segment anatomy and calculated-metric anatomy are contextual detail content,
224
244
  not separate navigation destinations. They open from the Catalog detail panel.
225
- Segment anatomy renders nested containers and references; calculated-metric
245
+ Segment anatomy renders nested containers and references. Calculated-metric
226
246
  anatomy renders operations, operands, and metric references.
227
247
 
248
+ You can restore an exact view from its address. The catalog's filters, sort,
249
+ view, and open detail panel are encoded in the URL hash, so within an
250
+ authorized report location you can copy the address bar to reload the same
251
+ filtered view.
252
+
228
253
  At most one conditional top-level view is added. With `--compare-to`, a
229
254
  **Changes** view appears, listing components
230
255
  added, removed, and modified relative to a baseline snapshot, with
@@ -237,18 +262,16 @@ per-interval change log. The window is capped at the 60 most recent
237
262
  snapshots.
238
263
 
239
264
  A trend directory must hold snapshots of a single implementation. If it mixes
240
- CJA and AA snapshots, pass `--platform cja|aa` to select one (or point at a
241
- single-platform directory); without it the run stops rather than guess. If it
242
- mixes data views or report suites, the run stops as well. This mirrors
243
- `--compare-to`, which refuses both a platform and an instance mismatch, so
265
+ CJA and AA snapshots, pass `--platform cja|aa` to select one, or point at a
266
+ single-platform directory. Without that, the run stops rather than guess. If it
267
+ mixes data views or report suites, the run also stops. `--compare-to` behaves
268
+ the same way and refuses both a platform mismatch and an instance mismatch, so
244
269
  neither view ever diffs unrelated inventories. To compare or chart across
245
- different data views or report suites on purpose (for example staging versus
246
- prod drift), pass `--allow-instance-mismatch`; the run then proceeds with a
270
+ different data views or report suites on purpose, for example staging versus
271
+ prod drift, pass `--allow-instance-mismatch`. The run then proceeds with a
247
272
  warning. Platform mismatches are always rejected. The report shown alongside
248
273
  the trend is the newest usable snapshot in the directory.
249
274
 
250
- - **Restorable report links** — the catalog's filters, sort, view, and open detail panel are encoded in the URL hash. Within an authorized report location, copy the address bar to restore the same filtered view.
251
-
252
275
  ## Performance budget
253
276
 
254
277
  The output is CI-gated against the budgets in
@@ -257,8 +280,8 @@ Build time and HTML size are enforced at every published tier (100 / 500 / 1,000
257
280
  components). Browser-measured budgets are enforced at the 1,000-component tier
258
281
  (initial render < 1s, filter/search < 150ms) and the 2,000-component tier
259
282
  (< 2s, < 300ms), plus a 700ms cap on the graph view's main-thread block.
260
- These guarantees cover up to 8,000 reference edges; denser valid reports use
261
- an explicit graph opt-in and sit outside the published size/latency envelope.
283
+ These guarantees cover up to 8,000 reference edges. Denser valid reports use an
284
+ explicit graph opt-in and sit outside the published size and latency limits.
262
285
  Functional browser tests cover Chromium and WebKit. A separate Chromium-only
263
286
  performance gate measures all four component tiers; this is not a timing
264
287
  guarantee for every branded browser.
@@ -302,8 +325,8 @@ the schema as loosely specified. Current-generator and private-corpus
302
325
  validation is a separate, recorded release gate; see
303
326
  [`docs/RELEASING.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/RELEASING.md).
304
327
 
305
- **CJA lineage.** Starting with 1.1.0, `cja-lineage` adds a separate CJA-only
306
- command. Its documented arguments and exit codes are described in the
328
+ **CJA lineage.** `cja-lineage` adds a separate CJA-only command. Its documented
329
+ arguments and exit codes are described in the
307
330
  [lineage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/LINEAGE.md).
308
331
  Its embedded payload and Python modules are internal and do not extend the
309
332
  catalog schema or JSON sidecar contract.
@@ -317,14 +340,15 @@ Warnings (snapshot generator newer than the tested version; 5,000+ component rep
317
340
  Requires Python 3.11+ and [uv](https://github.com/astral-sh/uv).
318
341
 
319
342
  ```bash
320
- uv sync --all-extras # Set up environment, including optional SDK tests
321
- uv run pytest # Run tests (auto-generates the large fixture on first run)
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)
322
346
  uv run ruff check # Lint
323
347
  uv run ruff format # Auto-format
324
348
 
325
349
  uv run python scripts/generate_examples.py # Regenerate examples/
326
- uv run python scripts/check_color_pack_parity.py \\
327
- --visualizer-sha <candidate-commit-sha> \\
350
+ uv run python scripts/check_color_pack_parity.py \
351
+ --visualizer-sha <candidate-commit-sha> \
328
352
  --grader-root ../sdr-grader --grader-sha <linked-grader-commit-sha>
329
353
  uv run python scripts/perf_check.py # Run the perf gate
330
354
  uv run python scripts/check_markdown_links.py
@@ -337,7 +361,7 @@ uv run python scripts/package_smoke_check.py dist/packages/
337
361
 
338
362
  See which Adobe Experience Platform (AEP) datasets feed your CJA Connections
339
363
  and which Data Views use those Connections. The **`cja-lineage`** command is
340
- included when you install `sdr-visualizer` (version 1.1.0 or later).
364
+ included when you install `sdr-visualizer`.
341
365
 
342
366
  Start with a saved dataset discovery JSON file from
343
367
  `cja_auto_sdr --list-datasets --format json --output -`. This file lists datasets
@@ -22,10 +22,10 @@ Static-output visual catalog generator for Adobe Customer Journey Analytics (CJA
22
22
 
23
23
  **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
24
 
25
- The output is one HTML file: no server, no consumer-side build step, and no
26
- CDN dependencies. Its JSON, CSS, JavaScript, and D3 runtime are embedded, so it
27
- opens in a modern browser without an internet connection and makes no network
28
- requests.
25
+ The output is one HTML file. There is no server, no consumer-side build step,
26
+ and no CDN dependency. Its JSON, CSS, JavaScript, and D3 runtime are all
27
+ embedded, so it opens in a modern browser with no internet connection and makes
28
+ no network requests.
29
29
 
30
30
  Offline does not mean cleared for distribution. A report can contain
31
31
  implementation and component names, descriptions, segment and
@@ -34,6 +34,22 @@ Treat it as derived from the source snapshot. Move, email, post, or attach it
34
34
  only in authorized locations and in accordance with your organization's
35
35
  confidentiality and data-handling policy.
36
36
 
37
+ ## Public preview scope
38
+
39
+ This project is in public preview. A report describes what is configured in a
40
+ snapshot. It does not grade the implementation, and it does not confirm that a
41
+ configuration is correct, complete, or working at runtime. Review the details
42
+ against the source implementation before you act on them.
43
+
44
+ The report embeds the supported normalized component catalog, not every
45
+ platform-specific field. Optional Workspace project references are unverified
46
+ candidates, and an empty result never means a component is unused. Keep the
47
+ original generator snapshot for anything the report does not embed.
48
+
49
+ The tool is verified on Ubuntu with Python 3.11, 3.12, and 3.14. Other platforms
50
+ and later Python versions are not yet verified. The package installs on Python
51
+ 3.11 or newer.
52
+
37
53
  ## Install
38
54
 
39
55
  Install from PyPI with uv:
@@ -76,7 +92,7 @@ sdr-visualizer snapshot_new.json --compare-to snapshot_old.json
76
92
  sdr-visualizer ./snapshots/ --trend
77
93
  ```
78
94
 
79
- The output lands at `./visualize-{instance_id}-{timestamp}.html` by default. Open it in a browser — that's the whole experience.
95
+ The output lands at `./visualize-{instance_id}-{timestamp}.html` by default. Open it in a browser. That is the whole experience.
80
96
 
81
97
  Standard input is also supported when another process already emits a complete
82
98
  compatible snapshot:
@@ -85,13 +101,16 @@ compatible snapshot:
85
101
  some-snapshot-command | sdr-visualizer -
86
102
  ```
87
103
 
88
- ## Live CJA
104
+ ## Live modes
105
+
106
+ Both live modes call a separate generator that you install and authenticate
107
+ yourself. Follow that project's current setup, then confirm the executable is on
108
+ your `PATH`. Either generator may require a newer Python version than
109
+ sdr-visualizer's Python 3.11 minimum. The upstream repository is authoritative
110
+ for credentials, permissions, and generator compatibility.
89
111
 
90
- Live CJA mode requires the separate
91
- [`cja_auto_sdr`](https://github.com/brian-a-au/cja_auto_sdr) executable. Follow
92
- that project's current installation, configuration, and authentication
93
- instructions, then confirm `cja_auto_sdr` is on your `PATH`. Its generator may
94
- require a newer Python version than sdr-visualizer's Python 3.11 minimum.
112
+ Live CJA mode uses the
113
+ [`cja_auto_sdr`](https://github.com/brian-a-au/cja_auto_sdr) executable:
95
114
 
96
115
  ```bash
97
116
  sdr-visualizer --dataview dv_prod_web
@@ -99,39 +118,37 @@ sdr-visualizer --dataview dv_prod_web
99
118
 
100
119
  sdr-visualizer runs the generator with JSON output, a temporary output
101
120
  directory, and `--include-all-inventory`, then selects the generated snapshot.
102
- The temporary source data is removed after the report is built. This is not a
103
- stdin pipeline: CJA's complete inventory is directory-backed.
121
+ It removes the temporary source data after the report is built. This is not a
122
+ stdin pipeline. CJA's complete inventory comes from a directory of files.
104
123
 
105
- ## Live AA
106
-
107
- Live AA mode likewise requires the separate
108
- [`aa_auto_sdr`](https://github.com/brian-a-au/aa_auto_sdr) executable. Complete
109
- its current setup and authentication steps, and confirm `aa_auto_sdr` is on your
110
- `PATH`. The generator may require a newer Python version than sdr-visualizer.
124
+ Live AA mode uses the
125
+ [`aa_auto_sdr`](https://github.com/brian-a-au/aa_auto_sdr) executable:
111
126
 
112
127
  ```bash
113
128
  sdr-visualizer --rsid prod_us
114
129
  ```
115
130
 
116
- AA live mode reads the generator JSON snapshot from stdout and embeds the
117
- supported normalized component catalog in the report. Retain the original
131
+ AA live mode reads the generator's JSON snapshot from stdout and embeds the
132
+ supported normalized component catalog in the report. Keep the original
118
133
  generator snapshot when you need platform-specific details that the visualizer
119
- does not embed. For both live modes, the upstream repository is authoritative
120
- for credentials, permissions, and generator compatibility.
134
+ does not embed.
121
135
 
122
136
  ## Optional Workspace project usage
123
137
 
124
138
  Add project-usage evidence while generating the HTML. Install the independent
125
- extra for your platform, then opt in to collection using an existing credential
126
- source:
139
+ extra for your platform with uv, then opt in to collection using an existing
140
+ credential source. The CJA and AA extras are independent; use the one that
141
+ matches your snapshot:
127
142
 
128
143
  ```bash
129
- pip install 'sdr-visualizer[workspace-cja]'
144
+ uv tool install 'sdr-visualizer[workspace-cja]'
130
145
  sdr-visualizer snapshots/cja.json --collect-workspace-usage \
131
146
  --workspace-usage-org 'EXAMPLE@AdobeOrg' \
132
147
  --workspace-usage-config ../credentials/adobe.json --output cja.html
148
+ ```
133
149
 
134
- pip install 'sdr-visualizer[workspace-aa]'
150
+ ```bash
151
+ uv tool install 'sdr-visualizer[workspace-aa]'
135
152
  sdr-visualizer snapshots/aa.json --collect-workspace-usage \
136
153
  --workspace-usage-org 'EXAMPLE@AdobeOrg' --workspace-usage-company example-company \
137
154
  --workspace-usage-config ../credentials/adobe.json --output aa.html
@@ -141,7 +158,8 @@ Each command automatically writes HTML and `<html-stem>.workspace-usage.json`.
141
158
  Existing snapshots and live exporter modes work without exporter changes.
142
159
  The catalog shows possible project references separately from component
143
160
  dependencies, with check time and coverage limits. SDK matches remain
144
- unverified candidates; empty results never mean unused or safe to delete.
161
+ unverified candidates. Empty results never mean a component is unused or safe
162
+ to delete.
145
163
  Opening the HTML and replaying the saved usage file need no credentials or
146
164
  network access. See the
147
165
  [Workspace usage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md)
@@ -153,6 +171,8 @@ for collection scopes, offline replay, identity binding, limits, and privacy.
153
171
  |---|---|
154
172
  | `--output PATH` | Write HTML somewhere specific. |
155
173
  | `--json PATH` | Also emit the embedded payload as a separate JSON file (useful for downstream tooling). |
174
+ | `--collect-workspace-usage` | Collect optional Workspace project-usage evidence; see the [Workspace usage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/WORKSPACE_USAGE.md). |
175
+ | `--workspace-usage PATH` | Replay saved Workspace usage evidence with the original snapshot. |
156
176
  | `--title TEXT` | Override the document title. |
157
177
  | `--color-pack CODE` | Select `default`, `ADBE`, `OMTR`, or `BLUE` for HTML presentation (case-sensitive). |
158
178
  | `--exclude-orphans` | Default the catalog's references filter to "Referenced" — hides components nothing depends on. |
@@ -183,9 +203,9 @@ Color-pack selection changes HTML presentation only. It does not add to or
183
203
  alter the embedded JSON or a `--json` sidecar. The pack CSS, report data, and
184
204
  runtime remain embedded in the single offline HTML file.
185
205
 
186
- The named packs are palette-inspired alternatives, not official brand assets
187
- or claims of affiliation or endorsement, and they contain no company or
188
- product logos. Each pack is checked against the project's declared WCAG text
206
+ The named packs are alternative palettes. They are not official brand assets or
207
+ claims of affiliation or endorsement, and they contain no company or product
208
+ logos. Each pack is checked against the project's declared WCAG text
189
209
  and essential-graphics contrast pairs. Text labels and other non-color cues
190
210
  continue to communicate state, and reviewed print colors keep reports legible
191
211
  when printed.
@@ -199,9 +219,14 @@ Every report has two base top-level views:
199
219
 
200
220
  Segment anatomy and calculated-metric anatomy are contextual detail content,
201
221
  not separate navigation destinations. They open from the Catalog detail panel.
202
- Segment anatomy renders nested containers and references; calculated-metric
222
+ Segment anatomy renders nested containers and references. Calculated-metric
203
223
  anatomy renders operations, operands, and metric references.
204
224
 
225
+ You can restore an exact view from its address. The catalog's filters, sort,
226
+ view, and open detail panel are encoded in the URL hash, so within an
227
+ authorized report location you can copy the address bar to reload the same
228
+ filtered view.
229
+
205
230
  At most one conditional top-level view is added. With `--compare-to`, a
206
231
  **Changes** view appears, listing components
207
232
  added, removed, and modified relative to a baseline snapshot, with
@@ -214,18 +239,16 @@ per-interval change log. The window is capped at the 60 most recent
214
239
  snapshots.
215
240
 
216
241
  A trend directory must hold snapshots of a single implementation. If it mixes
217
- CJA and AA snapshots, pass `--platform cja|aa` to select one (or point at a
218
- single-platform directory); without it the run stops rather than guess. If it
219
- mixes data views or report suites, the run stops as well. This mirrors
220
- `--compare-to`, which refuses both a platform and an instance mismatch, so
242
+ CJA and AA snapshots, pass `--platform cja|aa` to select one, or point at a
243
+ single-platform directory. Without that, the run stops rather than guess. If it
244
+ mixes data views or report suites, the run also stops. `--compare-to` behaves
245
+ the same way and refuses both a platform mismatch and an instance mismatch, so
221
246
  neither view ever diffs unrelated inventories. To compare or chart across
222
- different data views or report suites on purpose (for example staging versus
223
- prod drift), pass `--allow-instance-mismatch`; the run then proceeds with a
247
+ different data views or report suites on purpose, for example staging versus
248
+ prod drift, pass `--allow-instance-mismatch`. The run then proceeds with a
224
249
  warning. Platform mismatches are always rejected. The report shown alongside
225
250
  the trend is the newest usable snapshot in the directory.
226
251
 
227
- - **Restorable report links** — the catalog's filters, sort, view, and open detail panel are encoded in the URL hash. Within an authorized report location, copy the address bar to restore the same filtered view.
228
-
229
252
  ## Performance budget
230
253
 
231
254
  The output is CI-gated against the budgets in
@@ -234,8 +257,8 @@ Build time and HTML size are enforced at every published tier (100 / 500 / 1,000
234
257
  components). Browser-measured budgets are enforced at the 1,000-component tier
235
258
  (initial render < 1s, filter/search < 150ms) and the 2,000-component tier
236
259
  (< 2s, < 300ms), plus a 700ms cap on the graph view's main-thread block.
237
- These guarantees cover up to 8,000 reference edges; denser valid reports use
238
- an explicit graph opt-in and sit outside the published size/latency envelope.
260
+ These guarantees cover up to 8,000 reference edges. Denser valid reports use an
261
+ explicit graph opt-in and sit outside the published size and latency limits.
239
262
  Functional browser tests cover Chromium and WebKit. A separate Chromium-only
240
263
  performance gate measures all four component tiers; this is not a timing
241
264
  guarantee for every branded browser.
@@ -279,8 +302,8 @@ the schema as loosely specified. Current-generator and private-corpus
279
302
  validation is a separate, recorded release gate; see
280
303
  [`docs/RELEASING.md`](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/RELEASING.md).
281
304
 
282
- **CJA lineage.** Starting with 1.1.0, `cja-lineage` adds a separate CJA-only
283
- command. Its documented arguments and exit codes are described in the
305
+ **CJA lineage.** `cja-lineage` adds a separate CJA-only command. Its documented
306
+ arguments and exit codes are described in the
284
307
  [lineage guide](https://github.com/brian-a-au/sdr-visualizer/blob/main/docs/LINEAGE.md).
285
308
  Its embedded payload and Python modules are internal and do not extend the
286
309
  catalog schema or JSON sidecar contract.
@@ -294,14 +317,15 @@ Warnings (snapshot generator newer than the tested version; 5,000+ component rep
294
317
  Requires Python 3.11+ and [uv](https://github.com/astral-sh/uv).
295
318
 
296
319
  ```bash
297
- uv sync --all-extras # Set up environment, including optional SDK tests
298
- uv run pytest # Run tests (auto-generates the large fixture on first run)
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)
299
323
  uv run ruff check # Lint
300
324
  uv run ruff format # Auto-format
301
325
 
302
326
  uv run python scripts/generate_examples.py # Regenerate examples/
303
- uv run python scripts/check_color_pack_parity.py \\
304
- --visualizer-sha <candidate-commit-sha> \\
327
+ uv run python scripts/check_color_pack_parity.py \
328
+ --visualizer-sha <candidate-commit-sha> \
305
329
  --grader-root ../sdr-grader --grader-sha <linked-grader-commit-sha>
306
330
  uv run python scripts/perf_check.py # Run the perf gate
307
331
  uv run python scripts/check_markdown_links.py
@@ -314,7 +338,7 @@ uv run python scripts/package_smoke_check.py dist/packages/
314
338
 
315
339
  See which Adobe Experience Platform (AEP) datasets feed your CJA Connections
316
340
  and which Data Views use those Connections. The **`cja-lineage`** command is
317
- included when you install `sdr-visualizer` (version 1.1.0 or later).
341
+ included when you install `sdr-visualizer`.
318
342
 
319
343
  Start with a saved dataset discovery JSON file from
320
344
  `cja_auto_sdr --list-datasets --format json --output -`. This file lists datasets
@@ -43,9 +43,14 @@ Alternatively use `--profile profile-name`, or omit both credential selectors
43
43
  to use the upstream default credential route. `--profile` and `--config-file`
44
44
  are mutually exclusive and apply only to `--live`. The executable and explicit
45
45
  configuration paths must be absolute. Live discovery currently accepts exactly
46
- `cja_auto_sdr` 3.11.8 and 3.12.0. Other versions fail closed pending compatibility
47
- qualification; saved discovery is validated by shape rather than generator
48
- version. No generator is installed automatically.
46
+ `cja_auto_sdr` 3.11.8, 3.12.0, 3.12.2, and 3.12.4. Other versions fail closed pending
47
+ compatibility qualification; saved discovery is validated by shape rather than
48
+ generator version. Version 3.12.2 was qualified against the offline discovery
49
+ contract with synthetic inventories and blocked network access. That compatibility
50
+ check does not qualify credentials, network behavior, or a live release. No
51
+ generator is installed automatically. Version 3.12.4 was qualified with fresh
52
+ read-only dataset discovery and saved-shape validation; this does not imply
53
+ complete visibility into every dataset or Connection.
49
54
 
50
55
  The command currently targets macOS and Linux, using POSIX process and
51
56
  owner-only output protections. Windows execution is not qualified. The generated
@@ -207,8 +207,8 @@ unusable, and capped-out members do not warn. The current markers are:
207
207
 
208
208
  | Platform | Warning threshold |
209
209
  |---|---:|
210
- | CJA (`cja_auto_sdr`) | 3.11.7 |
211
- | AA (`aa_auto_sdr`) | 1.21.10 |
210
+ | CJA (`cja_auto_sdr`) | 3.12.4 |
211
+ | AA (`aa_auto_sdr`) | 1.21.15 |
212
212
 
213
213
  A marker is evidence of exercised compatibility, not a promise about every
214
214
  possible snapshot produced by that version. It may advance only after a