From 589a8319367b59997985d65e2393f1d24774f2b6 Mon Sep 17 00:00:00 2001 From: luisleo526 Date: Sat, 7 Nov 2026 14:25:23 +0800 Subject: [PATCH 1/2] Add live drawing capacity to the runtime limit vocabulary Accept live_drawings through the existing typed limit helper and publish its English template, preserving the code identity, since value and prior limit values. Regenerate the registry and catalog diff and exercise distinct operator maxima through the real helper contract. --- docker/run_failure_codes.json | 6 +- docker/run_failure_codes_diff.json | 8 +- docs/pages/run-failure-codes.md | 19 +- include/pineforge/run_failure.hpp | 3 +- src/run_failure_registry.inc | 291 +++++++++++++++-------------- tests/test_run_failure_codes.cpp | 6 + 6 files changed, 181 insertions(+), 152 deletions(-) diff --git a/docker/run_failure_codes.json b/docker/run_failure_codes.json index b2580231d..5a0a95d86 100644 --- a/docker/run_failure_codes.json +++ b/docker/run_failure_codes.json @@ -802,7 +802,8 @@ "max_bars_back", "matrix_elements", "udt_objects", - "drawing_ids" + "drawing_ids", + "live_drawings" ] }, "max": { @@ -822,7 +823,8 @@ "box drawing ID domain exhausted", "label drawing ID domain exhausted", "linefill drawing ID domain exhausted", - "generic drawing ID domain exhausted" + "generic drawing ID domain exhausted", + "The script keeps more than {max} live drawings of one type; the configured drawing capacity is exceeded." ], "retryable": false, "since": "1.4.0" diff --git a/docker/run_failure_codes_diff.json b/docker/run_failure_codes_diff.json index 723b258ac..3370b9cf3 100644 --- a/docker/run_failure_codes_diff.json +++ b/docker/run_failure_codes_diff.json @@ -8,7 +8,7 @@ "to": { "version": null, "unreleased": true, - "catalogSha256": "d4a555dcea58c5d7a4c3a0f2223832acb04361f6eebda5f4a642226df4a5067f" + "catalogSha256": "00b60fe00cb9371b5e5be06f671217e3d14ed0f612434dae640bed2aabddd699" }, "catalogSchema": { "before": "pineforge-run-failure-catalog/v1", @@ -238,7 +238,8 @@ "max_bars_back", "matrix_elements", "udt_objects", - "drawing_ids" + "drawing_ids", + "live_drawings" ] }, { @@ -262,7 +263,8 @@ "box drawing ID domain exhausted", "label drawing ID domain exhausted", "linefill drawing ID domain exhausted", - "generic drawing ID domain exhausted" + "generic drawing ID domain exhausted", + "The script keeps more than {max} live drawings of one type; the configured drawing capacity is exceeded." ] } ] diff --git a/docs/pages/run-failure-codes.md b/docs/pages/run-failure-codes.md index 6275a6e07..b37b940b6 100644 --- a/docs/pages/run-failure-codes.md +++ b/docs/pages/run-failure-codes.md @@ -215,7 +215,7 @@ other `strategy_create_failed` lines omit it. | `pine_map_capacity_exceeded` | `strategy_limit` | no | `bar_index` (integer), `code` (identifier), `currSize` (integer), `maxSize` (integer) | A distinct map insertion exceeds that map's configured pair limit. Zero or omitted selects no limit. Counts and bar index are engine-owned context; code is the fixed TradingView identifier RE10070. | | `pine_matrix_error` | `strategy` | no | `function` (vocab, 15 values), `reason` (vocab, 10 values) | A matrix built-in refused its arguments (an index, a dimension, a size or an empty matrix). | | `pine_na_reference` | `strategy` | no | `object` (vocab, 10 values) | The script called a method on an na reference (an array, matrix, map, drawing or object id). | -| `pine_runtime_limit` | `strategy_limit` | no | `limit` (vocab, 5 values), `max` (integer, optional) | The script reached a TradingView or PineForge resource limit. | +| `pine_runtime_limit` | `strategy_limit` | no | `limit` (vocab, 6 values), `max` (integer, optional) | The script reached a TradingView or PineForge resource limit. | | `pine_string_error` | `strategy` | no | `reason` (vocab, 2 values) | A string built-in refused its arguments. | | `recalc_cap` | `strategy_limit` | no | none | The script's calc_on_order_fills recalculation loop reached its cap. | | `recorded_request_missing` | `no_data` | no | none | No recorded series is installed for a request the script reads. | @@ -652,6 +652,23 @@ reads. | `pine_string_stop(reason, english)` | `pine_string_error` | | `pine_engine_invariant(english)` | `engine_invariant` | +`pine_limit_stop` accepts six closed `limit` values: `map_pairs`, +`max_bars_back`, `matrix_elements`, `udt_objects`, `drawing_ids` and +`live_drawings`. `max_bars_back` identifies the historical buffer limit; +`drawing_ids` identifies exhaustion of the logical drawing-ID domain. +`live_drawings` identifies an explicit operator capacity for live drawings +of one type. + +`pine_limit_stop("live_drawings", N, english)` uses the operator's configured +capacity `N` as `max` and raises the existing nonretryable +`pine_runtime_limit`, class `strategy_limit`, with arguments +`{"limit":"live_drawings","max":N}`. Its catalog English template is: + +> The script keeps more than {max} live drawings of one type; the configured drawing capacity is exceeded. + +This vocabulary extension prepares the helper contract; drawing enforcement +and its defaults remain unchanged. + The generated wrapper records an exception that escapes the strategy with `note_run_failure(engine, entrypoint, error)`: the text it writes is still `": "`, and the code is the exception's own. diff --git a/include/pineforge/run_failure.hpp b/include/pineforge/run_failure.hpp index 15012ed8d..22e25d4ab 100644 --- a/include/pineforge/run_failure.hpp +++ b/include/pineforge/run_failure.hpp @@ -82,7 +82,8 @@ // polyline | table | udt_object // pine_limit_stop(const char* limit, std::int64_t max, const char* english) // -> pine_runtime_limit {limit, max} -// limit: map_pairs | max_bars_back | matrix_elements | udt_objects; +// limit: map_pairs | max_bars_back | matrix_elements | udt_objects | +// drawing_ids | live_drawings; // max is the limit's engine or transpiler constant (pass -1 for none) // pine_unsupported_stop(const char* reason, std::int32_t line, // const char* english) diff --git a/src/run_failure_registry.inc b/src/run_failure_registry.inc index 7fb269ab1..0911c701a 100644 --- a/src/run_failure_registry.inc +++ b/src/run_failure_registry.inc @@ -126,6 +126,7 @@ static constexpr const char* kRegistryValues[] = { "matrix_elements", "udt_objects", "drawing_ids", + "live_drawings", "substring_out_of_range", "format_index_overflow", "run_in_progress", @@ -567,151 +568,151 @@ static constexpr RegistryArg kRegistryArgs[] = { {"function", RunFailureArgKind::vocab, false, 80, 15}, {"reason", RunFailureArgKind::vocab, false, 95, 10}, {"object", RunFailureArgKind::vocab, false, 105, 10}, - {"limit", RunFailureArgKind::vocab, false, 115, 5}, - {"max", RunFailureArgKind::integer, true, 120, 0}, - {"reason", RunFailureArgKind::vocab, false, 120, 2}, - {"reason", RunFailureArgKind::vocab, false, 122, 5}, - {"cap_bytes", RunFailureArgKind::integer, false, 127, 0}, - {"channel", RunFailureArgKind::vocab, false, 127, 2}, - {"requested_bytes", RunFailureArgKind::integer, false, 129, 0}, - {"used_bytes", RunFailureArgKind::integer, false, 129, 0}, - {"channel", RunFailureArgKind::vocab, false, 129, 5}, - {"reason", RunFailureArgKind::vocab, false, 134, 5}, - {"contract", RunFailureArgKind::string, false, 139, 0}, - {"mode", RunFailureArgKind::string, false, 139, 0}, - {"field", RunFailureArgKind::vocab, false, 139, 6}, - {"phase", RunFailureArgKind::vocab, false, 145, 3}, - {"reason", RunFailureArgKind::vocab, false, 148, 4}, - {"field", RunFailureArgKind::string, false, 152, 0}, - {"reason", RunFailureArgKind::vocab, false, 152, 4}, - {"option", RunFailureArgKind::vocab, false, 156, 2}, - {"value", RunFailureArgKind::scalar, false, 158, 0}, - {"shape", RunFailureArgKind::string, false, 158, 0}, - {"arena_bytes", RunFailureArgKind::integer, true, 158, 0}, - {"cap_bytes", RunFailureArgKind::integer, true, 158, 0}, - {"claimed_bytes", RunFailureArgKind::integer, true, 158, 0}, - {"high_water_bytes", RunFailureArgKind::integer, true, 158, 0}, - {"needed_bytes_lower_bound", RunFailureArgKind::integer, true, 158, 0}, - {"reason", RunFailureArgKind::vocab, true, 158, 7}, - {"sink_bytes", RunFailureArgKind::integer, true, 165, 0}, - {"store", RunFailureArgKind::vocab, true, 165, 13}, - {"api", RunFailureArgKind::vocab, false, 178, 2}, - {"input_tf", RunFailureArgKind::timeframe, true, 180, 0}, - {"reason", RunFailureArgKind::vocab, false, 180, 7}, - {"script_tf", RunFailureArgKind::timeframe, true, 187, 0}, - {"line", RunFailureArgKind::integer, true, 187, 0}, - {"reason", RunFailureArgKind::vocab, false, 187, 2}, - {"requested", RunFailureArgKind::string, false, 189, 0}, - {"bars_count", RunFailureArgKind::integer, true, 189, 0}, - {"strategy_started", RunFailureArgKind::boolean, true, 189, 0}, - {"stage", RunFailureArgKind::vocab, false, 189, 5}, - {"limit", RunFailureArgKind::integer, false, 194, 0}, - {"peak", RunFailureArgKind::integer, false, 194, 0}, - {"process_role", RunFailureArgKind::vocab, false, 194, 6}, - {"requested", RunFailureArgKind::integer, false, 200, 0}, - {"soft_nofile", RunFailureArgKind::integer, false, 200, 0}, - {"stage", RunFailureArgKind::vocab, false, 200, 8}, - {"used", RunFailureArgKind::integer, false, 208, 0}, - {"reason", RunFailureArgKind::vocab, false, 208, 3}, - {"feature", RunFailureArgKind::vocab, false, 211, 11}, - {"input_tf", RunFailureArgKind::timeframe, true, 222, 0}, - {"option", RunFailureArgKind::vocab, false, 222, 11}, - {"script_tf", RunFailureArgKind::timeframe, true, 233, 0}, - {"operation", RunFailureArgKind::vocab, false, 233, 4}, - {"exit_status", RunFailureArgKind::integer, true, 237, 0}, - {"reason", RunFailureArgKind::vocab, false, 237, 3}, - {"signal", RunFailureArgKind::integer, true, 240, 0}, - {"reason", RunFailureArgKind::vocab, false, 240, 8}, - {"setting", RunFailureArgKind::vocab, false, 248, 10}, - {"stage", RunFailureArgKind::vocab, false, 258, 8}, - {"option", RunFailureArgKind::vocab, false, 266, 25}, - {"artifact", RunFailureArgKind::vocab, false, 291, 14}, - {"limit", RunFailureArgKind::integer, false, 305, 0}, - {"peak", RunFailureArgKind::integer, false, 305, 0}, - {"requested", RunFailureArgKind::integer, false, 305, 0}, - {"resource", RunFailureArgKind::vocab, false, 305, 3}, - {"stage", RunFailureArgKind::vocab, false, 308, 8}, - {"used", RunFailureArgKind::integer, false, 316, 0}, - {"configured", RunFailureArgKind::string, false, 316, 0}, - {"needed", RunFailureArgKind::string, false, 316, 0}, - {"used", RunFailureArgKind::string, false, 316, 0}, - {"backing_bytes_lower_bound", RunFailureArgKind::string, false, 316, 0}, - {"overflow", RunFailureArgKind::boolean, false, 316, 0}, - {"resident_metadata_bytes_lower_bound", RunFailureArgKind::string, false, 316, 0}, - {"resident_payload_bytes_lower_bound", RunFailureArgKind::string, false, 316, 0}, - {"unsupported_flags", RunFailureArgKind::string, false, 316, 0}, - {"resource", RunFailureArgKind::vocab, false, 316, 12}, - {"reason", RunFailureArgKind::vocab, false, 328, 3}, - {"stage", RunFailureArgKind::vocab, false, 331, 1}, - {"reason", RunFailureArgKind::vocab, false, 332, 11}, - {"limit", RunFailureArgKind::string, false, 343, 0}, - {"requested", RunFailureArgKind::string, false, 343, 0}, - {"used", RunFailureArgKind::string, false, 343, 0}, - {"limit", RunFailureArgKind::string, false, 343, 0}, - {"requested", RunFailureArgKind::string, false, 343, 0}, - {"used", RunFailureArgKind::string, false, 343, 0}, - {"limit", RunFailureArgKind::string, false, 343, 0}, - {"requested", RunFailureArgKind::string, false, 343, 0}, - {"used", RunFailureArgKind::string, false, 343, 0}, - {"limit", RunFailureArgKind::string, false, 343, 0}, - {"requested", RunFailureArgKind::string, false, 343, 0}, - {"used", RunFailureArgKind::string, false, 343, 0}, - {"limit", RunFailureArgKind::string, false, 343, 0}, - {"requested", RunFailureArgKind::string, false, 343, 0}, - {"used", RunFailureArgKind::string, false, 343, 0}, - {"entrypoint", RunFailureArgKind::vocab, true, 343, 4}, - {"input", RunFailureArgKind::pine_source, true, 347, 0}, - {"reason", RunFailureArgKind::vocab, true, 347, 21}, - {"abi", RunFailureArgKind::integer, true, 368, 0}, - {"missing", RunFailureArgKind::vocab, true, 368, 13}, - {"reason", RunFailureArgKind::vocab, false, 381, 8}, - {"field", RunFailureArgKind::vocab, false, 389, 33}, - {"field", RunFailureArgKind::string, false, 422, 0}, - {"reason", RunFailureArgKind::vocab, false, 422, 3}, - {"field", RunFailureArgKind::vocab, true, 425, 6}, - {"input_tf", RunFailureArgKind::timeframe, true, 431, 0}, - {"reason", RunFailureArgKind::vocab, false, 431, 47}, - {"script_tf", RunFailureArgKind::timeframe, true, 478, 0}, - {"field", RunFailureArgKind::vocab, false, 478, 14}, - {"reason", RunFailureArgKind::vocab, false, 492, 4}, - {"bound", RunFailureArgKind::vocab, false, 496, 3}, - {"next_boundary_ms", RunFailureArgKind::integer, false, 499, 0}, - {"previous_boundary_ms", RunFailureArgKind::integer, false, 499, 0}, - {"value_ms", RunFailureArgKind::integer, false, 499, 0}, - {"session", RunFailureArgKind::nullable_string, false, 499, 0}, - {"timezone", RunFailureArgKind::string, false, 499, 0}, - {"actual_sha256", RunFailureArgKind::string, false, 499, 0}, - {"expected_sha256", RunFailureArgKind::string, false, 499, 0}, - {"feed_id", RunFailureArgKind::string, false, 499, 0}, - {"end_ms", RunFailureArgKind::integer, false, 499, 0}, - {"fed_start_ms", RunFailureArgKind::integer, false, 499, 0}, - {"time_ms", RunFailureArgKind::integer, false, 499, 0}, - {"actual", RunFailureArgKind::integer, false, 499, 0}, - {"cap_name", RunFailureArgKind::vocab, false, 499, 8}, - {"limit", RunFailureArgKind::integer, false, 507, 0}, - {"option", RunFailureArgKind::string, false, 507, 0}, - {"actual", RunFailureArgKind::scalar, false, 507, 0}, - {"expected", RunFailureArgKind::scalar, false, 507, 0}, - {"field", RunFailureArgKind::string, false, 507, 0}, - {"capability", RunFailureArgKind::string, false, 507, 0}, - {"requested", RunFailureArgKind::integer, true, 507, 0}, - {"timeframe", RunFailureArgKind::string, true, 507, 0}, - {"end_ms", RunFailureArgKind::integer, false, 507, 0}, - {"start_ms", RunFailureArgKind::integer, false, 507, 0}, - {"requested", RunFailureArgKind::integer, false, 507, 0}, - {"fill_ms", RunFailureArgKind::integer, false, 507, 0}, - {"start_ms", RunFailureArgKind::integer, false, 507, 0}, - {"position_size", RunFailureArgKind::number, false, 507, 0}, - {"resting_orders", RunFailureArgKind::integer, false, 507, 0}, - {"time_ms", RunFailureArgKind::integer, false, 507, 0}, - {"pruner", RunFailureArgKind::string, false, 507, 0}, - {"end_ms", RunFailureArgKind::integer, false, 507, 0}, - {"fed_start_ms", RunFailureArgKind::integer, false, 507, 0}, - {"start_ms", RunFailureArgKind::integer, false, 507, 0}, - {"actual", RunFailureArgKind::integer, false, 507, 0}, - {"expected", RunFailureArgKind::integer, false, 507, 0}, - {"field", RunFailureArgKind::vocab, false, 507, 3}, - {"option", RunFailureArgKind::vocab, false, 510, 13}, + {"limit", RunFailureArgKind::vocab, false, 115, 6}, + {"max", RunFailureArgKind::integer, true, 121, 0}, + {"reason", RunFailureArgKind::vocab, false, 121, 2}, + {"reason", RunFailureArgKind::vocab, false, 123, 5}, + {"cap_bytes", RunFailureArgKind::integer, false, 128, 0}, + {"channel", RunFailureArgKind::vocab, false, 128, 2}, + {"requested_bytes", RunFailureArgKind::integer, false, 130, 0}, + {"used_bytes", RunFailureArgKind::integer, false, 130, 0}, + {"channel", RunFailureArgKind::vocab, false, 130, 5}, + {"reason", RunFailureArgKind::vocab, false, 135, 5}, + {"contract", RunFailureArgKind::string, false, 140, 0}, + {"mode", RunFailureArgKind::string, false, 140, 0}, + {"field", RunFailureArgKind::vocab, false, 140, 6}, + {"phase", RunFailureArgKind::vocab, false, 146, 3}, + {"reason", RunFailureArgKind::vocab, false, 149, 4}, + {"field", RunFailureArgKind::string, false, 153, 0}, + {"reason", RunFailureArgKind::vocab, false, 153, 4}, + {"option", RunFailureArgKind::vocab, false, 157, 2}, + {"value", RunFailureArgKind::scalar, false, 159, 0}, + {"shape", RunFailureArgKind::string, false, 159, 0}, + {"arena_bytes", RunFailureArgKind::integer, true, 159, 0}, + {"cap_bytes", RunFailureArgKind::integer, true, 159, 0}, + {"claimed_bytes", RunFailureArgKind::integer, true, 159, 0}, + {"high_water_bytes", RunFailureArgKind::integer, true, 159, 0}, + {"needed_bytes_lower_bound", RunFailureArgKind::integer, true, 159, 0}, + {"reason", RunFailureArgKind::vocab, true, 159, 7}, + {"sink_bytes", RunFailureArgKind::integer, true, 166, 0}, + {"store", RunFailureArgKind::vocab, true, 166, 13}, + {"api", RunFailureArgKind::vocab, false, 179, 2}, + {"input_tf", RunFailureArgKind::timeframe, true, 181, 0}, + {"reason", RunFailureArgKind::vocab, false, 181, 7}, + {"script_tf", RunFailureArgKind::timeframe, true, 188, 0}, + {"line", RunFailureArgKind::integer, true, 188, 0}, + {"reason", RunFailureArgKind::vocab, false, 188, 2}, + {"requested", RunFailureArgKind::string, false, 190, 0}, + {"bars_count", RunFailureArgKind::integer, true, 190, 0}, + {"strategy_started", RunFailureArgKind::boolean, true, 190, 0}, + {"stage", RunFailureArgKind::vocab, false, 190, 5}, + {"limit", RunFailureArgKind::integer, false, 195, 0}, + {"peak", RunFailureArgKind::integer, false, 195, 0}, + {"process_role", RunFailureArgKind::vocab, false, 195, 6}, + {"requested", RunFailureArgKind::integer, false, 201, 0}, + {"soft_nofile", RunFailureArgKind::integer, false, 201, 0}, + {"stage", RunFailureArgKind::vocab, false, 201, 8}, + {"used", RunFailureArgKind::integer, false, 209, 0}, + {"reason", RunFailureArgKind::vocab, false, 209, 3}, + {"feature", RunFailureArgKind::vocab, false, 212, 11}, + {"input_tf", RunFailureArgKind::timeframe, true, 223, 0}, + {"option", RunFailureArgKind::vocab, false, 223, 11}, + {"script_tf", RunFailureArgKind::timeframe, true, 234, 0}, + {"operation", RunFailureArgKind::vocab, false, 234, 4}, + {"exit_status", RunFailureArgKind::integer, true, 238, 0}, + {"reason", RunFailureArgKind::vocab, false, 238, 3}, + {"signal", RunFailureArgKind::integer, true, 241, 0}, + {"reason", RunFailureArgKind::vocab, false, 241, 8}, + {"setting", RunFailureArgKind::vocab, false, 249, 10}, + {"stage", RunFailureArgKind::vocab, false, 259, 8}, + {"option", RunFailureArgKind::vocab, false, 267, 25}, + {"artifact", RunFailureArgKind::vocab, false, 292, 14}, + {"limit", RunFailureArgKind::integer, false, 306, 0}, + {"peak", RunFailureArgKind::integer, false, 306, 0}, + {"requested", RunFailureArgKind::integer, false, 306, 0}, + {"resource", RunFailureArgKind::vocab, false, 306, 3}, + {"stage", RunFailureArgKind::vocab, false, 309, 8}, + {"used", RunFailureArgKind::integer, false, 317, 0}, + {"configured", RunFailureArgKind::string, false, 317, 0}, + {"needed", RunFailureArgKind::string, false, 317, 0}, + {"used", RunFailureArgKind::string, false, 317, 0}, + {"backing_bytes_lower_bound", RunFailureArgKind::string, false, 317, 0}, + {"overflow", RunFailureArgKind::boolean, false, 317, 0}, + {"resident_metadata_bytes_lower_bound", RunFailureArgKind::string, false, 317, 0}, + {"resident_payload_bytes_lower_bound", RunFailureArgKind::string, false, 317, 0}, + {"unsupported_flags", RunFailureArgKind::string, false, 317, 0}, + {"resource", RunFailureArgKind::vocab, false, 317, 12}, + {"reason", RunFailureArgKind::vocab, false, 329, 3}, + {"stage", RunFailureArgKind::vocab, false, 332, 1}, + {"reason", RunFailureArgKind::vocab, false, 333, 11}, + {"limit", RunFailureArgKind::string, false, 344, 0}, + {"requested", RunFailureArgKind::string, false, 344, 0}, + {"used", RunFailureArgKind::string, false, 344, 0}, + {"limit", RunFailureArgKind::string, false, 344, 0}, + {"requested", RunFailureArgKind::string, false, 344, 0}, + {"used", RunFailureArgKind::string, false, 344, 0}, + {"limit", RunFailureArgKind::string, false, 344, 0}, + {"requested", RunFailureArgKind::string, false, 344, 0}, + {"used", RunFailureArgKind::string, false, 344, 0}, + {"limit", RunFailureArgKind::string, false, 344, 0}, + {"requested", RunFailureArgKind::string, false, 344, 0}, + {"used", RunFailureArgKind::string, false, 344, 0}, + {"limit", RunFailureArgKind::string, false, 344, 0}, + {"requested", RunFailureArgKind::string, false, 344, 0}, + {"used", RunFailureArgKind::string, false, 344, 0}, + {"entrypoint", RunFailureArgKind::vocab, true, 344, 4}, + {"input", RunFailureArgKind::pine_source, true, 348, 0}, + {"reason", RunFailureArgKind::vocab, true, 348, 21}, + {"abi", RunFailureArgKind::integer, true, 369, 0}, + {"missing", RunFailureArgKind::vocab, true, 369, 13}, + {"reason", RunFailureArgKind::vocab, false, 382, 8}, + {"field", RunFailureArgKind::vocab, false, 390, 33}, + {"field", RunFailureArgKind::string, false, 423, 0}, + {"reason", RunFailureArgKind::vocab, false, 423, 3}, + {"field", RunFailureArgKind::vocab, true, 426, 6}, + {"input_tf", RunFailureArgKind::timeframe, true, 432, 0}, + {"reason", RunFailureArgKind::vocab, false, 432, 47}, + {"script_tf", RunFailureArgKind::timeframe, true, 479, 0}, + {"field", RunFailureArgKind::vocab, false, 479, 14}, + {"reason", RunFailureArgKind::vocab, false, 493, 4}, + {"bound", RunFailureArgKind::vocab, false, 497, 3}, + {"next_boundary_ms", RunFailureArgKind::integer, false, 500, 0}, + {"previous_boundary_ms", RunFailureArgKind::integer, false, 500, 0}, + {"value_ms", RunFailureArgKind::integer, false, 500, 0}, + {"session", RunFailureArgKind::nullable_string, false, 500, 0}, + {"timezone", RunFailureArgKind::string, false, 500, 0}, + {"actual_sha256", RunFailureArgKind::string, false, 500, 0}, + {"expected_sha256", RunFailureArgKind::string, false, 500, 0}, + {"feed_id", RunFailureArgKind::string, false, 500, 0}, + {"end_ms", RunFailureArgKind::integer, false, 500, 0}, + {"fed_start_ms", RunFailureArgKind::integer, false, 500, 0}, + {"time_ms", RunFailureArgKind::integer, false, 500, 0}, + {"actual", RunFailureArgKind::integer, false, 500, 0}, + {"cap_name", RunFailureArgKind::vocab, false, 500, 8}, + {"limit", RunFailureArgKind::integer, false, 508, 0}, + {"option", RunFailureArgKind::string, false, 508, 0}, + {"actual", RunFailureArgKind::scalar, false, 508, 0}, + {"expected", RunFailureArgKind::scalar, false, 508, 0}, + {"field", RunFailureArgKind::string, false, 508, 0}, + {"capability", RunFailureArgKind::string, false, 508, 0}, + {"requested", RunFailureArgKind::integer, true, 508, 0}, + {"timeframe", RunFailureArgKind::string, true, 508, 0}, + {"end_ms", RunFailureArgKind::integer, false, 508, 0}, + {"start_ms", RunFailureArgKind::integer, false, 508, 0}, + {"requested", RunFailureArgKind::integer, false, 508, 0}, + {"fill_ms", RunFailureArgKind::integer, false, 508, 0}, + {"start_ms", RunFailureArgKind::integer, false, 508, 0}, + {"position_size", RunFailureArgKind::number, false, 508, 0}, + {"resting_orders", RunFailureArgKind::integer, false, 508, 0}, + {"time_ms", RunFailureArgKind::integer, false, 508, 0}, + {"pruner", RunFailureArgKind::string, false, 508, 0}, + {"end_ms", RunFailureArgKind::integer, false, 508, 0}, + {"fed_start_ms", RunFailureArgKind::integer, false, 508, 0}, + {"start_ms", RunFailureArgKind::integer, false, 508, 0}, + {"actual", RunFailureArgKind::integer, false, 508, 0}, + {"expected", RunFailureArgKind::integer, false, 508, 0}, + {"field", RunFailureArgKind::vocab, false, 508, 3}, + {"option", RunFailureArgKind::vocab, false, 511, 13}, }; static constexpr RegistryCode kRegistryCodes[] = { diff --git a/tests/test_run_failure_codes.cpp b/tests/test_run_failure_codes.cpp index 9f4c520f8..28c61bc43 100644 --- a/tests/test_run_failure_codes.cpp +++ b/tests/test_run_failure_codes.cpp @@ -434,6 +434,12 @@ void helper_contract_rows() { "{}"}, {"pine_limit_stop max", [] { pine_limit_stop("map_pairs", 50000, "E"); }, "pine_runtime_limit", R"({"limit":"map_pairs","max":50000})"}, + {"pine_limit_stop live_drawings 40", + [] { pine_limit_stop("live_drawings", 40, "E"); }, + "pine_runtime_limit", R"({"limit":"live_drawings","max":40})"}, + {"pine_limit_stop live_drawings 100", + [] { pine_limit_stop("live_drawings", 100, "E"); }, + "pine_runtime_limit", R"({"limit":"live_drawings","max":100})"}, {"pine_limit_stop no max", [] { pine_limit_stop("udt_objects", -1, "E"); }, "pine_runtime_limit", R"({"limit":"udt_objects"})"}, {"pine_limit_stop outside list", [] { pine_limit_stop("loop_iterations", 5, "E"); }, From d6772ea0b36e4d9aa68635d210de8a7cf79057fd Mon Sep 17 00:00:00 2001 From: luisleo526 Date: Sat, 7 Nov 2026 20:07:29 +0800 Subject: [PATCH 2/2] Repair runtime failure catalog documentation references Point seven documentation citations at the matching catalog fields after the vocabulary additions shifted their lines. --- docs/design/BARS-BIN-INPUT.md | 10 +++++----- docs/pages/memory-management.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/design/BARS-BIN-INPUT.md b/docs/design/BARS-BIN-INPUT.md index 485ce4ab3..869b87304 100644 --- a/docs/design/BARS-BIN-INPUT.md +++ b/docs/design/BARS-BIN-INPUT.md @@ -205,8 +205,8 @@ Selected-window selection includes a report policy, any window option or `--validate-window-only` (`_selected_requested` docker/run_json.py:4699). The refusals above use the ordinary request code, not a window-specific code (`_request_invalid` docker/run_json.py:4465). The catalog names -`run_request_invalid` docker/run_failure_codes.json:1538 and includes the -option `ohlcv_bin` docker/run_failure_codes.json:1563. +`run_request_invalid` docker/run_failure_codes.json:1540 and includes the +option `ohlcv_bin` docker/run_failure_codes.json:1565. These request refusals exit 1 and emit the failure JSON line on stdout (`exit_status` docker/run_json.py:4465; `write_failure` docker/run_json.py:2366). @@ -224,7 +224,7 @@ Read-only searches covered `docker/`, `scripts/`, `runner/` and repository filenames/release notes; `campaign/` and `cloudrun/` are absent. The local backtest entry is `main` docker/run_json.py:5345; the catalog itself identifies the optimizer-only refusal separately (`description` -docker/run_failure_codes.json:2593). Neither establishes the production HPO +docker/run_failure_codes.json:2595). Neither establishes the production HPO runner's input support. Check the separate **pineforge-hpo** repository named by this repository's @@ -336,8 +336,8 @@ Failure JSON uses `engine`, `error`, `code`, `args` (`doc` docker/run_json.py:2322; `code` docker/run_json.py:2325; `args` docker/run_json.py:2326). The catalog entries are `chart_bars_unreadable` docker/run_failure_codes.json:60, `symbol_feeds_refused` -docker/run_failure_codes.json:2178 and `run_request_invalid` -docker/run_failure_codes.json:1538. Shared binary-reader helpers additionally +docker/run_failure_codes.json:2180 and `run_request_invalid` +docker/run_failure_codes.json:1540. Shared binary-reader helpers additionally refuse malformed file `size`, metadata/digests as `sidecar`, and a bad feed companion as `close_file` (`bar_count` docker/pf_bars.py:101; `check_sidecar` docker/pf_bars.py:137; `check_close_size` diff --git a/docs/pages/memory-management.md b/docs/pages/memory-management.md index 89ac87bab..094756bb5 100644 --- a/docs/pages/memory-management.md +++ b/docs/pages/memory-management.md @@ -300,8 +300,8 @@ trailer, 7 internal error, 8 `sink_exhausted` (the stream exceeds `--max-bytes`; `sink_exhausted` at `docker/pineforge_sink_finalize.py:115-123`). Its output is provisional until exit 0, and a consumer must discard everything it received on exit 3 to 8 (`PROVISIONAL` at `docker/pineforge_sink_finalize.py:24-26`). The failure catalog maps exit 8 to `report_sink_failed` -with `reason` `sink_exhausted` (`sink_exhausted` at `docker/run_failure_codes.json:1134`). A sink failure carries code `report_sink_failed` and a `reason` -from the closed list of the catalog (`report_sink_failed` at `docker/run_failure_codes.json:1074`): +with `reason` `sink_exhausted` (`sink_exhausted` at `docker/run_failure_codes.json:1136`). A sink failure carries code `report_sink_failed` and a `reason` +from the closed list of the catalog (`report_sink_failed` at `docker/run_failure_codes.json:1076`): `arena_exhausted`, `arena_io`, `arena_backing`, `scratch_io`, `sink_io`, `sink_peer_closed` and `sink_exhausted`. Only some reasons carry sizes: `arena_exhausted` carries `high_water_bytes`, `arena_bytes`, `claimed_bytes`, `store` and `needed_bytes_lower_bound`, `sink_exhausted` carries