hyperweave 0.3.2__tar.gz → 0.3.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 (424) hide show
  1. {hyperweave-0.3.2 → hyperweave-0.3.3}/CHANGELOG.md +17 -0
  2. {hyperweave-0.3.2 → hyperweave-0.3.3}/PKG-INFO +3 -3
  3. {hyperweave-0.3.2 → hyperweave-0.3.3}/README.md +2 -2
  4. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/_version.py +2 -2
  5. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/cli.py +38 -25
  6. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/layout.py +72 -27
  7. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolver.py +81 -16
  8. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/models.py +11 -0
  9. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/paradigm.py +41 -0
  10. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/brutalist.json +36 -18
  11. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/brutalist.yaml +24 -0
  12. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/chart_engine.py +7 -1
  13. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/receipt_paths.py +23 -13
  14. hyperweave-0.3.3/src/hyperweave/templates/components/chart-milestone-brutalist.svg.j2 +37 -0
  15. hyperweave-0.3.3/src/hyperweave/templates/frames/badge/brutalist-dark-content.j2 +95 -0
  16. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-dark-content.j2 +15 -7
  17. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +91 -9
  18. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-light-content.j2 +17 -7
  19. hyperweave-0.3.3/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +49 -0
  20. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/divider.svg.j2 +22 -10
  21. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-light-content.j2 +12 -3
  22. hyperweave-0.3.3/tests/test_badge_brutalist_dark.py +343 -0
  23. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chart_engine.py +7 -3
  24. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chromatic_coverage_validator.py +29 -8
  25. hyperweave-0.3.3/tests/test_divider_genome_specific.py +244 -0
  26. hyperweave-0.3.3/tests/test_receipt_paths.py +165 -0
  27. hyperweave-0.3.3/tests/test_stats_brutalist.py +125 -0
  28. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_integration.py +75 -12
  29. hyperweave-0.3.2/src/hyperweave/templates/frames/badge/brutalist-dark-content.j2 +0 -55
  30. hyperweave-0.3.2/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -39
  31. hyperweave-0.3.2/tests/test_divider_genome_specific.py +0 -93
  32. hyperweave-0.3.2/tests/test_receipt_paths.py +0 -129
  33. {hyperweave-0.3.2 → hyperweave-0.3.3}/.dockerignore +0 -0
  34. {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/ci.yml +0 -0
  35. {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/deploy.yml +0 -0
  36. {hyperweave-0.3.2 → hyperweave-0.3.3}/.github/workflows/publish.yml +0 -0
  37. {hyperweave-0.3.2 → hyperweave-0.3.3}/.gitignore +0 -0
  38. {hyperweave-0.3.2 → hyperweave-0.3.3}/.pre-commit-config.yaml +0 -0
  39. {hyperweave-0.3.2 → hyperweave-0.3.3}/Dockerfile +0 -0
  40. {hyperweave-0.3.2 → hyperweave-0.3.3}/LICENSE +0 -0
  41. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/buttons/button-liquid.svg +0 -0
  42. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-butterfly.svg +0 -0
  43. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-python.svg +0 -0
  44. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-sunflower.svg +0 -0
  45. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/cards/card-waves.svg +0 -0
  46. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
  47. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
  48. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
  49. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/banner.svg +0 -0
  50. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
  51. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
  52. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
  53. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
  54. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
  55. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
  56. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
  57. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
  58. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
  59. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
  60. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/brutalist-emerald/strip.svg +0 -0
  61. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
  62. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
  63. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
  64. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/banner.svg +0 -0
  65. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
  66. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/github.svg +0 -0
  67. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
  68. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
  69. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/icons/x.svg +0 -0
  70. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
  71. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
  72. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
  73. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
  74. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
  75. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/chrome-horizon/strip.svg +0 -0
  76. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/master_card.svg +0 -0
  77. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt.svg +0 -0
  78. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
  79. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
  80. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
  81. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/rhythm_strip.svg +0 -0
  82. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
  83. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer-liquid.svg +0 -0
  84. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer-purple.svg +0 -0
  85. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/footers/inneraura-footer.svg +0 -0
  86. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/hyperweave-banner.svg +0 -0
  87. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-discord.svg +0 -0
  88. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-docs.svg +0 -0
  89. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-github.svg +0 -0
  90. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
  91. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
  92. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
  93. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-x.svg +0 -0
  94. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
  95. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/badge-showcase-triple.svg +0 -0
  96. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/genome-marquee-triple.svg +0 -0
  97. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/marquees/sample-badges.svg +0 -0
  98. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/404.svg +0 -0
  99. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/callout-icons.svg +0 -0
  100. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/divider.svg +0 -0
  101. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/favicon.svg +0 -0
  102. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hero-banner.svg +0 -0
  103. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
  104. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
  105. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/loader.svg +0 -0
  106. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/mintlify-assets/og-image.svg +0 -0
  107. {hyperweave-0.3.2 → hyperweave-0.3.3}/assets/timelines/hyperweave-roadmap.svg +0 -0
  108. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/favicon.svg +0 -0
  109. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/hyperweave-banner.svg +0 -0
  110. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/hyperweave-navbar-logo.svg +0 -0
  111. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/assets/og-image.svg +0 -0
  112. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/architecture.mdx +0 -0
  113. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/camo-compatibility.mdx +0 -0
  114. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/cim-compliance.mdx +0 -0
  115. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/genome-profile-system.mdx +0 -0
  116. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/explanation/metadata-tiers.mdx +0 -0
  117. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/add-motion-to-badges.mdx +0 -0
  118. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/create-session-receipts.mdx +0 -0
  119. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
  120. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/how-to/use-live-data-badges.mdx +0 -0
  121. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/introduction.mdx +0 -0
  122. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/mint.json +0 -0
  123. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/quickstart.mdx +0 -0
  124. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/cli.mdx +0 -0
  125. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/compose-spec.mdx +0 -0
  126. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/genomes.mdx +0 -0
  127. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/http-api.mdx +0 -0
  128. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/mcp-tools.mdx +0 -0
  129. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/motions.mdx +0 -0
  130. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/reference/telemetry-contract.mdx +0 -0
  131. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/spec/hyperweave-protocol.mdx +0 -0
  132. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
  133. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/compose-your-first-badge.mdx +0 -0
  134. {hyperweave-0.3.2 → hyperweave-0.3.3}/docs/tutorials/install-session-telemetry.mdx +0 -0
  135. {hyperweave-0.3.2 → hyperweave-0.3.3}/fly.toml +0 -0
  136. {hyperweave-0.3.2 → hyperweave-0.3.3}/hooks/install.py +0 -0
  137. {hyperweave-0.3.2 → hyperweave-0.3.3}/hooks/session_end.sh +0 -0
  138. {hyperweave-0.3.2 → hyperweave-0.3.3}/justfile +0 -0
  139. {hyperweave-0.3.2 → hyperweave-0.3.3}/pyproject.toml +0 -0
  140. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/extract_font_metrics.py +0 -0
  141. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/extract_glyphs.py +0 -0
  142. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/generate_proofset.py +0 -0
  143. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/probe_live_stats.py +0 -0
  144. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/probe_star_history.py +0 -0
  145. {hyperweave-0.3.2 → hyperweave-0.3.3}/scripts/stress_test.py +0 -0
  146. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/__init__.py +0 -0
  147. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/__main__.py +0 -0
  148. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/__init__.py +0 -0
  149. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/assembler.py +0 -0
  150. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/bar_chart.py +0 -0
  151. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/context.py +0 -0
  152. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/engine.py +0 -0
  153. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/lanes.py +0 -0
  154. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/palette.py +0 -0
  155. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/reasoning.py +0 -0
  156. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/__init__.py +0 -0
  157. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/chart.py +0 -0
  158. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/resolvers/stats.py +0 -0
  159. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/rhythm.py +0 -0
  160. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/rhythm_strip.py +0 -0
  161. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/treemap.py +0 -0
  162. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/compose/validate_paradigms.py +0 -0
  163. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/__init__.py +0 -0
  164. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/genome_validator.py +0 -0
  165. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/loader.py +0 -0
  166. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/registry.py +0 -0
  167. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/config/settings.py +0 -0
  168. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/__init__.py +0 -0
  169. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/arxiv.py +0 -0
  170. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/base.py +0 -0
  171. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/cache.py +0 -0
  172. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/github.py +0 -0
  173. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/connectors/rest.py +0 -0
  174. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/__init__.py +0 -0
  175. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/cell_layout.py +0 -0
  176. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/color.py +0 -0
  177. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/contracts.py +0 -0
  178. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/enums.py +0 -0
  179. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/font_metrics.py +0 -0
  180. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/schema.py +0 -0
  181. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/state.py +0 -0
  182. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/text.py +0 -0
  183. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/core/thresholds.py +0 -0
  184. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/badge_modes.yaml +0 -0
  185. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/accessibility.css +0 -0
  186. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/bridge.css +0 -0
  187. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/expression.css +0 -0
  188. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/css/status.css +0 -0
  189. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
  190. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/inter.json +0 -0
  191. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
  192. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
  193. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-700.b64 +0 -0
  194. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-700.meta.json +0 -0
  195. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-900.b64 +0 -0
  196. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/barlow-condensed-900.meta.json +0 -0
  197. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
  198. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
  199. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
  200. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
  201. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
  202. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
  203. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/automata.json +0 -0
  204. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/chrome.json +0 -0
  205. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
  206. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
  207. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
  208. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -0
  209. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/glyphs.json +0 -0
  210. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
  211. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
  212. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
  213. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
  214. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
  215. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/motions/static.yaml +0 -0
  216. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
  217. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
  218. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/paradigms/default.yaml +0 -0
  219. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/normal.json +0 -0
  220. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/permissive.json +0 -0
  221. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/policies/ungoverned.json +0 -0
  222. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
  223. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
  224. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
  225. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/profiles/chrome.yaml +0 -0
  226. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/reasoning/__init__.py +0 -0
  227. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/reasoning/brutalist.yaml +0 -0
  228. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/specimens.yaml +0 -0
  229. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
  230. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
  231. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
  232. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
  233. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
  234. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
  235. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/arrow.json +0 -0
  236. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/aurora.json +0 -0
  237. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/beacon.json +0 -0
  238. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/bracket3d.json +0 -0
  239. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/chevron.json +0 -0
  240. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/crosshair.json +0 -0
  241. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/diamond.json +0 -0
  242. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rocket.json +0 -0
  243. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/bar.json +0 -0
  244. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
  245. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
  246. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
  247. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/straight.json +0 -0
  248. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/rules/wave.json +0 -0
  249. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/data/terminals/stijl.json +0 -0
  250. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/kit.py +0 -0
  251. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/__init__.py +0 -0
  252. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/__main__.py +0 -0
  253. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/mcp/server.py +0 -0
  254. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/py.typed +0 -0
  255. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/__init__.py +0 -0
  256. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/fonts.py +0 -0
  257. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/glyphs.py +0 -0
  258. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/motion.py +0 -0
  259. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/render/templates.py +0 -0
  260. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/__init__.py +0 -0
  261. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/app.py +0 -0
  262. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/serve/data_tokens.py +0 -0
  263. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/__init__.py +0 -0
  264. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/capture.py +0 -0
  265. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/codex_parser.py +0 -0
  266. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/contract.py +0 -0
  267. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/corrections.py +0 -0
  268. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/cost.py +0 -0
  269. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/models.py +0 -0
  270. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/parser.py +0 -0
  271. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/runtimes.py +0 -0
  272. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/telemetry/stages.py +0 -0
  273. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
  274. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
  275. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
  276. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
  277. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
  278. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
  279. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
  280. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
  281. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
  282. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
  283. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
  284. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
  285. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
  286. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
  287. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
  288. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
  289. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
  290. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
  291. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
  292. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/status.svg.j2 +0 -0
  293. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
  294. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/document.svg.j2 +0 -0
  295. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
  296. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
  297. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
  298. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/brutalist-light-content.j2 +0 -0
  299. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
  300. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
  301. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
  302. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
  303. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
  304. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
  305. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
  306. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
  307. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
  308. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
  309. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
  310. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
  311. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
  312. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
  313. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
  314. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
  315. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
  316. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
  317. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
  318. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
  319. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
  320. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
  321. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
  322. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
  323. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
  324. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
  325. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
  326. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
  327. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
  328. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
  329. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
  330. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
  331. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
  332. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
  333. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
  334. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
  335. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
  336. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
  337. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
  338. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
  339. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-dark-content.j2 +0 -0
  340. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
  341. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
  342. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
  343. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
  344. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
  345. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
  346. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
  347. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-dark-content.j2 +0 -0
  348. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
  349. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-light-content.j2 +0 -0
  350. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
  351. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
  352. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
  353. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
  354. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
  355. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
  356. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
  357. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
  358. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
  359. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
  360. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
  361. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
  362. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
  363. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
  364. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
  365. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
  366. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
  367. {hyperweave-0.3.2 → hyperweave-0.3.3}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
  368. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/__init__.py +0 -0
  369. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/conftest.py +0 -0
  370. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/codex_session.jsonl +0 -0
  371. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/codex_session_patches.jsonl +0 -0
  372. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/github_contributions/synthetic.html +0 -0
  373. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/session.json +0 -0
  374. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/session.jsonl +0 -0
  375. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/fixtures/synthetic_session.jsonl +0 -0
  376. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/helpers.py +0 -0
  377. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/snapshots/url_stability/divider_band_chrome_static.svg +0 -0
  378. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/snapshots/url_stability/icon_github_chrome_static.svg +0 -0
  379. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_assembler.py +0 -0
  380. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_cellular.py +0 -0
  381. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_layout.py +0 -0
  382. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_badge_mode.py +0 -0
  383. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chart_frame.py +0 -0
  384. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_chrome_variants.py +0 -0
  385. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_codex_parser.py +0 -0
  386. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_bar_chart.py +0 -0
  387. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_rhythm_strip.py +0 -0
  388. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_treemap.py +0 -0
  389. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_compose_variant_field.py +0 -0
  390. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_connectors.py +0 -0
  391. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_core.py +0 -0
  392. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_data_tokens.py +0 -0
  393. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_divider_cellular.py +0 -0
  394. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_font_gating.py +0 -0
  395. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_font_metrics_chakra.py +0 -0
  396. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_genome_automata.py +0 -0
  397. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_github_scrape.py +0 -0
  398. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_kit.py +0 -0
  399. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_marquee_v0_2_16.py +0 -0
  400. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_mcp.py +0 -0
  401. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_cellular.py +0 -0
  402. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_dispatch.py +0 -0
  403. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_paradigm_extensibility.py +0 -0
  404. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_parse_transcript_auto.py +0 -0
  405. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_proofset.py +0 -0
  406. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_receipt_token_compliance.py +0 -0
  407. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_render.py +0 -0
  408. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_resolver_rhythm.py +0 -0
  409. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_runtime_registries.py +0 -0
  410. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_serve.py +0 -0
  411. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_serve_live_state.py +0 -0
  412. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_slot_metric_state.py +0 -0
  413. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_state_inference.py +0 -0
  414. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_stats_card.py +0 -0
  415. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_brutalist_grammar.py +0 -0
  416. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_cellular.py +0 -0
  417. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_strip_status_toggle.py +0 -0
  418. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry.py +0 -0
  419. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_contract_per_stage.py +0 -0
  420. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_telemetry_skin_dispatch.py +0 -0
  421. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_tool_class_completeness.py +0 -0
  422. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_url_stability.py +0 -0
  423. {hyperweave-0.3.2 → hyperweave-0.3.3}/tests/test_variant_default_resolution.py +0 -0
  424. {hyperweave-0.3.2 → hyperweave-0.3.3}/uv.lock +0 -0
@@ -5,6 +5,23 @@ All notable changes to HyperWeave are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.3.3] - 2026-05-12
9
+
10
+ ### Fixed
11
+
12
+ - **Receipt filenames** — use consistent underscore separators; the footer displays the same human-readable filename.
13
+ - **Dark brutalist badge panels** — match the prototype: left panel reads `brand_panel_fill`, label reads `ink-primary`, seam-gap rect restored so the divider region renders the same in any markdown viewer.
14
+ - **Badge layout engine** — brutalist badges land every interior gap (accent→glyph, glyph→label, label→seam, seam→value, value→indicator, indicator→right border) on a single 5px rhythm. `measure_text` now consumes the paradigm's declared `value_letter_spacing_em` so the engine reserves the actual rendered width instead of under-counting by `(n-1) * font_size * em`.
15
+ - **Dark brutalist star charts** — header glyph fill routes through `var(--dna-signal)` (was an orphaned brand-text white). 6px solid left accent rail anchors the chart as a Y-axis spine; outer perimeter softens to a 1.5px hairline at 0.25 opacity so the rail dominates the read.
16
+ - **Light scholar star charts** — area gradient resolves through each variant's panel color across all 6 light variants instead of falling back to the seam color. Substrate-aware paper grain with multiply blend; perimeter inset and grain layer order match the prototype.
17
+ - **Activity graph bars** — light scholar stat cards use the correct accent color.
18
+ - **Divider tick marks** — resolve through the genome palette instead of a hardcoded green.
19
+
20
+ ### Changed
21
+
22
+ - **Star chart milestone callouts** — now include date context (e.g. `1K · JAN 24`) so the chart is self-documenting without cross-referencing external star history tools.
23
+ - **Star chart milestone markers** — data points use a filled square marker (■) to visually distinguish them from the regular interval crosshair (+) markers.
24
+
8
25
  ## [0.3.2] - 2026-05-11
9
26
 
10
27
  Brutalist gets 12 variants split by substrate: 6 dark monochromes (celadon, carbon, alloy, temper, pigment, ember) and 6 light scholars (archive, signal, pulse, depth, afterimage, primer). Metadata pipeline wires 12 fields that were silently hardcoded. Per-frame reasoning populates `hw:reasoning` from per-genome YAML.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperweave
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Headless visual output layer for AI agents. One API call → self-contained SVG.
5
5
  Project-URL: Repository, https://github.com/InnerAura/hyperweave
6
6
  Project-URL: Issues, https://github.com/InnerAura/hyperweave/issues
@@ -197,11 +197,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
197
197
  <tr>
198
198
  <th align="left">Dashboard<br/><sub>strip</sub></th>
199
199
  <td>
200
- <img src="https://hyperweave.app/v1/strip/readme-ai/brutalist.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&glyph=github&variant=celadon" alt="strip"/>
200
+ <img src="https://hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon" alt="strip"/>
201
201
  <br/>
202
202
  <ul>
203
203
  <li><sub><code>/v1/strip/{title}/{genome}.static?data={tokens}&subtitle={text}&glyph={glyph}&variant={variant}</code></sub></li>
204
- <li><sub><code>hyperweave.app/v1/strip/readme-ai/brutalist.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&glyph=github&variant=celadon</code></sub></li>
204
+ <li><sub><code>hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon</code></sub></li>
205
205
  </ul>
206
206
  </td>
207
207
  </tr>
@@ -165,11 +165,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
165
165
  <tr>
166
166
  <th align="left">Dashboard<br/><sub>strip</sub></th>
167
167
  <td>
168
- <img src="https://hyperweave.app/v1/strip/readme-ai/brutalist.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&glyph=github&variant=celadon" alt="strip"/>
168
+ <img src="https://hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon" alt="strip"/>
169
169
  <br/>
170
170
  <ul>
171
171
  <li><sub><code>/v1/strip/{title}/{genome}.static?data={tokens}&subtitle={text}&glyph={glyph}&variant={variant}</code></sub></li>
172
- <li><sub><code>hyperweave.app/v1/strip/readme-ai/brutalist.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&glyph=github&variant=celadon</code></sub></li>
172
+ <li><sub><code>hyperweave.app/v1/strip/hyperweave/brutalist.static?data=gh:InnerAura/hyperweave.stars,pypi:hyperweave.version,gh:InnerAura/hyperweave.build&subtitle=InnerAura/hyperweave&glyph=github&variant=celadon</code></sub></li>
173
173
  </ul>
174
174
  </td>
175
175
  </tr>
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.3.2'
22
- __version_tuple__ = version_tuple = (0, 3, 2)
21
+ __version__ = version = '0.3.3'
22
+ __version_tuple__ = version_tuple = (0, 3, 3)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -361,39 +361,52 @@ def session(
361
361
 
362
362
  frame_type = "receipt" if action == "receipt" else "rhythm-strip"
363
363
  genome_slug = _normalize_genome_slug(genome) if genome else ""
364
+
365
+ # Pre-compute the receipt's on-disk filename (when applicable) so the
366
+ # footer can render the same human-readable basename as the file the
367
+ # user sees. The compose pipeline reads receipt_filename_hint when set;
368
+ # an empty hint falls back to the legacy UUID-path footer (HTTP / MCP).
369
+ filename_hint = ""
370
+ if action == "receipt" and not output:
371
+ from datetime import datetime as _dt
372
+
373
+ from hyperweave.telemetry.receipt_paths import receipt_filename
374
+
375
+ sess = contract.get("session", {})
376
+ sid = sess.get("id", "unknown")
377
+ session_name = sess.get("name", "")
378
+ start_iso = sess.get("start", "")
379
+ try:
380
+ ts = _dt.fromisoformat(start_iso)
381
+ except (TypeError, ValueError):
382
+ ts = _dt.now()
383
+ user_events = contract.get("user_events", []) or []
384
+ first_prompt = user_events[0].get("preview", "") if user_events else ""
385
+ hw_dir = Path(".hyperweave") / "receipts"
386
+ hw_dir.mkdir(parents=True, exist_ok=True)
387
+ output = hw_dir / receipt_filename(
388
+ timestamp=ts,
389
+ session_name=session_name,
390
+ session_id=sid,
391
+ prompt_text=first_prompt,
392
+ )
393
+ filename_hint = output.name
394
+ elif action == "receipt" and output:
395
+ # Explicit --output: the user picked a basename; surface it.
396
+ filename_hint = output.name
397
+
364
398
  spec = ComposeSpec(
365
399
  type=frame_type,
366
400
  genome_id=genome_slug,
367
401
  telemetry_data=contract,
402
+ receipt_filename_hint=filename_hint,
368
403
  )
369
404
  result = do_compose(spec)
370
405
 
371
406
  if action == "receipt":
372
- # Default output: .hyperweave/receipts/{date}_{time}_{slug}.svg
373
- if not output:
374
- from datetime import datetime as _dt
375
-
376
- from hyperweave.telemetry.receipt_paths import receipt_filename
377
-
378
- sess = contract.get("session", {})
379
- sid = sess.get("id", "unknown")
380
- session_name = sess.get("name", "")
381
- start_iso = sess.get("start", "")
382
- try:
383
- ts = _dt.fromisoformat(start_iso)
384
- except (TypeError, ValueError):
385
- ts = _dt.now()
386
- user_events = contract.get("user_events", []) or []
387
- first_prompt = user_events[0].get("preview", "") if user_events else ""
388
- hw_dir = Path(".hyperweave") / "receipts"
389
- hw_dir.mkdir(parents=True, exist_ok=True)
390
- output = hw_dir / receipt_filename(
391
- timestamp=ts,
392
- session_name=session_name,
393
- session_id=sid,
394
- prompt_text=first_prompt,
395
- )
396
-
407
+ # output is guaranteed non-None here: the receipt branch above either
408
+ # received an explicit --output or computed a default path.
409
+ assert output is not None
397
410
  output.parent.mkdir(parents=True, exist_ok=True)
398
411
  output.write_text(result.svg)
399
412
 
@@ -110,6 +110,8 @@ def compute_badge_layout(
110
110
  value_font_size: float,
111
111
  right_canvas_inset: int = 0,
112
112
  min_total_w: int = 60,
113
+ inner_bit_ratio: float = 0.5,
114
+ rhythm_gap: int = 0,
113
115
  ) -> BadgeLayout:
114
116
  """Compute every position the badge templates need from input measurements.
115
117
 
@@ -121,44 +123,83 @@ def compute_badge_layout(
121
123
 
122
124
  The centering correctness is verified by ``tests/test_badge_layout``
123
125
  against short / long / version / license / python_requires values.
126
+
127
+ When ``rhythm_gap > 0`` (brutalist v0.3.3 sets 8), the layout collapses
128
+ every interior gap to a single value: accent_right→glyph_left,
129
+ glyph_right→label_first, label_last→seam_left, seam_right→value_first,
130
+ value_last→indicator_left, indicator_right→right_border. Caller must
131
+ also set ``ind_pad_r=rhythm_gap`` so the indicator gaps land on the
132
+ same rhythm.
124
133
  """
125
134
  # Glyph pixel position. Mirrors resolver.py logic: paradigms with a
126
135
  # left-edge decoration zone (cellular pattern strip x=2..~20) reserve
127
136
  # space via ``glyph_left_offset``; brutalist/chrome declare 0.
137
+ # When rhythm_gap is set, the glyph sits exactly ``rhythm_gap`` right
138
+ # of the accent bar so the accent→glyph gap matches the global rhythm.
128
139
  if has_glyph:
129
- glyph_x = (inset + accent_w + 4) if inset else (accent_w + 3)
130
- glyph_x += glyph_left_offset
140
+ if rhythm_gap > 0:
141
+ glyph_x = accent_w + rhythm_gap + glyph_left_offset
142
+ else:
143
+ glyph_x = (inset + accent_w + 4) if inset else (accent_w + 3)
144
+ glyph_x += glyph_left_offset
131
145
  glyph_y = round((height - glyph_size) / 2, 1)
132
146
  else:
133
147
  glyph_x, glyph_y = 0, 0.0
134
148
 
135
149
  # Label area starts after the glyph (or after the accent + paradigm
136
- # left-edge decoration when there's no glyph). The no-glyph branch
137
- # must respect glyph_left_offset too cellular pattern strip runs
138
- # to ~x=20 even when no glyph is rendered.
139
- label_start = (glyph_x + glyph_size + glyph_gap) if has_glyph else (accent_w + 6 + glyph_left_offset)
150
+ # left-edge decoration when there's no glyph). When rhythm_gap > 0,
151
+ # the glyph→label gap (with-glyph) and accent→label gap (no-glyph)
152
+ # both equal rhythm_gap.
153
+ if rhythm_gap > 0:
154
+ label_start = (glyph_x + glyph_size + rhythm_gap) if has_glyph else (accent_w + rhythm_gap + glyph_left_offset)
155
+ else:
156
+ label_start = (glyph_x + glyph_size + glyph_gap) if has_glyph else (accent_w + 6 + glyph_left_offset)
140
157
 
141
158
  # Left panel width — fits the label plus paradigm-driven right padding.
142
- label_pad_r = 9 if use_mono else 8
159
+ # rhythm_gap mode forces label_pad_r = rhythm_gap so label_last→seam_left
160
+ # equals the global rhythm. Legacy mode keeps the 9 (mono) / 8 (non-mono)
161
+ # default tuned for chrome/cellular's denser label kerning.
162
+ label_pad_r = rhythm_gap if rhythm_gap > 0 else (9 if use_mono else 8)
143
163
  left_panel = round(label_start + measured_label_w + label_pad_r)
144
164
  left_panel = max(left_panel, 30)
145
165
 
146
- # Label text center is the midpoint of the label area. For uppercase
147
- # labels the visual right edge is 6px shy of the panel boundary so
148
- # the cap glyphs don't kiss the seam.
149
- label_area_end = left_panel - (6 if label_uppercase else 0)
150
- label_x = round((label_start + label_area_end) / 2, 1)
166
+ # Label text center. Legacy mode centers the label in [label_start,
167
+ # label_area_end] with a 6px shy-from-seam adjustment for uppercase
168
+ # labels. rhythm_gap mode aligns label_first with label_start exactly
169
+ # (label_x = label_start + w/2) so the accent_right→label_first gap
170
+ # lands at ``rhythm_gap`` regardless of label_w. The legacy area-center
171
+ # formula leaves a (panel_w - label_w)/2 interior gutter inside the
172
+ # label area, which collapses the structural gap to ~(rhythm_gap +
173
+ # interior_gutter)/2 — visible as 12.2/4.2 asymmetry on a 35.64px
174
+ # label in a 44px area when targeting an 8px rhythm.
175
+ if rhythm_gap > 0:
176
+ label_area_end = left_panel
177
+ label_x = round(label_start + measured_label_w / 2, 1)
178
+ else:
179
+ label_area_end = left_panel - (6 if label_uppercase else 0)
180
+ label_x = round((label_start + label_area_end) / 2, 1)
151
181
 
152
182
  # Right-panel allocation. ``ls_extra`` accounts for non-mono letter-
153
183
  # spacing overrun (each char carries 0.4 of trailing tracking).
154
184
  indicator_alloc = (indicator_size + ind_pad_r) if show_indicator else 0
155
185
  ls_extra = value_raw_len * 0.4 if (not use_mono and value_raw_len) else 0
156
- # right_panel reserves: val_pad_l (left interior gutter), the measured
157
- # value text + letter-spacing overrun, val_min_gap (right interior gutter),
158
- # and indicator_alloc when stateful. Pre-v0.3.0 reserved 2 * val_min_gap
159
- # which left ~val_min_gap of unaccounted slack on stateless badges
160
- # (visible as ~4.5px right padding instead of symmetric ~3px).
161
- right_panel = val_pad_l + measured_value_w + ls_extra + val_min_gap + indicator_alloc
186
+ # Gap between value text right edge and the indicator's left edge. For
187
+ # stateful badges this mirrors ``ind_pad_r`` (gap right of indicator) so
188
+ # the indicator sits with equal interior padding on both sides — the
189
+ # cohesive-balance contract the brutalist v16 prototype encodes. For
190
+ # stateless badges there's no indicator, so the trailing pad collapses
191
+ # to ``val_min_gap`` (3px tight right gutter; tighter than the stateful
192
+ # symmetric gap because there's no marker to balance against).
193
+ text_to_indicator_gap = ind_pad_r if show_indicator else val_min_gap
194
+ # rhythm_gap mode overrides ``val_pad_l`` (seam→value gap) to the
195
+ # global rhythm. Legacy mode keeps the resolver-supplied val_pad_l
196
+ # (3px) for chrome/cellular/default paradigms.
197
+ effective_val_pad_l = rhythm_gap if rhythm_gap > 0 else val_pad_l
198
+ # right_panel reserves: effective_val_pad_l (left interior gutter), the
199
+ # measured value text + letter-spacing overrun, text_to_indicator_gap
200
+ # (right interior gutter), and indicator_alloc when stateful. Symmetric
201
+ # stateful: text + ind_pad_r + indicator_size + ind_pad_r.
202
+ right_panel = effective_val_pad_l + measured_value_w + ls_extra + text_to_indicator_gap + indicator_alloc
162
203
  total_w = round(left_panel + sep_w + seam_w + right_panel)
163
204
  total_w = max(total_w, min_total_w)
164
205
 
@@ -176,13 +217,14 @@ def compute_badge_layout(
176
217
  # which is the midpoint of [zone_left, indicator_left_edge], not
177
218
  # [zone_left, zone_right]. Old formula skewed text by val_min_gap/2
178
219
  # toward the indicator and was undefined when no indicator rendered.
179
- value_zone_left = right_panel_x + val_pad_l
220
+ value_zone_left = right_panel_x + effective_val_pad_l
180
221
  # When stateless (no indicator), the slab's right edge is total_w minus
181
- # any paradigm-specific canvas inset (cellular: 2; brutalist/chrome: 0).
182
- # val_min_gap is the symmetric trailing pad together they place
183
- # value_zone_right at the slab's interior right boundary so a centered
184
- # text lands at slab geometric center.
185
- value_zone_right = (indicator_x - val_min_gap) if show_indicator else (total_w - right_canvas_inset - val_min_gap)
222
+ # any paradigm-specific canvas inset (cellular: 2; brutalist/chrome: 0)
223
+ # minus val_min_gap (tight 3px trailing pad). When stateful, the right
224
+ # edge sits ind_pad_r inside the indicator's left edge mirroring the
225
+ # right-of-indicator gap so the indicator reads as equidistant from
226
+ # the value text and from the badge's right border.
227
+ value_zone_right = (indicator_x - ind_pad_r) if show_indicator else (total_w - right_canvas_inset - val_min_gap)
186
228
  value_zone_width = value_zone_right - value_zone_left
187
229
  value_x = round((value_zone_left + value_zone_right) / 2, 1)
188
230
 
@@ -196,9 +238,12 @@ def compute_badge_layout(
196
238
  indicator_y = round(text_y - value_font_size * 0.3 - indicator_size / 2, 1)
197
239
 
198
240
  # Indicator inner-bit geometry — moved from cellular/brutalist
199
- # template-side arithmetic. The bit is half the indicator side,
200
- # centered.
201
- inner_bit_w = indicator_size // 2
241
+ # template-side arithmetic. v0.3.3 generalizes the ratio so brutalist
242
+ # can render the prototype's 6/10 (0.6) bit instead of the cellular
243
+ # 4/8 (0.5) default — caller passes a paradigm-driven ratio. Rounded
244
+ # to the nearest integer so the bit lands on a pixel grid; offset is
245
+ # the half-difference, which can be a half-pixel for odd ratios.
246
+ inner_bit_w = round(indicator_size * inner_bit_ratio)
202
247
  inner_bit_offset = (indicator_size - inner_bit_w) / 2
203
248
 
204
249
  return BadgeLayout(
@@ -335,8 +335,30 @@ def resolve_badge(
335
335
  if badge_cfg_for_seam and badge_cfg_for_seam.seam_w > 0
336
336
  else profile.get("badge_seam_width", 3)
337
337
  )
338
- indicator_size = profile.get("badge_indicator_size", 8)
339
- ind_pad_r = profile.get("badge_indicator_pad_r", 8)
338
+ # Indicator geometry: paradigm overrides profile defaults. Brutalist v0.3.3
339
+ # declares 10x10 + ind_pad_r=10 to match the v16 prototype's translate(138,5);
340
+ # chrome and cellular continue to fall back to their profile defaults.
341
+ badge_cfg_for_indicator = paradigm_spec.badge if paradigm_spec else None
342
+ indicator_size = (
343
+ badge_cfg_for_indicator.indicator_size
344
+ if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_size > 0
345
+ else profile.get("badge_indicator_size", 8)
346
+ )
347
+ ind_pad_r = (
348
+ badge_cfg_for_indicator.indicator_pad_r
349
+ if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_pad_r > 0
350
+ else profile.get("badge_indicator_pad_r", 8)
351
+ )
352
+ indicator_stroke_width = (
353
+ badge_cfg_for_indicator.indicator_stroke_width
354
+ if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_stroke_width > 0
355
+ else 1.2
356
+ )
357
+ indicator_inner_bit_ratio = (
358
+ badge_cfg_for_indicator.indicator_inner_bit_ratio
359
+ if badge_cfg_for_indicator and badge_cfg_for_indicator.indicator_inner_bit_ratio > 0
360
+ else 0.5
361
+ )
340
362
  inset = profile.get("badge_inset", 0)
341
363
  # text_y_factor from paradigm (cellular uses 0.656 matching spec y=21 at
342
364
  # h=32; brutalist/chrome use 0.69 baseline). One place drives the math.
@@ -364,18 +386,26 @@ def resolve_badge(
364
386
  _label_size = max(round(_label_size * 0.78), 6)
365
387
  _value_size = max(round(_value_size * 0.78), 7)
366
388
 
367
- # Monospace labels carry letter-spacing 0.06em (CSS declared in chrome-
368
- # defs). Pre-v0.2.25 the resolver added len(text)*font_size*0.06 AFTER
369
- # measure_text returned, double-counting and using the wrong (N vs N-1)
370
- # formula. measure_text now applies (max(0, N-1) * font_size * em)
371
- # internally single source of truth in core/text.py.
389
+ # Letter-spacing values come from the paradigm's badge config so
390
+ # measure_text reserves the exact width the template will render. The
391
+ # paradigm's declared values are the canonical source; the
392
+ # ``0.06 if use_mono else 0.0`` fallback preserves pre-v0.3.3 behavior
393
+ # for paradigms (cellular, default) that haven't declared their badge
394
+ # letter-spacing yet. measure_text applies ``(max(0, N-1) * font_size
395
+ # * em)`` internally — single source of truth in core/text.py.
396
+ _label_ls_em = (
397
+ paradigm_spec.badge.label_letter_spacing_em
398
+ if paradigm_spec and paradigm_spec.badge.label_letter_spacing_em > 0
399
+ else (0.06 if use_mono else 0.0)
400
+ )
401
+ _value_ls_em = paradigm_spec.badge.value_letter_spacing_em if paradigm_spec else 0.0
372
402
  lw = (
373
403
  measure_text(
374
404
  label_display,
375
405
  font_family=_label_family,
376
406
  font_size=_label_size,
377
407
  font_weight=400 if use_mono else 700,
378
- letter_spacing_em=0.06 if use_mono else 0.0,
408
+ letter_spacing_em=_label_ls_em,
379
409
  )
380
410
  if label_display
381
411
  else 0.0
@@ -386,6 +416,7 @@ def resolve_badge(
386
416
  font_family=_value_family,
387
417
  font_size=_value_size,
388
418
  font_weight=_value_weight,
419
+ letter_spacing_em=_value_ls_em,
389
420
  )
390
421
  if value_raw
391
422
  else 0.0
@@ -426,6 +457,16 @@ def resolve_badge(
426
457
  # All badge geometry now lives in compose/layout.py — single source of
427
458
  # truth, unit-tested independently. The v0.2.25 centering fix is in there
428
459
  # (value_x = zone_center, not midpoint of unrelated bounds).
460
+ # Uniform-rhythm gap: when the paradigm declares a positive
461
+ # ``rhythm_gap`` (brutalist v0.3.3 sets 8), every interior gap of the
462
+ # badge composition (accent→glyph or accent→label, glyph→label,
463
+ # label→seam, seam→value, value→indicator, indicator→right border)
464
+ # collapses to that single value. Paradigms that don't declare it
465
+ # (chrome / cellular / default) receive 0 and keep their legacy layout
466
+ # constants. When rhythm_gap > 0, ``ind_pad_r`` is also forced to the
467
+ # same value so the value→indicator and indicator→right-border gaps
468
+ # match the rest of the rhythm.
469
+ rhythm_gap = paradigm_spec.badge.rhythm_gap if paradigm_spec else 0
429
470
  layout = compute_badge_layout(
430
471
  height=height,
431
472
  measured_label_w=lw,
@@ -449,6 +490,8 @@ def resolve_badge(
449
490
  right_canvas_inset=right_canvas_inset,
450
491
  text_y_factor=text_y_factor,
451
492
  value_font_size=_value_size,
493
+ inner_bit_ratio=indicator_inner_bit_ratio,
494
+ rhythm_gap=rhythm_gap,
452
495
  )
453
496
 
454
497
  # Variant resolution and profile visual context (envelope, well, specular,
@@ -483,6 +526,7 @@ def resolve_badge(
483
526
  "indicator_size": layout.indicator_size,
484
527
  "inner_bit_w": layout.inner_bit_w,
485
528
  "inner_bit_offset": layout.inner_bit_offset,
529
+ "indicator_stroke_width": indicator_stroke_width,
486
530
  "accent_bar_width": accent_w,
487
531
  "has_glyph": has_glyph,
488
532
  "show_indicator": layout.show_indicator,
@@ -1100,10 +1144,18 @@ def resolve_divider(
1100
1144
  "divider_label": spec.value or "",
1101
1145
  "variant": spec.variant or "",
1102
1146
  # Pass through chrome chromosomes so chrome-band template's envelope_stops
1103
- # for-loop has data. brutalist-seam needs accent + accent_signal.
1147
+ # for-loop has data. brutalist-seam needs accent + accent_complement (was
1148
+ # accent_signal pre-v0.3.3 — see brutalist-seam.svg.j2 header for the
1149
+ # chromatic-register rationale). zeropoint (editorial default) needs
1150
+ # accent + accent_complement + surface_deep to drive its variant-aware
1151
+ # aurora gradient + nexus beacon without hardcoded chromatic literals.
1152
+ # accent_signal stays in context for backward-compat — currently no
1153
+ # divider template reads it but other surfaces may grow into the field.
1104
1154
  "envelope_stops": genome.get("envelope_stops", []),
1105
1155
  "accent": genome.get("accent", ""),
1156
+ "accent_complement": genome.get("accent_complement", ""),
1106
1157
  "accent_signal": genome.get("accent_signal", ""),
1158
+ "surface_deep": genome.get("surface_2", ""),
1107
1159
  }
1108
1160
  # Profile visual context now injected centrally by the dispatcher.
1109
1161
 
@@ -1704,12 +1756,16 @@ def _truncate_path_left(
1704
1756
  """Truncate ``path`` from the LEFT (drop prefix, keep filename end) so the
1705
1757
  result fits inside ``max_w`` pixels at 9pt JetBrains Mono.
1706
1758
 
1707
- Receipt footer paths look like ``.hyperweave/receipts/<uuid>.svg``,
1708
- where the UUID suffix is the only distinguishing information; the
1709
- ``.hyperweave/receipts/`` prefix is constant noise across every
1710
- session. Left-truncation preserves the meaningful end and emits
1711
- ``…<unique-suffix>``, so a footer line that would otherwise collide
1712
- with the right-aligned session date stays inside the content track.
1759
+ Receipt footer paths take one of two shapes depending on the caller:
1760
+ the CLI write path emits a human-readable basename like
1761
+ ``20260508_receipt_debug_v0226.svg`` (set via
1762
+ ``ComposeSpec.receipt_filename_hint``); HTTP / MCP callers without the
1763
+ hint emit the legacy ``.hyperweave/receipts/<uuid>.svg`` shape. In both
1764
+ cases the *end* of the string carries the most identifying information
1765
+ (the slug or the UUID), and any leading prefix is the lower-signal
1766
+ portion to drop. Left-truncation emits ``…<unique-suffix>`` so a
1767
+ footer line that would otherwise collide with the right-aligned
1768
+ session date stays inside the content track.
1713
1769
 
1714
1770
  Returns the input unchanged when it already fits. Returns the empty
1715
1771
  string when ``max_w`` is too small even for a single ellipsis. Width
@@ -2169,7 +2225,16 @@ def resolve_receipt(
2169
2225
  git_branch = session.get("git_branch", "")
2170
2226
  project_path = session.get("project_path", "")
2171
2227
  project_name = Path(project_path).name if project_path else "session"
2172
- receipt_path = f".hyperweave/receipts/{session_id}.svg" if session_id else ""
2228
+ # Footer filepath token: prefer the CLI-supplied human-readable basename
2229
+ # (matches the file the user sees on disk — e.g. "20260508_receipt_debug_v0226.svg").
2230
+ # Fall back to the legacy UUID path so HTTP / MCP callers that don't set
2231
+ # receipt_filename_hint keep rendering rather than blanking the footer.
2232
+ if spec.receipt_filename_hint:
2233
+ receipt_path = spec.receipt_filename_hint
2234
+ elif session_id:
2235
+ receipt_path = f".hyperweave/receipts/{session_id}.svg"
2236
+ else:
2237
+ receipt_path = ""
2173
2238
 
2174
2239
  start_iso = session.get("start", "")
2175
2240
  start_formatted = ""
@@ -147,6 +147,17 @@ class ComposeSpec(FrozenModel):
147
147
  telemetry_data: dict[str, object] | None = Field(
148
148
  default=None, description="Session data contract JSON (telemetry frames only)"
149
149
  )
150
+ receipt_filename_hint: str = Field(
151
+ default="",
152
+ description=(
153
+ "Human-readable filename basename for the receipt footer (e.g. "
154
+ "'20260508_receipt_debug_v0226.svg'). Set by the CLI write path "
155
+ "after computing the on-disk filename so the footer's filepath "
156
+ "token matches the file the user sees. Empty string falls back "
157
+ "to the legacy '.hyperweave/receipts/{uuid}.svg' path so HTTP / "
158
+ "MCP callers that don't set the hint keep rendering."
159
+ ),
160
+ )
150
161
 
151
162
  # -- Divider-specific --
152
163
  divider_variant: DividerVariant = Field(
@@ -283,6 +283,47 @@ class ParadigmBadgeConfig(FrozenModel):
283
283
  at ``x=2..width-2`` per cellular-content.j2:9). Without this override,
284
284
  ``value_zone_right`` lands ``right_canvas_inset`` past the actual slab
285
285
  edge and drifts the centered value text right by half that amount."""
286
+ indicator_size: int = 0
287
+ """Optional paradigm-specific indicator side length. ``> 0`` overrides
288
+ the profile's ``badge_indicator_size``. Brutalist v0.3.3 sets 10 to
289
+ match the v16 badge matrix prototype (concentric 10x10 outline + 6x6
290
+ inner bit). Zero (default) defers to the profile."""
291
+ indicator_pad_r: int = 0
292
+ """Optional paradigm-specific right padding for the indicator. ``> 0``
293
+ overrides the profile's ``badge_indicator_pad_r``. Brutalist v0.3.3
294
+ sets 10 so the 10x10 indicator anchors at x=138 in a 158px badge
295
+ (matches prototype's ``translate(138,5)``). Zero defers to the profile."""
296
+ indicator_stroke_width: float = 0.0
297
+ """Optional paradigm-specific outer-ring stroke width for the indicator.
298
+ ``> 0`` overrides the layout-engine default (1.2). Brutalist v0.3.3
299
+ sets 1.5 to match the prototype's heavier ring weight. Zero defers
300
+ to the default."""
301
+ indicator_inner_bit_ratio: float = 0.0
302
+ """Optional paradigm-specific inner-bit/outer-ring side-length ratio.
303
+ ``> 0`` overrides the layout-engine default (0.5 — bit half of outer).
304
+ Brutalist v0.3.3 sets 0.6 (10→6) to match the prototype's heavier
305
+ inner mark. Zero defers to the default."""
306
+ label_letter_spacing_em: float = 0.0
307
+ """CSS-rendered ``letter-spacing`` for the label text. Resolver passes
308
+ this to ``measure_text`` so the layout reserves the actual rendered
309
+ width. Pre-v0.3.3 the resolver hardcoded ``0.06 if use_mono else 0.0``;
310
+ paradigm-driven now so brutalist (0.06) and chrome (0.12) declare the
311
+ measurement value alongside the template's ``letter-spacing`` attribute."""
312
+ value_letter_spacing_em: float = 0.0
313
+ """CSS-rendered ``letter-spacing`` for the value text. Brutalist's value
314
+ text declares ``letter-spacing="0.04em"`` in the template; before this
315
+ field landed the resolver passed ``0.0`` to measure_text and the badge
316
+ layout under-reserved width by ``(n-1) * font_size * 0.04`` — visible as
317
+ the value text overflowing the value zone by ~2.6px on a 7-char value."""
318
+ rhythm_gap: int = 0
319
+ """When ``> 0``, the badge layout engine uses a uniform interior rhythm:
320
+ every interior gap (accent→glyph, glyph→label, label→seam, seam→value,
321
+ value→indicator, indicator→right border) equals ``rhythm_gap`` pixels.
322
+ Forces ``label_start = accent_w + rhythm_gap``, ``label_pad_r = rhythm_gap``,
323
+ ``val_pad_l = rhythm_gap``, ``glyph_gap = rhythm_gap``, and disables the
324
+ uppercase shy-from-seam adjustment. Zero (default) preserves legacy
325
+ layout for chrome/cellular/default paradigms; brutalist sets 8 to match
326
+ the v16 prototype's symmetric composition."""
286
327
 
287
328
 
288
329
  class ParadigmIconConfig(FrozenModel):