pineforge-codegen 0.10.1__tar.gz → 0.10.2__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 (443) hide show
  1. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/release.yml +1 -1
  2. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/PKG-INFO +2 -2
  3. pineforge_codegen-0.10.2/VERSION +1 -0
  4. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/docs/codegen-coverage-gaps.md +52 -0
  5. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/base.py +141 -1
  6. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/emit_top.py +15 -0
  7. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/security.py +160 -0
  8. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/tables.py +130 -29
  9. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/types.py +6 -1
  10. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_call.py +33 -15
  11. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/support_checker.py +68 -4
  12. pineforge_codegen-0.10.2/tests/test_array_bounds_insert_fill_slice.py +277 -0
  13. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_checked_access.py +4 -1
  14. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_calc_on_order_fills_codegen.py +26 -11
  15. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_series_param_types.py +10 -6
  16. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_audit_fixes.py +4 -1
  17. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_validation_fixes.py +11 -5
  18. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_method_written_callsite_lifecycle.py +6 -3
  19. pineforge_codegen-0.10.2/tests/test_security_lazy_ta_under_conditionals.py +246 -0
  20. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker.py +71 -0
  21. pineforge_codegen-0.10.2/tests/test_udf_series_parameter_history.py +177 -0
  22. pineforge_codegen-0.10.1/VERSION +0 -1
  23. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/dependabot.yml +0 -0
  24. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/gate.yml +0 -0
  25. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/publish-pyodide.yml +0 -0
  26. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.github/workflows/test.yml +0 -0
  27. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/.gitignore +0 -0
  28. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/CLAUDE.md +0 -0
  29. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/LEGAL.md +0 -0
  30. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/LICENSE +0 -0
  31. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/PYODIDE_TARGET +0 -0
  32. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/README.md +0 -0
  33. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/compare.mjs +0 -0
  34. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/glue.py +0 -0
  35. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/oracle.py +0 -0
  36. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/run-gate.mjs +0 -0
  37. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/gate/selftest.mjs +0 -0
  38. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/README.md +0 -0
  39. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/index.mjs +0 -0
  40. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/npm/package.json +0 -0
  41. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/package-lock.json +0 -0
  42. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/package.json +0 -0
  43. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/__init__.py +0 -0
  44. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/__init__.py +0 -0
  45. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/base.py +0 -0
  46. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/call_handlers.py +0 -0
  47. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/contracts.py +0 -0
  48. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/diagnostics.py +0 -0
  49. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/tables.py +0 -0
  50. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/analyzer/types.py +0 -0
  51. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/ast_nodes.py +0 -0
  52. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/__init__.py +0 -0
  53. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/drawing.py +0 -0
  54. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/helpers.py +0 -0
  55. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/helpers_syminfo.py +0 -0
  56. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/input.py +0 -0
  57. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/ta.py +0 -0
  58. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_expr.py +0 -0
  59. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/codegen/visit_stmt.py +0 -0
  60. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/errors.py +0 -0
  61. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/finite_ta_length.py +0 -0
  62. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/lexer.py +0 -0
  63. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/method_binding.py +0 -0
  64. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/parser.py +0 -0
  65. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/pragmas.py +0 -0
  66. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/signatures.py +0 -0
  67. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/symbols.py +0 -0
  68. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/tokens.py +0 -0
  69. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pineforge_codegen/tv_input_choices.py +0 -0
  70. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/pyproject.toml +0 -0
  71. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/build-npm-package.mjs +0 -0
  72. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/dump-tables.py +0 -0
  73. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/scripts/worker-template.mjs +0 -0
  74. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/__init__.py +0 -0
  75. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/_compile.py +0 -0
  76. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/fixtures/matrix_eigen_pca.pine +0 -0
  77. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/const_ns_plot_style_free.pine +0 -0
  78. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/const_ns_shape_free.pine +0 -0
  79. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/export_func.pine +0 -0
  80. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/footprint_new.pine +0 -0
  81. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/hard_reject_dividends.pine +0 -0
  82. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/matrix_unknown_elem.pine +0 -0
  83. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/multi_error_one_line.pine +0 -0
  84. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/sec_tf_invalid.pine +0 -0
  85. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_color.pine +0 -0
  86. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_math.pine +0 -0
  87. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_str.pine +0 -0
  88. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_strategy_fn.pine +0 -0
  89. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_syminfo.pine +0 -0
  90. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/err/unknown_ta.pine +0 -0
  91. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/AAPL__session-ismarket-nyse-rth-01.pine +0 -0
  92. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/AAPL__time-tradingday-daily-reset-counter-01.pine +0 -0
  93. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/QQQ__session-ispremarket-nasdaq-01.pine +0 -0
  94. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/SPY__session-firstbar-vwap-anchor-01.pine +0 -0
  95. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/SPY__session-lastbar-flatten-01.pine +0 -0
  96. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/chart_bg_color.pine +0 -0
  97. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/crypto-htf__mtf-htf-monthly-ema-cross-01.pine +0 -0
  98. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/crypto-leverage__leverage-margin-call-perp-5x-01.pine +0 -0
  99. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/divergent_last_bar_index.pine +0 -0
  100. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/forex__symbol-fx-5dp-eurusd-01.pine +0 -0
  101. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/futures__symbol-futures-pointvalue-es-01.pine +0 -0
  102. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__macd__strategy.pine +0 -0
  103. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__mtf__strategy_htf.pine +0 -0
  104. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/tutorial__mtf__strategy_ltf.pine +0 -0
  105. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/us-equity__symbol-equity-rth-gaps-aapl-01.pine +0 -0
  106. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/us-equity__us-equity-exchange-tz-intraday-cap-01.pine +0 -0
  107. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-choch-bos-isolator-01.pine +0 -0
  108. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-edge-margin-50-pct-01.pine +0 -0
  109. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-percent-of-equity-sizing-01.pine +0 -0
  110. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-small-equity-fraction-01.pine +0 -0
  111. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-parity-stop-limit-timing-01.pine +0 -0
  112. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__analyzer-self-test-multi-mode-01.pine +0 -0
  113. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__anomaly-equity-mirror-strategy-equity-01.pine +0 -0
  114. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-off-01b.pine +0 -0
  115. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__barstate-isconfirmed-magnifier-on-01a.pine +0 -0
  116. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-atr-trail-series-int-points-01.pine +0 -0
  117. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-atr-trailing-stop-state-01.pine +0 -0
  118. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-entry-exit-same-pass-attach-01.pine +0 -0
  119. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-stop-limit-trail-same-bar-01.pine +0 -0
  120. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-three-way-set-once-entry-01.pine +0 -0
  121. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-exit-tp-sl-fixed-01.pine +0 -0
  122. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-narrow-stop-limit-with-trail8-01.pine +0 -0
  123. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-partial-exit-qty-percent-01.pine +0 -0
  124. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-same-id-exit-replace-01.pine +0 -0
  125. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-tp-sl-oca-reduce-isolate-01.pine +0 -0
  126. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trail-points-no-offset-explicit-01.pine +0 -0
  127. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trail-points-with-offset-only-01.pine +0 -0
  128. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__bracket-trailing-activation-offset-path-01.pine +0 -0
  129. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__cap-max-intraday-filled-orders-isolate-01.pine +0 -0
  130. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__cap-risk-gates-allow-max-intraday-01.pine +0 -0
  131. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-integration-01.pine +0 -0
  132. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-quad-ema-stack-01.pine +0 -0
  133. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-rsi-pullback-latch-01.pine +0 -0
  134. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-4emarsi-session-window-nbar-exit-01.pine +0 -0
  135. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-integration-01.pine +0 -0
  136. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-linreg-slope-channel-01.pine +0 -0
  137. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-boscurv-pivot-bos-trigger-01.pine +0 -0
  138. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-bracket-cap-range-pending-stop-01.pine +0 -0
  139. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-adx-regime-classify-01.pine +0 -0
  140. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-bb-kc-squeeze-release-01.pine +0 -0
  141. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-cooldown-daily-cap-01.pine +0 -0
  142. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-equity-feedback-sizing-01.pine +0 -0
  143. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-integration-01.pine +0 -0
  144. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-pivot-liquidity-sweep-01.pine +0 -0
  145. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-pressure-gauge-01.pine +0 -0
  146. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-rsi-macd-momentum-01.pine +0 -0
  147. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-ies-three-ema-bias-score-01.pine +0 -0
  148. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-calc-on-every-tick-01.pine +0 -0
  149. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-integration-01.pine +0 -0
  150. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-kama-state-recurrence-01.pine +0 -0
  151. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kanuck-max-bars-back-500-01.pine +0 -0
  152. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-ema-atr-breakout-band-01.pine +0 -0
  153. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-integration-01.pine +0 -0
  154. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-kalman-filter-1d-01.pine +0 -0
  155. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-kkb-margin-100-pct-01.pine +0 -0
  156. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-integration-01.pine +0 -0
  157. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-pivot-hh-ll-01.pine +0 -0
  158. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-wait-one-continuation-01.pine +0 -0
  159. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-liqsweep-wick-pierce-close-back-01.pine +0 -0
  160. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-integration-01.pine +0 -0
  161. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-pivot-state-machine-01.pine +0 -0
  162. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-rolling-highest-lowest-01.pine +0 -0
  163. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-marketshift-state-edge-detector-01.pine +0 -0
  164. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-fast-ma-cross-trigger-01.pine +0 -0
  165. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-integration-01.pine +0 -0
  166. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-scalping-tight-tp-sl-points-01.pine +0 -0
  167. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-integration-01.pine +0 -0
  168. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-line-new-projection-01.pine +0 -0
  169. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-pivot-anchored-bracket-01.pine +0 -0
  170. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-three-tier-ema-state-01.pine +0 -0
  171. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-trendmaster-trend-momentum-structure-gate-01.pine +0 -0
  172. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-cumulative-volume-delta-01.pine +0 -0
  173. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-fvg-active-zones-01.pine +0 -0
  174. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-integration-01.pine +0 -0
  175. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-manual-adx-regime-01.pine +0 -0
  176. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-pivot-strength-5-01.pine +0 -0
  177. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-rsi-smooth-divergence-01.pine +0 -0
  178. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-session-tz-newyork-01.pine +0 -0
  179. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-vcp-vol-zscore-anomaly-01.pine +0 -0
  180. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-alert-templates-01.pine +0 -0
  181. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-explicit-reverse-01.pine +0 -0
  182. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__composite-wunderscalper-integration-01.pine +0 -0
  183. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__input-source-runtime-override-high-01.pine +0 -0
  184. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__input-source-subscript-hl2-01.pine +0 -0
  185. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ltf-bool-array-bull-majority-01.pine +0 -0
  186. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ltf-numeric-float-ratio15-01.pine +0 -0
  187. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-01.pine +0 -0
  188. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-endpoints-rsi-cross-08a.pine +0 -0
  189. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__magnifier-tick-dist-volume-weighted-on-01.pine +0 -0
  190. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-explicit-utc-tz-01.pine +0 -0
  191. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-no-transpose-01.pine +0 -0
  192. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-mask-transpose-roundtrip-01.pine +0 -0
  193. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-bool-regime-mask-24x7-01.pine +0 -0
  194. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-covariance-eigen-pca-01.pine +0 -0
  195. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__matrix-eigen-rank-deficient-cov-01.pine +0 -0
  196. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__max-bars-back-function-call-deep-history-01.pine +0 -0
  197. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-array-median-percentrank-01.pine +0 -0
  198. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-ema26-warmup-01.pine +0 -0
  199. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-daily-prev-high-break-01.pine +0 -0
  200. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-dual-tf-60-240-rising-01.pine +0 -0
  201. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-close-change-baseline-01.pine +0 -0
  202. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-close-roll-01.pine +0 -0
  203. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-gaps-on-roll-01.pine +0 -0
  204. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-rsi14-inside-security-01.pine +0 -0
  205. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-sma20-inside-security-01.pine +0 -0
  206. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-60-volume-spike-01.pine +0 -0
  207. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-confluence-manual-trail-01.pine +0 -0
  208. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-confluence-static-bracket-01.pine +0 -0
  209. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-htf-weekly-sma-cross-01.pine +0 -0
  210. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-roll-state-60-240-d-minimal-01.pine +0 -0
  211. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-triple-tf-close-confluence-01.pine +0 -0
  212. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__mtf-triple-tf-macd-hist-confluence-01.pine +0 -0
  213. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__na-deep-history-int-na-01.pine +0 -0
  214. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__na-nz-fixnan-history-chain-01.pine +0 -0
  215. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-exit-bracket-internal-cancel-01.pine +0 -0
  216. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-multi-bracket-isolation-01.pine +0 -0
  217. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__oca-raw-strategy-order-reduce-01.pine +0 -0
  218. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-close-all-cancel-all-01.pine +0 -0
  219. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-close-immediate-vs-next-bar-01.pine +0 -0
  220. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-entry-cancel-same-pass-01.pine +0 -0
  221. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-entry-close-same-pass-01.pine +0 -0
  222. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-cross-exit-close-same-pass-01.pine +0 -0
  223. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-deferred-flip-guaranteed-gap-stops-01.pine +0 -0
  224. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-deferred-flip-pooc-cross-bar-01.pine +0 -0
  225. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-four-bar-stop-no-close-01.pine +0 -0
  226. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-side-same-id-stop-no-cancel-01.pine +0 -0
  227. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-both-touch-priority-01.pine +0 -0
  228. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-cancel-rotation-01.pine +0 -0
  229. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-far-only-01.pine +0 -0
  230. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-near-only-01.pine +0 -0
  231. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-high-first-path-01.pine +0 -0
  232. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-low-first-path-01.pine +0 -0
  233. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-open-tie-01.pine +0 -0
  234. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-long-first-01.pine +0 -0
  235. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-dual-stop-source-order-short-first-01.pine +0 -0
  236. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-entry-implicit-reversal-exit-01.pine +0 -0
  237. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-flip-stop-no-paired-close-01.pine +0 -0
  238. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-market-close-fill-basis-01.pine +0 -0
  239. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-one-side-four-bar-far-opposite-01.pine +0 -0
  240. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-opposite-entry-close-same-pass-01.pine +0 -0
  241. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-percent-equity-cash-commission-01.pine +0 -0
  242. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-process-on-close-false-01.pine +0 -0
  243. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-process-on-close-true-01.pine +0 -0
  244. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-range-expansion-pending-stop-01.pine +0 -0
  245. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-entry-close-same-bar-01.pine +0 -0
  246. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-market-entry-repeat-01.pine +0 -0
  247. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-after-flat-01.pine +0 -0
  248. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-cross-before-modify-01.pine +0 -0
  249. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-minute-zero-01.pine +0 -0
  250. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-modification-01.pine +0 -0
  251. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-raise-only-01.pine +0 -0
  252. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-same-id-stop-window-four-bars-01.pine +0 -0
  253. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stale-stop-after-close-no-cancel-01.pine +0 -0
  254. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-cancel-no-regime-close-01.pine +0 -0
  255. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-cancel-opposite-01.pine +0 -0
  256. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-reversal-grouping-01.pine +0 -0
  257. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__order-stop-entry-touch-boundary-01.pine +0 -0
  258. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-cash-fractional-commission-01.pine +0 -0
  259. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-close-id-grouping-01.pine +0 -0
  260. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-deferred-flip-close-all-01.pine +0 -0
  261. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__pyramid-flip-stop-pyramiding-2-01.pine +0 -0
  262. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__recompute-alma-sar-corr-magnifier-01.pine +0 -0
  263. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__recompute-mtf-rsi-macd-bb-01.pine +0 -0
  264. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__risk-max-contracts-held-gate-pyramid-01.pine +0 -0
  265. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__session-hour-minute-pulse-filter-01.pine +0 -0
  266. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__session-ny-spring-forward-dst-01.pine +0 -0
  267. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__stats-eventrades-zero-pnl-count-01.pine +0 -0
  268. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-accdist-ema-cross-01.pine +0 -0
  269. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-bb-kc-squeeze-breakout-01.pine +0 -0
  270. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-bb-rsi-mean-reversion-01.pine +0 -0
  271. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cci-threshold-cross-01.pine +0 -0
  272. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-chandelier-exit-direction-01.pine +0 -0
  273. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-closedtrades-risk-introspection-01.pine +0 -0
  274. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cmo-9-zero-cross-01.pine +0 -0
  275. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-cog-10-signal-cross-01.pine +0 -0
  276. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dmi-adx-di-cross-01.pine +0 -0
  277. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-donchian-channel-breakout-01.pine +0 -0
  278. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dual-ma-switch-dispatch-01.pine +0 -0
  279. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-dual-thrust-open-anchored-range-01.pine +0 -0
  280. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-elder-ray-bull-bear-power-01.pine +0 -0
  281. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-ema-ribbon-stack-transition-01.pine +0 -0
  282. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-engulfing-candle-pattern-01.pine +0 -0
  283. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-highestbars-lowestbars-breakout-01.pine +0 -0
  284. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-hma-55-close-cross-01.pine +0 -0
  285. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-hma-fast-slow-cross-01.pine +0 -0
  286. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-inside-bar-engulfing-01.pine +0 -0
  287. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-kama-style-efficiency-ratio-01.pine +0 -0
  288. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-keltner-channel-break-01.pine +0 -0
  289. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-linreg-stdev-channel-revert-01.pine +0 -0
  290. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-12-26-9-line-signal-cross-01.pine +0 -0
  291. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-histogram-reversal-01.pine +0 -0
  292. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-macd-line-gt-signal-continuous-state-01.pine +0 -0
  293. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-map-regime-threshold-lookup-01.pine +0 -0
  294. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-median-vs-ema-cross-01.pine +0 -0
  295. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-mfi-14-bands-20-80-01.pine +0 -0
  296. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-momentum-roc-zero-cross-01.pine +0 -0
  297. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-multi-indicator-score-composite-01.pine +0 -0
  298. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-nvi-pvi-cross-01.pine +0 -0
  299. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-obv-ema-cross-01.pine +0 -0
  300. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-percentrank-mean-reversion-01.pine +0 -0
  301. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-array-unshift-pop-01.pine +0 -0
  302. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-atr-stop-target-01.pine +0 -0
  303. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-confirmed-break-01.pine +0 -0
  304. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pivot-point-levels-break-01.pine +0 -0
  305. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-pvt-ema-cross-01.pine +0 -0
  306. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-range-filter-var-band-01.pine +0 -0
  307. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rci-14-zero-cross-01.pine +0 -0
  308. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-bb-self-bands-01.pine +0 -0
  309. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-ema-signal-cross-01.pine +0 -0
  310. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi-macd-and-continuous-state-01.pine +0 -0
  311. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-bands-30-70-01.pine +0 -0
  312. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-cross-50-01.pine +0 -0
  313. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-gt-50-continuous-state-01.pine +0 -0
  314. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-rsi14-gt60-lt45-no-matrix-01.pine +0 -0
  315. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sar-flip-entry-01.pine +0 -0
  316. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sma-152-close-cross-01.pine +0 -0
  317. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-sma-dual-cross-01.pine +0 -0
  318. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stdev-sma-expansion-break-01.pine +0 -0
  319. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stoch-slow-k-d-cross-01.pine +0 -0
  320. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-stochastic-rsi-cross-01.pine +0 -0
  321. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-str-match-regex-filter-01.pine +0 -0
  322. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-supertrend-adx-filter-01.pine +0 -0
  323. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-supertrend-direction-flip-01.pine +0 -0
  324. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-triple-sma-stack-latch-01.pine +0 -0
  325. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-tsi-25-13-signal-cross-01.pine +0 -0
  326. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-volume-spike-atr-breakout-01.pine +0 -0
  327. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-vwma-vs-sma-divergence-01.pine +0 -0
  328. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__ta-wpr-14-bands-01.pine +0 -0
  329. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__timeframe-main-period-self-adaptive-01.pine +0 -0
  330. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-calls-sibling-cumulative-01.pine +0 -0
  331. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-default-param-kwargs-01.pine +0 -0
  332. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-drives-strategy-entry-01.pine +0 -0
  333. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-extra-primitive-args-01.pine +0 -0
  334. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-feeds-strategy-exit-prices-01.pine +0 -0
  335. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-for-loop-01.pine +0 -0
  336. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-if-else-branch-01.pine +0 -0
  337. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-switch-arms-01.pine +0 -0
  338. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-in-while-loop-01.pine +0 -0
  339. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-mutating-self-ref-01.pine +0 -0
  340. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-on-array-element-01.pine +0 -0
  341. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-reads-strategy-state-01.pine +0 -0
  342. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-receives-ta-series-param-01.pine +0 -0
  343. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-scalar-return-01.pine +0 -0
  344. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-tuple-return-destructure-01.pine +0 -0
  345. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-udt-return-from-func-01.pine +0 -0
  346. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-history-globals-01.pine +0 -0
  347. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-math-funcs-01.pine +0 -0
  348. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-uses-na-nz-fixnan-01.pine +0 -0
  349. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-var-instance-streak-01.pine +0 -0
  350. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-method-windowed-method-chain-01.pine +0 -0
  351. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__udt-regime-stack-stress-01.pine +0 -0
  352. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__vwap-bands-breakout-1sigma-01.pine +0 -0
  353. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/gate-corpus/ok/validation__vwap-bands-mean-reversion-2sigma-01.pine +0 -0
  354. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/golden/matrix_eigen_pca.cpp +0 -0
  355. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer.py +0 -0
  356. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer_matrix_inference.py +0 -0
  357. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_analyzer_ta_return_types.py +0 -0
  358. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_empty_aggregates.py +0 -0
  359. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_array_terminal_returns.py +0 -0
  360. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_ta_forwarded_length.py +0 -0
  361. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_callable_var_first_reach.py +0 -0
  362. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_determinism.py +0 -0
  363. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_drawing_data.py +0 -0
  364. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_drawing_handles.py +0 -0
  365. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_fallthrough_guards.py +0 -0
  366. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_golden.py +0 -0
  367. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_input_getters.py +0 -0
  368. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_matrix_typed.py +0 -0
  369. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_new.py +0 -0
  370. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_string_escape.py +0 -0
  371. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_derived_length.py +0 -0
  372. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_finite_choice_length.py +0 -0
  373. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_codegen_ta_stable_var_literal.py +0 -0
  374. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_collection_scope_isolation.py +0 -0
  375. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_compile_corpus.py +0 -0
  376. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_compile_smoke.py +0 -0
  377. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_errors.py +0 -0
  378. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_extract_inputs.py +0 -0
  379. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_float_relational_runtime.py +0 -0
  380. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_glue_smoke.py +0 -0
  381. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_hungpixi_regressions.py +0 -0
  382. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_import_all.py +0 -0
  383. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_input_time_int64.py +0 -0
  384. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_int64_reassign_promotion.py +0 -0
  385. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_int64_time_storage.py +0 -0
  386. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lazy_saturated_roc.py +0 -0
  387. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lazy_saturated_roc_runtime.py +0 -0
  388. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_lexer.py +0 -0
  389. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_call_diagnostics.py +0 -0
  390. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_param_methods.py +0 -0
  391. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_map_terminal_returns.py +0 -0
  392. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_math_sign_na_codegen.py +0 -0
  393. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_identity_checkpoint.py +0 -0
  394. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_na_lifecycle.py +0 -0
  395. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_matrix_void_method_return.py +0 -0
  396. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_method_receiver_types.py +0 -0
  397. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_na_reassign_retype.py +0 -0
  398. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_na_relational_lowering.py +0 -0
  399. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_official_surface.py +0 -0
  400. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_parser.py +0 -0
  401. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_persistent_callable_owner_state.py +0 -0
  402. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_boundaries_and_order.py +0 -0
  403. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_cold_followups_history.py +0 -0
  404. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_semantics.py +0 -0
  405. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_pinemap_temp_receiver_var.py +0 -0
  406. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_runtime_var_initialization.py +0 -0
  407. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_helper_local_var.py +0 -0
  408. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_math_reducer.py +0 -0
  409. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_ohlc_hist_is_complete.py +0 -0
  410. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_ta_input_history_offset.py +0 -0
  411. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tf_input_derived.py +0 -0
  412. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tf_literal.py +0 -0
  413. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_security_tuple_interactions.py +0 -0
  414. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_signatures.py +0 -0
  415. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_strategy_close_callsite_tokens.py +0 -0
  416. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_chart_visible_bar_time.py +0 -0
  417. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_color_cast.py +0 -0
  418. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_const_namespaces.py +0 -0
  419. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_dividends_earnings.py +0 -0
  420. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_footprint.py +0 -0
  421. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_input_color.py +0 -0
  422. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_input_source.py +0 -0
  423. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_matrix.py +0 -0
  424. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_security_adjustment.py +0 -0
  425. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_syminfo_gap_fields.py +0 -0
  426. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_timeframe_from_seconds.py +0 -0
  427. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_varip.py +0 -0
  428. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_support_checker_volume_row.py +0 -0
  429. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_symbols.py +0 -0
  430. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_ta_official_surface.py +0 -0
  431. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_division.py +0 -0
  432. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_enum_order.py +0 -0
  433. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_pf_trace.py +0 -0
  434. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpile_tr_handle_na.py +0 -0
  435. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_transpiler_matrix_kwargs.py +0 -0
  436. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_typed_void_method_precedence.py +0 -0
  437. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_typespec_matrix.py +0 -0
  438. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_drawing_field_cleanup.py +0 -0
  439. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_lvalue_alias.py +0 -0
  440. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_na_lifecycle.py +0 -0
  441. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_udt_object_identity.py +0 -0
  442. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_unsupported_reporting.py +0 -0
  443. {pineforge_codegen-0.10.1 → pineforge_codegen-0.10.2}/tests/test_vwap_tuple_unpack.py +0 -0
@@ -124,7 +124,7 @@ jobs:
124
124
  # failure would leave npm shipping a version PyPI never got.
125
125
  - name: Publish to PyPI
126
126
  if: ${{ !inputs.dry_run }}
127
- uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
127
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
128
128
 
129
129
  # Commit + tag + push AFTER PyPI succeeds. The `git push --tags` triggers
130
130
  # publish-pyodide.yml for npm (which re-runs the gate — defense in depth),
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: pineforge-codegen
3
- Version: 0.10.1
3
+ Version: 0.10.2
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.10.2
@@ -76,3 +76,55 @@ were added to convert the most fragile defensive paths from
76
76
  silent-on-bug to loud-on-bug.
77
77
 
78
78
  No new follow-up work identified by this audit.
79
+
80
+ ## Residuals left open by the array-bounds guard (2026-07-25)
81
+
82
+ `array.insert`, the 3-argument `array.fill`, and `array.slice` now reject an
83
+ out-of-range index instead of emitting raw STL iterator arithmetic (undefined
84
+ behaviour). Three questions the bounds work deliberately does NOT settle:
85
+
86
+ 1. **`array.slice` shares storage with its source; codegen deep-copies.**
87
+ The Pine v6 reference says "Changing the elements in a slice directly
88
+ changes the elements in the original array, and vice versa", while both
89
+ lowerings construct a fresh `std::vector` from the iterator range. Any
90
+ write through a slice (or through the source while a slice is live) is
91
+ therefore lost. Closing this needs a view/alias type over the receiver's
92
+ storage, not an index check, so it is a separate and much larger change.
93
+ The extent of the aliasing is itself unsettled: the reference sentence
94
+ says "an object from the slice", which is unambiguous for arrays of
95
+ reference-like elements (UDT instances) but does NOT establish that a
96
+ primitive `array<float>` slice aliases element-for-element. Pin that
97
+ against TradingView before designing the view type — the answer decides
98
+ whether the fix is "arrays of UDTs only" or "all arrays".
99
+
100
+ 2. **Inverted ranges (`index_from > index_to`) are rejected, not clamped.**
101
+ No evidence pins TradingView's behaviour for `array.fill(id, v, 2, 1)` /
102
+ `array.slice(id, 2, 1)`. Rejecting is the fail-closed choice and the
103
+ 3-argument `fill` range form has no current corpus exposure, but a
104
+ TradingView probe could show TV treats it as an empty range instead.
105
+
106
+ 3. **Negative endpoints for `fill`/`slice` are rejected.** The reference
107
+ lists only `array.get`/`array.set`/`array.insert`/`array.remove` as
108
+ negative-indexing functions, so `fill`/`slice` follow `array.percentrank`
109
+ and reject. If TradingView in fact normalises them, this is an
110
+ over-rejection (a valid script fails to transpile), not a wrong result.
111
+
112
+ ## Residual left open by the request.security rebind guard (2026-07-25)
113
+
114
+ `_scalar_rebinds` is keyed by BARE NAME with no scope resolution, mirroring
115
+ the existing `_scalar_defs`. A divergent `:=` rebind of a *local* named `sym`
116
+ inside a user function therefore also disqualifies an unrelated *global*
117
+ `sym` used as a `request.security` symbol. That direction is fail-closed
118
+ (over-rejection, never a silent wrong-symbol run), but a scoped symbol table
119
+ would be the exact fix. A 788-source differential shows the over-rejection
120
+ costs nothing on the current corpus.
121
+
122
+ **Still open — the ternary branch hole (KI-47(a)).** `_is_current_symbol_expr`
123
+ still accepts `cond ? "EXCH:OTHER" : syminfo.tickerid` because EITHER branch
124
+ resolving to the chart symbol is enough. Tightening it to require BOTH
125
+ branches is correct in principle but rejects
126
+ `data/standard/doriannnq-tjr-v4-strategy`, whose alternate branch is
127
+ unreachable at its declared input configuration (`smtSym` defaults to `""`)
128
+ and which grades Excellent at 44/44 / 100% match. Closing this needs the
129
+ checker to see the effective input configuration, which it currently cannot
130
+ (see the analysis in the R6 handoff). Held deliberately, not overlooked.
@@ -514,6 +514,15 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
514
514
  # the declaration-derived checkpoint inventory.
515
515
  self._inline_history_members: list[dict] = []
516
516
  self._inline_history_member_by_key: dict[tuple, str] = {}
517
+ # request.security/request.security_lower_tf inline their Pine helper
518
+ # expressions on the requested clock instead of calling the ordinary
519
+ # emitted UDF methods. The chart-clocked plain-UDF history factor must
520
+ # therefore exclude those source nodes and any emitted helper context
521
+ # reached only through them.
522
+ self._requested_context_inline_node_ids: set[int] = set()
523
+ self._requested_context_only_inline_contexts: set[
524
+ tuple[str, str | None]
525
+ ] = set()
517
526
  # Unique lambda-local names used when an array lowering references its
518
527
  # receiver more than once. The binding keeps temporary-producing or
519
528
  # side-effectful receivers single-evaluation (see TypeInferer).
@@ -3173,7 +3182,11 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
3173
3182
  """
3174
3183
  self._inline_history_members = []
3175
3184
  self._inline_history_member_by_key = {}
3176
- counters = {"hist_call": 0, "series_arg": 0}
3185
+ counters = {
3186
+ "hist_call": 0,
3187
+ "series_arg": 0,
3188
+ "udf_series_arg": 0,
3189
+ }
3177
3190
 
3178
3191
  def walk_nodes(value):
3179
3192
  """Yield AST nodes in stable field order, including tuple elements.
@@ -3345,6 +3358,113 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
3345
3358
  lexical.update(self._func_collection_types.get(owner, {}))
3346
3359
  return lexical
3347
3360
 
3361
+ def plain_udf_info(call: FuncCall):
3362
+ if not isinstance(call.callee, Identifier):
3363
+ return None
3364
+ candidate = self._func_info_map.get(call.callee.name)
3365
+ if (
3366
+ candidate is None
3367
+ or candidate.node is None
3368
+ or getattr(candidate, "is_udt_method", False)
3369
+ ):
3370
+ return None
3371
+ return candidate
3372
+
3373
+ # Requested-context UDF expressions are lowered independently by
3374
+ # security.py. Classify their otherwise-emitted helper variants so
3375
+ # this chart-clocked factor neither allocates unused buffers for them
3376
+ # nor changes the legacy bodies that remain in generated C++.
3377
+ requested_node_ids: set[int] = set()
3378
+ for security_call in self._security_calls:
3379
+ expression = security_call.get("expr_node")
3380
+ if expression is None:
3381
+ continue
3382
+ requested_node_ids.update(
3383
+ id(child) for child in walk_nodes(expression)
3384
+ )
3385
+ self._requested_context_inline_node_ids = requested_node_ids
3386
+
3387
+ def emitted_context_for_call(
3388
+ fi,
3389
+ call: FuncCall,
3390
+ owner: str | None,
3391
+ owner_context: str | None,
3392
+ ) -> str | None:
3393
+ dispatch = self._instance_dispatch.get(
3394
+ (owner_context, id(call))
3395
+ )
3396
+ if dispatch is not None:
3397
+ return dispatch
3398
+ target_cs = target_cs_for_context(
3399
+ fi, call, owner, owner_context
3400
+ )
3401
+ if target_cs is not None:
3402
+ return f"{self._func_cpp_base_name(fi.name)}_cs{target_cs}"
3403
+ return None
3404
+
3405
+ requested_roots: set[tuple[str, str | None]] = set()
3406
+ chart_roots: set[tuple[str, str | None]] = set()
3407
+ context_edges: dict[
3408
+ tuple[str, str | None], set[tuple[str, str | None]]
3409
+ ] = {}
3410
+ for call in (
3411
+ candidate
3412
+ for candidate in walk_nodes(self.ctx.ast)
3413
+ if isinstance(candidate, FuncCall)
3414
+ ):
3415
+ fi = plain_udf_info(call)
3416
+ if fi is None:
3417
+ continue
3418
+ owner = owner_by_node.get(id(call))
3419
+ if id(call) in requested_node_ids:
3420
+ owner_contexts = (
3421
+ [None]
3422
+ if owner is None
3423
+ else self._inline_history_contexts_for_owner(owner)
3424
+ )
3425
+ for owner_context in owner_contexts:
3426
+ requested_roots.add((
3427
+ fi.name,
3428
+ emitted_context_for_call(
3429
+ fi, call, owner, owner_context
3430
+ ),
3431
+ ))
3432
+ continue
3433
+ if owner is None:
3434
+ target = (
3435
+ fi.name,
3436
+ emitted_context_for_call(fi, call, None, None),
3437
+ )
3438
+ chart_roots.add(target)
3439
+ continue
3440
+ for owner_context in self._inline_history_contexts_for_owner(owner):
3441
+ source = (owner, owner_context)
3442
+ target = (
3443
+ fi.name,
3444
+ emitted_context_for_call(
3445
+ fi, call, owner, owner_context
3446
+ ),
3447
+ )
3448
+ context_edges.setdefault(source, set()).add(target)
3449
+
3450
+ def reachable(
3451
+ roots: set[tuple[str, str | None]],
3452
+ ) -> set[tuple[str, str | None]]:
3453
+ found = set(roots)
3454
+ pending = list(roots)
3455
+ while pending:
3456
+ source = pending.pop()
3457
+ for target in context_edges.get(source, ()):
3458
+ if target in found:
3459
+ continue
3460
+ found.add(target)
3461
+ pending.append(target)
3462
+ return found
3463
+
3464
+ self._requested_context_only_inline_contexts = (
3465
+ reachable(requested_roots) - reachable(chart_roots)
3466
+ )
3467
+
3348
3468
  for node in walk_nodes(self.ctx.ast):
3349
3469
  owner = owner_by_node.get(id(node))
3350
3470
  if isinstance(node, Subscript) and isinstance(node.object, FuncCall):
@@ -3403,6 +3523,26 @@ class CodeGen(CallVisitor, ExprVisitor, StmtVisitor, TopLevelEmitter, SecurityEm
3403
3523
  expected_cpp_type = self._series_param_element_cpp_type(
3404
3524
  fi, idx, target_cs
3405
3525
  )
3526
+ # Pine gives each plain-UDF written call its own
3527
+ # chart-aligned parameter history. Even an exact Series
3528
+ # actual therefore needs a call-site-owned buffer: skipped
3529
+ # evaluations hold the last value in that bar's slot
3530
+ # instead of exposing the caller's independently changing
3531
+ # history. Typed methods retain their established direct
3532
+ # binding/bridge behavior below.
3533
+ chart_execution_context = (
3534
+ id(node) not in requested_node_ids
3535
+ and (owner, context)
3536
+ not in self._requested_context_only_inline_contexts
3537
+ )
3538
+ if not method_call and chart_execution_context:
3539
+ register_one(
3540
+ "udf_series_arg",
3541
+ (id(node), idx),
3542
+ expected_cpp_type,
3543
+ context,
3544
+ )
3545
+ continue
3406
3546
  needs_bridge = True
3407
3547
  if isinstance(arg, Identifier):
3408
3548
  if (
@@ -949,6 +949,21 @@ class TopLevelEmitter:
949
949
  f"{info['member_name']}.clear();"
950
950
  )
951
951
 
952
+ # A history-reading plain-UDF parameter advances on the chart clock,
953
+ # even when lazy control flow skips its written call on this bar. Seed
954
+ # the new slot with the prior current value (``na`` before first reach);
955
+ # an executed call later in the bar updates this same slot with its
956
+ # scalar actual. Typed-method ``series_arg`` bridges intentionally keep
957
+ # their existing execution-clock behavior.
958
+ for info in self._inline_history_members:
959
+ if info["kind"] != "udf_series_arg":
960
+ continue
961
+ member = info["member_name"]
962
+ lines.append(
963
+ f" if (history_advances_new_bar()) "
964
+ f"{member}.push({member}.current());"
965
+ )
966
+
952
967
  # a. Push bar field series (with bar magnifier support)
953
968
  for field_name in sorted(self.ctx.series_bar_fields):
954
969
  push_expr = BAR_SERIES_PUSH.get(field_name, f"current_bar_.{field_name}")
@@ -2844,6 +2844,156 @@ class SecurityEmitter:
2844
2844
  )
2845
2845
  return out
2846
2846
 
2847
+ def _security_lazy_ta_keys(
2848
+ self,
2849
+ sec_id: int,
2850
+ expr_node,
2851
+ info: dict,
2852
+ ) -> set[tuple[int, tuple]]:
2853
+ """``(ta_index, binding_signature)`` pairs Pine reaches only lazily.
2854
+
2855
+ Pine evaluates ``and``/``or`` with left-to-right short-circuit and a
2856
+ ternary evaluates its condition plus exactly one branch. A ``ta.*``
2857
+ call sitting in a skipped operand is **not evaluated on that bar**, so
2858
+ its series state does not advance. The evaluator used to hoist every
2859
+ collected site into an unconditional ``auto _secval_N = ...compute(...)``
2860
+ prologue, which advanced every site on every HTF bar and desynchronised
2861
+ the series against TradingView.
2862
+
2863
+ A site returned here is dropped from that prologue. ``_build_security_expr``
2864
+ then falls through to its inline
2865
+ ``(security_series_slot_is_new(N) ? m.compute(a) : m.recompute(a))``
2866
+ form, emitted in expression position — C++'s own ``&&`` / ``||`` /
2867
+ ``?:`` short-circuit then advances the state exactly when Pine would,
2868
+ and the relational lowering's ``_pna_l`` / ``_pna_r`` temporaries keep
2869
+ the evaluation order left-to-right.
2870
+
2871
+ Deliberately conservative — anything not provably single-reach and
2872
+ conditional keeps the existing eager hoist, so scripts without
2873
+ conditional security TA regenerate byte-identically:
2874
+
2875
+ - A site reached more than once must stay hoisted: sharing one
2876
+ ``_secval_*`` is what keeps it to a single advance per bar, whereas
2877
+ two inline copies would advance it twice (or zero times).
2878
+ - Laziness does **not** propagate through a global binding. In the
2879
+ requested context that global is its own unconditional top-level
2880
+ statement, so it evaluates on every HTF bar wherever it is read
2881
+ (this is what keeps chart-side ``t0``-shaped code exact).
2882
+ - Sites with a history offset (``ta.ema(close, 55)[1]``) keep the
2883
+ committed ``_secval_*`` their per-bar Series push reads.
2884
+ - Securities that rebind mutable globals, and multi-statement helper
2885
+ calls, bail entirely: both lower through statement emitters that
2886
+ consume ``ta_results`` outside this expression.
2887
+ """
2888
+ if info.get("mutable_globals"):
2889
+ return set()
2890
+
2891
+ occurrences: dict[tuple[int, tuple], list[bool]] = {}
2892
+ unsafe = False
2893
+
2894
+ def walk(node, lazy: bool, binding_stack, resolving: set[str]) -> None:
2895
+ nonlocal unsafe
2896
+ if node is None or unsafe:
2897
+ return
2898
+
2899
+ if isinstance(node, Identifier):
2900
+ binding = None
2901
+ if not self._security_identifier_is_global_binding(node):
2902
+ binding = self._security_lookup_helper_binding_context(
2903
+ node.name, binding_stack
2904
+ )
2905
+ if binding is not None:
2906
+ bound, bound_stack = binding
2907
+ if isinstance(bound, str):
2908
+ return
2909
+ bind_key = f"bind:{id(bound)}"
2910
+ if bind_key in resolving:
2911
+ return
2912
+ resolving.add(bind_key)
2913
+ walk(bound, lazy, bound_stack, resolving)
2914
+ resolving.discard(bind_key)
2915
+ return
2916
+
2917
+ if self._global_mutable_infos.get(node.name) is not None:
2918
+ unsafe = True
2919
+ return
2920
+
2921
+ global_expr_map = getattr(self.ctx, "global_expr_map", {}) or {}
2922
+ if (
2923
+ self._security_identifier_is_global_binding(node)
2924
+ and node.name in global_expr_map
2925
+ and node.name not in resolving
2926
+ ):
2927
+ resolving.add(node.name)
2928
+ walk(global_expr_map[node.name], False, (), resolving)
2929
+ resolving.remove(node.name)
2930
+ return
2931
+
2932
+ if isinstance(node, FuncCall) and isinstance(node.callee, Identifier):
2933
+ func_name = node.callee.name
2934
+ if func_name in self._func_names:
2935
+ call_key = f"func:{func_name}"
2936
+ if call_key in resolving:
2937
+ return
2938
+ resolving.add(call_key)
2939
+ plan = self._security_helper_call_plan(node, binding_stack)
2940
+ if plan["mode"] == "expr":
2941
+ walk(plan["expr"], lazy, plan["binding_stack"], resolving)
2942
+ else:
2943
+ unsafe = True
2944
+ resolving.discard(call_key)
2945
+ return
2946
+
2947
+ if isinstance(node, BinOp) and node.op in ("and", "or"):
2948
+ walk(node.left, lazy, binding_stack, resolving)
2949
+ walk(node.right, True, binding_stack, resolving)
2950
+ return
2951
+
2952
+ if isinstance(node, Ternary):
2953
+ walk(node.condition, lazy, binding_stack, resolving)
2954
+ walk(node.true_val, True, binding_stack, resolving)
2955
+ walk(node.false_val, True, binding_stack, resolving)
2956
+ return
2957
+
2958
+ site = self._get_ta_site(node)
2959
+ if site is not None:
2960
+ idx = self._ta_index_by_site_id.get(id(site))
2961
+ if idx is not None:
2962
+ key = (idx, self._security_binding_stack_signature(binding_stack))
2963
+ occurrences.setdefault(key, []).append(lazy)
2964
+
2965
+ for child in vars(node).values():
2966
+ walk_value(child, lazy, binding_stack, resolving)
2967
+
2968
+ def walk_value(value, lazy: bool, binding_stack, resolving: set[str]) -> None:
2969
+ if value is None or unsafe:
2970
+ return
2971
+ if hasattr(value, "__dict__"):
2972
+ walk(value, lazy, binding_stack, resolving)
2973
+ return
2974
+ if isinstance(value, (list, tuple)):
2975
+ for item in value:
2976
+ walk_value(item, lazy, binding_stack, resolving)
2977
+ return
2978
+ if isinstance(value, dict):
2979
+ for item in value.values():
2980
+ walk_value(item, lazy, binding_stack, resolving)
2981
+
2982
+ walk(expr_node, False, (), set())
2983
+ if unsafe:
2984
+ return set()
2985
+
2986
+ hist_indices = set(self._security_ta_hist_idx_by_sec.get(sec_id, ()))
2987
+ inline_helper_ta_indices = set(info.get("inline_helper_ta_indices", []))
2988
+ return {
2989
+ key
2990
+ for key, reaches in occurrences.items()
2991
+ if key[0] not in hist_indices
2992
+ and key[0] not in inline_helper_ta_indices
2993
+ and len(reaches) == 1
2994
+ and reaches[0]
2995
+ }
2996
+
2847
2997
  def _emit_security_ohlc_hist_pushes(self, sec_id: int, lines: list[str]) -> None:
2848
2998
  """Emit the OHLC history-offset Series pushes for ``sec_id``, gated on
2849
2999
  ``is_complete``.
@@ -2909,6 +3059,7 @@ class SecurityEmitter:
2909
3059
  ta_indices = info.get("ta_indices") or []
2910
3060
  security_mutable_names = set(info.get("mutable_globals", []))
2911
3061
  inline_helper_ta_indices = set(info.get("inline_helper_ta_indices", []))
3062
+ lazy_ta_keys = self._security_lazy_ta_keys(sec_id, expr_node, info)
2912
3063
 
2913
3064
  lines.append(f" void _eval_security_{sec_id}(const Bar& bar, bool is_complete) {{")
2914
3065
 
@@ -2949,6 +3100,15 @@ class SecurityEmitter:
2949
3100
  site = self.ctx.ta_call_sites[idx]
2950
3101
  variants = (info.get("ta_variants") or {}).get(idx, [])
2951
3102
  for variant in variants:
3103
+ if (idx, variant["signature"]) in lazy_ta_keys:
3104
+ # Pine only reaches this site through a
3105
+ # short-circuited operand or an untaken ternary
3106
+ # branch. Leave it out of the eager prologue:
3107
+ # _build_security_expr emits its
3108
+ # compute()/recompute() inline in expression
3109
+ # position, where C++'s &&/||/?: short-circuit
3110
+ # advances the series exactly on the bars Pine does.
3111
+ continue
2952
3112
  helper_binding_stack = variant.get("binding_stack", ())
2953
3113
  compute_args = self._security_ta_compute_args_for_site(
2954
3114
  sec_id,
@@ -459,45 +459,143 @@ ORDER_DIRECTION_MAP = {
459
459
  # ---------------------------------------------------------------------------
460
460
 
461
461
 
462
- def _checked_array_index_prelude(*, normalize_negative: bool = True) -> str:
462
+ def _checked_array_index_prelude(
463
+ *,
464
+ normalize_negative: bool = True,
465
+ allow_size: bool = False,
466
+ name: str = "index",
467
+ ) -> str:
463
468
  """C++ body shared by checked single-index operations.
464
469
 
465
- Pine v6 explicitly gives end-relative negative indices to the checked
466
- ``get``, ``set``, and ``remove`` cluster. Other indexed functions such as
467
- ``percentrank`` still need the same NA/non-finite/range checks, but must
468
- reject negative indices instead of normalizing them. ``insert`` remains a
469
- separately bounded residual.
470
+ Pine v6 explicitly gives end-relative negative indices to ``array.get``,
471
+ ``array.set``, ``array.insert``, and ``array.remove``. Other indexed
472
+ functions such as ``percentrank`` and the ``fill``/``slice`` range
473
+ endpoints still need the same NA/non-finite/range checks, but must reject
474
+ negative indices instead of normalizing them (``normalize_negative``).
475
+
476
+ ``allow_size`` widens the upper bound from ``index < size`` to
477
+ ``index <= size``. An *element access* is invalid at ``size``, but an
478
+ *insertion point* is not: ``array.insert(id, size, v)`` appends, and the
479
+ half-open ``[index_from, index_to)`` ranges of ``array.fill`` /
480
+ ``array.slice`` legally end at ``size``.
481
+
482
+ ``name`` renames every emitted local so two endpoints can be checked in
483
+ one C++ scope without colliding. ``name="index"`` reproduces the original
484
+ identifiers byte-for-byte.
470
485
  """
486
+ raw_value = f"__pf_raw_{name}_value"
487
+ raw_type = f"__pf_raw_{name}_type"
488
+ raw_text = f"__pf_raw_{name}_text"
489
+ raw_wide = f"__pf_raw_{name}_wide"
490
+ raw = f"__pf_raw_{name}"
491
+ checked = f"__pf_array_{name}"
492
+ size = "__pf_array_size" if name == "index" else f"__pf_array_size_{name}"
471
493
  checked_index = (
472
- "__pf_raw_index<0?__pf_raw_index+__pf_array_size:__pf_raw_index"
473
- if normalize_negative
474
- else "__pf_raw_index"
494
+ f"{raw}<0?{raw}+{size}:{raw}" if normalize_negative else raw
475
495
  )
496
+ upper = ">" if allow_size else ">="
476
497
  return (
477
- "using __pf_raw_index_type=std::decay_t<decltype(__pf_raw_index_value)>; "
478
- "if constexpr(!std::is_same_v<__pf_raw_index_type,bool>) { "
479
- "if(is_na(__pf_raw_index_value)) "
498
+ f"using {raw_type}=std::decay_t<decltype({raw_value})>; "
499
+ f"if constexpr(!std::is_same_v<{raw_type},bool>) {{ "
500
+ f"if(is_na({raw_value})) "
480
501
  "pine_runtime_error(std::string(\"Index na is out of bounds. Array size is \")+"
481
502
  "std::to_string((int64_t)__pf_array.size())); } "
482
- "if constexpr(std::is_floating_point_v<__pf_raw_index_type>) { "
483
- "if(!std::isfinite(__pf_raw_index_value)) { "
484
- "std::string __pf_raw_index_text=__pf_raw_index_value>0?\"inf\":\"-inf\"; "
485
- "pine_runtime_error(std::string(\"Index \")+__pf_raw_index_text+"
503
+ f"if constexpr(std::is_floating_point_v<{raw_type}>) {{ "
504
+ f"if(!std::isfinite({raw_value})) {{ "
505
+ f"std::string {raw_text}={raw_value}>0?\"inf\":\"-inf\"; "
506
+ f"pine_runtime_error(std::string(\"Index \")+{raw_text}+"
486
507
  "\" is out of bounds. Array size is \"+"
487
508
  "std::to_string((int64_t)__pf_array.size())); } "
488
- "long double __pf_raw_index_wide=(long double)__pf_raw_index_value; "
489
- "if(__pf_raw_index_wide<(long double)std::numeric_limits<int64_t>::min()||"
490
- "__pf_raw_index_wide>(long double)std::numeric_limits<int64_t>::max()) "
509
+ f"long double {raw_wide}=(long double){raw_value}; "
510
+ f"if({raw_wide}<(long double)std::numeric_limits<int64_t>::min()||"
511
+ f"{raw_wide}>(long double)std::numeric_limits<int64_t>::max()) "
491
512
  "pine_runtime_error(std::string(\"Index \")+"
492
- "std::to_string((double)__pf_raw_index_value)+"
513
+ f"std::to_string((double){raw_value})+"
493
514
  "\" is out of bounds. Array size is \"+"
494
515
  "std::to_string((int64_t)__pf_array.size())); } "
495
- "int64_t __pf_raw_index=(int64_t)__pf_raw_index_value; "
496
- "int64_t __pf_array_size=(int64_t)__pf_array.size(); "
497
- f"int64_t __pf_array_index={checked_index}; "
498
- "if(__pf_array_index<0||__pf_array_index>=__pf_array_size) "
499
- "pine_runtime_error(std::string(\"Index \")+std::to_string(__pf_raw_index)+"
500
- "\" is out of bounds. Array size is \"+std::to_string(__pf_array_size)); "
516
+ f"int64_t {raw}=(int64_t){raw_value}; "
517
+ f"int64_t {size}=(int64_t)__pf_array.size(); "
518
+ f"int64_t {checked}={checked_index}; "
519
+ f"if({checked}<0||{checked}{upper}{size}) "
520
+ f"pine_runtime_error(std::string(\"Index \")+std::to_string({raw})+"
521
+ f"\" is out of bounds. Array size is \"+std::to_string({size})); "
522
+ )
523
+
524
+
525
+ def _checked_array_range_prelude() -> str:
526
+ """Validate the half-open ``[index_from, index_to)`` range of fill/slice.
527
+
528
+ Both endpoints are checked with ``allow_size`` (``index_to`` is exclusive,
529
+ so ``size`` is a legal endpoint) and without negative normalization
530
+ (neither function appears in the Pine v6 reference's negative-indexing
531
+ set). An inverted range is rejected rather than silently treated as empty:
532
+ ``begin()+from > begin()+to`` is undefined behaviour in the STL forms this
533
+ replaces, and no evidence pins TradingView's behaviour there.
534
+ """
535
+ return (
536
+ _checked_array_index_prelude(
537
+ normalize_negative=False, allow_size=True, name="index_from"
538
+ )
539
+ + _checked_array_index_prelude(
540
+ normalize_negative=False, allow_size=True, name="index_to"
541
+ )
542
+ + "if(__pf_array_index_from>__pf_array_index_to) "
543
+ "pine_runtime_error(std::string(\"Index range \")+"
544
+ "std::to_string(__pf_array_index_from)+\"..\"+"
545
+ "std::to_string(__pf_array_index_to)+"
546
+ "\" is invalid. Array size is \"+"
547
+ "std::to_string(__pf_array_size_index_from)); "
548
+ )
549
+
550
+
551
+ def _checked_array_insert(a: str, args: list[str]) -> str:
552
+ """``array.insert(id, index, value)`` — index is an INSERTION point.
553
+
554
+ ``index == size`` appends, so the bound is ``index <= size``; a negative
555
+ index is end-relative, exactly as for ``get``/``set``/``remove``.
556
+ """
557
+ check = _checked_array_index_prelude(allow_size=True)
558
+ return (
559
+ "[&](auto&& __pf_array){ "
560
+ "return [&](auto&& __pf_raw_index_value){ "
561
+ "return [&](auto&& __pf_array_value){ "
562
+ f"{check}"
563
+ "__pf_array.insert(__pf_array.begin()+(size_t)__pf_array_index, "
564
+ "__pf_array_value); "
565
+ f"}}(({args[1]})); }}(({args[0]})); }}(({a}))"
566
+ )
567
+
568
+
569
+ def _checked_array_fill_range(a: str, args: list[str]) -> str:
570
+ """``array.fill(id, value, index_from, index_to)`` — bounded range fill."""
571
+ check = _checked_array_range_prelude()
572
+ return (
573
+ "[&](auto&& __pf_array){ "
574
+ "return [&](auto&& __pf_array_value){ "
575
+ "return [&](auto&& __pf_raw_index_from_value){ "
576
+ "return [&](auto&& __pf_raw_index_to_value){ "
577
+ f"{check}"
578
+ "std::fill(__pf_array.begin()+(size_t)__pf_array_index_from, "
579
+ "__pf_array.begin()+(size_t)__pf_array_index_to, __pf_array_value); "
580
+ f"}}(({args[2]})); }}(({args[1]})); }}(({args[0]})); }}(({a}))"
581
+ )
582
+
583
+
584
+ def checked_array_slice(a: str, args: list[str], *, result_type: str) -> str:
585
+ """``array.slice(id, index_from, index_to)`` — bounded range extraction.
586
+
587
+ ``result_type`` stays caller-supplied so the typed method lane keeps
588
+ emitting the receiver's own element type; only the bounds checks are new.
589
+ """
590
+ check = _checked_array_range_prelude()
591
+ return (
592
+ "[&](auto&& __pf_array){ "
593
+ "return [&](auto&& __pf_raw_index_from_value){ "
594
+ "return [&](auto&& __pf_raw_index_to_value){ "
595
+ f"{check}"
596
+ f"return {result_type}(__pf_array.begin()+(size_t)__pf_array_index_from, "
597
+ "__pf_array.begin()+(size_t)__pf_array_index_to); "
598
+ f"}}(({args[1]})); }}(({args[0]})); }}(({a}))"
501
599
  )
502
600
 
503
601
 
@@ -600,7 +698,7 @@ ARRAY_METHODS = {
600
698
  "set": _checked_array_set,
601
699
  "push": lambda a, args: f"{a}.push_back({args[0]})",
602
700
  "unshift": lambda a, args: f"{a}.insert({a}.begin(), {args[0]})",
603
- "insert": lambda a, args: f"{a}.insert({a}.begin() + (int)({args[0]}), {args[1]})",
701
+ "insert": _checked_array_insert,
604
702
  "pop": lambda a, args: _checked_array_end_remove(a, "pop"),
605
703
  "shift": lambda a, args: _checked_array_end_remove(a, "shift"),
606
704
  "remove": _checked_array_remove,
@@ -609,7 +707,7 @@ ARRAY_METHODS = {
609
707
  "size": lambda a, args: f"(double){a}.size()",
610
708
  "clear": lambda a, args: f"{a}.clear()",
611
709
  "fill": lambda a, args: f"std::fill({a}.begin(), {a}.end(), {args[0]})" if len(args) == 1
612
- else f"std::fill({a}.begin()+(int)({args[1]}), {a}.begin()+(int)({args[2]}), {args[0]})",
710
+ else _checked_array_fill_range(a, args),
613
711
  "includes": lambda a, args: f"(std::find({a}.begin(), {a}.end(), {args[0]}) != {a}.end())",
614
712
  "indexof": lambda a, args: f"[&](){{ auto it=std::find({a}.begin(),{a}.end(),{args[0]}); return it!={a}.end()?(double)(it-{a}.begin()):-1.0; }}()",
615
713
  "lastindexof": lambda a, args: f"[&](){{ for(int i=(int){a}.size()-1;i>=0;i--)if({a}[i]=={args[0]})return(double)i; return -1.0; }}()",
@@ -619,7 +717,7 @@ ARRAY_METHODS = {
619
717
  ),
620
718
  "reverse": lambda a, args: f"std::reverse({a}.begin(),{a}.end())",
621
719
  "copy": lambda a, args: f"std::vector<double>({a})",
622
- "slice": lambda a, args: f"std::vector<double>({a}.begin()+(int)({args[0]}),{a}.begin()+(int)({args[1]}))",
720
+ "slice": lambda a, args: checked_array_slice(a, args, result_type="std::vector<double>"),
623
721
  "concat": lambda a, args: f"{a}.insert({a}.end(),{args[0]}.begin(),{args[0]}.end())",
624
722
  "sum": lambda a, args: f"({a}.empty()?na<double>():std::accumulate({a}.begin(),{a}.end(),0.0))",
625
723
  "avg": lambda a, args: f"({a}.empty()?na<double>():std::accumulate({a}.begin(),{a}.end(),0.0)/{a}.size())",
@@ -667,6 +765,9 @@ CHECKED_ARRAY_METHOD_KWARGS: dict[str, list[str]] = {
667
765
  "set": ["index", "value"],
668
766
  "remove": ["index"],
669
767
  "percentrank": ["index"],
768
+ "insert": ["index", "value"],
769
+ "fill": ["value", "index_from", "index_to"],
770
+ "slice": ["index_from", "index_to"],
670
771
  "first": [],
671
772
  "last": [],
672
773
  "pop": [],