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.
Files changed (184) hide show
  1. sdr_visualizer-1.2.3/AGENTS.md +194 -0
  2. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/CHANGELOG.md +28 -1
  3. sdr_visualizer-1.2.3/CONTRIBUTING.md +15 -0
  4. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/PKG-INFO +9 -22
  5. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/README.md +7 -20
  6. sdr_visualizer-1.2.3/docs/DEPENDABOT_AUTOMATION.md +116 -0
  7. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/LINEAGE.md +5 -2
  8. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/PERFORMANCE.md +6 -0
  9. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/RELEASE_EVIDENCE_TEMPLATE.md +17 -6
  10. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/RELEASING.md +19 -6
  11. sdr_visualizer-1.2.3/docs/SHOWCASE.md +52 -0
  12. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/WORKSPACE_USAGE.md +1 -1
  13. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/pyproject.toml +3 -2
  14. sdr_visualizer-1.2.3/scripts/capture_screenshot.py +346 -0
  15. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_workflow_policy.py +7 -1
  16. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/corpus_check.py +8 -7
  17. sdr_visualizer-1.2.3/scripts/dependabot_review.py +377 -0
  18. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_browser_check.py +10 -10
  19. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_check.py +38 -31
  20. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/__init__.py +1 -1
  21. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer.js +17 -2
  22. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer_trend.js +8 -0
  23. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/normalize.py +1 -1
  24. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/sdk_worker.py +12 -1
  25. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_browser_functional.py +82 -0
  26. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_corpus_check.py +24 -0
  27. sdr_visualizer-1.2.3/tests/test_dependabot_review.py +428 -0
  28. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_performance.py +2 -1
  29. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_package_smoke_check.py +2 -1
  30. sdr_visualizer-1.2.3/tests/test_perf.py +162 -0
  31. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_perf_browser_check.py +47 -0
  32. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_release_documentation.py +7 -4
  33. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workflow_policy.py +25 -1
  34. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_aa_sdk.py +1 -1
  35. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_sdk.py +89 -0
  36. sdr_visualizer-1.2.2/CONTRIBUTING.md +0 -97
  37. sdr_visualizer-1.2.2/scripts/capture_screenshot.py +0 -60
  38. sdr_visualizer-1.2.2/tests/test_perf.py +0 -76
  39. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/.gitignore +0 -0
  40. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/CODE_OF_CONDUCT.md +0 -0
  41. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/LICENSE +0 -0
  42. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/SECURITY.md +0 -0
  43. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/THIRD_PARTY_LICENSES +0 -0
  44. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ADAPTER_CORRECTNESS_1.1.2.md +0 -0
  45. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ADAPTER_GUIDE.md +0 -0
  46. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/ARCHITECTURE.md +0 -0
  47. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/EMBEDDED_DATA_FORMAT.md +0 -0
  48. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/PRODUCT_CONTRACT.md +0 -0
  49. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/payload-schema.json +0 -0
  50. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/docs/workspace-usage-schema.json +0 -0
  51. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_color_pack_parity.py +0 -0
  52. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/check_markdown_links.py +0 -0
  53. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_aa_large_fixture.py +0 -0
  54. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_cja_lineage_poc.py +0 -0
  55. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_examples.py +0 -0
  56. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/generate_large_fixture.py +0 -0
  57. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/mutate_fixture.py +0 -0
  58. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/package_smoke_check.py +0 -0
  59. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/perf_lineage_poc.py +0 -0
  60. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/scripts/workspace_usage_fixture.py +0 -0
  61. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/__main__.py +0 -0
  62. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/__init__.py +0 -0
  63. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/aa.py +0 -0
  64. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/base.py +0 -0
  65. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/cja.py +0 -0
  66. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/adapters/cja_lineage.py +0 -0
  67. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/__init__.py +0 -0
  68. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/diff.py +0 -0
  69. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/formula_tree.py +0 -0
  70. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/lineage_layout.py +0 -0
  71. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/references.py +0 -0
  72. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/segment_tree.py +0 -0
  73. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/analysis/trend.py +0 -0
  74. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/__init__.py +0 -0
  75. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/exit_codes.py +0 -0
  76. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/lineage.py +0 -0
  77. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/lineage_output.py +0 -0
  78. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/main.py +0 -0
  79. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/output_safety.py +0 -0
  80. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/cli/workspace_usage.py +0 -0
  81. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/__init__.py +0 -0
  82. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/exceptions.py +0 -0
  83. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/lineage.py +0 -0
  84. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/models.py +0 -0
  85. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/structure_limits.py +0 -0
  86. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/visualizer.py +0 -0
  87. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/core/workspace_usage.py +0 -0
  88. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/__init__.py +0 -0
  89. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/detect.py +0 -0
  90. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/lineage_discovery.py +0 -0
  91. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/loader.py +0 -0
  92. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/series.py +0 -0
  93. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/shell_out.py +0 -0
  94. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/input/workspace_usage.py +0 -0
  95. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/__init__.py +0 -0
  96. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/color_packs.py +0 -0
  97. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/data_payload.py +0 -0
  98. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/lineage_payload.py +0 -0
  99. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/lineage_renderer.py +0 -0
  100. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/renderer.py +0 -0
  101. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage.css +0 -0
  102. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage.js +0 -0
  103. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage_graph.js +0 -0
  104. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/cja_lineage_roles.js +0 -0
  105. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/d3.min.js +0 -0
  106. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/static/visualizer.css +0 -0
  107. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/catalog.html.j2 +0 -0
  108. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/changes.html.j2 +0 -0
  109. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/cja_lineage.html.j2 +0 -0
  110. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/graph.html.j2 +0 -0
  111. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/index.html.j2 +0 -0
  112. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/templates/trend.html.j2 +0 -0
  113. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/trend_charts.py +0 -0
  114. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/render/workspace_usage.py +0 -0
  115. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/__init__.py +0 -0
  116. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/aa_api.py +0 -0
  117. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/aa_sdk.py +0 -0
  118. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/auth.py +0 -0
  119. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/cja_api.py +0 -0
  120. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/cja_sdk.py +0 -0
  121. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/collector.py +0 -0
  122. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/src/sdr_visualizer/usage/transport.py +0 -0
  123. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/__init__.py +0 -0
  124. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/adapter_cases.py +0 -0
  125. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/browser_support.py +0 -0
  126. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/conftest.py +0 -0
  127. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/__init__.py +0 -0
  128. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/aa_snapshot_clean.json +0 -0
  129. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/aa_snapshot_messy.json +0 -0
  130. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_degraded.json +0 -0
  131. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_enriched.json +0 -0
  132. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_hostile.json +0 -0
  133. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_lineage_shared.json +0 -0
  134. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_clean.json +0 -0
  135. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_hostile.json +0 -0
  136. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_messy.json +0 -0
  137. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/cja_snapshot_minimal.json +0 -0
  138. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/workspace_usage_aa_all_types.json +0 -0
  139. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/fixtures/workspace_usage_cja_all_types.json +0 -0
  140. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapter_correctness.py +0 -0
  141. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapter_fuzz.py +0 -0
  142. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapters_aa.py +0 -0
  143. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_adapters_cja.py +0 -0
  144. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_diff.py +0 -0
  145. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_formula_tree.py +0 -0
  146. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_references.py +0 -0
  147. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_segment_tree.py +0 -0
  148. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_analysis_trend.py +0 -0
  149. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_browser_support.py +0 -0
  150. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cja_lineage.py +0 -0
  151. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cja_lineage_driver.py +0 -0
  152. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cli.py +0 -0
  153. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_cli_flags.py +0 -0
  154. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_color_pack_parity.py +0 -0
  155. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_color_packs.py +0 -0
  156. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_data_payload.py +0 -0
  157. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_entrypoint.py +0 -0
  158. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_generate_examples.py +0 -0
  159. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_input_modes.py +0 -0
  160. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_input_series.py +0 -0
  161. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_browser.py +0 -0
  162. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_cli.py +0 -0
  163. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_discovery.py +0 -0
  164. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_lineage_renderer.py +0 -0
  165. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_markdown_links.py +0 -0
  166. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_minimal_fixture.py +0 -0
  167. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_mutate_fixture.py +0 -0
  168. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_output_safety.py +0 -0
  169. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_payload_schema.py +0 -0
  170. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer.py +0 -0
  171. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer_anatomy.py +0 -0
  172. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_renderer_graph.py +0 -0
  173. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_semantic_properties.py +0 -0
  174. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_structure_limits.py +0 -0
  175. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_trend_charts.py +0 -0
  176. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage.py +0 -0
  177. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_auth.py +0 -0
  178. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_cja_sdk.py +0 -0
  179. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_cli.py +0 -0
  180. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_collection.py +0 -0
  181. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_offline.py +0 -0
  182. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_payload.py +0 -0
  183. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.3}/tests/test_workspace_usage_perf.py +0 -0
  184. {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.2...HEAD
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.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.3.post1; extra == 'workspace-aa'
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
- ![The catalog view: header stats strip, search and filters, and the component table](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.png)
44
+ [![Slideshow of the searchable catalog, reference graph, segment and formula anatomy, snapshot changes, trends, and offline HTML reports for AA and CJA](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.gif)](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
- Requires Python 3.11+ and [uv](https://github.com/astral-sh/uv).
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
- ![The catalog view: header stats strip, search and filters, and the component table](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.png)
21
+ [![Slideshow of the searchable catalog, reference graph, segment and formula anatomy, snapshot changes, trends, and offline HTML reports for AA and CJA](https://raw.githubusercontent.com/brian-a-au/sdr-visualizer/main/docs/screenshot-catalog.gif)](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
- Requires Python 3.11+ and [uv](https://github.com/astral-sh/uv).
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 a visual/assistive-technology pass.
157
- Automated assertions do not certify visual appearance or actual screen-reader use.
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 platform credentials | pending |
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 license review | pending |
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 and AA live-qualification authorization (pending blocks corresponding qualification) | pending |
142
- | Authorized CJA and AA live-qualification result | pending |
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/license evidence | pending |
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
- and licenses separately before publication. Never run live collection as an
141
- unannounced test or read a maintainer's credential sources.
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. Review `LICENSE` and
165
- [`THIRD_PARTY_LICENSES`](../THIRD_PARTY_LICENSES) against shipped code and the
166
- resolved dependency licenses.
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/license evidence | pending |
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 |