pineforge-codegen 0.7.1__tar.gz → 0.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. pineforge_codegen-0.7.3/.github/dependabot.yml +20 -0
  2. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/release.yml +29 -9
  3. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/PKG-INFO +1 -1
  4. pineforge_codegen-0.7.3/VERSION +1 -0
  5. pineforge_codegen-0.7.3/gate/compare.mjs +69 -0
  6. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/run-gate.mjs +19 -5
  7. pineforge_codegen-0.7.3/gate/selftest.mjs +57 -0
  8. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/base.py +109 -20
  9. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_call.py +5 -0
  10. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/support_checker.py +62 -19
  11. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/worker-template.mjs +21 -0
  12. pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_last_bar_index.pine +7 -0
  13. pineforge_codegen-0.7.3/tests/gate-corpus/err/divergent_time_close.pine +9 -0
  14. pineforge_codegen-0.7.3/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +23 -0
  15. pineforge_codegen-0.7.3/tests/test_codegen_determinism.py +136 -0
  16. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_official_surface.py +40 -0
  17. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker.py +78 -8
  18. pineforge_codegen-0.7.3/tests/test_support_checker_syminfo_gap_fields.py +120 -0
  19. pineforge_codegen-0.7.1/.github/dependabot.yml +0 -8
  20. pineforge_codegen-0.7.1/VERSION +0 -1
  21. pineforge_codegen-0.7.1/gate/compare.mjs +0 -29
  22. pineforge_codegen-0.7.1/gate/selftest.mjs +0 -29
  23. pineforge_codegen-0.7.1/tests/test_support_checker_syminfo_gap_fields.py +0 -71
  24. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/gate.yml +0 -0
  25. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/publish-pyodide.yml +0 -0
  26. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.github/workflows/test.yml +0 -0
  27. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/.gitignore +0 -0
  28. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/CLAUDE.md +0 -0
  29. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/LEGAL.md +0 -0
  30. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/LICENSE +0 -0
  31. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/PYODIDE_TARGET +0 -0
  32. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/README.md +0 -0
  33. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/docs/codegen-coverage-gaps.md +0 -0
  34. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/glue.py +0 -0
  35. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/gate/oracle.py +0 -0
  36. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/README.md +0 -0
  37. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/index.mjs +0 -0
  38. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/npm/package.json +0 -0
  39. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/package-lock.json +0 -0
  40. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/package.json +0 -0
  41. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/__init__.py +0 -0
  42. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/__init__.py +0 -0
  43. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/base.py +0 -0
  44. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/call_handlers.py +0 -0
  45. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/contracts.py +0 -0
  46. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/diagnostics.py +0 -0
  47. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/tables.py +0 -0
  48. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/analyzer/types.py +0 -0
  49. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/ast_nodes.py +0 -0
  50. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/__init__.py +0 -0
  51. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/emit_top.py +0 -0
  52. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers.py +0 -0
  53. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
  54. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/input.py +0 -0
  55. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/security.py +0 -0
  56. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/ta.py +0 -0
  57. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/tables.py +0 -0
  58. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/types.py +0 -0
  59. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_expr.py +0 -0
  60. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/codegen/visit_stmt.py +0 -0
  61. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/errors.py +0 -0
  62. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/lexer.py +0 -0
  63. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/parser.py +0 -0
  64. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/pragmas.py +0 -0
  65. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/signatures.py +0 -0
  66. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/symbols.py +0 -0
  67. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/tokens.py +0 -0
  68. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pineforge_codegen/tv_input_choices.py +0 -0
  69. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/pyproject.toml +0 -0
  70. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/build-npm-package.mjs +0 -0
  71. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/scripts/dump-tables.py +0 -0
  72. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/__init__.py +0 -0
  73. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/_compile.py +0 -0
  74. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/chart_bg_color.pine +0 -0
  75. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
  76. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
  77. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/export_func.pine +0 -0
  78. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/footprint_new.pine +0 -0
  79. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
  80. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
  81. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
  82. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
  83. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_color.pine +0 -0
  84. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_math.pine +0 -0
  85. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_str.pine +0 -0
  86. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
  87. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
  88. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/err/unknown_ta.pine +0 -0
  89. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
  90. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
  91. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
  92. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
  93. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
  94. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
  95. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
  96. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
  97. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
  98. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
  99. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
  100. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
  101. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
  102. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
  103. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
  104. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
  105. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
  106. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
  107. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
  108. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
  109. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
  110. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
  111. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
  112. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
  113. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
  114. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
  115. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
  116. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
  117. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
  118. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
  119. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
  120. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
  121. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
  122. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
  123. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
  124. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
  125. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
  126. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
  127. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
  128. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
  129. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
  130. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
  131. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
  132. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
  133. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
  134. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
  135. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
  136. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
  137. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
  138. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
  139. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
  140. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
  141. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
  142. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
  143. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
  144. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
  145. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
  146. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
  147. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
  148. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
  149. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
  150. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
  151. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
  152. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
  153. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
  154. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
  155. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
  156. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
  157. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
  158. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
  159. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
  160. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
  161. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
  162. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
  163. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
  164. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
  165. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
  166. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
  167. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
  168. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
  169. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
  170. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
  171. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
  172. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
  173. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
  174. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
  175. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
  176. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
  177. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
  178. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
  179. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
  180. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
  181. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
  182. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
  183. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
  184. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
  185. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
  186. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
  187. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
  188. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
  189. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
  190. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
  191. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
  192. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
  193. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
  194. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
  195. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
  196. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
  197. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
  198. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
  199. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
  200. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
  201. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
  202. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
  203. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
  204. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
  205. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
  206. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
  207. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
  208. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
  209. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
  210. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
  211. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
  212. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
  213. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
  214. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
  215. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
  216. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
  217. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
  218. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
  219. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
  220. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
  221. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
  222. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
  223. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
  224. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
  225. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
  226. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
  227. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
  228. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
  229. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
  230. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
  231. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
  232. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
  233. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
  234. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
  235. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
  236. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
  237. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
  238. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
  239. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
  240. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
  241. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
  242. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
  243. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
  244. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
  245. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
  246. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
  247. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
  248. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
  249. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
  250. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
  251. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
  252. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
  253. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
  254. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
  255. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
  256. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
  257. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
  258. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
  259. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
  260. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
  261. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
  262. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
  263. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
  264. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
  265. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
  266. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
  267. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
  268. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
  269. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
  270. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
  271. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
  272. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
  273. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
  274. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
  275. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
  276. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
  277. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
  278. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
  279. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
  280. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
  281. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
  282. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
  283. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
  284. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
  285. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
  286. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
  287. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
  288. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
  289. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
  290. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
  291. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
  292. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
  293. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
  294. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
  295. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
  296. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
  297. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
  298. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
  299. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
  300. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
  301. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
  302. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
  303. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
  304. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
  305. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
  306. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
  307. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
  308. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
  309. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
  310. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
  311. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
  312. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
  313. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
  314. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
  315. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
  316. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
  317. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
  318. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
  319. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
  320. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
  321. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
  322. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
  323. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
  324. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
  325. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
  326. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
  327. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
  328. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
  329. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
  330. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
  331. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
  332. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
  333. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
  334. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
  335. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
  336. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
  337. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
  338. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
  339. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
  340. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
  341. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
  342. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
  343. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
  344. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
  345. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
  346. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
  347. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
  348. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
  349. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/golden/matrix_eigen_pca.cpp +0 -0
  350. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer.py +0 -0
  351. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer_matrix_inference.py +0 -0
  352. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_analyzer_ta_return_types.py +0 -0
  353. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_audit_fixes.py +0 -0
  354. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_fallthrough_guards.py +0 -0
  355. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_golden.py +0 -0
  356. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_input_getters.py +0 -0
  357. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_matrix_typed.py +0 -0
  358. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_codegen_new.py +0 -0
  359. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_compile_corpus.py +0 -0
  360. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_compile_smoke.py +0 -0
  361. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_errors.py +0 -0
  362. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_import_all.py +0 -0
  363. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_input_time_int64.py +0 -0
  364. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_int64_time_storage.py +0 -0
  365. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_lexer.py +0 -0
  366. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_parser.py +0 -0
  367. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_security_tf_literal.py +0 -0
  368. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_signatures.py +0 -0
  369. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
  370. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_color_cast.py +0 -0
  371. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_const_namespaces.py +0 -0
  372. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_dividends_earnings.py +0 -0
  373. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_footprint.py +0 -0
  374. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_color.py +0 -0
  375. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_input_source.py +0 -0
  376. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_matrix.py +0 -0
  377. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_security_adjustment.py +0 -0
  378. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
  379. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_varip.py +0 -0
  380. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_support_checker_volume_row.py +0 -0
  381. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_symbols.py +0 -0
  382. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_ta_official_surface.py +0 -0
  383. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_division.py +0 -0
  384. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_enum_order.py +0 -0
  385. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_pf_trace.py +0 -0
  386. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpile_tr_handle_na.py +0 -0
  387. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_transpiler_matrix_kwargs.py +0 -0
  388. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_typespec_matrix.py +0 -0
  389. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_udt_drawing_field_cleanup.py +0 -0
  390. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_unsupported_reporting.py +0 -0
  391. {pineforge_codegen-0.7.1 → pineforge_codegen-0.7.3}/tests/test_vwap_tuple_unpack.py +0 -0
@@ -0,0 +1,20 @@
1
+ version: 2
2
+ updates:
3
+ # Keep the SHA-pinned GitHub Actions in workflows up to date with
4
+ # reviewable PRs (security review: pinned actions need a bump path).
5
+ - package-ecosystem: "github-actions"
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ # The conformance-gate / npm-package tooling (pyodide pinned to PYODIDE_TARGET,
10
+ # tar caret range) — get reviewable bump PRs. NOTE: a pyodide bump must move
11
+ # PYODIDE_TARGET in lockstep (the gate validates against it), so review these.
12
+ - package-ecosystem: "npm"
13
+ directory: "/"
14
+ schedule:
15
+ interval: "weekly"
16
+ # Python dev deps (pytest).
17
+ - package-ecosystem: "pip"
18
+ directory: "/"
19
+ schedule:
20
+ interval: "weekly"
@@ -36,8 +36,9 @@ jobs:
36
36
  release:
37
37
  runs-on: ubuntu-latest
38
38
  env:
39
- BUMP: ${{ inputs.bump }}
40
- OVERRIDE: ${{ inputs.override }}
39
+ BUMP: ${{ inputs.bump }}
40
+ OVERRIDE: ${{ inputs.override }}
41
+ PYTHONHASHSEED: "0" # deterministic gate runtime (match gate.yml)
41
42
  steps:
42
43
  - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
43
44
  with:
@@ -83,7 +84,22 @@ jobs:
83
84
 
84
85
  - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
85
86
  with:
86
- python-version: "3.12"
87
+ python-version: "3.14" # match the gate's runtime
88
+
89
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
90
+ with:
91
+ node-version: "22"
92
+
93
+ # Conformance gate (BLOCKING): the differential parity gate must pass
94
+ # before anything is built, published, or tagged. A gate-broken codegen
95
+ # fails the release here — nothing reaches PyPI, no tag is pushed (so the
96
+ # tag->npm trigger never fires), and no GitHub Release is created.
97
+ - name: Run conformance gate (blocking)
98
+ run: |
99
+ python -m pip install -e .
100
+ npm ci
101
+ npm run gate:selftest
102
+ npm run gate:full
87
103
 
88
104
  - name: Build sdist + wheel
89
105
  run: |
@@ -91,8 +107,16 @@ jobs:
91
107
  python -m build
92
108
  ls -l dist/
93
109
 
94
- # Commit + tag before publishing so a tag always corresponds to a built
95
- # artifact set; the GitHub Release (with files) comes after PyPI succeeds.
110
+ # Publish to PyPI BEFORE the tag is pushed. The tag push triggers
111
+ # publish-pyodide.yml (npm), so PyPI must land first otherwise a PyPI
112
+ # failure would leave npm shipping a version PyPI never got.
113
+ - name: Publish to PyPI
114
+ if: ${{ !inputs.dry_run }}
115
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
116
+
117
+ # Commit + tag + push AFTER PyPI succeeds. The `git push --tags` triggers
118
+ # publish-pyodide.yml for npm (which re-runs the gate — defense in depth),
119
+ # so the tag only exists once the gate passed and PyPI published.
96
120
  - name: Commit + tag + push
97
121
  if: ${{ !inputs.dry_run }}
98
122
  env:
@@ -105,10 +129,6 @@ jobs:
105
129
  git tag "v${NEW_VERSION}"
106
130
  git push origin HEAD --tags
107
131
 
108
- - name: Publish to PyPI
109
- if: ${{ !inputs.dry_run }}
110
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
111
-
112
132
  - name: Create GitHub Release
113
133
  if: ${{ !inputs.dry_run }}
114
134
  env:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pineforge-codegen
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: PineScript v6 to C++ transpiler that targets the pineforge-engine runtime.
5
5
  Project-URL: Homepage, https://github.com/pineforge-4pass/pineforge-codegen-oss
6
6
  Project-URL: Issues, https://github.com/pineforge-4pass/pineforge-codegen-oss/issues
@@ -0,0 +1 @@
1
+ 0.7.3
@@ -0,0 +1,69 @@
1
+ // Pure, side-effect-free comparator for the gate. Both run-gate.mjs (the runner)
2
+ // and selftest.mjs (the canary) import this — so importing it never triggers a
3
+ // gate run. Each side is {json: "<transpile_json string>"} (normal return) or
4
+ // {unexpected: "Type: msg"} (non-CompileError exception). Returns a mismatch
5
+ // string, or null if the two sides agree.
6
+ export function compareResults(name, native, browser) {
7
+ if (!native) return `${name}: oracle produced no result`;
8
+ if (!browser) return `${name}: pyodide produced no result`;
9
+ if (native.unexpected || browser.unexpected) {
10
+ if (native.unexpected !== browser.unexpected) {
11
+ return `${name}: unexpected-exception mismatch\n native : ${native.unexpected ?? "<none>"}\n pyodide: ${browser.unexpected ?? "<none>"}`;
12
+ }
13
+ return null;
14
+ }
15
+ if (native.json !== browser.json) {
16
+ let detail = "";
17
+ try {
18
+ const n = JSON.parse(native.json);
19
+ const b = JSON.parse(browser.json);
20
+ if (n.ok !== b.ok) detail = `verdict ${b.ok} (pyodide) != ${n.ok} (native)`;
21
+ else if (n.ok) detail = "C++ output differs";
22
+ else detail = `error/diagnostics differ\n native : ${native.json}\n pyodide: ${browser.json}`;
23
+ } catch {
24
+ detail = `raw json differs\n native : ${native.json}\n pyodide: ${browser.json}`;
25
+ }
26
+ return `${name}: ${detail}`;
27
+ }
28
+ return null;
29
+ }
30
+
31
+ // Expected verdict for a corpus branch: "ok/*" fixtures must transpile
32
+ // successfully (result.ok === true), "err/*" fixtures must be rejected
33
+ // (result.ok === false). Anything else — the wrong verdict, an unparseable
34
+ // payload, or an unexpected (non-CompileError) exception — is a gate failure
35
+ // even when native and wasm agree (two identical crashes must NOT pass).
36
+ //
37
+ // This is intentionally separate from compareResults so the gate enforces BOTH
38
+ // (a) native↔wasm parity and (b) the right answer. `side` is {json} or
39
+ // {unexpected}; `expectOk` is true for "ok", false for "err".
40
+ function verdictOf(side) {
41
+ if (!side) return { kind: "missing" };
42
+ if (side.unexpected) return { kind: "unexpected", detail: side.unexpected };
43
+ try {
44
+ const v = JSON.parse(side.json);
45
+ if (typeof v.ok !== "boolean") return { kind: "malformed", detail: side.json };
46
+ return { kind: "verdict", ok: v.ok };
47
+ } catch {
48
+ return { kind: "malformed", detail: side.json };
49
+ }
50
+ }
51
+
52
+ // Returns a failure string if either side does not match the expected verdict
53
+ // for the fixture's branch, or null if both sides produced the expected verdict.
54
+ export function checkExpectedVerdict(name, expectOk, native, browser) {
55
+ for (const [label, side] of [["native", native], ["pyodide", browser]]) {
56
+ const r = verdictOf(side);
57
+ if (r.kind === "missing") return `${name}: ${label} produced no result`;
58
+ if (r.kind === "unexpected") {
59
+ return `${name}: ${label} threw an unexpected exception (expected ok=${expectOk}): ${r.detail}`;
60
+ }
61
+ if (r.kind === "malformed") {
62
+ return `${name}: ${label} returned a malformed result (expected ok=${expectOk}): ${r.detail}`;
63
+ }
64
+ if (r.ok !== expectOk) {
65
+ return `${name}: ${label} verdict ok=${r.ok} but corpus dir expects ok=${expectOk}`;
66
+ }
67
+ }
68
+ return null;
69
+ }
@@ -13,7 +13,7 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from
13
13
  import { createRequire } from "node:module";
14
14
  import { dirname, join } from "node:path";
15
15
  import { fileURLToPath } from "node:url";
16
- import { compareResults } from "./compare.mjs";
16
+ import { checkExpectedVerdict, compareResults } from "./compare.mjs";
17
17
 
18
18
  const require = createRequire(import.meta.url);
19
19
  const HERE = dirname(fileURLToPath(import.meta.url));
@@ -79,8 +79,14 @@ async function main() {
79
79
  });
80
80
  const native = JSON.parse(oracleOut);
81
81
 
82
- // 4. Pyodide side + compare.
82
+ // 4. Pyodide side + compare. The gate enforces TWO independent properties:
83
+ // (a) native↔wasm parity (compareResults) and
84
+ // (b) the EXPECTED verdict by corpus dir (checkExpectedVerdict): ok/* must
85
+ // succeed, err/* must be rejected. A purely differential check would
86
+ // let two identical crashes — or an ok/ fixture that erroneously errors
87
+ // — slip through; (b) closes that gap.
83
88
  const mismatches = [];
89
+ const verdictFailures = [];
84
90
  for (const { name, src } of items) {
85
91
  let browser;
86
92
  try {
@@ -90,6 +96,9 @@ async function main() {
90
96
  }
91
97
  const m = compareResults(name, native[name], browser);
92
98
  if (m) mismatches.push(m);
99
+ const expectOk = name.startsWith("ok/");
100
+ const v = checkExpectedVerdict(name, expectOk, native[name], browser);
101
+ if (v) verdictFailures.push(v);
93
102
  }
94
103
 
95
104
  // 5. release.json (versions derived from the loaded Pyodide lock).
@@ -106,11 +115,16 @@ async function main() {
106
115
  writeFileSync(join(ROOT, "release.json"), JSON.stringify(release, null, 2) + "\n");
107
116
  console.log("gate: release.json ->", JSON.stringify(release));
108
117
 
109
- if (mismatches.length) {
110
- console.error(`gate: ${mismatches.length} MISMATCH(es):\n` + mismatches.join("\n"));
118
+ if (mismatches.length || verdictFailures.length) {
119
+ if (mismatches.length) {
120
+ console.error(`gate: ${mismatches.length} PARITY MISMATCH(es):\n` + mismatches.join("\n"));
121
+ }
122
+ if (verdictFailures.length) {
123
+ console.error(`gate: ${verdictFailures.length} VERDICT FAILURE(s) (wrong ok/err result):\n` + verdictFailures.join("\n"));
124
+ }
111
125
  process.exit(1);
112
126
  }
113
- console.log(`gate: PARITY OK over ${items.length} fixtures`);
127
+ console.log(`gate: PARITY OK over ${items.length} fixtures (verdicts asserted: ok/* succeed, err/* rejected)`);
114
128
  }
115
129
 
116
130
  main().catch((e) => {
@@ -0,0 +1,57 @@
1
+ // Canary: prove the gate's checks actually catch divergences. Imports the PURE
2
+ // comparator + verdict checker (gate/compare.mjs) so it runs in <1s without
3
+ // loading Pyodide. Covers BOTH (a) native↔wasm parity (compareResults) and
4
+ // (b) expected-verdict-by-corpus-dir (checkExpectedVerdict).
5
+ import { checkExpectedVerdict, compareResults } from "./compare.mjs";
6
+
7
+ const OK = '{"ok":true,"cpp":"X"}';
8
+ const ERR = '{"ok":false,"error":"e","diagnostics":[]}';
9
+
10
+ // --- (a) differential comparator cases: [name, native, browser, mustFlag] ---
11
+ const cmpCases = [
12
+ ["same-ok", { json: OK }, { json: OK }, false],
13
+ ["cpp-differs", { json: '{"ok":true,"cpp":"X"}' }, { json: '{"ok":true,"cpp":"Y"}' }, true],
14
+ ["verdict-differs", { json: OK }, { json: ERR }, true],
15
+ ["error-differs", { json: '{"ok":false,"error":"a","diagnostics":[]}' }, { json: '{"ok":false,"error":"b","diagnostics":[]}' }, true],
16
+ ["unexpected-one-side", { json: OK }, { unexpected: "TypeError: boom" }, true],
17
+ ["unexpected-both-same", { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, false],
18
+ ["unexpected-both-diff", { unexpected: "TypeError: a" }, { unexpected: "ValueError: b" }, true],
19
+ ["missing-native", undefined, { json: OK }, true],
20
+ ];
21
+
22
+ // --- (b) expected-verdict cases: [name, expectOk, native, browser, mustFlag] ---
23
+ // A native↔wasm match with the WRONG verdict (e.g. ok/ that errors, or a shared
24
+ // unexpected exception) must FAIL even though compareResults would pass it.
25
+ const verdictCases = [
26
+ ["ok/good", true, { json: OK }, { json: OK }, false],
27
+ ["err/bad", false, { json: ERR }, { json: ERR }, false],
28
+ ["ok/that-errors-both-sides", true, { json: ERR }, { json: ERR }, true],
29
+ ["err/that-succeeds-both-sides", false, { json: OK }, { json: OK }, true],
30
+ ["ok/unexpected-both-same", true, { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, true],
31
+ ["err/unexpected-both-same", false, { unexpected: "TypeError: boom" }, { unexpected: "TypeError: boom" }, true],
32
+ ["ok/native-wrong-only", true, { json: ERR }, { json: OK }, true],
33
+ ["ok/pyodide-wrong-only", true, { json: OK }, { json: ERR }, true],
34
+ ["ok/missing-native", true, undefined, { json: OK }, true],
35
+ ["ok/malformed", true, { json: "not json" }, { json: OK }, true],
36
+ ];
37
+
38
+ let failed = 0;
39
+ for (const [name, n, b, mustFlag] of cmpCases) {
40
+ const flagged = compareResults(name, n, b) !== null;
41
+ if (flagged !== mustFlag) {
42
+ console.error(`selftest FAIL (compareResults): ${name} expected mustFlag=${mustFlag} got ${flagged}`);
43
+ failed++;
44
+ }
45
+ }
46
+ for (const [name, expectOk, n, b, mustFlag] of verdictCases) {
47
+ const flagged = checkExpectedVerdict(name, expectOk, n, b) !== null;
48
+ if (flagged !== mustFlag) {
49
+ console.error(`selftest FAIL (checkExpectedVerdict): ${name} expected mustFlag=${mustFlag} got ${flagged}`);
50
+ failed++;
51
+ }
52
+ }
53
+ if (failed) {
54
+ console.error(`gate selftest: ${failed} case(s) failed`);
55
+ process.exit(1);
56
+ }
57
+ console.log(`gate selftest: ${cmpCases.length} comparator + ${verdictCases.length} verdict cases OK`);
@@ -185,19 +185,31 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
185
185
  # This ensures sub-function series vars get cloned for the parent's call sites.
186
186
  func_var_originals: dict[str, list[str]] = {} # func_name -> list of original var names
187
187
 
188
- # First, collect all function-scoped series vars (union across all functions)
189
- all_func_scoped_series: set[str] = set()
188
+ # First, collect all function-scoped series vars (union across all functions).
189
+ # Use an ordered, de-duplicated list (NOT a set): set iteration order is
190
+ # PYTHONHASHSEED-randomized, and this order reaches emitted C++ member
191
+ # declarations via ``orig_names`` -> ``func_var_originals`` ->
192
+ # ``_func_cs_var_remap``. ``ctx.func_series_vars`` is a dict whose VALUES
193
+ # are themselves sets (analyzer stores ``dict[str, set]``), so we must
194
+ # iterate each value in ``sorted`` order to be hash-seed independent.
195
+ all_func_scoped_series: list[str] = []
190
196
  for svars in ctx.func_series_vars.values():
191
- all_func_scoped_series.update(svars)
192
- # Also include function-scoped var_members
193
- all_func_scoped_vars: set[str] = set()
197
+ for sv in sorted(svars):
198
+ if sv not in all_func_scoped_series:
199
+ all_func_scoped_series.append(sv)
200
+ # Also include function-scoped var_members (same ordered-list rationale).
201
+ # ``ctx.func_var_members`` values are lists (already insertion-ordered).
202
+ all_func_scoped_vars: list[str] = []
194
203
  for vlist in ctx.func_var_members.values():
195
204
  for n, _, _ in vlist:
196
- all_func_scoped_vars.add(n)
205
+ if n not in all_func_scoped_vars:
206
+ all_func_scoped_vars.append(n)
197
207
 
198
208
  # For each function with call-site cloning (has TA ranges or is called multiple times),
199
- # include ALL function-scoped series/var vars that could be used in its body
200
- for fname in set(ctx.func_call_site_counts.keys()):
209
+ # include ALL function-scoped series/var vars that could be used in its body.
210
+ # Iterate the dict directly (insertion-ordered) rather than ``set(...keys())``,
211
+ # which would randomize the order of emitted clones across hash seeds.
212
+ for fname in ctx.func_call_site_counts:
201
213
  total_cs = ctx.func_call_site_counts[fname]
202
214
  if total_cs <= 1:
203
215
  continue # No cloning needed for single-call-site functions
@@ -207,9 +219,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
207
219
  for n, _, _ in ctx.func_var_members[fname]:
208
220
  if n not in orig_names:
209
221
  orig_names.append(n)
210
- # Include function's own series vars
222
+ # Include function's own series vars (set -> sorted for determinism)
211
223
  if fname in ctx.func_series_vars:
212
- for sv in ctx.func_series_vars[fname]:
224
+ for sv in sorted(ctx.func_series_vars[fname]):
213
225
  if sv not in orig_names:
214
226
  orig_names.append(sv)
215
227
  # Include series vars from sub-functions (they share the same class members)
@@ -457,6 +469,79 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
457
469
  self._register_global_aggregate_member_types()
458
470
  self._uses_matrix = self._detect_matrix_usage()
459
471
 
472
+ # max_bars_back: the per-variable history depth the engine's Series<T>
473
+ # ring buffer should retain. Pine exposes this two ways — the
474
+ # ``strategy(..., max_bars_back=N)`` kwarg (global) and the
475
+ # ``max_bars_back(var, N)`` function (per-var). The engine's
476
+ # ``Series<T>(int max_len)`` ctor (default 500, include/pineforge/
477
+ # series.hpp) is the wiring point: reads past the retained depth return
478
+ # na, so honoring the directive means constructing each Series with a
479
+ # capacity >= the requested depth. We take the MAX requested N and apply
480
+ # it (via ``_series_decl_suffix`` -> ``{N}``) to the directly-declared
481
+ # ``Series<T>`` members — a safe superset of Pine's per-var semantics
482
+ # (it never retains LESS than Pine, so any history access that succeeds
483
+ # in Pine succeeds here). ``None`` => no directive => keep the engine
484
+ # default 500 (emit a bare ``Series<T>`` with no ctor arg, so
485
+ # directive-free output is byte-identical to before).
486
+ #
487
+ # KNOWN LIMITATION: the lazily-constructed security-helper map series
488
+ # (``_security_helper_series_``, the ``std::unordered_map<std::string,
489
+ # Series<double>>`` ~line 971) do NOT pick up the cap. Their entries are
490
+ # default-constructed on first ``operator[]`` access, so they always use
491
+ # the engine default 500 regardless of the requested ``N``. A
492
+ # max_bars_back directive larger than 500 is therefore not honored for
493
+ # history reads off security-helper series.
494
+ self._max_bars_back_cap: int | None = self._compute_max_bars_back_cap()
495
+
496
+ @staticmethod
497
+ def _int_literal_value(node: ASTNode | None) -> int | None:
498
+ """Return the integer value of a (possibly unary-minus) NumberLiteral,
499
+ or None if ``node`` is not an integer literal expression."""
500
+ if isinstance(node, UnaryOp) and node.op == "-":
501
+ inner = CodeGen._int_literal_value(node.operand)
502
+ return -inner if inner is not None else None
503
+ if isinstance(node, NumberLiteral) and isinstance(node.value, int):
504
+ return node.value
505
+ if isinstance(node, NumberLiteral) and isinstance(node.value, float):
506
+ # Pine accepts ``max_bars_back=5e2`` style; accept integral floats.
507
+ return int(node.value) if node.value.is_integer() else None
508
+ return None
509
+
510
+ def _compute_max_bars_back_cap(self) -> int | None:
511
+ """Scan the AST for max_bars_back directives (strategy() kwarg AND the
512
+ bare function call) and return the largest positive integer requested,
513
+ or None if none is present / none is a usable literal."""
514
+ ast = getattr(self.ctx, "ast", None)
515
+ if ast is None:
516
+ return None
517
+ caps: list[int] = []
518
+ for node in self._walk_ast(ast):
519
+ if isinstance(node, StrategyDecl):
520
+ val = self._int_literal_value(node.kwargs.get("max_bars_back"))
521
+ if val is not None and val > 0:
522
+ caps.append(val)
523
+ elif (
524
+ isinstance(node, FuncCall)
525
+ and isinstance(node.callee, Identifier)
526
+ and node.callee.name == "max_bars_back"
527
+ ):
528
+ # max_bars_back(var, num) — second positional arg, or the
529
+ # ``num=`` kwarg, is the depth.
530
+ num_node = None
531
+ if len(node.args) >= 2:
532
+ num_node = node.args[1]
533
+ elif "num" in node.kwargs:
534
+ num_node = node.kwargs["num"]
535
+ val = self._int_literal_value(num_node)
536
+ if val is not None and val > 0:
537
+ caps.append(val)
538
+ return max(caps) if caps else None
539
+
540
+ def _series_decl_suffix(self) -> str:
541
+ """C++ constructor-arg suffix for Series<T> member declarations. Empty
542
+ (engine default 500) unless a max_bars_back directive raised the cap."""
543
+ return f"{{{self._max_bars_back_cap}}}" if self._max_bars_back_cap else ""
544
+
460
545
  def _register_global_aggregate_member_types(self) -> None:
461
546
  """Infer matrix/array/map class members for global non-var declarations from RHS AST.
462
547
 
@@ -790,6 +875,10 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
790
875
 
791
876
  lines: list[str] = []
792
877
 
878
+ # Series<T> ctor-arg suffix from any max_bars_back directive (empty when
879
+ # absent, so directive-free output is byte-identical to before).
880
+ _mbb = self._series_decl_suffix()
881
+
793
882
  # 1. Includes
794
883
  self._emit_includes(lines)
795
884
 
@@ -863,7 +952,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
863
952
  self._security_ohlc_hist_fields_by_sec.get(sec_id, ())
864
953
  ):
865
954
  lines.append(
866
- f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
955
+ f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
867
956
  )
868
957
  continue
869
958
  if returns_tuple and tuple_size and tuple_size > 0 and isinstance(expr_node, TupleLiteral):
@@ -884,7 +973,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
884
973
  lines.append(f" double _req_sec_{sec_id} = na<double>();")
885
974
  for field in sorted(self._security_ohlc_hist_fields_by_sec.get(sec_id, ())):
886
975
  lines.append(
887
- f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)};"
976
+ f" Series<double> {self._security_ohlc_hist_series_cpp(sec_id, field)}{_mbb};"
888
977
  )
889
978
 
890
979
  if self._security_calls:
@@ -899,7 +988,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
899
988
  state_name = self._security_state_name(info["sec_id"], name)
900
989
  cpp_type = self._security_cpp_type_for_mutable(name, ginfo)
901
990
  if getattr(ginfo, "is_series", False):
902
- lines.append(f" Series<{cpp_type}> {state_name};")
991
+ lines.append(f" Series<{cpp_type}> {state_name}{_mbb};")
903
992
  else:
904
993
  default = self._default_for_type(cpp_type)
905
994
  lines.append(f" {cpp_type} {state_name} = {default};")
@@ -926,7 +1015,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
926
1015
 
927
1016
  # 4. Series members for bar field history
928
1017
  for field_name in sorted(self.ctx.series_bar_fields):
929
- lines.append(f" Series<double> _s_{field_name};")
1018
+ lines.append(f" Series<double> _s_{field_name}{_mbb};")
930
1019
 
931
1020
  # 5. var/varip members (deduplicate by name)
932
1021
  seen_var_members: set[str] = set()
@@ -975,7 +1064,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
975
1064
  if cpp_type == "int" and self._is_int64_builtin_init(name):
976
1065
  cpp_type = "int64_t"
977
1066
  if name in self.ctx.series_vars:
978
- lines.append(f" Series<{cpp_type}> {safe};")
1067
+ lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
979
1068
  else:
980
1069
  lines.append(f" {cpp_type} {safe};")
981
1070
 
@@ -984,7 +1073,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
984
1073
  if name not in self._var_names:
985
1074
  safe = self._safe_name(name)
986
1075
  cpp_type = self._series_type_for(name)
987
- lines.append(f" Series<{cpp_type}> {safe};")
1076
+ lines.append(f" Series<{cpp_type}> {safe}{_mbb};")
988
1077
 
989
1078
  # 7. Fixnan members
990
1079
  for site in self.ctx.fixnan_sites:
@@ -997,9 +1086,9 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
997
1086
  # Determine type: int for count vars, double for float vars
998
1087
  if member in ("closedtrades", "opentrades", "wintrades", "losstrades",
999
1088
  "eventrades"):
1000
- lines.append(f" Series<int> {svar};")
1089
+ lines.append(f" Series<int> {svar}{_mbb};")
1001
1090
  else:
1002
- lines.append(f" Series<double> {svar};")
1091
+ lines.append(f" Series<double> {svar}{_mbb};")
1003
1092
 
1004
1093
  # 8b. Global-scope non-var declarations as class members
1005
1094
  # (so user-defined functions can reference them)
@@ -1051,7 +1140,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
1051
1140
  if self._safe_name(vname) == orig_safe:
1052
1141
  cpp_type = PINE_TYPE_TO_CPP.get(ptype, "double")
1053
1142
  if vname in self.ctx.series_vars:
1054
- lines.append(f" Series<{cpp_type}> {cloned_safe};")
1143
+ lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
1055
1144
  elif vname in self._matrix_specs:
1056
1145
  lines.append(f" {self._type_spec_to_cpp(self._matrix_specs[vname])} {cloned_safe};")
1057
1146
  elif vname in self._array_vars:
@@ -1066,7 +1155,7 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
1066
1155
  # Non-var series var
1067
1156
  if orig_safe in [self._safe_name(n) for n in self.ctx.series_vars]:
1068
1157
  cpp_type = self._series_type_for(orig_safe)
1069
- lines.append(f" Series<{cpp_type}> {cloned_safe};")
1158
+ lines.append(f" Series<{cpp_type}> {cloned_safe}{_mbb};")
1070
1159
  else:
1071
1160
  lines.append(f" double {cloned_safe} = 0.0;")
1072
1161
 
@@ -444,6 +444,11 @@ class CallVisitor:
444
444
  return "0"
445
445
  if func_name in SKIP_FUNC_NAMES and namespace is None:
446
446
  return "0"
447
+ # max_bars_back(var, num): a history-depth DIRECTIVE, not a value.
448
+ # Its effect is captured in CodeGen._compute_max_bars_back_cap (which
449
+ # sizes every Series<T> ring buffer), so the call itself emits nothing.
450
+ if func_name == "max_bars_back" and namespace is None:
451
+ return "0"
447
452
 
448
453
  # request.* calls
449
454
  if namespace == "request":