hyperweave 0.2.25__tar.gz → 0.2.26__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 (395) hide show
  1. {hyperweave-0.2.25 → hyperweave-0.2.26}/CHANGELOG.md +13 -0
  2. {hyperweave-0.2.25 → hyperweave-0.2.26}/PKG-INFO +1 -1
  3. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/_version.py +2 -2
  4. hyperweave-0.2.26/src/hyperweave/compose/engine.py +167 -0
  5. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/snapshots/url_stability/divider_band_chrome_static.svg +4 -4
  6. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/snapshots/url_stability/icon_github_chrome_static.svg +5 -5
  7. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_state_inference.py +51 -0
  8. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_url_stability.py +7 -0
  9. hyperweave-0.2.25/src/hyperweave/compose/engine.py +0 -106
  10. {hyperweave-0.2.25 → hyperweave-0.2.26}/.dockerignore +0 -0
  11. {hyperweave-0.2.25 → hyperweave-0.2.26}/.github/workflows/ci.yml +0 -0
  12. {hyperweave-0.2.25 → hyperweave-0.2.26}/.github/workflows/deploy.yml +0 -0
  13. {hyperweave-0.2.25 → hyperweave-0.2.26}/.github/workflows/publish.yml +0 -0
  14. {hyperweave-0.2.25 → hyperweave-0.2.26}/.gitignore +0 -0
  15. {hyperweave-0.2.25 → hyperweave-0.2.26}/.pre-commit-config.yaml +0 -0
  16. {hyperweave-0.2.25 → hyperweave-0.2.26}/Dockerfile +0 -0
  17. {hyperweave-0.2.25 → hyperweave-0.2.26}/LICENSE +0 -0
  18. {hyperweave-0.2.25 → hyperweave-0.2.26}/README.md +0 -0
  19. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/buttons/button-liquid.svg +0 -0
  20. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/cards/card-butterfly.svg +0 -0
  21. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/cards/card-python.svg +0 -0
  22. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/cards/card-sunflower.svg +0 -0
  23. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/cards/card-waves.svg +0 -0
  24. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/badge_critical.svg +0 -0
  25. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/badge_passing.svg +0 -0
  26. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/badge_warning.svg +0 -0
  27. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/banner.svg +0 -0
  28. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/icons/discord.svg +0 -0
  29. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/icons/notion.svg +0 -0
  30. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/icons/reddit.svg +0 -0
  31. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/icons/spotify.svg +0 -0
  32. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/icons/youtube.svg +0 -0
  33. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/marquee_counter.svg +0 -0
  34. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/marquee_horizontal.svg +0 -0
  35. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/marquee_vertical.svg +0 -0
  36. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/profile-cards/chart_stars_full.svg +0 -0
  37. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/profile-cards/stats.svg +0 -0
  38. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/brutalist-emerald/strip.svg +0 -0
  39. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/badge_critical.svg +0 -0
  40. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/badge_passing.svg +0 -0
  41. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/badge_warning.svg +0 -0
  42. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/banner.svg +0 -0
  43. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/icons/bluesky.svg +0 -0
  44. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/icons/github.svg +0 -0
  45. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/icons/instagram.svg +0 -0
  46. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/icons/mastodon.svg +0 -0
  47. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/icons/x.svg +0 -0
  48. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/marquee_counter.svg +0 -0
  49. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/marquee_horizontal.svg +0 -0
  50. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/marquee_vertical.svg +0 -0
  51. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/profile-cards/chart_stars_full.svg +0 -0
  52. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/profile-cards/stats.svg +0 -0
  53. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/chrome-horizon/strip.svg +0 -0
  54. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/master_card.svg +0 -0
  55. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/receipt.svg +0 -0
  56. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/receipt_claude-code_medium.svg +0 -0
  57. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/receipt_codex_large.svg +0 -0
  58. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/receipt_voltage_xlarge.svg +0 -0
  59. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/rhythm_strip.svg +0 -0
  60. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/examples/telemetry/rhythm_strip_voltage_xlarge.svg +0 -0
  61. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/footers/inneraura-footer-liquid.svg +0 -0
  62. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/footers/inneraura-footer-purple.svg +0 -0
  63. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/footers/inneraura-footer.svg +0 -0
  64. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/hyperweave-banner.svg +0 -0
  65. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-discord.svg +0 -0
  66. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-docs.svg +0 -0
  67. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-github.svg +0 -0
  68. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-instagram.svg +0 -0
  69. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-linkedin.svg +0 -0
  70. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-tiktok.svg +0 -0
  71. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-x.svg +0 -0
  72. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/icons/cobalt-sapphire-youtube.svg +0 -0
  73. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/marquees/badge-showcase-triple.svg +0 -0
  74. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/marquees/genome-marquee-triple.svg +0 -0
  75. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/marquees/sample-badges.svg +0 -0
  76. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/404.svg +0 -0
  77. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/callout-icons.svg +0 -0
  78. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/divider.svg +0 -0
  79. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/favicon.svg +0 -0
  80. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/hero-banner.svg +0 -0
  81. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/hyperweave-banner-v2.svg +0 -0
  82. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/hyperweave-navbar-logo.svg +0 -0
  83. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/loader.svg +0 -0
  84. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/mintlify-assets/og-image.svg +0 -0
  85. {hyperweave-0.2.25 → hyperweave-0.2.26}/assets/timelines/hyperweave-roadmap.svg +0 -0
  86. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/assets/favicon.svg +0 -0
  87. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/assets/hyperweave-banner.svg +0 -0
  88. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/assets/hyperweave-navbar-logo.svg +0 -0
  89. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/assets/og-image.svg +0 -0
  90. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/explanation/architecture.mdx +0 -0
  91. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/explanation/camo-compatibility.mdx +0 -0
  92. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/explanation/cim-compliance.mdx +0 -0
  93. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/explanation/genome-profile-system.mdx +0 -0
  94. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/explanation/metadata-tiers.mdx +0 -0
  95. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/how-to/add-motion-to-badges.mdx +0 -0
  96. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/how-to/create-session-receipts.mdx +0 -0
  97. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/how-to/set-up-claude-code-hooks.mdx +0 -0
  98. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/how-to/use-live-data-badges.mdx +0 -0
  99. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/introduction.mdx +0 -0
  100. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/mint.json +0 -0
  101. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/quickstart.mdx +0 -0
  102. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/cli.mdx +0 -0
  103. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/compose-spec.mdx +0 -0
  104. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/genomes.mdx +0 -0
  105. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/http-api.mdx +0 -0
  106. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/mcp-tools.mdx +0 -0
  107. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/motions.mdx +0 -0
  108. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/reference/telemetry-contract.mdx +0 -0
  109. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/spec/hyperweave-protocol.mdx +0 -0
  110. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/tutorials/build-an-artifact-kit.mdx +0 -0
  111. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/tutorials/compose-your-first-badge.mdx +0 -0
  112. {hyperweave-0.2.25 → hyperweave-0.2.26}/docs/tutorials/install-session-telemetry.mdx +0 -0
  113. {hyperweave-0.2.25 → hyperweave-0.2.26}/fly.toml +0 -0
  114. {hyperweave-0.2.25 → hyperweave-0.2.26}/hooks/install.py +0 -0
  115. {hyperweave-0.2.25 → hyperweave-0.2.26}/hooks/session_end.sh +0 -0
  116. {hyperweave-0.2.25 → hyperweave-0.2.26}/justfile +0 -0
  117. {hyperweave-0.2.25 → hyperweave-0.2.26}/pyproject.toml +0 -0
  118. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/extract_font_metrics.py +0 -0
  119. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/extract_glyphs.py +0 -0
  120. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/generate_proofset.py +0 -0
  121. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/probe_live_stats.py +0 -0
  122. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/probe_star_history.py +0 -0
  123. {hyperweave-0.2.25 → hyperweave-0.2.26}/scripts/stress_test.py +0 -0
  124. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/__init__.py +0 -0
  125. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/__main__.py +0 -0
  126. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/cli.py +0 -0
  127. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/__init__.py +0 -0
  128. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/assembler.py +0 -0
  129. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/bar_chart.py +0 -0
  130. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/context.py +0 -0
  131. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/lanes.py +0 -0
  132. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/layout.py +0 -0
  133. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/resolver.py +0 -0
  134. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/resolvers/__init__.py +0 -0
  135. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/resolvers/chart.py +0 -0
  136. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/resolvers/stats.py +0 -0
  137. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/rhythm.py +0 -0
  138. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/rhythm_strip.py +0 -0
  139. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/treemap.py +0 -0
  140. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/compose/validate_paradigms.py +0 -0
  141. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/config/__init__.py +0 -0
  142. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/config/genome_validator.py +0 -0
  143. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/config/loader.py +0 -0
  144. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/config/registry.py +0 -0
  145. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/config/settings.py +0 -0
  146. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/__init__.py +0 -0
  147. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/arxiv.py +0 -0
  148. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/base.py +0 -0
  149. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/cache.py +0 -0
  150. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/github.py +0 -0
  151. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/connectors/rest.py +0 -0
  152. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/__init__.py +0 -0
  153. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/cell_layout.py +0 -0
  154. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/color.py +0 -0
  155. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/contracts.py +0 -0
  156. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/enums.py +0 -0
  157. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/font_metrics.py +0 -0
  158. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/models.py +0 -0
  159. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/paradigm.py +0 -0
  160. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/schema.py +0 -0
  161. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/state.py +0 -0
  162. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/text.py +0 -0
  163. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/core/thresholds.py +0 -0
  164. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/badge_modes.yaml +0 -0
  165. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/css/accessibility.css +0 -0
  166. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/css/bridge.css +0 -0
  167. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/css/expression.css +0 -0
  168. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/css/status.css +0 -0
  169. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/font-metrics/chakra-petch.json +0 -0
  170. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/font-metrics/inter.json +0 -0
  171. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/font-metrics/jetbrains-mono.json +0 -0
  172. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/font-metrics/orbitron.json +0 -0
  173. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/chakra-petch.b64 +0 -0
  174. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/chakra-petch.meta.json +0 -0
  175. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/jetbrains-mono.b64 +0 -0
  176. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/jetbrains-mono.meta.json +0 -0
  177. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/orbitron.b64 +0 -0
  178. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/fonts/orbitron.meta.json +0 -0
  179. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/automata.json +0 -0
  180. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/brutalist.json +0 -0
  181. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/chrome.json +0 -0
  182. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/telemetry-claude-code.json +0 -0
  183. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/telemetry-codex.json +0 -0
  184. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/telemetry-cream.json +0 -0
  185. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/genomes/telemetry-voltage.json +0 -0
  186. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/glyphs.json +0 -0
  187. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/border/chromatic-pulse.yaml +0 -0
  188. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/border/corner-trace.yaml +0 -0
  189. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/border/dual-orbit.yaml +0 -0
  190. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/border/entanglement.yaml +0 -0
  191. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/border/rimrun.yaml +0 -0
  192. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/motions/static.yaml +0 -0
  193. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/paradigms/brutalist.yaml +0 -0
  194. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/paradigms/cellular.yaml +0 -0
  195. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/paradigms/chrome.yaml +0 -0
  196. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/paradigms/default.yaml +0 -0
  197. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/policies/normal.json +0 -0
  198. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/policies/permissive.json +0 -0
  199. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/policies/ungoverned.json +0 -0
  200. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/profiles/brutalist.contract.json +0 -0
  201. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/profiles/brutalist.yaml +0 -0
  202. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/profiles/chrome.contract.json +0 -0
  203. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/profiles/chrome.yaml +0 -0
  204. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/specimens.yaml +0 -0
  205. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/model-pricing.yaml +0 -0
  206. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/runtimes/claude-code.yaml +0 -0
  207. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/runtimes/codex.yaml +0 -0
  208. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/stage-config.yaml +0 -0
  209. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/stage-labels.yaml +0 -0
  210. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/telemetry/tool-colors.yaml +0 -0
  211. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/arrow.json +0 -0
  212. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/aurora.json +0 -0
  213. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/beacon.json +0 -0
  214. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/bracket3d.json +0 -0
  215. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/chevron.json +0 -0
  216. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/crosshair.json +0 -0
  217. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/diamond.json +0 -0
  218. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rocket.json +0 -0
  219. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/bar.json +0 -0
  220. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/dashed.json +0 -0
  221. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/five-wave.json +0 -0
  222. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/spectral.json +0 -0
  223. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/straight.json +0 -0
  224. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/rules/wave.json +0 -0
  225. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/data/terminals/stijl.json +0 -0
  226. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/kit.py +0 -0
  227. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/mcp/__init__.py +0 -0
  228. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/mcp/__main__.py +0 -0
  229. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/mcp/server.py +0 -0
  230. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/py.typed +0 -0
  231. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/__init__.py +0 -0
  232. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/chart_engine.py +0 -0
  233. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/fonts.py +0 -0
  234. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/glyphs.py +0 -0
  235. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/motion.py +0 -0
  236. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/render/templates.py +0 -0
  237. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/serve/__init__.py +0 -0
  238. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/serve/app.py +0 -0
  239. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/serve/data_tokens.py +0 -0
  240. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/__init__.py +0 -0
  241. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/capture.py +0 -0
  242. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/codex_parser.py +0 -0
  243. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/contract.py +0 -0
  244. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/corrections.py +0 -0
  245. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/cost.py +0 -0
  246. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/models.py +0 -0
  247. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/parser.py +0 -0
  248. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/runtimes.py +0 -0
  249. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/telemetry/stages.py +0 -0
  250. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-area.svg.j2 +0 -0
  251. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-axes.svg.j2 +0 -0
  252. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-empty-state.svg.j2 +0 -0
  253. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-gridlines.svg.j2 +0 -0
  254. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-markers/circle.svg.j2 +0 -0
  255. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-markers/diamond.svg.j2 +0 -0
  256. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-markers/endpoint-diamond.svg.j2 +0 -0
  257. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-markers/endpoint-rect.svg.j2 +0 -0
  258. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-markers/rect.svg.j2 +0 -0
  259. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-milestone.svg.j2 +0 -0
  260. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/chart-polyline.svg.j2 +0 -0
  261. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/filter.svg.j2 +0 -0
  262. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/glyph-inline.svg.j2 +0 -0
  263. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/glyph.svg.j2 +0 -0
  264. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/gradient.svg.j2 +0 -0
  265. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/metadata.svg.j2 +0 -0
  266. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/metric.svg.j2 +0 -0
  267. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/phase-segment.svg.j2 +0 -0
  268. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/rule.svg.j2 +0 -0
  269. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/status.svg.j2 +0 -0
  270. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/components/terminal.svg.j2 +0 -0
  271. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/document.svg.j2 +0 -0
  272. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/error-badge.svg.j2 +0 -0
  273. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/brutalist-content.j2 +0 -0
  274. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/brutalist-defs.j2 +0 -0
  275. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/cellular-content.j2 +0 -0
  276. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/cellular-defs.j2 +0 -0
  277. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/chrome-content.j2 +0 -0
  278. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/chrome-defs.j2 +0 -0
  279. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/default-content.j2 +0 -0
  280. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge/default-defs.j2 +0 -0
  281. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/badge.svg.j2 +0 -0
  282. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/catalog.svg.j2 +0 -0
  283. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/brutalist-content.j2 +0 -0
  284. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/brutalist-defs.j2 +0 -0
  285. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/cellular-content.j2 +0 -0
  286. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/cellular-defs.j2 +0 -0
  287. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/chrome-content.j2 +0 -0
  288. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart/chrome-defs.j2 +0 -0
  289. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/chart.svg.j2 +0 -0
  290. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/divider/brutalist-seam.svg.j2 +0 -0
  291. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/divider/chrome-band.svg.j2 +0 -0
  292. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/divider.svg.j2 +0 -0
  293. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/brutalist-content.j2 +0 -0
  294. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/brutalist-defs.j2 +0 -0
  295. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/cellular-content.j2 +0 -0
  296. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/cellular-defs.j2 +0 -0
  297. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/chrome-content.j2 +0 -0
  298. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/chrome-defs.j2 +0 -0
  299. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/default-content.j2 +0 -0
  300. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon/default-defs.j2 +0 -0
  301. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/icon.svg.j2 +0 -0
  302. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-content.j2 +0 -0
  303. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-defs.j2 +0 -0
  304. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/brutalist-overlay.j2 +0 -0
  305. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/cellular-content.j2 +0 -0
  306. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/cellular-defs.j2 +0 -0
  307. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/cellular-overlay.j2 +0 -0
  308. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/chrome-content.j2 +0 -0
  309. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/chrome-defs.j2 +0 -0
  310. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/chrome-overlay.j2 +0 -0
  311. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/default-content.j2 +0 -0
  312. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal/default-defs.j2 +0 -0
  313. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/marquee-horizontal.svg.j2 +0 -0
  314. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/master-card.svg.j2 +0 -0
  315. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/receipt.svg.j2 +0 -0
  316. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/rhythm-strip.svg.j2 +0 -0
  317. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/brutalist-content.j2 +0 -0
  318. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/brutalist-defs.j2 +0 -0
  319. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/cellular-content.j2 +0 -0
  320. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/cellular-defs.j2 +0 -0
  321. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/chrome-content.j2 +0 -0
  322. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats/chrome-defs.j2 +0 -0
  323. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/stats.svg.j2 +0 -0
  324. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/brutalist-content.j2 +0 -0
  325. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/brutalist-defs.j2 +0 -0
  326. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/brutalist-status.j2 +0 -0
  327. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/cellular-content.j2 +0 -0
  328. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/cellular-defs.j2 +0 -0
  329. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/cellular-status.j2 +0 -0
  330. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/chrome-content.j2 +0 -0
  331. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/chrome-defs.j2 +0 -0
  332. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/chrome-status.j2 +0 -0
  333. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/default-content.j2 +0 -0
  334. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/default-defs.j2 +0 -0
  335. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip/default-status.j2 +0 -0
  336. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/frames/strip.svg.j2 +0 -0
  337. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/motions/border/chromatic-pulse.svg.j2 +0 -0
  338. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/motions/border/corner-trace.svg.j2 +0 -0
  339. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/motions/border/dual-orbit.svg.j2 +0 -0
  340. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/motions/border/entanglement.svg.j2 +0 -0
  341. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/motions/border/rimrun.svg.j2 +0 -0
  342. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/partials/provider-glyphs.svg.j2 +0 -0
  343. {hyperweave-0.2.25 → hyperweave-0.2.26}/src/hyperweave/templates/partials/state-signal-cascade.j2 +0 -0
  344. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/__init__.py +0 -0
  345. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/conftest.py +0 -0
  346. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/fixtures/codex_session.jsonl +0 -0
  347. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/fixtures/codex_session_patches.jsonl +0 -0
  348. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/fixtures/github_contributions/synthetic.html +0 -0
  349. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/fixtures/session.json +0 -0
  350. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/fixtures/session.jsonl +0 -0
  351. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/helpers.py +0 -0
  352. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_assembler.py +0 -0
  353. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_badge_cellular.py +0 -0
  354. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_badge_layout.py +0 -0
  355. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_badge_mode.py +0 -0
  356. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_chart_engine.py +0 -0
  357. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_chart_frame.py +0 -0
  358. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_codex_parser.py +0 -0
  359. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_compose_bar_chart.py +0 -0
  360. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_compose_rhythm_strip.py +0 -0
  361. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_compose_treemap.py +0 -0
  362. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_compose_variant_field.py +0 -0
  363. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_connectors.py +0 -0
  364. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_core.py +0 -0
  365. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_data_tokens.py +0 -0
  366. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_divider_cellular.py +0 -0
  367. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_divider_genome_specific.py +0 -0
  368. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_font_metrics_chakra.py +0 -0
  369. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_genome_automata.py +0 -0
  370. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_github_scrape.py +0 -0
  371. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_kit.py +0 -0
  372. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_marquee_v0_2_16.py +0 -0
  373. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_mcp.py +0 -0
  374. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_paradigm_cellular.py +0 -0
  375. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_paradigm_dispatch.py +0 -0
  376. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_paradigm_extensibility.py +0 -0
  377. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_parse_transcript_auto.py +0 -0
  378. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_proofset.py +0 -0
  379. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_receipt_token_compliance.py +0 -0
  380. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_render.py +0 -0
  381. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_resolver_rhythm.py +0 -0
  382. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_runtime_registries.py +0 -0
  383. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_serve.py +0 -0
  384. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_serve_live_state.py +0 -0
  385. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_slot_metric_state.py +0 -0
  386. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_stats_card.py +0 -0
  387. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_strip_cellular.py +0 -0
  388. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_strip_status_toggle.py +0 -0
  389. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_telemetry.py +0 -0
  390. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_telemetry_contract_per_stage.py +0 -0
  391. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_telemetry_integration.py +0 -0
  392. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_telemetry_skin_dispatch.py +0 -0
  393. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_tool_class_completeness.py +0 -0
  394. {hyperweave-0.2.25 → hyperweave-0.2.26}/tests/test_variant_default_resolution.py +0 -0
  395. {hyperweave-0.2.25 → hyperweave-0.2.26}/uv.lock +0 -0
@@ -5,6 +5,19 @@ 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.2.26] - 2026-05-07
9
+
10
+ Two follow-ups to v0.2.25's badge state architecture: strip status indicators now color correctly when CI metrics fail, and the snapshot test suite no longer fails on local-vs-CI version differences.
11
+
12
+ ### Fixed
13
+
14
+ - **Strip status indicator color tracks the most severe CI metric** — a strip with `BUILD:failing` next to `STARS` and `VERSION` now renders the right-edge diamond red, matching pre-v0.2.25 behavior. The v0.2.25 narrowing inadvertently dropped this for strips because their title is the repo identifier (`HYPERWEAVE`, `readme-ai`), not a state-bearing label. The engine now parses strip metric cells, runs state inference per allowlisted cell (`BUILD`, `COVERAGE`, `LINT`, etc.), and rolls up to the most severe state across them. Pure data strips (no allowlisted cells) stay neutral.
15
+ - **Snapshot tests handle local-vs-CI version differences** — the URL stability suite was treating package version strings as content (`version="0.2.20"` vs `version="0.2.25"` from dynamic git-tag versioning), failing CI when local snapshots were captured at a different version than the runner. Versions in metadata are now normalized for comparison alongside UUIDs and timestamps.
16
+
17
+ ### Notes
18
+
19
+ - 960 tests (was 955). 5 new tests pin the strip rollup contract across failing / passing / mixed-severity / pure-data / explicit-override cases.
20
+
8
21
  ## [0.2.25] - 2026-05-07
9
22
 
10
23
  Production badges on data-driven URLs (`STARS`, `FORKS`, `VERSION`, `LICENSE`, `PYTHON`) no longer trigger false-alarm status indicators on numeric values. Badge value text now centers correctly for every value length across all genomes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperweave
3
- Version: 0.2.25
3
+ Version: 0.2.26
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
@@ -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.2.25'
22
- __version_tuple__ = version_tuple = (0, 2, 25)
21
+ __version__ = version = '0.2.26'
22
+ __version_tuple__ = version_tuple = (0, 2, 26)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -0,0 +1,167 @@
1
+ """Composition engine -- the single entry point for all artifact generation."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import time
6
+
7
+ from hyperweave.core.models import ArtifactMetadata, ComposeResult, ComposeSpec, ResolvedArtifact
8
+
9
+
10
+ def compose(spec: ComposeSpec) -> ComposeResult:
11
+ """Compose an artifact from a ComposeSpec."""
12
+ start = time.monotonic()
13
+
14
+ # ── 0. Infer state from value when the caller left the default ──
15
+ # Any explicit override (?state=failing, --state passing, MCP state arg,
16
+ # etc.) sets spec.state to something other than "active" and survives
17
+ # this step untouched. This is the single chokepoint covering HTTP,
18
+ # CLI, MCP, and kit.
19
+ #
20
+ # v0.2.25: gated on the stateful-title allowlist (data/badge_modes.yaml).
21
+ # Pre-v0.2.25 the inference fired on EVERY frame regardless of title —
22
+ # so a STARS=42 badge was auto-inferred to state="critical" (leading
23
+ # digit 4) and rendered an orange/red status indicator on a value with
24
+ # no semantic state.
25
+ #
26
+ # Frame-aware logic:
27
+ # Badge → title-keyed inference. Title in allowlist → run infer_state.
28
+ # Strip → per-cell rolled-up inference. Strip's spec.title is the
29
+ # repo identifier (HYPERWEAVE, readme-ai), not a state-
30
+ # bearing label — state lives in the metric cells. Parse
31
+ # cells, run infer_state on each allowlisted (label, value)
32
+ # pair, take the most severe state.
33
+ if spec.state == "active" and spec.value:
34
+ from hyperweave.compose.layout import normalize_title
35
+ from hyperweave.config.loader import load_badge_modes
36
+ from hyperweave.core.enums import FrameType
37
+ from hyperweave.core.state import infer_state
38
+
39
+ allowlist = load_badge_modes()
40
+ # Severity ordering when rolling up across multiple metric cells.
41
+ # critical / failing share the most-severe slot — both render red.
42
+ _SEVERITY = {
43
+ "active": 0,
44
+ "passing": 1,
45
+ "building": 2,
46
+ "warning": 3,
47
+ "critical": 4,
48
+ "failing": 4,
49
+ }
50
+
51
+ inferred: str = "active"
52
+ if spec.type == FrameType.BADGE and spec.title:
53
+ if normalize_title(spec.title) in allowlist:
54
+ inferred = infer_state(spec.title, spec.value)
55
+ elif spec.type == FrameType.STRIP:
56
+ # Roll up across metric cells. v0.2.24 and earlier accidentally
57
+ # got this for free because infer_state ran on the strip's
58
+ # whole comma-separated value string and found "fail" in
59
+ # "BUILD:failing" — a happy substring-match accident. v0.2.25's
60
+ # title gate broke that path. Per-cell inference is the
61
+ # principled replacement: only allowlisted cells contribute
62
+ # state, and we pick the most severe.
63
+ best_severity = 0
64
+ for label, value in _parse_strip_metric_pairs(spec):
65
+ if normalize_title(label) in allowlist:
66
+ cell_state = infer_state(label, value)
67
+ sev = _SEVERITY.get(cell_state, 0)
68
+ if sev > best_severity:
69
+ inferred = cell_state
70
+ best_severity = sev
71
+
72
+ if inferred != "active":
73
+ spec = spec.model_copy(update={"state": inferred})
74
+
75
+ # ── 1. Resolve genome, profile, frame ──
76
+ from hyperweave.compose.resolver import resolve
77
+
78
+ resolved = resolve(spec)
79
+
80
+ # ── 2. Assemble CSS ──
81
+ from hyperweave.compose.assembler import assemble_css
82
+
83
+ css_bundle = assemble_css(resolved, frame_type=spec.type)
84
+
85
+ # ── 3. Build template context ──
86
+ from hyperweave.compose.context import build_context
87
+
88
+ context = build_context(spec, resolved, css_bundle)
89
+
90
+ # ── 4. Enforce policy lanes ──
91
+ from hyperweave.compose.lanes import enforce
92
+
93
+ context = enforce(context, spec.regime)
94
+
95
+ # ── 5. Render template → SVG ──
96
+ from hyperweave.render.templates import render_artifact
97
+
98
+ svg = render_artifact(resolved.frame_template, context)
99
+
100
+ # ── 6. Build result ──
101
+ duration_ms = (time.monotonic() - start) * 1000
102
+
103
+ metadata = _build_metadata(spec, resolved, duration_ms)
104
+
105
+ result = ComposeResult(
106
+ svg=svg,
107
+ metadata=metadata,
108
+ width=resolved.width,
109
+ height=resolved.height,
110
+ )
111
+
112
+ # ── 7. Emit telemetry event (fire-and-forget) ──
113
+ try:
114
+ from hyperweave.telemetry.capture import emit_generation_event
115
+
116
+ emit_generation_event(spec, result)
117
+ except Exception:
118
+ pass # telemetry must never break compose
119
+
120
+ return result
121
+
122
+
123
+ def _parse_strip_metric_pairs(spec: ComposeSpec) -> list[tuple[str, str]]:
124
+ """Parse strip metric (label, value) pairs from spec.
125
+
126
+ Mirrors ``compose/resolver.py:_parse_metrics`` but lives here so engine
127
+ step 0 can run state inference before resolve() is called. Two sources:
128
+
129
+ * ``spec.slots`` entries with zones starting with ``metric`` —
130
+ ``slot.value`` of the form ``"LABEL:value"``.
131
+ * Comma-separated fallback in ``spec.value`` —
132
+ ``"STARS:2.9k,FORKS:278,BUILD:failing"``.
133
+ """
134
+ pairs: list[tuple[str, str]] = []
135
+ for slot in spec.slots:
136
+ if slot.zone.startswith("metric") and ":" in slot.value:
137
+ k, v = slot.value.split(":", 1)
138
+ pairs.append((k.strip(), v.strip()))
139
+ if not pairs and spec.value:
140
+ for pair_str in spec.value.split(","):
141
+ stripped = pair_str.strip()
142
+ if ":" in stripped:
143
+ k, v = stripped.split(":", 1)
144
+ pairs.append((k.strip(), v.strip()))
145
+ return pairs
146
+
147
+
148
+ def _build_metadata(
149
+ spec: ComposeSpec,
150
+ resolved: ResolvedArtifact,
151
+ duration_ms: float,
152
+ ) -> ArtifactMetadata:
153
+ return ArtifactMetadata(
154
+ type=spec.type,
155
+ genome=spec.genome_id,
156
+ profile=resolved.profile_id,
157
+ divider_variant=spec.divider_variant,
158
+ motion=resolved.motion,
159
+ state=spec.state,
160
+ regime=spec.regime,
161
+ width=resolved.width,
162
+ height=resolved.height,
163
+ metadata_tier=spec.metadata_tier,
164
+ duration_ms=round(duration_ms, 2),
165
+ generation=spec.generation,
166
+ series=spec.series,
167
+ )
@@ -22,10 +22,10 @@
22
22
  <title id="hw-UID-title">HyperWeave divider artifact</title>
23
23
  <desc id="hw-UID-desc">A divider artifact, using chrome genome.</desc>
24
24
  <metadata>
25
- <hw:artifact id="UUID" type="divider" series="core" version="0.2.20"
25
+ <hw:artifact id="UUID" type="divider" series="core" version="VERSION"
26
26
  xmlns:hw="https://hyperweave.app/hw/v1.0">
27
27
  <hw:provenance>
28
- <hw:generator>HyperWeave Compositor v0.2.20 (InnerAura Labs)</hw:generator>
28
+ <hw:generator>HyperWeave Compositor vVERSION (InnerAura Labs)</hw:generator>
29
29
  <hw:created>TIMESTAMP</hw:created>
30
30
  <hw:human-directed>true</hw:human-directed>
31
31
  </hw:provenance>
@@ -34,7 +34,7 @@
34
34
  </hw:artifact>
35
35
  <hw:composition xmlns:hw="https://hyperweave.app/hw/v1.0">
36
36
  <hw:frame>divider</hw:frame>
37
- <hw:genome>chrome@0.2.20</hw:genome>
37
+ <hw:genome>chrome@VERSION</hw:genome>
38
38
  <hw:profile>chrome</hw:profile>
39
39
  <hw:slots>
40
40
  </hw:slots>
@@ -44,7 +44,7 @@
44
44
  xmlns:dc="http://purl.org/dc/elements/1.1/">
45
45
  <rdf:Description>
46
46
  <dc:title>HyperWeave divider artifact</dc:title>
47
- <dc:creator>HyperWeave Compositor v0.2.20 (InnerAura Labs)</dc:creator>
47
+ <dc:creator>HyperWeave Compositor vVERSION (InnerAura Labs)</dc:creator>
48
48
  <dc:date>TIMESTAMP</dc:date>
49
49
  <dc:rights>CC BY 4.0</dc:rights>
50
50
  </rdf:Description>
@@ -23,10 +23,10 @@
23
23
  <title id="hw-UID-title">github</title>
24
24
  <desc id="hw-UID-desc">A icon artifact, using chrome genome.</desc>
25
25
  <metadata>
26
- <hw:artifact id="UUID" type="icon" series="core" version="0.2.20"
26
+ <hw:artifact id="UUID" type="icon" series="core" version="VERSION"
27
27
  xmlns:hw="https://hyperweave.app/hw/v1.0">
28
28
  <hw:provenance>
29
- <hw:generator>HyperWeave Compositor v0.2.20 (InnerAura Labs)</hw:generator>
29
+ <hw:generator>HyperWeave Compositor vVERSION (InnerAura Labs)</hw:generator>
30
30
  <hw:created>TIMESTAMP</hw:created>
31
31
  <hw:human-directed>true</hw:human-directed>
32
32
  </hw:provenance>
@@ -35,7 +35,7 @@
35
35
  </hw:artifact>
36
36
  <hw:composition xmlns:hw="https://hyperweave.app/hw/v1.0">
37
37
  <hw:frame>icon</hw:frame>
38
- <hw:genome>chrome@0.2.20</hw:genome>
38
+ <hw:genome>chrome@VERSION</hw:genome>
39
39
  <hw:profile>chrome</hw:profile>
40
40
  <hw:slots>
41
41
  </hw:slots>
@@ -45,7 +45,7 @@
45
45
  xmlns:dc="http://purl.org/dc/elements/1.1/">
46
46
  <rdf:Description>
47
47
  <dc:title>github</dc:title>
48
- <dc:creator>HyperWeave Compositor v0.2.20 (InnerAura Labs)</dc:creator>
48
+ <dc:creator>HyperWeave Compositor vVERSION (InnerAura Labs)</dc:creator>
49
49
  <dc:date>TIMESTAMP</dc:date>
50
50
  <dc:rights>CC BY 4.0</dc:rights>
51
51
  </rdf:Description>
@@ -261,7 +261,7 @@ svg, :root {
261
261
  <circle r="42" fill="none" stroke="#000510" stroke-width="0.6"/>
262
262
  <circle r="42" fill="none" stroke="url(#hw-UID-rim)" stroke-width="1.0"/>
263
263
  <svg viewBox="0 0 24 24" width="48" height="48" x="-24" y="-24" overflow="visible">
264
- <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" fill="#E0ECF6"/>
264
+ <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 VERSION.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-VERSION 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 VERSION 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 VERSION.108-.776.417-VERSION 0-VERSION 1.235-3.22-.135-.303-.54-VERSION 0 0 1.005-.322 3.3 VERSION 1.98-.399 3-.405 VERSION VERSION 3 .405 2.28-1.552 3.285-1.23 3.285-VERSION VERSION VERSION VERSION.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 VERSION.36.81 VERSION 2.22 0 1.606-.015 2.896-.015 3.286 0 .VERSION.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" fill="#E0ECF6"/>
265
265
  </svg>
266
266
  </g>
267
267
 
@@ -99,3 +99,54 @@ def test_compose_empty_value_no_inference() -> None:
99
99
  def test_compose_unrecognizable_value_no_inference() -> None:
100
100
  """Value with no rule match leaves state at default."""
101
101
  assert _metadata_state("version", "v1.2.3") == "active"
102
+
103
+
104
+ # ─────────────────────────────────────────────────────────────────────
105
+ # Strip frames — per-cell rolled-up inference (v0.2.25)
106
+ # ─────────────────────────────────────────────────────────────────────
107
+
108
+
109
+ def _strip_metadata_state(value: str, state: str = "active") -> str:
110
+ """Compose a strip and return its post-inference metadata state.
111
+
112
+ Strip's title is a repo identifier (HYPERWEAVE), not a state-bearing
113
+ label — the engine inspects metric cells and rolls up the most severe
114
+ state across allowlisted ones.
115
+ """
116
+ spec = ComposeSpec(
117
+ type="strip",
118
+ genome_id="chrome",
119
+ title="HYPERWEAVE",
120
+ value=value,
121
+ state=state,
122
+ )
123
+ result = compose(spec)
124
+ assert result.metadata is not None
125
+ return str(result.metadata.state)
126
+
127
+
128
+ def test_strip_infers_failing_from_build_cell() -> None:
129
+ """Pre-v0.2.25 README regression: strip with BUILD:failing cell
130
+ must roll up to failing state so the right-edge indicator goes red."""
131
+ assert _strip_metadata_state("BUILD:failing,VERSION:0.2.24,LICENSE:Apache-2.0") == "failing"
132
+
133
+
134
+ def test_strip_infers_passing_from_build_cell() -> None:
135
+ assert _strip_metadata_state("BUILD:passing,VERSION:0.2.24") == "passing"
136
+
137
+
138
+ def test_strip_picks_most_severe_state_across_cells() -> None:
139
+ """When multiple cells are stateful, the rolled-up state is the
140
+ most severe (failing > critical > warning > building > passing)."""
141
+ assert _strip_metadata_state("BUILD:failing,LINT:warning,STARS:42") == "failing"
142
+
143
+
144
+ def test_strip_with_no_stateful_cells_stays_active() -> None:
145
+ """Pure data strips don't infer state — STARS, FORKS, VERSION are
146
+ not in the allowlist, so no cell contributes to the rollup."""
147
+ assert _strip_metadata_state("STARS:2.9k,FORKS:278,VERSION:0.2.24") == "active"
148
+
149
+
150
+ def test_strip_explicit_state_survives_inference() -> None:
151
+ """User-set state overrides metric rollup."""
152
+ assert _strip_metadata_state("BUILD:failing,VERSION:0.2.24", state="passing") == "passing"
@@ -49,6 +49,12 @@ _HW_UID_RE = re.compile(r"hw-[0-9a-f]{6,}")
49
49
  _FULL_UUID_RE = re.compile(r"\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b")
50
50
  # ISO 8601 timestamps that may appear in metadata (created/created_at).
51
51
  _TS_RE = re.compile(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?")
52
+ # Package version strings — `__version__` is dynamically computed from git
53
+ # tags by hatch-vcs/setuptools-scm, so the same code produces "0.2.20"
54
+ # locally (no tag) and "0.2.25" in CI (tagged release). Normalize all
55
+ # semver-like version strings in metadata so backward-compat snapshots
56
+ # track artifact STRUCTURE, not the version that happened to render them.
57
+ _VERSION_RE = re.compile(r"\d+\.\d+\.\d+(?:[-+][0-9a-zA-Z.\-]+)?")
52
58
 
53
59
 
54
60
  def _normalize(svg: str) -> str:
@@ -56,6 +62,7 @@ def _normalize(svg: str) -> str:
56
62
  svg = _HW_UID_RE.sub("hw-UID", svg)
57
63
  svg = _FULL_UUID_RE.sub("UUID", svg)
58
64
  svg = _TS_RE.sub("TIMESTAMP", svg)
65
+ svg = _VERSION_RE.sub("VERSION", svg)
59
66
  return svg
60
67
 
61
68
 
@@ -1,106 +0,0 @@
1
- """Composition engine -- the single entry point for all artifact generation."""
2
-
3
- from __future__ import annotations
4
-
5
- import time
6
-
7
- from hyperweave.core.models import ArtifactMetadata, ComposeResult, ComposeSpec, ResolvedArtifact
8
-
9
-
10
- def compose(spec: ComposeSpec) -> ComposeResult:
11
- """Compose an artifact from a ComposeSpec."""
12
- start = time.monotonic()
13
-
14
- # ── 0. Infer state from value when the caller left the default ──
15
- # Any explicit override (?state=failing, --state passing, MCP state arg,
16
- # etc.) sets spec.state to something other than "active" and survives
17
- # this step untouched. This is the single chokepoint covering HTTP,
18
- # CLI, MCP, and kit.
19
- #
20
- # v0.2.25: gated on the stateful-title allowlist (data/badge_modes.yaml).
21
- # Pre-v0.2.25 the inference fired on EVERY badge regardless of title —
22
- # so a STARS=42 badge was auto-inferred to state="critical" (leading
23
- # digit 4) and then re-classified as "explicit" mode by resolve_badge_mode,
24
- # rendering an orange/red status indicator on a value with no semantic
25
- # state. Now inference only fires for titles that meaningfully pass/fail
26
- # (build / coverage / uptime / health / score / lint / ci / deploy / status).
27
- if spec.state == "active" and spec.value and spec.title:
28
- from hyperweave.compose.layout import normalize_title
29
- from hyperweave.config.loader import load_badge_modes
30
- from hyperweave.core.state import infer_state
31
-
32
- # Normalize for separator-insensitive lookup (BUILD-STATUS,
33
- # CI_CD, etc.) — same normalizer ``resolve_badge_mode`` uses.
34
- if normalize_title(spec.title) in load_badge_modes():
35
- inferred = infer_state(spec.title, spec.value)
36
- if inferred != "active":
37
- spec = spec.model_copy(update={"state": inferred})
38
-
39
- # ── 1. Resolve genome, profile, frame ──
40
- from hyperweave.compose.resolver import resolve
41
-
42
- resolved = resolve(spec)
43
-
44
- # ── 2. Assemble CSS ──
45
- from hyperweave.compose.assembler import assemble_css
46
-
47
- css_bundle = assemble_css(resolved, frame_type=spec.type)
48
-
49
- # ── 3. Build template context ──
50
- from hyperweave.compose.context import build_context
51
-
52
- context = build_context(spec, resolved, css_bundle)
53
-
54
- # ── 4. Enforce policy lanes ──
55
- from hyperweave.compose.lanes import enforce
56
-
57
- context = enforce(context, spec.regime)
58
-
59
- # ── 5. Render template → SVG ──
60
- from hyperweave.render.templates import render_artifact
61
-
62
- svg = render_artifact(resolved.frame_template, context)
63
-
64
- # ── 6. Build result ──
65
- duration_ms = (time.monotonic() - start) * 1000
66
-
67
- metadata = _build_metadata(spec, resolved, duration_ms)
68
-
69
- result = ComposeResult(
70
- svg=svg,
71
- metadata=metadata,
72
- width=resolved.width,
73
- height=resolved.height,
74
- )
75
-
76
- # ── 7. Emit telemetry event (fire-and-forget) ──
77
- try:
78
- from hyperweave.telemetry.capture import emit_generation_event
79
-
80
- emit_generation_event(spec, result)
81
- except Exception:
82
- pass # telemetry must never break compose
83
-
84
- return result
85
-
86
-
87
- def _build_metadata(
88
- spec: ComposeSpec,
89
- resolved: ResolvedArtifact,
90
- duration_ms: float,
91
- ) -> ArtifactMetadata:
92
- return ArtifactMetadata(
93
- type=spec.type,
94
- genome=spec.genome_id,
95
- profile=resolved.profile_id,
96
- divider_variant=spec.divider_variant,
97
- motion=resolved.motion,
98
- state=spec.state,
99
- regime=spec.regime,
100
- width=resolved.width,
101
- height=resolved.height,
102
- metadata_tier=spec.metadata_tier,
103
- duration_ms=round(duration_ms, 2),
104
- generation=spec.generation,
105
- series=spec.series,
106
- )
File without changes
File without changes
File without changes
File without changes
File without changes