hyperweave 0.3.0__tar.gz → 0.3.1__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 (400) hide show
  1. {hyperweave-0.3.0 → hyperweave-0.3.1}/CHANGELOG.md +19 -0
  2. {hyperweave-0.3.0 → hyperweave-0.3.1}/PKG-INFO +21 -15
  3. {hyperweave-0.3.0 → hyperweave-0.3.1}/README.md +20 -14
  4. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/_version.py +2 -2
  5. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/cli.py +21 -3
  6. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolver.py +3 -4
  7. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -10
  8. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/chart_engine.py +58 -17
  9. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/codex_parser.py +15 -1
  10. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/contract.py +1 -1
  11. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/models.py +10 -0
  12. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/parser.py +25 -2
  13. hyperweave-0.3.1/src/hyperweave/telemetry/receipt_paths.py +73 -0
  14. hyperweave-0.3.1/tests/fixtures/synthetic_session.jsonl +18 -0
  15. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_assembler.py +18 -0
  16. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chart_engine.py +143 -0
  17. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_codex_parser.py +19 -0
  18. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_proofset.py +23 -8
  19. hyperweave-0.3.1/tests/test_receipt_paths.py +129 -0
  20. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry.py +84 -0
  21. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_url_stability.py +21 -4
  22. {hyperweave-0.3.0 → hyperweave-0.3.1}/.dockerignore +0 -0
  23. {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/ci.yml +0 -0
  24. {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/deploy.yml +0 -0
  25. {hyperweave-0.3.0 → hyperweave-0.3.1}/.github/workflows/publish.yml +0 -0
  26. {hyperweave-0.3.0 → hyperweave-0.3.1}/.gitignore +0 -0
  27. {hyperweave-0.3.0 → hyperweave-0.3.1}/.pre-commit-config.yaml +0 -0
  28. {hyperweave-0.3.0 → hyperweave-0.3.1}/Dockerfile +0 -0
  29. {hyperweave-0.3.0 → hyperweave-0.3.1}/LICENSE +0 -0
  30. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/buttons/button-liquid.svg +0 -0
  31. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-butterfly.svg +0 -0
  32. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-python.svg +0 -0
  33. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-sunflower.svg +0 -0
  34. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/cards/card-waves.svg +0 -0
  35. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
  36. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
  37. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
  38. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/banner.svg +0 -0
  39. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
  40. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
  41. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
  42. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
  43. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
  44. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
  45. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
  46. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
  47. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
  48. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
  49. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/brutalist-emerald/strip.svg +0 -0
  50. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
  51. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
  52. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
  53. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/banner.svg +0 -0
  54. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
  55. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/github.svg +0 -0
  56. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
  57. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
  58. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/icons/x.svg +0 -0
  59. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
  60. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
  61. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
  62. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
  63. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
  64. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/chrome-horizon/strip.svg +0 -0
  65. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/master_card.svg +0 -0
  66. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt.svg +0 -0
  67. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
  68. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
  69. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
  70. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/rhythm_strip.svg +0 -0
  71. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
  72. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer-liquid.svg +0 -0
  73. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer-purple.svg +0 -0
  74. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/footers/inneraura-footer.svg +0 -0
  75. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/hyperweave-banner.svg +0 -0
  76. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-discord.svg +0 -0
  77. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-docs.svg +0 -0
  78. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-github.svg +0 -0
  79. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
  80. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
  81. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
  82. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-x.svg +0 -0
  83. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
  84. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/badge-showcase-triple.svg +0 -0
  85. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/genome-marquee-triple.svg +0 -0
  86. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/marquees/sample-badges.svg +0 -0
  87. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/404.svg +0 -0
  88. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/callout-icons.svg +0 -0
  89. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/divider.svg +0 -0
  90. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/favicon.svg +0 -0
  91. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hero-banner.svg +0 -0
  92. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
  93. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
  94. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/loader.svg +0 -0
  95. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/mintlify-assets/og-image.svg +0 -0
  96. {hyperweave-0.3.0 → hyperweave-0.3.1}/assets/timelines/hyperweave-roadmap.svg +0 -0
  97. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/favicon.svg +0 -0
  98. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/hyperweave-banner.svg +0 -0
  99. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/hyperweave-navbar-logo.svg +0 -0
  100. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/assets/og-image.svg +0 -0
  101. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/architecture.mdx +0 -0
  102. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/camo-compatibility.mdx +0 -0
  103. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/cim-compliance.mdx +0 -0
  104. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/genome-profile-system.mdx +0 -0
  105. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/explanation/metadata-tiers.mdx +0 -0
  106. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/add-motion-to-badges.mdx +0 -0
  107. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/create-session-receipts.mdx +0 -0
  108. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
  109. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/how-to/use-live-data-badges.mdx +0 -0
  110. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/introduction.mdx +0 -0
  111. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/mint.json +0 -0
  112. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/quickstart.mdx +0 -0
  113. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/cli.mdx +0 -0
  114. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/compose-spec.mdx +0 -0
  115. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/genomes.mdx +0 -0
  116. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/http-api.mdx +0 -0
  117. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/mcp-tools.mdx +0 -0
  118. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/motions.mdx +0 -0
  119. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/reference/telemetry-contract.mdx +0 -0
  120. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/spec/hyperweave-protocol.mdx +0 -0
  121. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
  122. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/compose-your-first-badge.mdx +0 -0
  123. {hyperweave-0.3.0 → hyperweave-0.3.1}/docs/tutorials/install-session-telemetry.mdx +0 -0
  124. {hyperweave-0.3.0 → hyperweave-0.3.1}/fly.toml +0 -0
  125. {hyperweave-0.3.0 → hyperweave-0.3.1}/hooks/install.py +0 -0
  126. {hyperweave-0.3.0 → hyperweave-0.3.1}/hooks/session_end.sh +0 -0
  127. {hyperweave-0.3.0 → hyperweave-0.3.1}/justfile +0 -0
  128. {hyperweave-0.3.0 → hyperweave-0.3.1}/pyproject.toml +0 -0
  129. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/extract_font_metrics.py +0 -0
  130. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/extract_glyphs.py +0 -0
  131. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/generate_proofset.py +0 -0
  132. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/probe_live_stats.py +0 -0
  133. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/probe_star_history.py +0 -0
  134. {hyperweave-0.3.0 → hyperweave-0.3.1}/scripts/stress_test.py +0 -0
  135. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/__init__.py +0 -0
  136. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/__main__.py +0 -0
  137. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/__init__.py +0 -0
  138. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/assembler.py +0 -0
  139. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/bar_chart.py +0 -0
  140. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/context.py +0 -0
  141. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/engine.py +0 -0
  142. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/lanes.py +0 -0
  143. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/layout.py +0 -0
  144. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/palette.py +0 -0
  145. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/__init__.py +0 -0
  146. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/chart.py +0 -0
  147. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/resolvers/stats.py +0 -0
  148. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/rhythm.py +0 -0
  149. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/rhythm_strip.py +0 -0
  150. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/treemap.py +0 -0
  151. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/compose/validate_paradigms.py +0 -0
  152. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/__init__.py +0 -0
  153. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/genome_validator.py +0 -0
  154. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/loader.py +0 -0
  155. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/registry.py +0 -0
  156. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/config/settings.py +0 -0
  157. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/__init__.py +0 -0
  158. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/arxiv.py +0 -0
  159. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/base.py +0 -0
  160. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/cache.py +0 -0
  161. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/github.py +0 -0
  162. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/connectors/rest.py +0 -0
  163. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/__init__.py +0 -0
  164. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/cell_layout.py +0 -0
  165. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/color.py +0 -0
  166. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/contracts.py +0 -0
  167. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/enums.py +0 -0
  168. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/font_metrics.py +0 -0
  169. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/models.py +0 -0
  170. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/paradigm.py +0 -0
  171. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/schema.py +0 -0
  172. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/state.py +0 -0
  173. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/text.py +0 -0
  174. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/core/thresholds.py +0 -0
  175. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/badge_modes.yaml +0 -0
  176. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/accessibility.css +0 -0
  177. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/bridge.css +0 -0
  178. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/expression.css +0 -0
  179. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/css/status.css +0 -0
  180. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
  181. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/inter.json +0 -0
  182. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
  183. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
  184. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
  185. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
  186. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
  187. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
  188. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
  189. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
  190. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/automata.json +0 -0
  191. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/brutalist.json +0 -0
  192. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/chrome.json +0 -0
  193. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
  194. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
  195. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
  196. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/glyphs.json +0 -0
  197. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
  198. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
  199. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
  200. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
  201. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
  202. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/motions/static.yaml +0 -0
  203. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/brutalist.yaml +0 -0
  204. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
  205. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
  206. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/paradigms/default.yaml +0 -0
  207. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/normal.json +0 -0
  208. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/permissive.json +0 -0
  209. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/policies/ungoverned.json +0 -0
  210. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
  211. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
  212. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
  213. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/profiles/chrome.yaml +0 -0
  214. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/specimens.yaml +0 -0
  215. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
  216. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
  217. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
  218. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
  219. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
  220. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
  221. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/arrow.json +0 -0
  222. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/aurora.json +0 -0
  223. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/beacon.json +0 -0
  224. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/bracket3d.json +0 -0
  225. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/chevron.json +0 -0
  226. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/crosshair.json +0 -0
  227. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/diamond.json +0 -0
  228. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rocket.json +0 -0
  229. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/bar.json +0 -0
  230. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
  231. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
  232. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
  233. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/straight.json +0 -0
  234. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/rules/wave.json +0 -0
  235. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/data/terminals/stijl.json +0 -0
  236. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/kit.py +0 -0
  237. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/__init__.py +0 -0
  238. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/__main__.py +0 -0
  239. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/mcp/server.py +0 -0
  240. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/py.typed +0 -0
  241. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/__init__.py +0 -0
  242. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/fonts.py +0 -0
  243. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/glyphs.py +0 -0
  244. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/motion.py +0 -0
  245. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/render/templates.py +0 -0
  246. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/__init__.py +0 -0
  247. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/app.py +0 -0
  248. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/serve/data_tokens.py +0 -0
  249. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/__init__.py +0 -0
  250. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/capture.py +0 -0
  251. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/corrections.py +0 -0
  252. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/cost.py +0 -0
  253. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/runtimes.py +0 -0
  254. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/telemetry/stages.py +0 -0
  255. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
  256. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
  257. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
  258. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
  259. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
  260. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
  261. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
  262. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
  263. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
  264. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
  265. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
  266. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
  267. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
  268. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
  269. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
  270. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
  271. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
  272. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
  273. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
  274. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/status.svg.j2 +0 -0
  275. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
  276. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/document.svg.j2 +0 -0
  277. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
  278. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
  279. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
  280. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
  281. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
  282. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
  283. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
  284. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
  285. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
  286. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
  287. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
  288. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
  289. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +0 -0
  290. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
  291. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
  292. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
  293. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
  294. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
  295. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -0
  296. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
  297. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/divider.svg.j2 +0 -0
  298. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
  299. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
  300. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
  301. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
  302. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
  303. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
  304. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
  305. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
  306. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
  307. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
  308. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
  309. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
  310. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
  311. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
  312. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
  313. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
  314. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
  315. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
  316. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
  317. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
  318. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
  319. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
  320. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
  321. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
  322. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
  323. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
  324. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
  325. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
  326. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
  327. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
  328. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
  329. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
  330. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
  331. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
  332. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
  333. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
  334. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
  335. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
  336. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
  337. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
  338. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
  339. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
  340. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
  341. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
  342. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
  343. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
  344. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
  345. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
  346. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
  347. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
  348. {hyperweave-0.3.0 → hyperweave-0.3.1}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
  349. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/__init__.py +0 -0
  350. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/conftest.py +0 -0
  351. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/codex_session.jsonl +0 -0
  352. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/codex_session_patches.jsonl +0 -0
  353. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/github_contributions/synthetic.html +0 -0
  354. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/session.json +0 -0
  355. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/fixtures/session.jsonl +0 -0
  356. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/helpers.py +0 -0
  357. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/snapshots/url_stability/divider_band_chrome_static.svg +0 -0
  358. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/snapshots/url_stability/icon_github_chrome_static.svg +0 -0
  359. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_cellular.py +0 -0
  360. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_layout.py +0 -0
  361. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_badge_mode.py +0 -0
  362. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chart_frame.py +0 -0
  363. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_chrome_variants.py +0 -0
  364. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_bar_chart.py +0 -0
  365. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_rhythm_strip.py +0 -0
  366. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_treemap.py +0 -0
  367. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_compose_variant_field.py +0 -0
  368. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_connectors.py +0 -0
  369. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_core.py +0 -0
  370. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_data_tokens.py +0 -0
  371. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_divider_cellular.py +0 -0
  372. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_divider_genome_specific.py +0 -0
  373. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_font_gating.py +0 -0
  374. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_font_metrics_chakra.py +0 -0
  375. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_genome_automata.py +0 -0
  376. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_github_scrape.py +0 -0
  377. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_kit.py +0 -0
  378. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_marquee_v0_2_16.py +0 -0
  379. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_mcp.py +0 -0
  380. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_cellular.py +0 -0
  381. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_dispatch.py +0 -0
  382. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_paradigm_extensibility.py +0 -0
  383. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_parse_transcript_auto.py +0 -0
  384. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_receipt_token_compliance.py +0 -0
  385. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_render.py +0 -0
  386. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_resolver_rhythm.py +0 -0
  387. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_runtime_registries.py +0 -0
  388. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_serve.py +0 -0
  389. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_serve_live_state.py +0 -0
  390. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_slot_metric_state.py +0 -0
  391. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_state_inference.py +0 -0
  392. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_stats_card.py +0 -0
  393. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_strip_cellular.py +0 -0
  394. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_strip_status_toggle.py +0 -0
  395. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_contract_per_stage.py +0 -0
  396. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_integration.py +0 -0
  397. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_telemetry_skin_dispatch.py +0 -0
  398. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_tool_class_completeness.py +0 -0
  399. {hyperweave-0.3.0 → hyperweave-0.3.1}/tests/test_variant_default_resolution.py +0 -0
  400. {hyperweave-0.3.0 → hyperweave-0.3.1}/uv.lock +0 -0
@@ -5,6 +5,25 @@ 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.1] - 2026-05-10
9
+
10
+ Receipt user-turn count and filenames now reflect actual session content. Voltage receipts always render dark regardless of viewer color scheme. Star chart x-axis labels no longer collide on short-history repos.
11
+
12
+ ### Fixed
13
+
14
+ - **Receipt user-turn count** — the footer "N user turns" now reports actual prompt count; slash commands and tool results no longer skew the number.
15
+ - **Star chart x-axis labels on short histories** — "Apr 2026" / "May 2026" no longer overlap on charts spanning under two years. Spacing now accounts for actual label width and drops middle labels when their bounding boxes would touch.
16
+
17
+ ### Changed
18
+
19
+ - **Receipt filenames are human-readable** — saved as `{date}_{time}_{session-name}.svg` (was UUID-only). Session name comes from Claude Code's auto-titled session or Codex's thread name; UUID stays in the SVG metadata.
20
+ - **Voltage receipts always render dark** — the light-mode adaptation block is removed; voltage stays dark across all viewers.
21
+ - **Codex receipts carry git branch and thread name** — both are now extracted from Codex transcripts and surfaced in receipt provenance and filenames.
22
+
23
+ ### Notes
24
+
25
+ - 1067 tests (was 1035).
26
+
8
27
  ## [0.3.0] - 2026-05-10
9
28
 
10
29
  Chrome ships five named variants. Automata ships sixteen tones with a pairing grammar that composes any two into a bifamily strip or divider. Stat cards, star charts, marquees, and icons redesigned. Per-frame font filtering cuts artifact payloads.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperweave
3
- Version: 0.3.0
3
+ Version: 0.3.1
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
@@ -161,11 +161,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
161
161
  <h3 id="chrome">chrome</h3>
162
162
 
163
163
  <p align="center">
164
- <img src="https://hyperweave.app/v1/badge/BUILD/passing/chrome.static?state=passing&variant=horizon" alt="BUILD passing — horizon variant"/>
165
- <img src="https://hyperweave.app/v1/badge/DEPLOY/live/chrome.static?state=passing&variant=abyssal" alt="DEPLOY live — abyssal variant"/>
166
- <img src="https://hyperweave.app/v1/badge/COVERAGE/94%25/chrome.static?state=passing&variant=lightning" alt="COVERAGE 94% — lightning variant"/>
167
- <img src="https://hyperweave.app/v1/badge/CRITICAL/0/chrome.static?state=warning&variant=graphite" alt="CRITICAL 0 — graphite variant"/>
168
- <img src="https://hyperweave.app/v1/badge/TESTS/142/chrome.static?state=passing&variant=moth" alt="TESTS 142 — moth variant"/>
164
+ <img src="https://hyperweave.app/v1/badge/BUILD/chrome.static?data=gh:InnerAura/hyperweave.build&glyph=githubactions&variant=horizon" alt="BUILD — horizon variant"/>
165
+ <img src="https://hyperweave.app/v1/badge/BLUESKY/POST/chrome.static?glyph=bluesky&variant=abyssal" alt="BLUESKY POST — abyssal variant"/>
166
+ <img src="https://hyperweave.app/v1/badge/DOCKER/chrome.static?data=docker:zeroxeli/readme-ai.pull_count&glyph=docker&variant=lightning" alt="DOCKER pulls — lightning variant"/>
167
+ <img src="https://hyperweave.app/v1/badge/STARS/chrome.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=graphite" alt="STARS — graphite variant"/>
168
+ <img src="https://hyperweave.app/v1/badge/ANTHROPIC/CLAUDE/chrome.static?glyph=anthropic&variant=moth" alt="ANTHROPIC CLAUDE — moth variant"/>
169
169
  </p>
170
170
 
171
171
  <p align="center">
@@ -260,12 +260,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
260
260
  <h3 id="automata">automata</h3>
261
261
 
262
262
  <p align="center">
263
- <img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=indigo" alt="DISCORD JOINindigo variant"/>
264
- <img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=cobalt" alt="DOCKER PULLcobalt variant"/>
265
- <img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:InnerAura/hyperweave.stars&glyph=github&variant=bone" alt="STARS — bone variant"/>
266
- <img src="https://hyperweave.app/v1/badge/FOLLOW/automata.static?glyph=x&variant=steel" alt="FOLLOW — steel variant"/>
263
+ <img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=teal" alt="DOCKER PULLteal variant"/>
264
+ <img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=violet" alt="DISCORD JOINviolet variant"/>
265
+ <img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=amber" alt="STARS — amber variant"/>
267
266
  <img src="https://hyperweave.app/v1/badge/HF/MODELS/automata.static?glyph=huggingface&variant=sulfur" alt="HF MODELS — sulfur variant"/>
268
- <img src="https://hyperweave.app/v1/badge/LISTEN/automata.static?glyph=spotify&variant=jade" alt="LISTEN — jade variant"/>
267
+ <img src="https://hyperweave.app/v1/badge/SPOTIFY/LISTEN/automata.static?glyph=spotify&variant=jade" alt="SPOTIFY LISTEN — jade variant"/>
269
268
  </p>
270
269
 
271
270
  <p align="center">
@@ -289,7 +288,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
289
288
  <tr>
290
289
  <th align="left">Dashboard<br/><sub>strip</sub></th>
291
290
  <td>
292
- <img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&pair=steel&glyph=github" alt="strip"/>
291
+ <img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&glyph=github" alt="strip"/>
293
292
  <br/>
294
293
  <ul>
295
294
  <li><sub><code>/v1/strip/{title}/automata.static?data={tokens}&variant={tone}&pair={tone}&subtitle={text}&glyph={glyph}</code></sub></li>
@@ -300,7 +299,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
300
299
  <tr>
301
300
  <th align="left">Profile<br/><sub>stats card</sub></th>
302
301
  <td>
303
- <img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone" alt="stats" width="100%"/>
302
+ <img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone&v=2" alt="stats" width="100%"/>
304
303
  <br/>
305
304
  <ul>
306
305
  <li><sub><code>/v1/stats/{username}/{genome}.static?variant={tone}</code></sub></li>
@@ -311,7 +310,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
311
310
  <tr>
312
311
  <th align="left">Star Chart<br/><sub>star history</sub></th>
313
312
  <td>
314
- <img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone" alt="star chart" width="100%"/>
313
+ <img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone&v=2" alt="star chart" width="100%"/>
315
314
  <br/>
316
315
  <ul>
317
316
  <li><sub><code>/v1/chart/stars/{owner}/{repo}/{genome}.static?variant={tone}</code></sub></li>
@@ -335,8 +334,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
335
334
  <td>
336
335
  <img src="https://hyperweave.app/v1/icon/docker/automata.static?shape=square&variant=cobalt" alt="docker cobalt" width="56"/>
337
336
  <img src="https://hyperweave.app/v1/icon/discord/automata.static?shape=square&variant=indigo" alt="discord indigo" width="56"/>
337
+ <img src="https://hyperweave.app/v1/icon/github/automata.static?shape=square&variant=bone" alt="github bone" width="56"/>
338
338
  <img src="https://hyperweave.app/v1/icon/huggingface/automata.static?shape=square&variant=sulfur" alt="huggingface sulfur" width="56"/>
339
+ <img src="https://hyperweave.app/v1/icon/anthropic/automata.static?shape=square&variant=solar" alt="anthropic solar" width="56"/>
339
340
  <img src="https://hyperweave.app/v1/icon/youtube/automata.static?shape=square&variant=crimson" alt="youtube crimson" width="56"/>
341
+ <img src="https://hyperweave.app/v1/icon/spotify/automata.static?shape=square&variant=jade" alt="spotify jade" width="56"/>
340
342
  <br/>
341
343
  <ul>
342
344
  <li><sub><code>/v1/icon/{glyph}/automata.static?shape=square&variant={tone}</code></sub></li>
@@ -347,7 +349,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
347
349
  <tr>
348
350
  <th align="left">Divider<br/><sub>dissolve</sub></th>
349
351
  <td>
350
- <img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone&pair=steel" alt="automata dissolve divider"/>
352
+ <img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone" alt="automata dissolve divider"/>
351
353
  <br/>
352
354
  <ul>
353
355
  <li><sub><code>/v1/divider/dissolve/{genome}.static?variant={tone}&pair={tone}</code></sub></li>
@@ -444,6 +446,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
444
446
  </tr>
445
447
  </table>
446
448
 
449
+ <br />
450
+
447
451
  | | chrome | brutalist | automata |
448
452
  |---|---|---|---|
449
453
  | Aesthetic | Metallic precision | Raw material | Living cellular grid |
@@ -451,6 +455,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
451
455
  | Motion | Animated border SMIL | Animated border SMIL | Animated cell grid |
452
456
  | Divider | `band` | `seam` | `dissolve` |
453
457
 
458
+ <br />
459
+
454
460
  <h3 id="dividers"><code>/a/inneraura/dividers/</code></h3>
455
461
 
456
462
  <table>
@@ -129,11 +129,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
129
129
  <h3 id="chrome">chrome</h3>
130
130
 
131
131
  <p align="center">
132
- <img src="https://hyperweave.app/v1/badge/BUILD/passing/chrome.static?state=passing&variant=horizon" alt="BUILD passing — horizon variant"/>
133
- <img src="https://hyperweave.app/v1/badge/DEPLOY/live/chrome.static?state=passing&variant=abyssal" alt="DEPLOY live — abyssal variant"/>
134
- <img src="https://hyperweave.app/v1/badge/COVERAGE/94%25/chrome.static?state=passing&variant=lightning" alt="COVERAGE 94% — lightning variant"/>
135
- <img src="https://hyperweave.app/v1/badge/CRITICAL/0/chrome.static?state=warning&variant=graphite" alt="CRITICAL 0 — graphite variant"/>
136
- <img src="https://hyperweave.app/v1/badge/TESTS/142/chrome.static?state=passing&variant=moth" alt="TESTS 142 — moth variant"/>
132
+ <img src="https://hyperweave.app/v1/badge/BUILD/chrome.static?data=gh:InnerAura/hyperweave.build&glyph=githubactions&variant=horizon" alt="BUILD — horizon variant"/>
133
+ <img src="https://hyperweave.app/v1/badge/BLUESKY/POST/chrome.static?glyph=bluesky&variant=abyssal" alt="BLUESKY POST — abyssal variant"/>
134
+ <img src="https://hyperweave.app/v1/badge/DOCKER/chrome.static?data=docker:zeroxeli/readme-ai.pull_count&glyph=docker&variant=lightning" alt="DOCKER pulls — lightning variant"/>
135
+ <img src="https://hyperweave.app/v1/badge/STARS/chrome.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=graphite" alt="STARS — graphite variant"/>
136
+ <img src="https://hyperweave.app/v1/badge/ANTHROPIC/CLAUDE/chrome.static?glyph=anthropic&variant=moth" alt="ANTHROPIC CLAUDE — moth variant"/>
137
137
  </p>
138
138
 
139
139
  <p align="center">
@@ -228,12 +228,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
228
228
  <h3 id="automata">automata</h3>
229
229
 
230
230
  <p align="center">
231
- <img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=indigo" alt="DISCORD JOINindigo variant"/>
232
- <img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=cobalt" alt="DOCKER PULLcobalt variant"/>
233
- <img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:InnerAura/hyperweave.stars&glyph=github&variant=bone" alt="STARS — bone variant"/>
234
- <img src="https://hyperweave.app/v1/badge/FOLLOW/automata.static?glyph=x&variant=steel" alt="FOLLOW — steel variant"/>
231
+ <img src="https://hyperweave.app/v1/badge/DOCKER/PULL/automata.static?glyph=docker&variant=teal" alt="DOCKER PULLteal variant"/>
232
+ <img src="https://hyperweave.app/v1/badge/DISCORD/JOIN/automata.static?glyph=discord&variant=violet" alt="DISCORD JOINviolet variant"/>
233
+ <img src="https://hyperweave.app/v1/badge/STARS/automata.static?data=gh:eli64s/readme-ai.stars&glyph=github&variant=amber" alt="STARS — amber variant"/>
235
234
  <img src="https://hyperweave.app/v1/badge/HF/MODELS/automata.static?glyph=huggingface&variant=sulfur" alt="HF MODELS — sulfur variant"/>
236
- <img src="https://hyperweave.app/v1/badge/LISTEN/automata.static?glyph=spotify&variant=jade" alt="LISTEN — jade variant"/>
235
+ <img src="https://hyperweave.app/v1/badge/SPOTIFY/LISTEN/automata.static?glyph=spotify&variant=jade" alt="SPOTIFY LISTEN — jade variant"/>
237
236
  </p>
238
237
 
239
238
  <p align="center">
@@ -257,7 +256,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
257
256
  <tr>
258
257
  <th align="left">Dashboard<br/><sub>strip</sub></th>
259
258
  <td>
260
- <img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&pair=steel&glyph=github" alt="strip"/>
259
+ <img src="https://hyperweave.app/v1/strip/readme-ai/automata.static?data=gh:eli64s/readme-ai.stars,gh:eli64s/readme-ai.forks,pypi:readmeai.version&subtitle=eli64s/readme-ai&variant=bone&glyph=github" alt="strip"/>
261
260
  <br/>
262
261
  <ul>
263
262
  <li><sub><code>/v1/strip/{title}/automata.static?data={tokens}&variant={tone}&pair={tone}&subtitle={text}&glyph={glyph}</code></sub></li>
@@ -268,7 +267,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
268
267
  <tr>
269
268
  <th align="left">Profile<br/><sub>stats card</sub></th>
270
269
  <td>
271
- <img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone" alt="stats" width="100%"/>
270
+ <img src="https://hyperweave.app/v1/stats/eli64s/automata.static?variant=bone&v=2" alt="stats" width="100%"/>
272
271
  <br/>
273
272
  <ul>
274
273
  <li><sub><code>/v1/stats/{username}/{genome}.static?variant={tone}</code></sub></li>
@@ -279,7 +278,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
279
278
  <tr>
280
279
  <th align="left">Star Chart<br/><sub>star history</sub></th>
281
280
  <td>
282
- <img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone" alt="star chart" width="100%"/>
281
+ <img src="https://hyperweave.app/v1/chart/stars/eli64s/readme-ai/automata.static?variant=bone&v=2" alt="star chart" width="100%"/>
283
282
  <br/>
284
283
  <ul>
285
284
  <li><sub><code>/v1/chart/stars/{owner}/{repo}/{genome}.static?variant={tone}</code></sub></li>
@@ -303,8 +302,11 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
303
302
  <td>
304
303
  <img src="https://hyperweave.app/v1/icon/docker/automata.static?shape=square&variant=cobalt" alt="docker cobalt" width="56"/>
305
304
  <img src="https://hyperweave.app/v1/icon/discord/automata.static?shape=square&variant=indigo" alt="discord indigo" width="56"/>
305
+ <img src="https://hyperweave.app/v1/icon/github/automata.static?shape=square&variant=bone" alt="github bone" width="56"/>
306
306
  <img src="https://hyperweave.app/v1/icon/huggingface/automata.static?shape=square&variant=sulfur" alt="huggingface sulfur" width="56"/>
307
+ <img src="https://hyperweave.app/v1/icon/anthropic/automata.static?shape=square&variant=solar" alt="anthropic solar" width="56"/>
307
308
  <img src="https://hyperweave.app/v1/icon/youtube/automata.static?shape=square&variant=crimson" alt="youtube crimson" width="56"/>
309
+ <img src="https://hyperweave.app/v1/icon/spotify/automata.static?shape=square&variant=jade" alt="spotify jade" width="56"/>
308
310
  <br/>
309
311
  <ul>
310
312
  <li><sub><code>/v1/icon/{glyph}/automata.static?shape=square&variant={tone}</code></sub></li>
@@ -315,7 +317,7 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
315
317
  <tr>
316
318
  <th align="left">Divider<br/><sub>dissolve</sub></th>
317
319
  <td>
318
- <img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone&pair=steel" alt="automata dissolve divider"/>
320
+ <img src="https://hyperweave.app/v1/divider/dissolve/automata.static?variant=bone" alt="automata dissolve divider"/>
319
321
  <br/>
320
322
  <ul>
321
323
  <li><sub><code>/v1/divider/dissolve/{genome}.static?variant={tone}&pair={tone}</code></sub></li>
@@ -412,6 +414,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
412
414
  </tr>
413
415
  </table>
414
416
 
417
+ <br />
418
+
415
419
  | | chrome | brutalist | automata |
416
420
  |---|---|---|---|
417
421
  | Aesthetic | Metallic precision | Raw material | Living cellular grid |
@@ -419,6 +423,8 @@ Why genome and not theme? Because brand isn't a design problem, it's an infrastr
419
423
  | Motion | Animated border SMIL | Animated border SMIL | Animated cell grid |
420
424
  | Divider | `band` | `seam` | `dissolve` |
421
425
 
426
+ <br />
427
+
422
428
  <h3 id="dividers"><code>/a/inneraura/dividers/</code></h3>
423
429
 
424
430
  <table>
@@ -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.0'
22
- __version_tuple__ = version_tuple = (0, 3, 0)
21
+ __version__ = version = '0.3.1'
22
+ __version_tuple__ = version_tuple = (0, 3, 1)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -369,12 +369,30 @@ def session(
369
369
  result = do_compose(spec)
370
370
 
371
371
  if action == "receipt":
372
- # Default output: .hyperweave/receipts/{session_id}.svg
372
+ # Default output: .hyperweave/receipts/{date}_{time}_{slug}.svg
373
373
  if not output:
374
- sid = contract.get("session", {}).get("id", "unknown")
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 ""
375
388
  hw_dir = Path(".hyperweave") / "receipts"
376
389
  hw_dir.mkdir(parents=True, exist_ok=True)
377
- output = hw_dir / f"{sid}.svg"
390
+ output = hw_dir / receipt_filename(
391
+ timestamp=ts,
392
+ session_name=session_name,
393
+ session_id=sid,
394
+ prompt_text=first_prompt,
395
+ )
378
396
 
379
397
  output.parent.mkdir(parents=True, exist_ok=True)
380
398
  output.write_text(result.svg)
@@ -1993,10 +1993,9 @@ def resolve_receipt(
1993
1993
  pill_label = hero_profile.upper()
1994
1994
  pill_w = int(len(pill_label) * 7 * 1.28) + 14
1995
1995
  pill_x = 800 - 24 - pill_w
1996
- # Split "pushbacks" into distinct signals so the card stops labeling them
1997
- # as one opaque "N corrections" lie. user_events counts every non-continuation
1998
- # user turn (corrections + redirects + elaborations); tool errors count
1999
- # failing/blocked tool calls (the red ✗N cell marks reconcile to this).
1996
+ # user_events is the unfiltered series of human-authored prose turns
1997
+ # (continuations + corrections + redirects + elaborations). Tool errors
1998
+ # count failing/blocked tool calls; the red ✗N cell marks reconcile to this.
2000
1999
  n_user_turns = len(user_events)
2001
2000
  n_tool_errors = sum(t.get("errors", 0) + t.get("blocked", 0) for t in tools)
2002
2001
  # n_agents = len(agents) # was used by old footer; v0.2.21 footer is 4-quadrant.
@@ -66,16 +66,6 @@
66
66
  "state_building_bright": "#DC8AC2",
67
67
  "state_offline_core": "#7A7F88",
68
68
  "state_offline_bright": "#B0B4BC",
69
- "light_mode": {
70
- "surface": "#fafafa",
71
- "surface_alt": "#f5f5f5",
72
- "surface_deep": "#f0f0f0",
73
- "ink": "#18181b",
74
- "ink_muted": "#3f3f46",
75
- "ink_ghost": "#a1a1aa",
76
- "border": "#e4e4e7",
77
- "sep": "#d4d4d8"
78
- },
79
69
  "paradigms": {
80
70
  "receipt": "default",
81
71
  "rhythm-strip": "default",
@@ -798,10 +798,49 @@ def _build_y_labels(ticks: list[int], v_min: int, v_max: int, vp: Viewport) -> l
798
798
  return out
799
799
 
800
800
 
801
- # Minimum horizontal pixel gap between two x-axis labels. Year labels (4 chars)
802
- # need a bit more room than milestone labels (40 px); 48 px keeps well-spaced
803
- # "2023" / "2024" / "2025" readable without forcing unnecessary drops.
804
- _X_LABEL_MIN_GAP_PX: int = 48
801
+ # Width-aware label collision constants. The previous fixed 48px center-to-center
802
+ # gap let monthly labels ("Apr 2026", ~58px wide) overlap by ~10px on adjacent ticks
803
+ # even when the gap "rule" passed. We now compute each label's actual rendered
804
+ # bounding box and check edge-to-edge separation.
805
+
806
+ # Conservative per-character width covering the widest paradigm (brutalist:
807
+ # 9px sans-serif + 0.20em letter-spacing + uppercase). Cellular and chrome
808
+ # render narrower, so this estimate is a safe upper bound for all genome
809
+ # paradigms — it never under-estimates collision.
810
+ _LABEL_CHAR_WIDTH_PX: float = 7.5
811
+
812
+ # Minimum visual gap between two label bounding boxes. Smaller than the full
813
+ # character width — readers tolerate close-packed labels as long as the glyphs
814
+ # don't actually touch.
815
+ _LABEL_EDGE_PADDING_PX: float = 6.0
816
+
817
+
818
+ def _label_pixel_width(text: str) -> float:
819
+ """Worst-case rendered width of `text` in pixels."""
820
+ return len(text) * _LABEL_CHAR_WIDTH_PX
821
+
822
+
823
+ def _label_bounds(label: dict[str, Any]) -> tuple[float, float]:
824
+ """Return (left_edge_px, right_edge_px) for a generated label dict.
825
+
826
+ Honors the SVG `text-anchor` semantics: 'start' anchors the left edge
827
+ at x, 'end' anchors the right edge at x, 'middle' centers the text on x.
828
+ """
829
+ x = float(label["x"])
830
+ w = _label_pixel_width(str(label["text"]))
831
+ anchor = label.get("anchor", "middle")
832
+ if anchor == "start":
833
+ return (x, x + w)
834
+ if anchor == "end":
835
+ return (x - w, x)
836
+ return (x - w / 2, x + w / 2)
837
+
838
+
839
+ def _labels_collide(left: dict[str, Any], right: dict[str, Any]) -> bool:
840
+ """True if `right`'s left edge is closer than padding to `left`'s right edge."""
841
+ _, left_right = _label_bounds(left)
842
+ right_left, _ = _label_bounds(right)
843
+ return right_left < left_right + _LABEL_EDGE_PADDING_PX
805
844
 
806
845
 
807
846
  def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[str, Any]]:
@@ -815,10 +854,11 @@ def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[st
815
854
  else → every other year ("2012", "2014", ...)
816
855
 
817
856
  A single-point input renders one centered label with full "%b %d, %Y".
818
- After candidate generation, a min-gap de-overlap pass removes any middle
819
- label within ``_X_LABEL_MIN_GAP_PX`` of a previously-kept one. The first
820
- and last labels are preserved unconditionally because they're the
821
- temporal endpoints a reader expects to see.
857
+ After candidate generation, a width-aware de-overlap pass removes any
858
+ middle label whose bounding box would touch the previously-kept one
859
+ (see ``_labels_collide``). The first and last labels are preserved
860
+ unconditionally because they're the temporal endpoints a reader
861
+ expects to see.
822
862
  """
823
863
  if not points:
824
864
  return []
@@ -867,22 +907,23 @@ def _build_x_date_labels(points: list[ChartPoint], vp: Viewport) -> list[dict[st
867
907
  # First label flush with the y-axis for a cleaner left edge.
868
908
  candidates[0]["anchor"] = "start"
869
909
 
870
- # De-overlap: preserve first + last; drop any middle label within min-gap
871
- # of a previously-kept one. Same algorithm as _build_milestones.
910
+ # De-overlap: preserve first + last; drop any middle label whose
911
+ # bounding box would touch the previously-kept one. Edge-to-edge
912
+ # collision (not center-to-center) so labels of different widths
913
+ # (e.g. monthly "Apr 2026" vs yearly "2026") behave correctly.
872
914
  if len(candidates) <= 2:
873
915
  return candidates
874
916
  kept: list[dict[str, Any]] = [candidates[0]]
875
917
  for label in candidates[1:-1]:
876
- if label["x"] - kept[-1]["x"] >= _X_LABEL_MIN_GAP_PX:
918
+ if not _labels_collide(kept[-1], label):
877
919
  kept.append(label)
878
- # The terminal endpoint is always included. If it's too close to the
879
- # last-kept middle label, or has identical text (e.g. yearly granularity
880
- # where the last jan-1 tick and the terminal point both read "2026"),
881
- # replace that middle label with the terminal rather than duplicating.
920
+ # The terminal endpoint is always included. If it would collide with
921
+ # the last-kept middle label, or has identical text (e.g. yearly
922
+ # granularity where the last jan-1 tick and the terminal point both
923
+ # read "2026"), replace that middle rather than duplicating.
882
924
  last_candidate = candidates[-1]
883
- too_close = last_candidate["x"] - kept[-1]["x"] < _X_LABEL_MIN_GAP_PX
884
925
  same_text = last_candidate["text"] == kept[-1]["text"]
885
- if too_close or same_text:
926
+ if same_text or _labels_collide(kept[-1], last_candidate):
886
927
  kept[-1] = last_candidate
887
928
  else:
888
929
  kept.append(last_candidate)
@@ -230,6 +230,8 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
230
230
  # ── Pass 1: session_meta + turn_context derive session metadata ──
231
231
  session_id = ""
232
232
  project_path = ""
233
+ git_branch: str | None = None
234
+ session_name = ""
233
235
  model: str | None = None
234
236
  for line in raw_lines:
235
237
  ltype = line.get("type")
@@ -239,6 +241,11 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
239
241
  if ltype == "session_meta":
240
242
  session_id = session_id or str(payload.get("id", ""))
241
243
  project_path = project_path or str(payload.get("cwd", ""))
244
+ git_data = payload.get("git") or {}
245
+ if isinstance(git_data, dict):
246
+ branch = git_data.get("branch")
247
+ if isinstance(branch, str) and branch:
248
+ git_branch = branch
242
249
  elif ltype == "turn_context":
243
250
  # turn_context refines model + cwd over time; the latest wins.
244
251
  cwd = payload.get("cwd")
@@ -247,6 +254,12 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
247
254
  mdl = payload.get("model")
248
255
  if mdl:
249
256
  model = str(mdl)
257
+ elif ltype == "event_msg" and payload.get("type") == "thread_name_updated":
258
+ # Codex's equivalent of Claude Code's customTitle — driven by
259
+ # task-naming flow. Latest-wins so renames mid-session are honored.
260
+ tname = payload.get("thread_name")
261
+ if isinstance(tname, str) and tname:
262
+ session_name = tname
250
263
 
251
264
  # ── Pass 2: tool calls from response_item (3 shapes) ──
252
265
  all_tool_calls: list[ToolCall] = []
@@ -411,8 +424,9 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
411
424
 
412
425
  return SessionTelemetry(
413
426
  session_id=session_id,
427
+ session_name=session_name,
414
428
  project_path=project_path,
415
- git_branch=None, # Codex doesn't surface git_branch in transcripts
429
+ git_branch=git_branch,
416
430
  model=model,
417
431
  runtime=_REGISTRY.runtime,
418
432
  timestamp=session_start,
@@ -104,6 +104,7 @@ def _assemble(t: SessionTelemetry, cost: float) -> dict[str, Any]:
104
104
  return {
105
105
  "session": {
106
106
  "id": t.session_id,
107
+ "name": t.session_name,
107
108
  "start": t.timestamp.isoformat(),
108
109
  "end": end,
109
110
  "duration_minutes": t.duration_minutes,
@@ -162,7 +163,6 @@ def _assemble(t: SessionTelemetry, cost: float) -> dict[str, Any]:
162
163
  "user_events": [
163
164
  {"category": e.category.value, "preview": e.message_preview, "confidence": e.confidence.value}
164
165
  for e in t.user_events
165
- if e.category.value != "continuation"
166
166
  ],
167
167
  "agents": [
168
168
  {"id": a.agent_id, "type": a.agent_type, "tool_calls": a.tool_calls, "tokens": a.total_tokens}
@@ -248,6 +248,16 @@ class SessionTelemetry(BaseModel):
248
248
  model_config = ConfigDict(extra="forbid")
249
249
 
250
250
  session_id: str
251
+ session_name: str = Field(
252
+ default="",
253
+ description=(
254
+ "Human-readable session identifier. Claude Code: latest customTitle "
255
+ "from `custom-title` records (driven by /rename and auto-titling). "
256
+ "Codex: latest thread_name from `event_msg/thread_name_updated` events. "
257
+ "Empty when neither is available — consumers fall back to first-prompt "
258
+ "slug or session_id when constructing receipt filenames."
259
+ ),
260
+ )
251
261
  project_path: str
252
262
  git_branch: str | None = None
253
263
  model: str | None = None
@@ -14,6 +14,7 @@ from __future__ import annotations
14
14
 
15
15
  import json
16
16
  import logging
17
+ import re
17
18
  from datetime import datetime
18
19
  from pathlib import Path
19
20
  from typing import Any
@@ -40,6 +41,15 @@ _JsonObj = dict[str, Any]
40
41
  # Resolved at import time — fail loud if claude-code.yaml is missing.
41
42
  _REGISTRY = get_runtime("claude-code")
42
43
 
44
+ # Match content that consists entirely of one or more XML envelopes
45
+ # emitted by the Claude Code harness (e.g. <command-name>...</command-name>,
46
+ # <local-command-stdout>...</local-command-stdout>, <system-reminder>...</...>).
47
+ # These are non-prose framing — never count them as user turns.
48
+ _ENVELOPE_ONLY = re.compile(
49
+ r"^<[a-z][a-z0-9-]*>.*</[a-z][a-z0-9-]*>$",
50
+ re.DOTALL,
51
+ )
52
+
43
53
 
44
54
  # --------------------------------------------------------------------------- #
45
55
  # HELPERS
@@ -199,7 +209,7 @@ def _extract_user_text(obj: _JsonObj) -> str | None:
199
209
 
200
210
  if isinstance(content, str):
201
211
  text = content.strip()
202
- if text.startswith("<") and ("command-name" in text or "system-reminder" in text):
212
+ if _ENVELOPE_ONLY.match(text):
203
213
  return None
204
214
  return text if text else None
205
215
 
@@ -303,6 +313,16 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
303
313
  if session_id and project_path and git_branch is not None:
304
314
  break
305
315
 
316
+ # `custom-title` records carry the user-facing session name (driven by /rename
317
+ # and Claude Code's auto-titling, which slugifies the first prompt). One record
318
+ # is emitted per assistant turn after the most-recent rename, so latest-wins.
319
+ session_name = ""
320
+ for line in raw_lines:
321
+ if line.get("type") == "custom-title":
322
+ title = line.get("customTitle")
323
+ if isinstance(title, str) and title:
324
+ session_name = title
325
+
306
326
  # -- Pass 1: Extract all tool calls from assistant messages --
307
327
  all_tool_calls: list[ToolCall] = []
308
328
  for line in raw_lines:
@@ -381,7 +401,9 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
381
401
  s.error_count += 1
382
402
 
383
403
  # -- Build totals --
384
- total_user_msgs = sum(1 for ln in raw_lines if _is_user_entry(ln))
404
+ # Count only human-authored prose. type:"user" lines also wrap tool_results
405
+ # and command-name/local-command-stdout envelopes; those are not turns.
406
+ total_user_msgs = sum(1 for ln in raw_lines if _is_user_entry(ln) and _extract_user_text(ln) is not None)
385
407
  total_assistant_msgs = sum(1 for ln in raw_lines if ln.get("type") == "assistant")
386
408
 
387
409
  totals = SessionTotals(
@@ -408,6 +430,7 @@ def parse_transcript(transcript_path: str | Path) -> SessionTelemetry:
408
430
 
409
431
  return SessionTelemetry(
410
432
  session_id=session_id,
433
+ session_name=session_name,
411
434
  project_path=project_path,
412
435
  git_branch=git_branch,
413
436
  model=model,