sdr-visualizer 1.2.2__tar.gz → 1.2.4__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.4/AGENTS.md +194 -0
  2. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/CHANGELOG.md +42 -1
  3. sdr_visualizer-1.2.4/CONTRIBUTING.md +15 -0
  4. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/PKG-INFO +9 -22
  5. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/README.md +7 -20
  6. sdr_visualizer-1.2.4/docs/DEPENDABOT_AUTOMATION.md +116 -0
  7. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/LINEAGE.md +5 -2
  8. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/PERFORMANCE.md +6 -0
  9. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/PRODUCT_CONTRACT.md +2 -2
  10. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/RELEASE_EVIDENCE_TEMPLATE.md +34 -12
  11. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/RELEASING.md +57 -11
  12. sdr_visualizer-1.2.4/docs/SHOWCASE.md +52 -0
  13. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/WORKSPACE_USAGE.md +1 -1
  14. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/pyproject.toml +3 -2
  15. sdr_visualizer-1.2.4/scripts/capture_screenshot.py +346 -0
  16. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/check_workflow_policy.py +7 -1
  17. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/corpus_check.py +8 -7
  18. sdr_visualizer-1.2.4/scripts/dependabot_review.py +377 -0
  19. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/perf_browser_check.py +10 -10
  20. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/perf_check.py +38 -31
  21. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/__init__.py +1 -1
  22. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/adapters/aa.py +1 -1
  23. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/adapters/cja.py +1 -1
  24. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/visualizer.js +17 -2
  25. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/visualizer_trend.js +8 -0
  26. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/cja_lineage.html.j2 +1 -1
  27. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/normalize.py +1 -1
  28. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/sdk_worker.py +12 -1
  29. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_browser_functional.py +82 -0
  30. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_cli.py +30 -0
  31. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_corpus_check.py +24 -0
  32. sdr_visualizer-1.2.4/tests/test_dependabot_review.py +428 -0
  33. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_lineage_performance.py +2 -1
  34. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_lineage_renderer.py +2 -0
  35. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_package_smoke_check.py +2 -1
  36. sdr_visualizer-1.2.4/tests/test_perf.py +162 -0
  37. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_perf_browser_check.py +47 -0
  38. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_release_documentation.py +7 -4
  39. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workflow_policy.py +25 -1
  40. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_aa_sdk.py +1 -1
  41. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_sdk.py +89 -0
  42. sdr_visualizer-1.2.2/CONTRIBUTING.md +0 -97
  43. sdr_visualizer-1.2.2/scripts/capture_screenshot.py +0 -60
  44. sdr_visualizer-1.2.2/tests/test_perf.py +0 -76
  45. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/.gitignore +0 -0
  46. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/CODE_OF_CONDUCT.md +0 -0
  47. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/LICENSE +0 -0
  48. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/SECURITY.md +0 -0
  49. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/THIRD_PARTY_LICENSES +0 -0
  50. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/ADAPTER_CORRECTNESS_1.1.2.md +0 -0
  51. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/ADAPTER_GUIDE.md +0 -0
  52. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/ARCHITECTURE.md +0 -0
  53. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/EMBEDDED_DATA_FORMAT.md +0 -0
  54. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/payload-schema.json +0 -0
  55. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/docs/workspace-usage-schema.json +0 -0
  56. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/check_color_pack_parity.py +0 -0
  57. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/check_markdown_links.py +0 -0
  58. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/generate_aa_large_fixture.py +0 -0
  59. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/generate_cja_lineage_poc.py +0 -0
  60. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/generate_examples.py +0 -0
  61. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/generate_large_fixture.py +0 -0
  62. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/mutate_fixture.py +0 -0
  63. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/package_smoke_check.py +0 -0
  64. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/perf_lineage_poc.py +0 -0
  65. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/scripts/workspace_usage_fixture.py +0 -0
  66. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/__main__.py +0 -0
  67. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/adapters/__init__.py +0 -0
  68. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/adapters/base.py +0 -0
  69. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/adapters/cja_lineage.py +0 -0
  70. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/__init__.py +0 -0
  71. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/diff.py +0 -0
  72. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/formula_tree.py +0 -0
  73. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/lineage_layout.py +0 -0
  74. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/references.py +0 -0
  75. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/segment_tree.py +0 -0
  76. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/analysis/trend.py +0 -0
  77. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/__init__.py +0 -0
  78. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/exit_codes.py +0 -0
  79. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/lineage.py +0 -0
  80. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/lineage_output.py +0 -0
  81. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/main.py +0 -0
  82. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/output_safety.py +0 -0
  83. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/cli/workspace_usage.py +0 -0
  84. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/__init__.py +0 -0
  85. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/exceptions.py +0 -0
  86. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/lineage.py +0 -0
  87. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/models.py +0 -0
  88. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/structure_limits.py +0 -0
  89. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/visualizer.py +0 -0
  90. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/core/workspace_usage.py +0 -0
  91. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/__init__.py +0 -0
  92. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/detect.py +0 -0
  93. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/lineage_discovery.py +0 -0
  94. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/loader.py +0 -0
  95. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/series.py +0 -0
  96. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/shell_out.py +0 -0
  97. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/input/workspace_usage.py +0 -0
  98. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/__init__.py +0 -0
  99. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/color_packs.py +0 -0
  100. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/data_payload.py +0 -0
  101. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/lineage_payload.py +0 -0
  102. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/lineage_renderer.py +0 -0
  103. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/renderer.py +0 -0
  104. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/cja_lineage.css +0 -0
  105. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/cja_lineage.js +0 -0
  106. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/cja_lineage_graph.js +0 -0
  107. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/cja_lineage_roles.js +0 -0
  108. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/d3.min.js +0 -0
  109. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/static/visualizer.css +0 -0
  110. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/catalog.html.j2 +0 -0
  111. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/changes.html.j2 +0 -0
  112. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/graph.html.j2 +0 -0
  113. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/index.html.j2 +0 -0
  114. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/templates/trend.html.j2 +0 -0
  115. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/trend_charts.py +0 -0
  116. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/render/workspace_usage.py +0 -0
  117. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/__init__.py +0 -0
  118. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/aa_api.py +0 -0
  119. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/aa_sdk.py +0 -0
  120. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/auth.py +0 -0
  121. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/cja_api.py +0 -0
  122. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/cja_sdk.py +0 -0
  123. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/collector.py +0 -0
  124. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/src/sdr_visualizer/usage/transport.py +0 -0
  125. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/__init__.py +0 -0
  126. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/adapter_cases.py +0 -0
  127. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/browser_support.py +0 -0
  128. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/conftest.py +0 -0
  129. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/__init__.py +0 -0
  130. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/aa_snapshot_clean.json +0 -0
  131. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/aa_snapshot_messy.json +0 -0
  132. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_lineage_degraded.json +0 -0
  133. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_lineage_enriched.json +0 -0
  134. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_lineage_hostile.json +0 -0
  135. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_lineage_shared.json +0 -0
  136. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_snapshot_clean.json +0 -0
  137. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_snapshot_hostile.json +0 -0
  138. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_snapshot_messy.json +0 -0
  139. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/cja_snapshot_minimal.json +0 -0
  140. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/workspace_usage_aa_all_types.json +0 -0
  141. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/fixtures/workspace_usage_cja_all_types.json +0 -0
  142. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_adapter_correctness.py +0 -0
  143. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_adapter_fuzz.py +0 -0
  144. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_adapters_aa.py +0 -0
  145. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_adapters_cja.py +0 -0
  146. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_analysis_diff.py +0 -0
  147. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_analysis_formula_tree.py +0 -0
  148. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_analysis_references.py +0 -0
  149. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_analysis_segment_tree.py +0 -0
  150. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_analysis_trend.py +0 -0
  151. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_browser_support.py +0 -0
  152. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_cja_lineage.py +0 -0
  153. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_cja_lineage_driver.py +0 -0
  154. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_cli_flags.py +0 -0
  155. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_color_pack_parity.py +0 -0
  156. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_color_packs.py +0 -0
  157. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_data_payload.py +0 -0
  158. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_entrypoint.py +0 -0
  159. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_generate_examples.py +0 -0
  160. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_input_modes.py +0 -0
  161. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_input_series.py +0 -0
  162. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_lineage_browser.py +0 -0
  163. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_lineage_cli.py +0 -0
  164. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_lineage_discovery.py +0 -0
  165. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_markdown_links.py +0 -0
  166. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_minimal_fixture.py +0 -0
  167. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_mutate_fixture.py +0 -0
  168. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_output_safety.py +0 -0
  169. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_payload_schema.py +0 -0
  170. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_renderer.py +0 -0
  171. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_renderer_anatomy.py +0 -0
  172. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_renderer_graph.py +0 -0
  173. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_semantic_properties.py +0 -0
  174. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_structure_limits.py +0 -0
  175. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_trend_charts.py +0 -0
  176. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage.py +0 -0
  177. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_auth.py +0 -0
  178. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_cja_sdk.py +0 -0
  179. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_cli.py +0 -0
  180. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_collection.py +0 -0
  181. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_offline.py +0 -0
  182. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_payload.py +0 -0
  183. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/tests/test_workspace_usage_perf.py +0 -0
  184. {sdr_visualizer-1.2.2 → sdr_visualizer-1.2.4}/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,45 @@ All notable changes to `sdr-visualizer` will be documented here. The format foll
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.2.4] - 2026-10-17
8
+
9
+ ### Changed
10
+
11
+ - Advance the catalog tested-through generator markers to `cja_auto_sdr`
12
+ 3.12.12 and `aa_auto_sdr` 1.21.24. Snapshots declaring those versions no
13
+ longer raise a newer-than-tested warning; later versions remain accepted
14
+ with a compatibility warning. The separate lineage allowlist is unchanged.
15
+
16
+ ### Fixed
17
+
18
+ - Label the lineage report footer “CJA lineage” instead of “Private CJA lineage POC”.
19
+
20
+ ## [1.2.3] - 2026-10-16
21
+
22
+ ### Fixed
23
+
24
+ - Enforce the published performance budgets with decimal UTF-8 byte limits
25
+ and strict build, render, and filter timing boundaries in verification tools.
26
+ - Preserve keyboard focus when paging Changes and Trend, and keep expanded
27
+ comparison details open as additional changes appear.
28
+ - Preserve completed and partial Workspace SDK matches when process-group
29
+ signaling races with worker exit. Cleanup still fails if the worker does not
30
+ exit within the existing bounded wait.
31
+
32
+ ### Changed
33
+
34
+ - Make live AA Workspace collection and manual assistive-technology testing
35
+ optional release evidence, retain automated accessibility and keyboard checks,
36
+ and scope release license signoff to project and vendored D3 notices.
37
+
38
+ - Update the optional AA Workspace SDK to `aanalytics2==0.5.5.post2` and align
39
+ its collection version guard with the package pin.
40
+ - Automatically review and merge verified, lockfile-only patch updates to
41
+ Ruff, pytest, and pytest-cov after all protected CI gates pass. Keep other
42
+ dependency changes on the manual-review path.
43
+ - Replace the README catalog screenshot with a feature slideshow covering search,
44
+ references, anatomy, comparisons, trends, and offline reports across AA and CJA.
45
+
7
46
  ## [1.2.2] - 2026-09-21
8
47
 
9
48
  ### Changed
@@ -713,7 +752,9 @@ The following are explicitly internal and may change without notice:
713
752
  - Workspace project visualization (v0.4)
714
753
  - Schema map view (v0.5)
715
754
 
716
- [Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.2...HEAD
755
+ [Unreleased]: https://github.com/brian-a-au/sdr-visualizer/compare/v1.2.4...HEAD
756
+ [1.2.4]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.4
757
+ [1.2.3]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.3
717
758
  [1.2.2]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.2
718
759
  [1.2.1]: https://github.com/brian-a-au/sdr-visualizer/releases/tag/v1.2.1
719
760
  [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.4
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,
@@ -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.12.4 |
211
- | AA (`aa_auto_sdr`) | 1.21.15 |
210
+ | CJA (`cja_auto_sdr`) | 3.12.12 |
211
+ | AA (`aa_auto_sdr`) | 1.21.24 |
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
@@ -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
@@ -189,7 +200,9 @@ cannot be closed by recording the current delta as diff-backed N/A.
189
200
  | Candidate SHA | pending |
190
201
  | Complete changed-path output permalink | pending |
191
202
  | Shared runtime paths changed | pending |
192
- | Full parity or diff-backed N/A evidence | pending |
203
+ | Full parity review, marker-only disposition, or diff-backed N/A evidence | pending |
204
+ | Marker-only: both projects' marker values and explicit-SHA adapter/helper review | pending |
205
+ | Marker-only: fresh candidate qualification and literal warning-boundary evidence | pending |
193
206
  | Current sibling PR and commit permalinks, if applicable | pending |
194
207
  | Shared-contract comparator result, if applicable | pending |
195
208
  | Reviewer / reviewed UTC / result | pending |
@@ -237,11 +250,11 @@ renumber these requirements.
237
250
  | R11 immutable action pins | workflow-policy check | pending |
238
251
  | R12 PyPI-before-GitHub ordering | workflow-policy check + authorized tag run | pending |
239
252
  | R13 installed artifacts | wheel/sdist smoke + digests | pending |
240
- | R14 minimal runtime dependencies | metadata/export/audit/license evidence | pending |
253
+ | R14 minimal runtime dependencies | metadata/export/audit and project/D3 notice evidence | pending |
241
254
  | R15 shipped, consistent docs | Markdown links + source-distribution check | pending |
242
255
  | R16 safe sharing guidance | README review | pending |
243
256
  | R17 current compatibility | privacy-safe fresh/corpus record | pending |
244
- | R18 sibling parity | linked green sibling PR/commit and passing shared-contract comparator when color packs change | pending |
257
+ | R18 sibling parity | full sibling review; linked green merged sibling PR/commit unless the marker-only disposition applies; shared-contract comparator when color packs change | pending |
245
258
  | R19 protected/monitored `main` | settings/API inspection | pending |
246
259
  | R20 complete community surface | community profile + advertised public-link resolution | pending |
247
260
  | R21 one traced candidate | this matrix + final go/no-go | pending |
@@ -301,20 +314,29 @@ renumber these requirements.
301
314
  ## Authoritative artifact and retention
302
315
 
303
316
  Use one artifact set throughout. Record every retry separately; never combine
304
- evidence from different attempts or manifests.
317
+ evidence from different attempts or manifests. Inspect retention settings before
318
+ tagging; inspect the created artifact's actual expiry before PyPI publication
319
+ approval. A configured duration does not establish the actual recovery deadline.
320
+ The actual expiry must cover the recorded full 90-day policy window; stop if it
321
+ falls short. Record the window start and its basis rather than inferring them
322
+ from a previous release's retention behavior.
305
323
 
306
324
  | Field | Value |
307
325
  |---|---|
308
326
  | Release workflow URL | pending |
309
327
  | Workflow run ID | pending |
310
328
  | Attempt | pending |
329
+ | Workflow creation UTC | pending |
311
330
  | Event / tag / `headSha` | pending |
312
331
  | Job conclusions | pending |
313
332
  | Retained artifact ID | pending |
314
333
  | Artifact URL | pending |
315
- | Artifact expiry UTC | pending |
316
- | Repository retention setting and inspection URL | pending |
317
- | 90-day recovery-window end UTC | pending |
334
+ | Artifact creation UTC | pending |
335
+ | Actual artifact expiry UTC and inspection URL | pending |
336
+ | Repository retention setting / workflow retention request / pre-tag inspection URL | pending |
337
+ | Policy-window start UTC and basis | pending |
338
+ | 90-day recovery deadline UTC | pending |
339
+ | Actual expiry covers the full policy window / post-build inspection UTC | pending |
318
340
  | Wheel filename / SHA-256 | pending |
319
341
  | Source-distribution filename / SHA-256 | pending |
320
342
  | Authoritative `SHA256SUMS` manifest URL | pending |