@almadar/std 16.254.0 → 16.255.0

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 (455) hide show
  1. package/behaviors/lolo/agent/atoms/std-agent-pool.lolo +10 -10
  2. package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +15 -8
  3. package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +6 -5
  4. package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
  5. package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
  6. package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
  7. package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -1
  8. package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
  9. package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
  10. package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
  11. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
  12. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
  13. package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
  14. package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -1
  15. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
  16. package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
  17. package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
  18. package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
  19. package/behaviors/registry/infra/atoms/std-audit-capture.orb +1 -1
  20. package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
  21. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
  22. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
  23. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
  24. package/behaviors/registry/infra/atoms/std-cross-reference.orb +1 -1
  25. package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
  26. package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
  27. package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
  28. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
  29. package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
  30. package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
  31. package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
  32. package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
  33. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
  34. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
  35. package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
  36. package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
  37. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
  38. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
  39. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
  40. package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
  41. package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
  42. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
  43. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
  44. package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
  45. package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
  46. package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
  47. package/behaviors/registry/ml/atoms/std-ml-exact-check.orb +1 -1
  48. package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
  49. package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
  50. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
  51. package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
  52. package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
  53. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
  54. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
  55. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  56. package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
  57. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
  58. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
  59. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
  60. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
  61. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
  62. package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
  63. package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
  64. package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
  65. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
  66. package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
  67. package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
  68. package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
  69. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
  70. package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  71. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
  72. package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
  73. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  74. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
  75. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
  76. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
  77. package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
  78. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +1 -1
  79. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
  80. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
  81. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
  82. package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
  83. package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
  84. package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
  85. package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
  86. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
  87. package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
  88. package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
  89. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +1 -1
  90. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  91. package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
  92. package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
  93. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
  94. package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
  95. package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
  96. package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
  97. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
  98. package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
  99. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
  100. package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
  101. package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
  102. package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
  103. package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
  104. package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
  105. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
  106. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
  107. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
  108. package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
  109. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
  110. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
  111. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  112. package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
  113. package/behaviors/registry/ui/core/atoms/std-search.orb +1 -1
  114. package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
  115. package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
  116. package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
  117. package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
  118. package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
  119. package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
  120. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
  121. package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
  122. package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
  123. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
  124. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
  125. package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
  126. package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
  127. package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
  128. package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
  129. package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
  130. package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
  131. package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
  132. package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
  133. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
  134. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
  135. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
  136. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  137. package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
  138. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  139. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  140. package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
  141. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  142. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
  143. package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
  144. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  145. package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
  146. package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
  147. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
  148. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  149. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
  150. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  151. package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
  152. package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
  153. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  154. package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
  156. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
  159. package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
  161. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
  163. package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
  165. package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
  166. package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
  167. package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
  168. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  169. package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
  170. package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
  171. package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
  172. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
  173. package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
  174. package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
  175. package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
  176. package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
  177. package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
  178. package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
  179. package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
  180. package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
  181. package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
  182. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  183. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
  184. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
  185. package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
  186. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  187. package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
  188. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  189. package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
  190. package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
  191. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  192. package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
  193. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
  194. package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
  196. package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
  198. package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
  199. package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
  200. package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
  201. package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
  202. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
  203. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
  204. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
  205. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  206. package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
  207. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
  208. package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
  209. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  210. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
  211. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
  212. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
  213. package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
  214. package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
  215. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
  216. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
  218. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
  219. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
  221. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
  222. package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
  223. package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
  224. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
  225. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
  226. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
  227. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
  228. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
  229. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
  230. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  231. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
  232. package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
  233. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
  234. package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
  235. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
  236. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
  237. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
  238. package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
  239. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  240. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
  241. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
  242. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
  243. package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
  244. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
  245. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  246. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
  247. package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
  248. package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
  249. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
  250. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
  251. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
  252. package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
  253. package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
  254. package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
  255. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
  256. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
  257. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  258. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
  259. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
  260. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
  261. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
  262. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
  263. package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
  264. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
  265. package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
  266. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
  267. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
  268. package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
  269. package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
  270. package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
  271. package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
  272. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
  273. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
  274. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  275. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
  276. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  277. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
  278. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  279. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
  280. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  281. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  282. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
  283. package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
  284. package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
  285. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  286. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
  287. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
  288. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
  289. package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
  290. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
  291. package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
  292. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
  293. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
  294. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
  295. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
  296. package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
  297. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
  298. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  299. package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
  300. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
  301. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
  302. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
  303. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
  304. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
  305. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
  306. package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
  307. package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
  308. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  309. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
  310. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
  311. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
  312. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
  313. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
  314. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
  315. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
  316. package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
  317. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
  318. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  319. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
  320. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
  321. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
  322. package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
  323. package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
  324. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  325. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
  326. package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
  327. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
  328. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
  329. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
  330. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
  331. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  332. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  333. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  334. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
  335. package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
  336. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
  337. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
  338. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
  339. package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
  340. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
  341. package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
  342. package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
  343. package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
  344. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
  345. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
  346. package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
  347. package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
  348. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
  349. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  350. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
  351. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
  352. package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
  353. package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
  354. package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
  355. package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
  356. package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
  357. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
  358. package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
  359. package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
  360. package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
  361. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
  362. package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
  363. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
  364. package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
  365. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
  366. package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
  367. package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
  368. package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
  369. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
  370. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
  371. package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
  372. package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
  373. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
  374. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
  375. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
  376. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
  377. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
  378. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
  379. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
  380. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
  381. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  382. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
  383. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
  384. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
  385. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
  386. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
  387. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
  388. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
  389. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
  390. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
  391. package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
  392. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
  393. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
  394. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  395. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
  396. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
  397. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
  398. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
  399. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  400. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
  401. package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
  402. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
  403. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
  404. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
  405. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
  406. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
  407. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
  408. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
  409. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
  410. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
  411. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
  412. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
  413. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
  414. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
  415. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
  416. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
  417. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
  418. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
  419. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
  420. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
  421. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
  422. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
  423. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
  424. package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
  425. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
  426. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
  427. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
  428. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
  429. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
  430. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
  431. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
  432. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
  433. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
  434. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
  435. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
  436. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
  437. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
  438. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
  439. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
  440. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
  441. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
  442. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
  443. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
  444. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
  445. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
  446. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  447. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  448. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  449. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
  450. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  451. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  452. package/dist/behaviors-embeddings.hash.json +1 -1
  453. package/dist/behaviors-embeddings.json +1 -1
  454. package/dist/knob-embeddings.hash.json +1 -1
  455. package/package.json +1 -1
@@ -1 +1 @@
1
- {"name":"std-patience","version":"1.0.0","description":"Headless customer-service mechanic: owns a stationary customer roster with per-customer patience. Decrements patience every tick, serves nearby customers on HERO_STEPPED (resets their patience + scores), and emits CUSTOMER_LOST when a timer expires. Never writes units.","orbitals":[{"name":"PatienceOrbital","id":"orb_E64NXRAZS8FWM988N39NV1R3BZ","entity":{"name":"PatienceData","id":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"customers","type":"array","items":{"type":"object","properties":{"maxPatience":{"name":"maxPatience","type":"number","required":false},"name":{"name":"name","type":"string","required":false},"modelUrl":{"name":"modelUrl","type":"object","required":false,"properties":{"url":{"name":"url","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"dimension":{"name":"dimension","type":"string","required":false},"style":{"name":"style","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"name":{"name":"name","type":"string","required":false}}},"id":{"name":"id","type":"string","required":true},"patience":{"name":"patience","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"unitType":{"name":"unitType","type":"string","required":false}}}},{"name":"served","type":"number","default":0},{"name":"pending","type":"number","default":0},{"name":"lost","type":"number","default":0}],"shared":true},"traits":[{"name":"Patience","id":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z","entityRebindable":true,"entityContract":{"requires":[],"provides":["customers","lost","pending","served"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"BURST","site":"tick"},{"kind":"emit","resource":"CUSTOMER_LOST","site":"tick"},{"kind":"emit","resource":"SERVICE_CHANGED"},{"kind":"emit","resource":"SERVICE_CHANGED","site":"tick"},{"kind":"set","resource":"@entity.customers"},{"kind":"set","resource":"@entity.customers","site":"tick"},{"kind":"set","resource":"@entity.lost"},{"kind":"set","resource":"@entity.lost","site":"tick"},{"kind":"set","resource":"@entity.pending"},{"kind":"set","resource":"@entity.served"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"PatienceData","linkedEntityId":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","entityRefIds":{"PatienceData":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ"},"emits":[{"event":"BURST","eventId":"evt_J4H97HPG8E8479S6WDSC7Z74DY","description":"Serve or starve particle burst; a fx-particles listener spawns it","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"SERVICE_CHANGED","eventId":"evt_WH6SDKHRWZWEFPCJW4145M6H01","description":"Served/pending/lost counts after this step; a market-flow listener decides win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"served","type":"number","required":true},{"name":"pending","type":"number","required":true},{"name":"lost","type":"number","required":true}]},{"event":"CUSTOMER_LOST","eventId":"evt_66N1P7B4AVJ5DS59T552TFC8DC","description":"Emitted when one or more customers' patience expires in the same tick","tier":"domain","scope":"external","payloadSchema":[{"name":"count","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","name":"Initialize"},{"key":"HERO_STEPPED","id":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","name":"Hero Stepped","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"z","type":"number"},{"name":"movesLeft","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_E915DH25TB2X5HE5P1K72T2DPT","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_J4H97HPG8E8479S6WDSC7Z74DY","name":"Burst","description":"Serve or starve particle burst; a fx-particles listener spawns it","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"SERVICE_CHANGED","id":"evt_WH6SDKHRWZWEFPCJW4145M6H01","name":"Service Changed","description":"Served/pending/lost counts after this step; a market-flow listener decides win/lose","tier":"domain","payloadSchema":[{"name":"served","type":"number","required":true},{"name":"pending","type":"number","required":true},{"name":"lost","type":"number","required":true}]},{"key":"CUSTOMER_LOST","id":"evt_66N1P7B4AVJ5DS59T552TFC8DC","name":"Customer Lost","description":"Emitted when one or more customers' patience expires in the same tick","tier":"domain","payloadSchema":[{"name":"count","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","effects":[["set","@entity.customers","@config.customers"],["set","@entity.served",0],["set","@entity.pending",["array/len","@config.customers"]],["set","@entity.lost",0]]},{"from":"active","to":"active","event":"HERO_STEPPED","eventId":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","guard":"@config.running","effects":[["let",[["matched",["array/filter","@entity.customers",["fn","c",["<=",["grid/manhattan-distance",["object/get","@c","position"],{"x":"@payload.x","y":"@payload.z"}],"@config.serveRadius"]]]]],["let",[["hitCount",["array/len","@matched"]]],["do",["set","@entity.customers",["array/map","@entity.customers",["fn","c",["if",["<=",["grid/manhattan-distance",["object/get","@c","position"],{"x":"@payload.x","y":"@payload.z"}],"@config.serveRadius"],["object/merge","@c",{"patience":"@c.maxPatience"}],"@c"]]]],["set","@entity.served",["+","@entity.served","@hitCount"]],["emit","BURST",{"particles":["array/map","@matched",["fn","c",{"id":["str/concat","fx-serve-","@c.id"],"type":"score","x":["object/get",["object/get","@c","position"],"x"],"z":["object/get",["object/get","@c","position"],"y"],"message":"+1","ttl":3}]]}],["emit","SERVICE_CHANGED",{"served":"@entity.served","pending":"@entity.pending","lost":"@entity.lost"}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_E915DH25TB2X5HE5P1K72T2DPT","effects":[["set","@entity.customers","@config.customers"],["set","@entity.served",0],["set","@entity.pending",["array/len","@config.customers"]],["set","@entity.lost",0]]}]},"ticks":[{"name":"patienceTick","interval":1000,"guard":"@config.running","effects":[["set","@entity.customers",["array/map","@entity.customers",["fn","c",["object/merge","@c",{"patience":["math/clamp",["-","@c.patience",1],0,"@c.maxPatience"]}]]]],["let",[["starved",["array/filter","@entity.customers",["fn","c",["<=","@c.patience",0]]]]],["let",[["starvedCount",["array/len","@starved"]]],["do",["set","@entity.lost",["+","@entity.lost","@starvedCount"]],["set","@entity.customers",["array/map","@entity.customers",["fn","c",["if",["<=","@c.patience",0],["object/merge","@c",{"patience":"@c.maxPatience"}],"@c"]]]],["if",[">","@starvedCount",0],["emit","BURST",{"particles":["array/map","@starved",["fn","c",{"id":["str/concat","fx-starve-","@c.id"],"type":"damage","x":["object/get",["object/get","@c","position"],"x"],"z":["object/get",["object/get","@c","position"],"y"],"message":"-1 life","ttl":3}]]}],null],["if",[">","@starvedCount",0],["emit","CUSTOMER_LOST",{"count":"@starvedCount"}],null],["emit","SERVICE_CHANGED",{"served":"@entity.served","pending":"@entity.pending","lost":"@entity.lost"}]]]]]}],"config":{"customers":{"type":"[Customer]","default":[],"label":"Customers","description":"Seed roster of stationary customers, each with their own position + patience/maxPatience","tier":"domain","items":{"type":"object","properties":{"maxPatience":{"name":"maxPatience","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}},"name":{"name":"name","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"unitType":{"name":"unitType","type":"string","required":false},"patience":{"name":"patience","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"modelUrl":{"name":"modelUrl","type":"object","required":false,"properties":{"style":{"name":"style","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"dimension":{"name":"dimension","type":"string","required":false},"name":{"name":"name","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"url":{"name":"url","type":"string","required":false},"category":{"name":"category","type":"string","required":false}}}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, patience ticks down and HERO_STEPPED serves nearby customers; toggle to freeze","tier":"domain"},"serveRadius":{"type":"number","default":1,"label":"Serve Radius","description":"Manhattan distance at which a customer counts as served by the hero's last step: 0 = step onto tile, 1 = adjacent","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"PatiencePage","id":"pag_3P6086X5DTJPX4RJNHNWCCXNA7","path":"/patience","traits":[{"ref":"Patience","refId":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"}]}],"types":{"Asset":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"Customer":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"patience","type":"number"},{"name":"maxPatience","type":"number"},{"name":"unitType","type":"string"},{"name":"name","type":"string"},{"name":"team","type":"string"},{"name":"modelUrl","type":"object","properties":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]}],"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ":{"id":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","kind":"entity","bakedName":"PatienceData","curName":"PatienceData","renames":[],"owner":"workspace"},"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT":{"id":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_66N1P7B4AVJ5DS59T552TFC8DC":{"id":"evt_66N1P7B4AVJ5DS59T552TFC8DC","kind":"event","bakedName":"CUSTOMER_LOST","curName":"CUSTOMER_LOST","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_E915DH25TB2X5HE5P1K72T2DPT":{"id":"evt_E915DH25TB2X5HE5P1K72T2DPT","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_J4H97HPG8E8479S6WDSC7Z74DY":{"id":"evt_J4H97HPG8E8479S6WDSC7Z74DY","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9":{"id":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_WH6SDKHRWZWEFPCJW4145M6H01":{"id":"evt_WH6SDKHRWZWEFPCJW4145M6H01","kind":"event","bakedName":"SERVICE_CHANGED","curName":"SERVICE_CHANGED","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"orb_E64NXRAZS8FWM988N39NV1R3BZ":{"id":"orb_E64NXRAZS8FWM988N39NV1R3BZ","kind":"orbital","bakedName":"PatienceOrbital","curName":"PatienceOrbital","renames":[],"owner":"workspace"},"pag_3P6086X5DTJPX4RJNHNWCCXNA7":{"id":"pag_3P6086X5DTJPX4RJNHNWCCXNA7","kind":"page","bakedName":"PatiencePage","curName":"PatiencePage","renames":[],"owner":"workspace"},"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z":{"id":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z","kind":"trait","bakedName":"Patience","curName":"Patience","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-patience","version":"1.0.0","description":"Headless customer-service mechanic: owns a stationary customer roster with per-customer patience. Decrements patience every tick, serves nearby customers on HERO_STEPPED (resets their patience + scores), and emits CUSTOMER_LOST when a timer expires. Never writes units.","orbitals":[{"name":"PatienceOrbital","id":"orb_E64NXRAZS8FWM988N39NV1R3BZ","entity":{"name":"PatienceData","id":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"customers","type":"array","items":{"type":"object","properties":{"team":{"name":"team","type":"string","required":false},"patience":{"name":"patience","type":"number","required":false},"modelUrl":{"name":"modelUrl","type":"object","required":false,"properties":{"name":{"name":"name","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"url":{"name":"url","type":"string","required":false},"dimension":{"name":"dimension","type":"string","required":false},"style":{"name":"style","type":"string","required":false}}},"id":{"name":"id","type":"string","required":true},"maxPatience":{"name":"maxPatience","type":"number","required":false},"name":{"name":"name","type":"string","required":false},"unitType":{"name":"unitType","type":"string","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}}}},{"name":"served","type":"number","default":0},{"name":"pending","type":"number","default":0},{"name":"lost","type":"number","default":0}],"shared":true},"traits":[{"name":"Patience","id":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z","entityRebindable":true,"entityContract":{"requires":[],"provides":["customers","lost","pending","served"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"BURST","site":"tick"},{"kind":"emit","resource":"CUSTOMER_LOST","site":"tick"},{"kind":"emit","resource":"SERVICE_CHANGED"},{"kind":"emit","resource":"SERVICE_CHANGED","site":"tick"},{"kind":"set","resource":"@entity.customers"},{"kind":"set","resource":"@entity.customers","site":"tick"},{"kind":"set","resource":"@entity.lost"},{"kind":"set","resource":"@entity.lost","site":"tick"},{"kind":"set","resource":"@entity.pending"},{"kind":"set","resource":"@entity.served"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"PatienceData","linkedEntityId":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","entityRefIds":{"PatienceData":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ"},"emits":[{"event":"BURST","eventId":"evt_J4H97HPG8E8479S6WDSC7Z74DY","description":"Serve or starve particle burst; a fx-particles listener spawns it","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"SERVICE_CHANGED","eventId":"evt_WH6SDKHRWZWEFPCJW4145M6H01","description":"Served/pending/lost counts after this step; a market-flow listener decides win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"served","type":"number","required":true},{"name":"pending","type":"number","required":true},{"name":"lost","type":"number","required":true}]},{"event":"CUSTOMER_LOST","eventId":"evt_66N1P7B4AVJ5DS59T552TFC8DC","description":"Emitted when one or more customers' patience expires in the same tick","tier":"domain","scope":"external","payloadSchema":[{"name":"count","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","name":"Initialize"},{"key":"HERO_STEPPED","id":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","name":"Hero Stepped","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"z","type":"number"},{"name":"movesLeft","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_E915DH25TB2X5HE5P1K72T2DPT","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_J4H97HPG8E8479S6WDSC7Z74DY","name":"Burst","description":"Serve or starve particle burst; a fx-particles listener spawns it","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"SERVICE_CHANGED","id":"evt_WH6SDKHRWZWEFPCJW4145M6H01","name":"Service Changed","description":"Served/pending/lost counts after this step; a market-flow listener decides win/lose","tier":"domain","payloadSchema":[{"name":"served","type":"number","required":true},{"name":"pending","type":"number","required":true},{"name":"lost","type":"number","required":true}]},{"key":"CUSTOMER_LOST","id":"evt_66N1P7B4AVJ5DS59T552TFC8DC","name":"Customer Lost","description":"Emitted when one or more customers' patience expires in the same tick","tier":"domain","payloadSchema":[{"name":"count","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","effects":[["set","@entity.customers","@config.customers"],["set","@entity.served",0],["set","@entity.pending",["array/len","@config.customers"]],["set","@entity.lost",0]]},{"from":"active","to":"active","event":"HERO_STEPPED","eventId":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","guard":"@config.running","effects":[["let",[["matched",["array/filter","@entity.customers",["fn","c",["<=",["grid/manhattan-distance",["object/get","@c","position"],{"x":"@payload.x","y":"@payload.z"}],"@config.serveRadius"]]]]],["let",[["hitCount",["array/len","@matched"]]],["do",["set","@entity.customers",["array/map","@entity.customers",["fn","c",["if",["<=",["grid/manhattan-distance",["object/get","@c","position"],{"x":"@payload.x","y":"@payload.z"}],"@config.serveRadius"],["object/merge","@c",{"patience":"@c.maxPatience"}],"@c"]]]],["set","@entity.served",["+","@entity.served","@hitCount"]],["emit","BURST",{"particles":["array/map","@matched",["fn","c",{"id":["str/concat","fx-serve-","@c.id"],"type":"score","x":["object/get",["object/get","@c","position"],"x"],"z":["object/get",["object/get","@c","position"],"y"],"message":"+1","ttl":3}]]}],["emit","SERVICE_CHANGED",{"served":"@entity.served","pending":"@entity.pending","lost":"@entity.lost"}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_E915DH25TB2X5HE5P1K72T2DPT","effects":[["set","@entity.customers","@config.customers"],["set","@entity.served",0],["set","@entity.pending",["array/len","@config.customers"]],["set","@entity.lost",0]]}]},"ticks":[{"name":"patienceTick","interval":1000,"guard":"@config.running","effects":[["set","@entity.customers",["array/map","@entity.customers",["fn","c",["object/merge","@c",{"patience":["math/clamp",["-","@c.patience",1],0,"@c.maxPatience"]}]]]],["let",[["starved",["array/filter","@entity.customers",["fn","c",["<=","@c.patience",0]]]]],["let",[["starvedCount",["array/len","@starved"]]],["do",["set","@entity.lost",["+","@entity.lost","@starvedCount"]],["set","@entity.customers",["array/map","@entity.customers",["fn","c",["if",["<=","@c.patience",0],["object/merge","@c",{"patience":"@c.maxPatience"}],"@c"]]]],["if",[">","@starvedCount",0],["emit","BURST",{"particles":["array/map","@starved",["fn","c",{"id":["str/concat","fx-starve-","@c.id"],"type":"damage","x":["object/get",["object/get","@c","position"],"x"],"z":["object/get",["object/get","@c","position"],"y"],"message":"-1 life","ttl":3}]]}],null],["if",[">","@starvedCount",0],["emit","CUSTOMER_LOST",{"count":"@starvedCount"}],null],["emit","SERVICE_CHANGED",{"served":"@entity.served","pending":"@entity.pending","lost":"@entity.lost"}]]]]]}],"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, patience ticks down and HERO_STEPPED serves nearby customers; toggle to freeze","tier":"domain"},"serveRadius":{"type":"number","default":1,"label":"Serve Radius","description":"Manhattan distance at which a customer counts as served by the hero's last step: 0 = step onto tile, 1 = adjacent","tier":"domain"},"customers":{"type":"[Customer]","default":[],"label":"Customers","description":"Seed roster of stationary customers, each with their own position + patience/maxPatience","tier":"domain","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"patience":{"name":"patience","type":"number","required":false},"modelUrl":{"name":"modelUrl","type":"object","required":false,"properties":{"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"category":{"name":"category","type":"string","required":false},"url":{"name":"url","type":"string","required":false},"style":{"name":"style","type":"string","required":false},"dimension":{"name":"dimension","type":"string","required":false},"name":{"name":"name","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false}}},"maxPatience":{"name":"maxPatience","type":"number","required":false},"name":{"name":"name","type":"string","required":false},"team":{"name":"team","type":"string","required":false},"unitType":{"name":"unitType","type":"string","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}}}}},"scope":"instance"}],"pages":[{"name":"PatiencePage","id":"pag_3P6086X5DTJPX4RJNHNWCCXNA7","path":"/patience","traits":[{"ref":"Patience","refId":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"}]}],"types":{"Asset":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"Customer":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"patience","type":"number"},{"name":"maxPatience","type":"number"},{"name":"unitType","type":"string"},{"name":"name","type":"string"},{"name":"team","type":"string"},{"name":"modelUrl","type":"object","properties":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]}],"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ":{"id":"ent_0VTE5CEYRTFCD9VCTMW2KZRGFZ","kind":"entity","bakedName":"PatienceData","curName":"PatienceData","renames":[],"owner":"workspace"},"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT":{"id":"evt_58ZGFEAFXN7YTXYSZNXY8H3HMT","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_66N1P7B4AVJ5DS59T552TFC8DC":{"id":"evt_66N1P7B4AVJ5DS59T552TFC8DC","kind":"event","bakedName":"CUSTOMER_LOST","curName":"CUSTOMER_LOST","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_E915DH25TB2X5HE5P1K72T2DPT":{"id":"evt_E915DH25TB2X5HE5P1K72T2DPT","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_J4H97HPG8E8479S6WDSC7Z74DY":{"id":"evt_J4H97HPG8E8479S6WDSC7Z74DY","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9":{"id":"evt_P4JNYVS9TWMXE6NMGQ6DXZP5C9","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"evt_WH6SDKHRWZWEFPCJW4145M6H01":{"id":"evt_WH6SDKHRWZWEFPCJW4145M6H01","kind":"event","bakedName":"SERVICE_CHANGED","curName":"SERVICE_CHANGED","renames":[],"owner":"workspace","parent":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z"},"orb_E64NXRAZS8FWM988N39NV1R3BZ":{"id":"orb_E64NXRAZS8FWM988N39NV1R3BZ","kind":"orbital","bakedName":"PatienceOrbital","curName":"PatienceOrbital","renames":[],"owner":"workspace"},"pag_3P6086X5DTJPX4RJNHNWCCXNA7":{"id":"pag_3P6086X5DTJPX4RJNHNWCCXNA7","kind":"page","bakedName":"PatiencePage","curName":"PatiencePage","renames":[],"owner":"workspace"},"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z":{"id":"trt_Y1KFDKDQEGVQ8A6FXGD35A293Z","kind":"trait","bakedName":"Patience","curName":"Patience","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-patrol-hazard","version":"1.0.0","description":"Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. SET_PATROLS replaces the live patrol set at runtime for boards that import their patrols; RESTART re-arms the live set, so injected patrols survive respawns. Renders nothing. Corresponds to the design-sheet field(s): challenge, dynamics.","orbitals":[{"name":"PatrolHazardOrbital","id":"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA","entity":{"name":"PatrolState","id":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"patrols","type":"array","default":[],"items":{"type":"object","properties":{"x1":{"name":"x1","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"cy":{"name":"cy","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"hit":{"name":"hit","type":"boolean","required":false},"touching":{"name":"touching","type":"boolean","required":false},"wavePeriod":{"name":"wavePeriod","type":"number","required":false},"speed":{"name":"speed","type":"number","required":true},"waveAmp":{"name":"waveAmp","type":"number","required":false},"dir":{"name":"dir","type":"number","required":false},"t":{"name":"t","type":"number","required":false}}}},{"name":"px","type":"number","default":0},{"name":"py","type":"number","default":0}],"shared":true},"traits":[{"name":"PatrolHazard","id":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB","entityRebindable":true,"entityContract":{"requires":[],"provides":["patrols","px","py"]},"effectRow":[{"kind":"emit","resource":"PATROL_HIT","site":"tick"},{"kind":"set","resource":"@entity.patrols"},{"kind":"set","resource":"@entity.patrols","site":"tick"},{"kind":"set","resource":"@entity.px"},{"kind":"set","resource":"@entity.py"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"PatrolState","linkedEntityId":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","entityRefIds":{"PatrolState":"ent_E8TZJW24GR28C9PE8FQGJ750ZE"},"emits":[{"event":"PATROL_HIT","eventId":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","description":"A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_ATESCJ3HRARW5B7R51K9SCB82X","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_2DDPWW4S3NCHTXQQ854WF3914D","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_PATROLS","id":"evt_TYME59DCS4PCJ9EBHK3QTTB687","name":"Set Patrols","payloadSchema":[{"name":"patrols","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true},{"name":"waveAmp","type":"number"},{"name":"wavePeriod","type":"number"},{"name":"x","type":"number"},{"name":"dir","type":"number"},{"name":"t","type":"number"},{"name":"cy","type":"number"},{"name":"touching","type":"boolean"},{"name":"hit","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"PATROL_HIT","id":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","name":"Patrol Hit","description":"A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_ATESCJ3HRARW5B7R51K9SCB82X","effects":[["set","@entity.patrols",["array/map","@config.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]],["set","@entity.px","@config.playerSpawnX"],["set","@entity.py","@config.playerSpawnY"]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_2DDPWW4S3NCHTXQQ854WF3914D","effects":[["set","@entity.px","@payload.x"],["set","@entity.py","@payload.y"]]},{"from":"active","to":"active","event":"SET_PATROLS","eventId":"evt_TYME59DCS4PCJ9EBHK3QTTB687","effects":[["set","@entity.patrols",["array/map","@payload.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]],["set","@entity.px","@config.playerSpawnX"],["set","@entity.py","@config.playerSpawnY"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","effects":[["set","@entity.patrols",["array/map","@entity.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]]]}]},"ticks":[{"name":"patrolTick","interval":33,"guard":["and","@config.running",[">",["array/len","@entity.patrols"],0]],"effects":[["set","@entity.patrols",["array/map","@entity.patrols",["fn","p",["let",[["nx",["+",["object/get","@p","x"],["*",["*",["object/get","@p","dir"],["object/get","@p","speed"]],0.033]]]],["let",[["overshoot",[">","@nx",["object/get","@p","x1"]]],["undershoot",["<","@nx",["object/get","@p","x0"]]]],["let",[["cx",["if","@overshoot",["object/get","@p","x1"],["if","@undershoot",["object/get","@p","x0"],"@nx"]]],["cdir",["if","@overshoot",-1,["if","@undershoot",1,["object/get","@p","dir"]]]]],["let",[["nt",["+",["object/get","@p","t"],0.033]]],["let",[["amp",["if",["==",["object/get","@p","waveAmp"],null],0,["object/get","@p","waveAmp"]]],["period",["if",["==",["object/get","@p","wavePeriod"],null],3,["object/get","@p","wavePeriod"]]]],["let",[["cy",["+",["object/get","@p","y"],["*","@amp",["math/sin",["/",["*",6.283185307179586,"@nt"],"@period"]]]]]],["let",[["near",["and",["<=",["math/abs",["-","@entity.px","@cx"]],"@config.hitRadius"],["<=",["math/abs",["-","@entity.py","@cy"]],"@config.hitRadius"]]]],["object/merge","@p",{"x":"@cx","dir":"@cdir","t":"@nt","cy":"@cy","hit":["and","@near",["==",["object/get","@p","touching"],false]],"touching":"@near"}]]]]]]]]]]],["let",[["hits",["array/filter","@entity.patrols",["fn","p",["==",["object/get","@p","hit"],true]]]]],["if",[">",["array/len","@hits"],0],["emit","PATROL_HIT",{"id":["object/get",["array/first","@hits"],"id"],"x":["object/get",["array/first","@hits"],"x"],"y":["object/get",["array/first","@hits"],"cy"]}],null]]]}],"config":{"patrols":{"type":"[Patrol]","default":[],"label":"Patrols","description":"One row per patroller: id, the [x0, x1] beat it walks, its base y, its speed in units/s, and optionally waveAmp/wavePeriod for a vertical sine bob (waveAmp 0 = flat ping-pong). Current x/dir/t/cy/touching/hit are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.patrols — SET_PATROLS replaces it at runtime (boards that import patrols), and RESTART re-arms the live set rather than re-reading config, so injected patrols survive respawns.","tier":"domain","items":{"type":"object","properties":{"speed":{"name":"speed","type":"number","required":true},"hit":{"name":"hit","type":"boolean","required":false},"x1":{"name":"x1","type":"number","required":true},"dir":{"name":"dir","type":"number","required":false},"waveAmp":{"name":"waveAmp","type":"number","required":false},"cy":{"name":"cy","type":"number","required":false},"y":{"name":"y","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true},"x0":{"name":"x0","type":"number","required":true},"wavePeriod":{"name":"wavePeriod","type":"number","required":false},"t":{"name":"t","type":"number","required":false},"x":{"name":"x","type":"number","required":false}}}},"hitRadius":{"type":"number","default":0.7,"label":"Hit Radius","description":"Per-axis distance (world units) within which a patrol counts as touching the player; smaller values demand precise contact, larger values forgive.","tier":"domain"},"playerSpawnX":{"type":"number","default":0,"label":"Player Spawn X","description":"Player x assumed before the first BODY_MOVED arrives (match the body authority's spawn).","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the 33ms tick moves patrols and tests contact; toggle to freeze every patrol in place.","tier":"domain"},"playerSpawnY":{"type":"number","default":0,"label":"Player Spawn Y","description":"Player y assumed before the first BODY_MOVED arrives.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"PatrolHazardPage","id":"pag_Q6BDZ187EM3QA2PWPJAHAA69SW","path":"/patrol-hazard","traits":[{"ref":"PatrolHazard","refId":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"}]}],"types":{"Patrol":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true},{"name":"waveAmp","type":"number"},{"name":"wavePeriod","type":"number"},{"name":"x","type":"number"},{"name":"dir","type":"number"},{"name":"t","type":"number"},{"name":"cy","type":"number"},{"name":"touching","type":"boolean"},{"name":"hit","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_E8TZJW24GR28C9PE8FQGJ750ZE":{"id":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","kind":"entity","bakedName":"PatrolState","curName":"PatrolState","renames":[],"owner":"workspace"},"evt_2DDPWW4S3NCHTXQQ854WF3914D":{"id":"evt_2DDPWW4S3NCHTXQQ854WF3914D","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G":{"id":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","kind":"event","bakedName":"PATROL_HIT","curName":"PATROL_HIT","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_ATESCJ3HRARW5B7R51K9SCB82X":{"id":"evt_ATESCJ3HRARW5B7R51K9SCB82X","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_P1FMTQVXX0YYG8KCPE87ETWJVS":{"id":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_TYME59DCS4PCJ9EBHK3QTTB687":{"id":"evt_TYME59DCS4PCJ9EBHK3QTTB687","kind":"event","bakedName":"SET_PATROLS","curName":"SET_PATROLS","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA":{"id":"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA","kind":"orbital","bakedName":"PatrolHazardOrbital","curName":"PatrolHazardOrbital","renames":[],"owner":"workspace"},"pag_Q6BDZ187EM3QA2PWPJAHAA69SW":{"id":"pag_Q6BDZ187EM3QA2PWPJAHAA69SW","kind":"page","bakedName":"PatrolHazardPage","curName":"PatrolHazardPage","renames":[],"owner":"workspace"},"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB":{"id":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB","kind":"trait","bakedName":"PatrolHazard","curName":"PatrolHazard","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-patrol-hazard","version":"1.0.0","description":"Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. SET_PATROLS replaces the live patrol set at runtime for boards that import their patrols; RESTART re-arms the live set, so injected patrols survive respawns. Renders nothing. Corresponds to the design-sheet field(s): challenge, dynamics.","orbitals":[{"name":"PatrolHazardOrbital","id":"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA","entity":{"name":"PatrolState","id":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"patrols","type":"array","default":[],"items":{"type":"object","properties":{"waveAmp":{"name":"waveAmp","type":"number","required":false},"cy":{"name":"cy","type":"number","required":false},"x0":{"name":"x0","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"dir":{"name":"dir","type":"number","required":false},"speed":{"name":"speed","type":"number","required":true},"x":{"name":"x","type":"number","required":false},"wavePeriod":{"name":"wavePeriod","type":"number","required":false},"x1":{"name":"x1","type":"number","required":true},"t":{"name":"t","type":"number","required":false},"hit":{"name":"hit","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":true}}}},{"name":"px","type":"number","default":0},{"name":"py","type":"number","default":0}],"shared":true},"traits":[{"name":"PatrolHazard","id":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB","entityRebindable":true,"entityContract":{"requires":[],"provides":["patrols","px","py"]},"effectRow":[{"kind":"emit","resource":"PATROL_HIT","site":"tick"},{"kind":"set","resource":"@entity.patrols"},{"kind":"set","resource":"@entity.patrols","site":"tick"},{"kind":"set","resource":"@entity.px"},{"kind":"set","resource":"@entity.py"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"PatrolState","linkedEntityId":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","entityRefIds":{"PatrolState":"ent_E8TZJW24GR28C9PE8FQGJ750ZE"},"emits":[{"event":"PATROL_HIT","eventId":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","description":"A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_ATESCJ3HRARW5B7R51K9SCB82X","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_2DDPWW4S3NCHTXQQ854WF3914D","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_PATROLS","id":"evt_TYME59DCS4PCJ9EBHK3QTTB687","name":"Set Patrols","payloadSchema":[{"name":"patrols","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true},{"name":"waveAmp","type":"number"},{"name":"wavePeriod","type":"number"},{"name":"x","type":"number"},{"name":"dir","type":"number"},{"name":"t","type":"number"},{"name":"cy","type":"number"},{"name":"touching","type":"boolean"},{"name":"hit","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"PATROL_HIT","id":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","name":"Patrol Hit","description":"A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_ATESCJ3HRARW5B7R51K9SCB82X","effects":[["set","@entity.patrols",["array/map","@config.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]],["set","@entity.px","@config.playerSpawnX"],["set","@entity.py","@config.playerSpawnY"]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_2DDPWW4S3NCHTXQQ854WF3914D","effects":[["set","@entity.px","@payload.x"],["set","@entity.py","@payload.y"]]},{"from":"active","to":"active","event":"SET_PATROLS","eventId":"evt_TYME59DCS4PCJ9EBHK3QTTB687","effects":[["set","@entity.patrols",["array/map","@payload.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]],["set","@entity.px","@config.playerSpawnX"],["set","@entity.py","@config.playerSpawnY"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","effects":[["set","@entity.patrols",["array/map","@entity.patrols",["fn","p",["object/merge","@p",{"x":["object/get","@p","x0"],"dir":1,"t":0,"cy":["object/get","@p","y"],"touching":false,"hit":false}]]]]]}]},"ticks":[{"name":"patrolTick","interval":33,"guard":["and","@config.running",[">",["array/len","@entity.patrols"],0]],"effects":[["set","@entity.patrols",["array/map","@entity.patrols",["fn","p",["let",[["nx",["+",["object/get","@p","x"],["*",["*",["object/get","@p","dir"],["object/get","@p","speed"]],0.033]]]],["let",[["overshoot",[">","@nx",["object/get","@p","x1"]]],["undershoot",["<","@nx",["object/get","@p","x0"]]]],["let",[["cx",["if","@overshoot",["object/get","@p","x1"],["if","@undershoot",["object/get","@p","x0"],"@nx"]]],["cdir",["if","@overshoot",-1,["if","@undershoot",1,["object/get","@p","dir"]]]]],["let",[["nt",["+",["object/get","@p","t"],0.033]]],["let",[["amp",["if",["==",["object/get","@p","waveAmp"],null],0,["object/get","@p","waveAmp"]]],["period",["if",["==",["object/get","@p","wavePeriod"],null],3,["object/get","@p","wavePeriod"]]]],["let",[["cy",["+",["object/get","@p","y"],["*","@amp",["math/sin",["/",["*",6.283185307179586,"@nt"],"@period"]]]]]],["let",[["near",["and",["<=",["math/abs",["-","@entity.px","@cx"]],"@config.hitRadius"],["<=",["math/abs",["-","@entity.py","@cy"]],"@config.hitRadius"]]]],["object/merge","@p",{"x":"@cx","dir":"@cdir","t":"@nt","cy":"@cy","hit":["and","@near",["==",["object/get","@p","touching"],false]],"touching":"@near"}]]]]]]]]]]],["let",[["hits",["array/filter","@entity.patrols",["fn","p",["==",["object/get","@p","hit"],true]]]]],["if",[">",["array/len","@hits"],0],["emit","PATROL_HIT",{"id":["object/get",["array/first","@hits"],"id"],"x":["object/get",["array/first","@hits"],"x"],"y":["object/get",["array/first","@hits"],"cy"]}],null]]]}],"config":{"playerSpawnY":{"type":"number","default":0,"label":"Player Spawn Y","description":"Player y assumed before the first BODY_MOVED arrives.","tier":"domain"},"patrols":{"type":"[Patrol]","default":[],"label":"Patrols","description":"One row per patroller: id, the [x0, x1] beat it walks, its base y, its speed in units/s, and optionally waveAmp/wavePeriod for a vertical sine bob (waveAmp 0 = flat ping-pong). Current x/dir/t/cy/touching/hit are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.patrols — SET_PATROLS replaces it at runtime (boards that import patrols), and RESTART re-arms the live set rather than re-reading config, so injected patrols survive respawns.","tier":"domain","items":{"type":"object","properties":{"hit":{"name":"hit","type":"boolean","required":false},"cy":{"name":"cy","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"t":{"name":"t","type":"number","required":false},"y":{"name":"y","type":"number","required":true},"waveAmp":{"name":"waveAmp","type":"number","required":false},"wavePeriod":{"name":"wavePeriod","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"speed":{"name":"speed","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"x1":{"name":"x1","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"dir":{"name":"dir","type":"number","required":false}}}},"hitRadius":{"type":"number","default":0.7,"label":"Hit Radius","description":"Per-axis distance (world units) within which a patrol counts as touching the player; smaller values demand precise contact, larger values forgive.","tier":"domain"},"playerSpawnX":{"type":"number","default":0,"label":"Player Spawn X","description":"Player x assumed before the first BODY_MOVED arrives (match the body authority's spawn).","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the 33ms tick moves patrols and tests contact; toggle to freeze every patrol in place.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"PatrolHazardPage","id":"pag_Q6BDZ187EM3QA2PWPJAHAA69SW","path":"/patrol-hazard","traits":[{"ref":"PatrolHazard","refId":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"}]}],"types":{"Patrol":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"speed","type":"number","required":true},{"name":"waveAmp","type":"number"},{"name":"wavePeriod","type":"number"},{"name":"x","type":"number"},{"name":"dir","type":"number"},{"name":"t","type":"number"},{"name":"cy","type":"number"},{"name":"touching","type":"boolean"},{"name":"hit","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_E8TZJW24GR28C9PE8FQGJ750ZE":{"id":"ent_E8TZJW24GR28C9PE8FQGJ750ZE","kind":"entity","bakedName":"PatrolState","curName":"PatrolState","renames":[],"owner":"workspace"},"evt_2DDPWW4S3NCHTXQQ854WF3914D":{"id":"evt_2DDPWW4S3NCHTXQQ854WF3914D","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G":{"id":"evt_2HHA8QHHNVRTXRK0SK2YRFQ12G","kind":"event","bakedName":"PATROL_HIT","curName":"PATROL_HIT","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_ATESCJ3HRARW5B7R51K9SCB82X":{"id":"evt_ATESCJ3HRARW5B7R51K9SCB82X","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_P1FMTQVXX0YYG8KCPE87ETWJVS":{"id":"evt_P1FMTQVXX0YYG8KCPE87ETWJVS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"evt_TYME59DCS4PCJ9EBHK3QTTB687":{"id":"evt_TYME59DCS4PCJ9EBHK3QTTB687","kind":"event","bakedName":"SET_PATROLS","curName":"SET_PATROLS","renames":[],"owner":"workspace","parent":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB"},"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA":{"id":"orb_FP2WAZX0NMGAT6SKJYMA3V6SMA","kind":"orbital","bakedName":"PatrolHazardOrbital","curName":"PatrolHazardOrbital","renames":[],"owner":"workspace"},"pag_Q6BDZ187EM3QA2PWPJAHAA69SW":{"id":"pag_Q6BDZ187EM3QA2PWPJAHAA69SW","kind":"page","bakedName":"PatrolHazardPage","curName":"PatrolHazardPage","renames":[],"owner":"workspace"},"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB":{"id":"trt_4QGVBMH7WBKY5GBYM55ZTSEFKB","kind":"trait","bakedName":"PatrolHazard","curName":"PatrolHazard","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-pickup","version":"1.0.0","description":"Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). A feature carrying active: false is visible but NOT collectible (gated pickups — e.g. a star that only counts once the curve passes through it); FEATURES_ACTIVE{updates:[{id,active}]} flips gates in place without re-arming collected. When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count (re-arming the live entity set, so SET_FEATURES-injected features survive). SET_FEATURES replaces the collectible set at runtime for boards that import their features; ADD_FEATURES appends without disturbing the live set (mid-game gem drops). kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards.","orbitals":[{"name":"PickupOrbital","id":"orb_M4BB6S07JH3S8SCW63EDC2D0CJ","entity":{"name":"PickupData","id":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"pickups","type":"array","default":[],"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"collected":{"name":"collected","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"message":{"name":"message","type":"string","required":false},"kind":{"name":"kind","type":"string","required":true},"glyph":{"name":"glyph","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"active":{"name":"active","type":"boolean","required":false}}}},{"name":"pickupCompleted","type":"boolean","default":false},{"name":"total","type":"number","default":0}],"shared":true},"traits":[{"name":"Pickup","id":"trt_QEYHAPN5DPJPV84JNG69MF04NR","entityRebindable":true,"entityContract":{"requires":[],"provides":["pickupCompleted","pickups","total"]},"effectRow":[{"kind":"emit","resource":"COLLECT"},{"kind":"emit","resource":"PICKED"},{"kind":"emit","resource":"PICKUP_SET_COMPLETED"},{"kind":"set","resource":"@entity.pickupCompleted"},{"kind":"set","resource":"@entity.pickups"},{"kind":"set","resource":"@entity.total"}],"category":"lifecycle","linkedEntity":"PickupData","linkedEntityId":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","entityRefIds":{"PickupData":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV"},"emits":[{"event":"PICKED","eventId":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","description":"The player touched an uncollected feature; carries the feature identity, board-defined kind (star, boost, …), position and display glyph/message. Fires once per feature per run.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"kind","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"}]},{"event":"COLLECT","eventId":"evt_B3HYS363661K3BF02TZKKJ2D1M","description":"Running count of collected features after this pickup — the event std-gate-lock consumes to count openings.","tier":"domain","scope":"external","payloadSchema":[{"name":"total","type":"number","required":true}]},{"event":"PICKUP_SET_COMPLETED","eventId":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","description":"Every feature in the set is collected; fires once per run.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_NPX9Z2X48AJ456H3PN9N980PSP","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_FEATURES","id":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","name":"Set Features","payloadSchema":[{"name":"features","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}],"listened":true},{"key":"ADD_FEATURES","id":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","name":"Add Features","payloadSchema":[{"name":"features","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}],"listened":true},{"key":"FEATURES_ACTIVE","id":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","name":"Features Active","payloadSchema":[{"name":"updates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"active","type":"boolean","required":true}]}],"listened":true},{"key":"RESTART","id":"evt_316ACAQZDPZPV36NF4W00M7MAP","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"PICKED","id":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","name":"Picked","description":"The player touched an uncollected feature; carries the feature identity, board-defined kind (star, boost, …), position and display glyph/message. Fires once per feature per run.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"kind","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"}]},{"key":"COLLECT","id":"evt_B3HYS363661K3BF02TZKKJ2D1M","name":"Collect","description":"Running count of collected features after this pickup — the event std-gate-lock consumes to count openings.","tier":"domain","payloadSchema":[{"name":"total","type":"number","required":true}]},{"key":"PICKUP_SET_COMPLETED","id":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","name":"Pickup Set Completed","description":"Every feature in the set is collected; fires once per run.","tier":"domain"}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","effects":[["set","@entity.pickups",["array/map","@config.features",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_NPX9Z2X48AJ456H3PN9N980PSP","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.pickups",["fn","f",["and",["==",["object/get","@f","collected"],false],["and",["!=",["object/get","@f","active"],false],["and",["<=",["math/abs",["-","@payload.x",["object/get","@f","x"]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@f","y"]]],"@config.reachY"]]]]]]]],["if",[">",["array/len","@touch"],0],["let",[["f",["array/first","@touch"]]],["let",[["remaining",["array/len",["array/filter","@entity.pickups",["fn","c",["and",["==",["object/get","@c","collected"],false],["!=",["object/get","@c","id"],["object/get","@f","id"]]]]]]]],["do",["set","@entity.pickups",["array/map","@entity.pickups",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@f","id"]],["object/merge","@c",{"collected":true}],"@c"]]]],["set","@entity.total",["+","@entity.total",1]],["emit","PICKED",{"id":["object/get","@f","id"],"kind":["object/get","@f","kind"],"x":["object/get","@f","x"],"y":["object/get","@f","y"],"glyph":["object/get","@f","glyph"],"message":["object/get","@f","message"]}],["emit","COLLECT",{"total":"@entity.total"}],["if",["and",["==","@entity.pickupCompleted",false],["==","@remaining",0]],["do",["set","@entity.pickupCompleted",true],["emit","PICKUP_SET_COMPLETED",{}]],null]]]],null]]]},{"from":"active","to":"active","event":"SET_FEATURES","eventId":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","effects":[["set","@entity.pickups",["array/map","@payload.features",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]},{"from":"active","to":"active","event":"ADD_FEATURES","eventId":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","effects":[["set","@entity.pickups",["array/concat","@entity.pickups",["array/map","@payload.features",["fn","f",["object/merge","@f",{"collected":false}]]]]],["set","@entity.pickupCompleted",false]]},{"from":"active","to":"active","event":"FEATURES_ACTIVE","eventId":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","effects":[["set","@entity.pickups",["array/map","@entity.pickups",["fn","f",["let",[["m",["array/filter","@payload.updates",["fn","u",["==",["object/get","@u","id"],["object/get","@f","id"]]]]]],["if",[">",["array/len","@m"],0],["object/merge","@f",{"active":["object/get",["array/first","@m"],"active"]}],"@f"]]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_316ACAQZDPZPV36NF4W00M7MAP","effects":[["set","@entity.pickups",["array/map","@entity.pickups",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED collects touched features; toggle to freeze the set as-is.","tier":"domain"},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around a feature's center when testing player contact.","tier":"domain"},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around a feature's center when testing player contact; generous values catch fly-through pickups.","tier":"domain"},"features":{"type":"[PickupFeature]","default":[],"label":"Features","description":"One row per collectible: id, center (x, y in world units), board-defined kind (star, boost, …), display glyph and message floated on pickup. collected is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.pickups — SET_FEATURES replaces it at runtime (boards that import collectibles), and RESTART re-arms the live set rather than re-reading config, so injected features survive respawns.","tier":"domain","items":{"type":"object","properties":{"active":{"name":"active","type":"boolean","required":false},"message":{"name":"message","type":"string","required":false},"collected":{"name":"collected","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"glyph":{"name":"glyph","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"kind":{"name":"kind","type":"string","required":true}}}}},"scope":"instance"}],"pages":[{"name":"PickupPage","id":"pag_6FTKP81CFSP7WZCXVS6R5V3N4A","path":"/pickup","traits":[{"ref":"Pickup","refId":"trt_QEYHAPN5DPJPV84JNG69MF04NR"}]}],"types":{"PickupActiveUpdate":[{"name":"id","type":"string","required":true},{"name":"active","type":"boolean","required":true}],"PickupFeature":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_J03W9KYKEV9QDGX8H8VYJC2JNV":{"id":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","kind":"entity","bakedName":"PickupData","curName":"PickupData","renames":[],"owner":"workspace"},"evt_316ACAQZDPZPV36NF4W00M7MAP":{"id":"evt_316ACAQZDPZPV36NF4W00M7MAP","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_8ZYEKY87V03XGCRVP5WMVF5NFY":{"id":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","kind":"event","bakedName":"ADD_FEATURES","curName":"ADD_FEATURES","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_B3HYS363661K3BF02TZKKJ2D1M":{"id":"evt_B3HYS363661K3BF02TZKKJ2D1M","kind":"event","bakedName":"COLLECT","curName":"COLLECT","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_JARSAD0RRXCCEM8TQ8CGTDH05P":{"id":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","kind":"event","bakedName":"FEATURES_ACTIVE","curName":"FEATURES_ACTIVE","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_MSTR9BV4YFJF7PET3C39NGNX6G":{"id":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","kind":"event","bakedName":"SET_FEATURES","curName":"SET_FEATURES","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_NPX9Z2X48AJ456H3PN9N980PSP":{"id":"evt_NPX9Z2X48AJ456H3PN9N980PSP","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_RNRBM1527AH3NEXGDG1J6YHCHJ":{"id":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","kind":"event","bakedName":"PICKED","curName":"PICKED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_WF44147PD2V6H7QZTQKQ3BJGB1":{"id":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","kind":"event","bakedName":"PICKUP_SET_COMPLETED","curName":"PICKUP_SET_COMPLETED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ":{"id":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"orb_M4BB6S07JH3S8SCW63EDC2D0CJ":{"id":"orb_M4BB6S07JH3S8SCW63EDC2D0CJ","kind":"orbital","bakedName":"PickupOrbital","curName":"PickupOrbital","renames":[],"owner":"workspace"},"pag_6FTKP81CFSP7WZCXVS6R5V3N4A":{"id":"pag_6FTKP81CFSP7WZCXVS6R5V3N4A","kind":"page","bakedName":"PickupPage","curName":"PickupPage","renames":[],"owner":"workspace"},"trt_QEYHAPN5DPJPV84JNG69MF04NR":{"id":"trt_QEYHAPN5DPJPV84JNG69MF04NR","kind":"trait","bakedName":"Pickup","curName":"Pickup","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-pickup","version":"1.0.0","description":"Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). A feature carrying active: false is visible but NOT collectible (gated pickups — e.g. a star that only counts once the curve passes through it); FEATURES_ACTIVE{updates:[{id,active}]} flips gates in place without re-arming collected. When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count (re-arming the live entity set, so SET_FEATURES-injected features survive). SET_FEATURES replaces the collectible set at runtime for boards that import their features; ADD_FEATURES appends without disturbing the live set (mid-game gem drops). kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards.","orbitals":[{"name":"PickupOrbital","id":"orb_M4BB6S07JH3S8SCW63EDC2D0CJ","entity":{"name":"PickupData","id":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"pickups","type":"array","default":[],"items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"kind":{"name":"kind","type":"string","required":true},"active":{"name":"active","type":"boolean","required":false},"message":{"name":"message","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"collected":{"name":"collected","type":"boolean","required":false},"glyph":{"name":"glyph","type":"string","required":false}}}},{"name":"pickupCompleted","type":"boolean","default":false},{"name":"total","type":"number","default":0}],"shared":true},"traits":[{"name":"Pickup","id":"trt_QEYHAPN5DPJPV84JNG69MF04NR","entityRebindable":true,"entityContract":{"requires":[],"provides":["pickupCompleted","pickups","total"]},"effectRow":[{"kind":"emit","resource":"COLLECT"},{"kind":"emit","resource":"PICKED"},{"kind":"emit","resource":"PICKUP_SET_COMPLETED"},{"kind":"set","resource":"@entity.pickupCompleted"},{"kind":"set","resource":"@entity.pickups"},{"kind":"set","resource":"@entity.total"}],"category":"lifecycle","linkedEntity":"PickupData","linkedEntityId":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","entityRefIds":{"PickupData":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV"},"emits":[{"event":"PICKED","eventId":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","description":"The player touched an uncollected feature; carries the feature identity, board-defined kind (star, boost, …), position and display glyph/message. Fires once per feature per run.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"kind","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"}]},{"event":"COLLECT","eventId":"evt_B3HYS363661K3BF02TZKKJ2D1M","description":"Running count of collected features after this pickup — the event std-gate-lock consumes to count openings.","tier":"domain","scope":"external","payloadSchema":[{"name":"total","type":"number","required":true}]},{"event":"PICKUP_SET_COMPLETED","eventId":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","description":"Every feature in the set is collected; fires once per run.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_NPX9Z2X48AJ456H3PN9N980PSP","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_FEATURES","id":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","name":"Set Features","payloadSchema":[{"name":"features","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}],"listened":true},{"key":"ADD_FEATURES","id":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","name":"Add Features","payloadSchema":[{"name":"features","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}],"listened":true},{"key":"FEATURES_ACTIVE","id":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","name":"Features Active","payloadSchema":[{"name":"updates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"active","type":"boolean","required":true}]}],"listened":true},{"key":"RESTART","id":"evt_316ACAQZDPZPV36NF4W00M7MAP","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"PICKED","id":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","name":"Picked","description":"The player touched an uncollected feature; carries the feature identity, board-defined kind (star, boost, …), position and display glyph/message. Fires once per feature per run.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"kind","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"}]},{"key":"COLLECT","id":"evt_B3HYS363661K3BF02TZKKJ2D1M","name":"Collect","description":"Running count of collected features after this pickup — the event std-gate-lock consumes to count openings.","tier":"domain","payloadSchema":[{"name":"total","type":"number","required":true}]},{"key":"PICKUP_SET_COMPLETED","id":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","name":"Pickup Set Completed","description":"Every feature in the set is collected; fires once per run.","tier":"domain"}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","effects":[["set","@entity.pickups",["array/map","@config.features",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_NPX9Z2X48AJ456H3PN9N980PSP","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.pickups",["fn","f",["and",["==",["object/get","@f","collected"],false],["and",["!=",["object/get","@f","active"],false],["and",["<=",["math/abs",["-","@payload.x",["object/get","@f","x"]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@f","y"]]],"@config.reachY"]]]]]]]],["if",[">",["array/len","@touch"],0],["let",[["f",["array/first","@touch"]]],["let",[["remaining",["array/len",["array/filter","@entity.pickups",["fn","c",["and",["==",["object/get","@c","collected"],false],["!=",["object/get","@c","id"],["object/get","@f","id"]]]]]]]],["do",["set","@entity.pickups",["array/map","@entity.pickups",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@f","id"]],["object/merge","@c",{"collected":true}],"@c"]]]],["set","@entity.total",["+","@entity.total",1]],["emit","PICKED",{"id":["object/get","@f","id"],"kind":["object/get","@f","kind"],"x":["object/get","@f","x"],"y":["object/get","@f","y"],"glyph":["object/get","@f","glyph"],"message":["object/get","@f","message"]}],["emit","COLLECT",{"total":"@entity.total"}],["if",["and",["==","@entity.pickupCompleted",false],["==","@remaining",0]],["do",["set","@entity.pickupCompleted",true],["emit","PICKUP_SET_COMPLETED",{}]],null]]]],null]]]},{"from":"active","to":"active","event":"SET_FEATURES","eventId":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","effects":[["set","@entity.pickups",["array/map","@payload.features",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]},{"from":"active","to":"active","event":"ADD_FEATURES","eventId":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","effects":[["set","@entity.pickups",["array/concat","@entity.pickups",["array/map","@payload.features",["fn","f",["object/merge","@f",{"collected":false}]]]]],["set","@entity.pickupCompleted",false]]},{"from":"active","to":"active","event":"FEATURES_ACTIVE","eventId":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","effects":[["set","@entity.pickups",["array/map","@entity.pickups",["fn","f",["let",[["m",["array/filter","@payload.updates",["fn","u",["==",["object/get","@u","id"],["object/get","@f","id"]]]]]],["if",[">",["array/len","@m"],0],["object/merge","@f",{"active":["object/get",["array/first","@m"],"active"]}],"@f"]]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_316ACAQZDPZPV36NF4W00M7MAP","effects":[["set","@entity.pickups",["array/map","@entity.pickups",["fn","f",["object/merge","@f",{"collected":false}]]]],["set","@entity.pickupCompleted",false],["set","@entity.total",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED collects touched features; toggle to freeze the set as-is.","tier":"domain"},"features":{"type":"[PickupFeature]","default":[],"label":"Features","description":"One row per collectible: id, center (x, y in world units), board-defined kind (star, boost, …), display glyph and message floated on pickup. collected is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.pickups — SET_FEATURES replaces it at runtime (boards that import collectibles), and RESTART re-arms the live set rather than re-reading config, so injected features survive respawns.","tier":"domain","items":{"type":"object","properties":{"glyph":{"name":"glyph","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"collected":{"name":"collected","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true},"active":{"name":"active","type":"boolean","required":false},"kind":{"name":"kind","type":"string","required":true},"message":{"name":"message","type":"string","required":false},"y":{"name":"y","type":"number","required":true}}}},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around a feature's center when testing player contact.","tier":"domain"},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around a feature's center when testing player contact; generous values catch fly-through pickups.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"PickupPage","id":"pag_6FTKP81CFSP7WZCXVS6R5V3N4A","path":"/pickup","traits":[{"ref":"Pickup","refId":"trt_QEYHAPN5DPJPV84JNG69MF04NR"}]}],"types":{"PickupActiveUpdate":[{"name":"id","type":"string","required":true},{"name":"active","type":"boolean","required":true}],"PickupFeature":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"kind","type":"string","required":true},{"name":"glyph","type":"string"},{"name":"message","type":"string"},{"name":"collected","type":"boolean"},{"name":"active","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_J03W9KYKEV9QDGX8H8VYJC2JNV":{"id":"ent_J03W9KYKEV9QDGX8H8VYJC2JNV","kind":"entity","bakedName":"PickupData","curName":"PickupData","renames":[],"owner":"workspace"},"evt_316ACAQZDPZPV36NF4W00M7MAP":{"id":"evt_316ACAQZDPZPV36NF4W00M7MAP","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_8ZYEKY87V03XGCRVP5WMVF5NFY":{"id":"evt_8ZYEKY87V03XGCRVP5WMVF5NFY","kind":"event","bakedName":"ADD_FEATURES","curName":"ADD_FEATURES","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_B3HYS363661K3BF02TZKKJ2D1M":{"id":"evt_B3HYS363661K3BF02TZKKJ2D1M","kind":"event","bakedName":"COLLECT","curName":"COLLECT","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_JARSAD0RRXCCEM8TQ8CGTDH05P":{"id":"evt_JARSAD0RRXCCEM8TQ8CGTDH05P","kind":"event","bakedName":"FEATURES_ACTIVE","curName":"FEATURES_ACTIVE","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_MSTR9BV4YFJF7PET3C39NGNX6G":{"id":"evt_MSTR9BV4YFJF7PET3C39NGNX6G","kind":"event","bakedName":"SET_FEATURES","curName":"SET_FEATURES","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_NPX9Z2X48AJ456H3PN9N980PSP":{"id":"evt_NPX9Z2X48AJ456H3PN9N980PSP","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_RNRBM1527AH3NEXGDG1J6YHCHJ":{"id":"evt_RNRBM1527AH3NEXGDG1J6YHCHJ","kind":"event","bakedName":"PICKED","curName":"PICKED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_WF44147PD2V6H7QZTQKQ3BJGB1":{"id":"evt_WF44147PD2V6H7QZTQKQ3BJGB1","kind":"event","bakedName":"PICKUP_SET_COMPLETED","curName":"PICKUP_SET_COMPLETED","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ":{"id":"evt_ZFMPQHHFJVQSDN6Y0HYJ1QG4SJ","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_QEYHAPN5DPJPV84JNG69MF04NR"},"orb_M4BB6S07JH3S8SCW63EDC2D0CJ":{"id":"orb_M4BB6S07JH3S8SCW63EDC2D0CJ","kind":"orbital","bakedName":"PickupOrbital","curName":"PickupOrbital","renames":[],"owner":"workspace"},"pag_6FTKP81CFSP7WZCXVS6R5V3N4A":{"id":"pag_6FTKP81CFSP7WZCXVS6R5V3N4A","kind":"page","bakedName":"PickupPage","curName":"PickupPage","renames":[],"owner":"workspace"},"trt_QEYHAPN5DPJPV84JNG69MF04NR":{"id":"trt_QEYHAPN5DPJPV84JNG69MF04NR","kind":"trait","bakedName":"Pickup","curName":"Pickup","renames":[],"owner":"workspace"}}}}