@jetta/cargo-stabilizer 0.1.0-15 → 0.1.0-5

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 (172) hide show
  1. package/CHANGELOG.md +2 -16
  2. package/README.md +12 -18
  3. package/build/core/adapters/axle_adapter.d.ts +0 -1
  4. package/build/core/adapters/axle_adapter.d.ts.map +1 -1
  5. package/build/core/adapters/axle_adapter.js +22 -3
  6. package/build/core/adapters/coordinate_mapper.d.ts +1 -1
  7. package/build/core/adapters/coordinate_mapper.js +3 -3
  8. package/build/core/candidates/candidate_generator.d.ts +1 -1
  9. package/build/core/candidates/candidate_generator.js +7 -21
  10. package/build/core/candidates/candidate_validation.d.ts.map +1 -1
  11. package/build/core/candidates/candidate_validation.js +0 -8
  12. package/build/core/evaluation/state_evaluator.d.ts +10 -2
  13. package/build/core/evaluation/state_evaluator.d.ts.map +1 -1
  14. package/build/core/evaluation/state_evaluator.js +26 -7
  15. package/build/core/factory/read_stabilizer_config.d.ts +2 -3
  16. package/build/core/factory/read_stabilizer_config.d.ts.map +1 -1
  17. package/build/core/factory/read_stabilizer_config_helpers.d.ts +5 -9
  18. package/build/core/factory/read_stabilizer_config_helpers.d.ts.map +1 -1
  19. package/build/core/factory/read_stabilizer_config_helpers.js +1 -12
  20. package/build/core/move/apply_move.d.ts +0 -2
  21. package/build/core/move/apply_move.d.ts.map +1 -1
  22. package/build/core/orchestration/StabilizerFlow.d.ts.map +1 -1
  23. package/build/core/orchestration/StabilizerFlow.js +1 -1
  24. package/build/core/orchestration/build_reorder_context.d.ts.map +1 -1
  25. package/build/core/orchestration/build_reorder_context.js +5 -3
  26. package/build/core/strategies/reorder/BeamSearchReorder.d.ts.map +1 -1
  27. package/build/core/strategies/reorder/BeamSearchReorder.js +13 -12
  28. package/build/core/strategies/reorder/GeneticReorder.d.ts.map +1 -1
  29. package/build/core/strategies/reorder/GeneticReorder.js +1 -2
  30. package/build/core/strategies/reorder/SimulatedAnnealingReorder.d.ts.map +1 -1
  31. package/build/core/strategies/reorder/SimulatedAnnealingReorder.js +5 -14
  32. package/build/core/strategies/reorder/beam_context.d.ts +0 -1
  33. package/build/core/strategies/reorder/beam_context.d.ts.map +1 -1
  34. package/build/core/strategies/reorder/greedy_improvement.d.ts.map +1 -1
  35. package/build/core/strategies/reorder/greedy_improvement.js +2 -3
  36. package/build/core/validation/contract/cargo_movement_wire_field_map.d.ts +1 -51
  37. package/build/core/validation/contract/cargo_movement_wire_field_map.d.ts.map +1 -1
  38. package/build/core/validation/contract/cargo_movement_wire_field_map.js +3 -53
  39. package/build/core/validation/contract/cargo_movement_wire_mapper.d.ts.map +1 -1
  40. package/build/core/validation/contract/cargo_movement_wire_mapper.js +1 -10
  41. package/build/core/validation/contract/map_contract_to_wire_shape.d.ts.map +1 -1
  42. package/build/core/validation/contract/map_contract_to_wire_shape.js +13 -18
  43. package/build/core/validation/contract/map_wire_input_to_contract_shape.d.ts.map +1 -1
  44. package/build/core/validation/contract/map_wire_input_to_contract_shape.js +22 -26
  45. package/build/core/validation/contract/parse_stabilizer_input.d.ts +4 -49
  46. package/build/core/validation/contract/parse_stabilizer_input.d.ts.map +1 -1
  47. package/build/core/validation/contract/parse_stabilizer_input.js +0 -2
  48. package/build/core/validation/contract/parse_stabilizer_output.d.ts +2 -34
  49. package/build/core/validation/contract/parse_stabilizer_output.d.ts.map +1 -1
  50. package/build/core/validation/contract/stabilizer_domain_schema.d.ts +56 -36
  51. package/build/core/validation/contract/stabilizer_domain_schema.d.ts.map +1 -1
  52. package/build/core/validation/contract/stabilizer_domain_schema.js +35 -16
  53. package/build/core/validation/contract/stabilizer_input_schema.d.ts +4 -51
  54. package/build/core/validation/contract/stabilizer_input_schema.d.ts.map +1 -1
  55. package/build/core/validation/contract/stabilizer_input_schema.js +2 -2
  56. package/build/core/validation/contract/stabilizer_output_schema.d.ts +4 -68
  57. package/build/core/validation/contract/stabilizer_output_schema.d.ts.map +1 -1
  58. package/build/core/validation/contract/wire_mapper_record_utils.d.ts +0 -14
  59. package/build/core/validation/contract/wire_mapper_record_utils.d.ts.map +1 -1
  60. package/build/core/validation/contract/wire_mapper_record_utils.js +0 -30
  61. package/build/core/validation/schemas/stabilizer_config_schema.d.ts +1 -2
  62. package/build/core/validation/schemas/stabilizer_config_schema.d.ts.map +1 -1
  63. package/build/core/validation/schemas/stabilizer_config_schema.js +1 -2
  64. package/build/index.d.ts +12 -11
  65. package/build/index.d.ts.map +1 -1
  66. package/build/index.js +21 -29
  67. package/package.json +10 -12
  68. package/build/core/adapters/axle_load_evaluation.d.ts +0 -8
  69. package/build/core/adapters/axle_load_evaluation.d.ts.map +0 -1
  70. package/build/core/adapters/axle_load_evaluation.js +0 -1
  71. package/build/core/adapters/build_axle_request.d.ts +0 -8
  72. package/build/core/adapters/build_axle_request.d.ts.map +0 -1
  73. package/build/core/adapters/build_axle_request.js +0 -67
  74. package/build/core/adapters/compute_axle_excess_kg.d.ts +0 -8
  75. package/build/core/adapters/compute_axle_excess_kg.d.ts.map +0 -1
  76. package/build/core/adapters/compute_axle_excess_kg.js +0 -19
  77. package/build/core/adapters/evaluate_axle_load.d.ts +0 -10
  78. package/build/core/adapters/evaluate_axle_load.d.ts.map +0 -1
  79. package/build/core/adapters/evaluate_axle_load.js +0 -32
  80. package/build/core/adapters/map_item_to_stacking_item.d.ts +0 -14
  81. package/build/core/adapters/map_item_to_stacking_item.d.ts.map +0 -1
  82. package/build/core/adapters/map_item_to_stacking_item.js +0 -40
  83. package/build/core/adapters/run_axle_calculator.d.ts +0 -16
  84. package/build/core/adapters/run_axle_calculator.d.ts.map +0 -1
  85. package/build/core/adapters/run_axle_calculator.js +0 -37
  86. package/build/core/candidates/collect_container_slots.d.ts +0 -16
  87. package/build/core/candidates/collect_container_slots.d.ts.map +0 -1
  88. package/build/core/candidates/collect_container_slots.js +0 -20
  89. package/build/core/candidates/enumerate_supporter_top_slots.d.ts +0 -11
  90. package/build/core/candidates/enumerate_supporter_top_slots.d.ts.map +0 -1
  91. package/build/core/candidates/enumerate_supporter_top_slots.js +0 -36
  92. package/build/core/candidates/is_candidate_stacking_valid.d.ts +0 -14
  93. package/build/core/candidates/is_candidate_stacking_valid.d.ts.map +0 -1
  94. package/build/core/candidates/is_candidate_stacking_valid.js +0 -43
  95. package/build/core/candidates/is_elevated_on_supporter_origin.d.ts +0 -14
  96. package/build/core/candidates/is_elevated_on_supporter_origin.d.ts.map +0 -1
  97. package/build/core/candidates/is_elevated_on_supporter_origin.js +0 -28
  98. package/build/core/constants/TieRatioOrientation.d.ts +0 -6
  99. package/build/core/constants/TieRatioOrientation.d.ts.map +0 -1
  100. package/build/core/constants/TieRatioOrientation.js +0 -5
  101. package/build/core/evaluation/compare_search_states.d.ts +0 -12
  102. package/build/core/evaluation/compare_search_states.d.ts.map +0 -1
  103. package/build/core/evaluation/compare_search_states.js +0 -12
  104. package/build/core/evaluation/compute_reorder_objective.d.ts +0 -13
  105. package/build/core/evaluation/compute_reorder_objective.d.ts.map +0 -1
  106. package/build/core/evaluation/compute_reorder_objective.js +0 -13
  107. package/build/core/evaluation/evaluate_search_gates.d.ts +0 -18
  108. package/build/core/evaluation/evaluate_search_gates.d.ts.map +0 -1
  109. package/build/core/evaluation/evaluate_search_gates.js +0 -30
  110. package/build/core/evaluation/evaluation_result.d.ts +0 -15
  111. package/build/core/evaluation/evaluation_result.d.ts.map +0 -1
  112. package/build/core/evaluation/evaluation_result.js +0 -1
  113. package/build/core/evaluation/genetic_fitness.d.ts +0 -9
  114. package/build/core/evaluation/genetic_fitness.d.ts.map +0 -1
  115. package/build/core/evaluation/genetic_fitness.js +0 -16
  116. package/build/core/evaluation/is_non_axle_gates_pass.d.ts +0 -8
  117. package/build/core/evaluation/is_non_axle_gates_pass.d.ts.map +0 -1
  118. package/build/core/evaluation/is_non_axle_gates_pass.js +0 -8
  119. package/build/core/evaluation/is_search_trial_admissible.d.ts +0 -10
  120. package/build/core/evaluation/is_search_trial_admissible.d.ts.map +0 -1
  121. package/build/core/evaluation/is_search_trial_admissible.js +0 -17
  122. package/build/core/evaluation/is_waypoint_order_valid.d.ts +0 -10
  123. package/build/core/evaluation/is_waypoint_order_valid.d.ts.map +0 -1
  124. package/build/core/evaluation/is_waypoint_order_valid.js +0 -14
  125. package/build/core/exceptions/AxleCalculationError.d.ts +0 -4
  126. package/build/core/exceptions/AxleCalculationError.d.ts.map +0 -1
  127. package/build/core/exceptions/AxleCalculationError.js +0 -6
  128. package/build/core/filters/collect_movable_items.d.ts +0 -18
  129. package/build/core/filters/collect_movable_items.d.ts.map +0 -1
  130. package/build/core/filters/collect_movable_items.js +0 -53
  131. package/build/core/filters/collect_pinned_floor_tie_ratio_group_ids.d.ts +0 -8
  132. package/build/core/filters/collect_pinned_floor_tie_ratio_group_ids.d.ts.map +0 -1
  133. package/build/core/filters/collect_pinned_floor_tie_ratio_group_ids.js +0 -41
  134. package/build/core/filters/is_item_on_cm_floor.d.ts +0 -8
  135. package/build/core/filters/is_item_on_cm_floor.d.ts.map +0 -1
  136. package/build/core/filters/is_item_on_cm_floor.js +0 -9
  137. package/build/core/geometry/has_penetrating_overlap.d.ts +0 -9
  138. package/build/core/geometry/has_penetrating_overlap.d.ts.map +0 -1
  139. package/build/core/geometry/has_penetrating_overlap.js +0 -27
  140. package/build/core/strategies/reorder/append_admitted_trial.d.ts +0 -11
  141. package/build/core/strategies/reorder/append_admitted_trial.d.ts.map +0 -1
  142. package/build/core/strategies/reorder/append_admitted_trial.js +0 -22
  143. package/build/core/strategies/reorder/is_improving_greedy_trial.d.ts +0 -10
  144. package/build/core/strategies/reorder/is_improving_greedy_trial.d.ts.map +0 -1
  145. package/build/core/strategies/reorder/is_improving_greedy_trial.js +0 -17
  146. package/build/core/strategies/reorder/select_beam_expansion_candidates.d.ts +0 -9
  147. package/build/core/strategies/reorder/select_beam_expansion_candidates.d.ts.map +0 -1
  148. package/build/core/strategies/reorder/select_beam_expansion_candidates.js +0 -28
  149. package/build/core/strategies/reorder/select_surviving_beam.d.ts +0 -11
  150. package/build/core/strategies/reorder/select_surviving_beam.d.ts.map +0 -1
  151. package/build/core/strategies/reorder/select_surviving_beam.js +0 -13
  152. package/build/core/validation/contract/map_input_config.d.ts +0 -9
  153. package/build/core/validation/contract/map_input_config.d.ts.map +0 -1
  154. package/build/core/validation/contract/map_input_config.js +0 -40
  155. package/build/core/validation/contract/map_wire_item_stacking.d.ts +0 -7
  156. package/build/core/validation/contract/map_wire_item_stacking.d.ts.map +0 -1
  157. package/build/core/validation/contract/map_wire_item_stacking.js +0 -40
  158. package/build/core/validation/contract/map_wire_item_to_contract.d.ts +0 -8
  159. package/build/core/validation/contract/map_wire_item_to_contract.d.ts.map +0 -1
  160. package/build/core/validation/contract/map_wire_item_to_contract.js +0 -51
  161. package/build/core/validation/contract/reject_forbidden_input_fields.d.ts +0 -6
  162. package/build/core/validation/contract/reject_forbidden_input_fields.d.ts.map +0 -1
  163. package/build/core/validation/contract/reject_forbidden_input_fields.js +0 -53
  164. package/build/core/validation/contract/stabilizer_env_schema.d.ts +0 -112
  165. package/build/core/validation/contract/stabilizer_env_schema.d.ts.map +0 -1
  166. package/build/core/validation/contract/stabilizer_env_schema.js +0 -38
  167. package/build/core/validation/contract/stabilizer_item_schema.d.ts +0 -25
  168. package/build/core/validation/contract/stabilizer_item_schema.d.ts.map +0 -1
  169. package/build/core/validation/contract/stabilizer_item_schema.js +0 -23
  170. package/build/core/validation/contract/uniquify_contract_item_ids.d.ts +0 -14
  171. package/build/core/validation/contract/uniquify_contract_item_ids.d.ts.map +0 -1
  172. package/build/core/validation/contract/uniquify_contract_item_ids.js +0 -54
package/CHANGELOG.md CHANGED
@@ -11,29 +11,15 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
11
11
  - Strict English internal I/O contract with bidirectional cargo-movement wire mapper (`map_wire_input_to_contract`, `map_contract_to_wire_output`).
12
12
  - Organization gates: waypoint Z zones, macro delivery order (`preserve_tie_block_organization`), and milkrun wall reservation (`enforce_milkrun_wall_reservation`).
13
13
  - Empty-space candidate discovery for floor and elevated slots via `@jetta/empty-spaces-manager`.
14
- - Supporter-top candidate slots aligned to each stacked item footprint, included in beam expansion (`top_k ∪ supporter_top`).
15
- - Elevated candidates must sit on a supporter `(x, z)` origin so stacked loose items copy the supporter footprint.
16
- - `cargo_stabilizer.pin_tie_ratio_blocks` (default `false`): when true, only **floor five-slot** `3_2`/`2_3` walls stay pinned; stacked tie-ratio items and generic groups stay movable.
17
- - Public contract exports: `parse_stabilizer_input`, `parse_stabilizer_output`, `safe_parse_stabilizer_input`, `safe_parse_stabilizer_output`, `run_stabilize`, and related domain types.
18
- - Closed English I/O: `parse_stabilizer_input` is the only `unknown` boundary; `run_stabilize` takes `StabilizerInput`. Wire aliases are mapped then stripped; `original_input` and item `attributes` bags are rejected.
19
- - Candidate moves are gated with `@jetta/stacking-constraints` `validate_stackings` so illegal family or supported-weight stacks are never emitted.
14
+ - Public contract exports: `parse_stabilizer_input`, `parse_stabilizer_output`, `safe_parse_stabilizer_input`, `safe_parse_stabilizer_output`, and related domain types.
20
15
 
21
16
  ### Changed
22
17
 
23
- - From an overloaded start, beam, greedy, SA, and genetic keep a one-item trial when non-axle gates pass and `axle_excess_kg` is strictly smaller. Once every axle is within `folga`, the hard axle gate returns and overload cannot be re-entered. Ranking prefers lower excess, then higher stability.
24
18
  - README documents I/O contract mapping, configuration keys, dependencies, and test/coverage commands.
25
- - Reorder objective is whole-cargo `transport_score`; loose-item score sum is only a tie-break. Axle, waypoint, and milkrun gates are unchanged.
26
- - `pin_tie_ratio_blocks` pins only floor five-slot `3_2`/`2_3` walls; stacked members of the same group stay movable.
27
- - Axle calculator is called with the object API. `ItemOverlapError` fails the axle gate instead of skipping kg.
28
- - `has_penetrating_overlap` uses `@jetta/number-compare` `lt` for face-touch.
29
-
30
- ### Fixed
31
-
32
- - Face-touching items no longer skip axle kg checks, so beam search cannot shove more mass forward on that skip.
33
19
 
34
20
  ### Testing
35
21
 
36
- - Expanded Mocha suite to 208 tests mirroring `src/` under `test/src/`.
22
+ - Expanded Mocha suite to 126 tests mirroring `src/` under `test/src/`.
37
23
  - Local coverage gate at 80% on lines, functions, branches, and statements (`npm run coverage`).
38
24
  - CI coverage gate at 75% (`npm run coverage:ci`).
39
25
  - Mocha setup preloads core modules so c8 attributes coverage consistently across the full suite.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @jetta/cargo-stabilizer
2
2
 
3
- TypeScript library that reorders items to improve **whole-cargo transport stability**. By default every item is movable; set `cargo_stabilizer.pin_tie_ratio_blocks` to pin **floor five-slot** `3_2`/`2_3` walls. Stacked tie-ratio pieces and generic groups stay movable one item at a time. The reorder objective is `transport_score` (loose-item score sum is a tie-break). Implements five config-selectable strategies with organization gates (waypoint order, milkrun wall reservation) and empty-space candidate discovery (JET-2262).
3
+ TypeScript library that reorders **loose items only** to improve cargo stability while keeping compound blocks pinned. Implements five config-selectable strategies with organization gates (waypoint order, milkrun wall reservation) and empty-space candidate discovery (JET-2262).
4
4
 
5
5
  ## Requirements
6
6
 
@@ -14,7 +14,7 @@ npm ci
14
14
  npm run build
15
15
  ```
16
16
 
17
- Local monorepo development uses `file:` links to `cargo-stability`, `@jetta/axle-load-calculator`, `@jetta/empty-spaces-manager`, `@jetta/number-compare`, and `@jetta/stacking-constraints`.
17
+ Local monorepo development uses `file:` links to `cargo-stability`, `@jetta/axle-load-calculator`, and `@jetta/empty-spaces-manager`.
18
18
 
19
19
  ## Usage
20
20
 
@@ -49,33 +49,30 @@ if (response.status === 'success') {
49
49
 
50
50
  ## I/O contract
51
51
 
52
- `parse_stabilizer_input(unknown)` is the only untyped boundary. `run_stabilize(input: StabilizerInput)` returns a typed `StabilizerResponse`. Wire aliases (`_id`, `w`/`h`/`d`, `eixos`, `algoritmo`) are mapped then stripped; `original_input` and item `attributes` bags are rejected.
53
-
54
- Success `data` is English `cargo_state` (items mutated in `x,y,z` only). Cargo-movement copies those poses onto existing items by `_id`.
52
+ The stabilizer uses a **strict English contract** internally (`src/core/validation/contract/`). Cargo-movement wire payloads keep legacy Portuguese keys; a bidirectional mapper translates at the public boundary.
55
53
 
56
54
  | CM wire | Contract (English) |
57
55
  |---------|-------------------|
58
56
  | `_id` | `item_id` |
59
57
  | `groupId` | `group_id` |
60
58
  | `w`, `h`, `d` | `width`, `height`, `depth` |
61
- | `peso` / `wg` | `weight` |
59
+ | `peso` | `weight` |
62
60
  | `sequencia` | `sequence` |
63
61
  | `largura`, `altura`, `comprimento` | `width`, `height`, `length` |
64
62
  | `eixos` | `axles` |
65
63
 
66
- Flow: `map_wire_input_to_contract` → strict Zod parse → `run_stabilize` → output validation.
64
+ Flow: `map_wire_input_to_contract` → strict Zod parse → stabilizer flow → output validation → `map_contract_to_wire_output`.
67
65
 
68
- Exported parsers: `parse_stabilizer_input`, `parse_stabilizer_output`, `safe_parse_*`, `run_stabilize`.
66
+ Exported parsers: `parse_stabilizer_input`, `parse_stabilizer_output`, `safe_parse_*`.
69
67
 
70
68
  ## Configuration
71
69
 
72
70
  | Key | Default | Description |
73
71
  |-----|---------|-------------|
74
72
  | `cargo_stabilizer.reorder_strategy` | `gravity` | `gravity`, `greedy`, `beam_search`, `simulated_annealing`, `genetic` |
75
- | `cargo_stabilizer.transport_stability_floor` | `0` | Hard minimum transport stability score (gate, not the maximize objective) |
73
+ | `cargo_stabilizer.transport_stability_floor` | `0` | Hard minimum transport stability score |
76
74
  | `cargo_stabilizer.max_iteration` | `10` | Greedy / SA iteration budget |
77
75
  | `cargo_stabilizer.preserve_tie_block_organization` | `true` | When true, enforce waypoint Z zones and macro delivery order |
78
- | `cargo_stabilizer.pin_tie_ratio_blocks` | `false` | When true, do not move floor five-slot `3_2`/`2_3` walls; stacked tie-ratio items and other groups remain movable |
79
76
  | `cargo_stabilizer.enforce_milkrun_wall_reservation` | `false` | When true, reserve rear compound-wall Z bands using profile key below |
80
77
  | `number_of_wall_to_allocate_from_last_waypoints` | `0` | Count of trailing waypoints whose compound walls are reserved (read from `cargo_state.config.algoritmo` when milkrun enforcement is enabled) |
81
78
  | `folga_de_peso_nos_eixos` | `0` | Axle folga percent |
@@ -98,8 +95,6 @@ Runtime integrations (all declared in `package.json`):
98
95
  - `@jetta/cargo-stability` — transport stability scoring gate and objective (`stability_adapter`)
99
96
  - `@jetta/axle-load-calculator` — axle load validation gate (`axle_adapter`)
100
97
  - `@jetta/empty-spaces-manager` — empty-region candidate slot discovery (`empty_space_adapter`)
101
- - `@jetta/number-compare` — face-touch interval tests (`has_penetrating_overlap`)
102
- - `@jetta/stacking-constraints` — family and supported-weight gate on candidate moves
103
98
  - `@jetta/logger` — structured logging at orchestration boundary (transitive via cargo-stability)
104
99
  - `zod` — I/O contract validation
105
100
 
@@ -107,7 +102,7 @@ Runtime integrations (all declared in `package.json`):
107
102
 
108
103
  | Command | Description |
109
104
  |---------|-------------|
110
- | `npm test` | Mocha tests (208 cases) |
105
+ | `npm test` | Mocha tests (126 cases) |
111
106
  | `npm run lint` | ESLint |
112
107
  | `npm run build` | TypeScript compile to `build/` |
113
108
  | `npm run coverage` | Tests with **80%** coverage gate (local) |
@@ -116,11 +111,11 @@ Runtime integrations (all declared in `package.json`):
116
111
 
117
112
  ## Layout
118
113
 
119
- - `src/index.ts` — public API (`stabilize`, `run_stabilize`)
114
+ - `src/index.ts` — public API (`stabilize`)
120
115
  - `src/core/validation/contract/` — strict English I/O contract and CM wire mapper
121
116
  - `src/core/strategies/reorder/` — five reorder algorithms
122
- - `src/core/evaluation/` — shared stability + axle + waypoint gates and search admission
123
- - `src/core/candidates/` — empty-space slot discovery, stacking gate, and candidate ranking
117
+ - `src/core/evaluation/` — shared stability + axle + waypoint gates
118
+ - `src/core/candidates/` — empty-space slot discovery and candidate ranking
124
119
  - `test/src/` — mirrors `src/`; fixtures under `test/data/src/`
125
120
 
126
121
  ## Testing and coverage
@@ -143,7 +138,6 @@ npm test -- --grep "apply_move"
143
138
  npm test -- --grep "state_evaluator"
144
139
  npm test -- --grep "gravity_compaction"
145
140
  npm test -- --grep "reorder_strategy_depth"
146
- npm test -- --grep "is_search_trial_admissible"
147
- npm test -- --grep "is_candidate_stacking_valid"
141
+ npm test -- --grep "strategy_factory"
148
142
  npm run coverage
149
143
  ```
@@ -8,7 +8,6 @@ import type { StabilizerEnv } from '../validation/contract/stabilizer_domain_sch
8
8
  export declare function exceeds_with_folga(final_kg: number, max_kg: number, folga_pct: number): boolean;
9
9
  /**
10
10
  * Validates axle loads for an env using axle-load-calculator.
11
- * Layout overlap from the calculator is a failed gate, not a skip of kg checks.
12
11
  * @param env - Stabilizer env with containers and axles.
13
12
  * @param folga_pct - Axle load margin percent.
14
13
  * @returns True when all axles are within limits.
@@ -1 +1 @@
1
- {"version":3,"file":"axle_adapter.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/axle_adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAA;AAEvF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAGjF"}
1
+ {"version":3,"file":"axle_adapter.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/axle_adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oDAAoD,CAAA;AAEvF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAClB,OAAO,CAGT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAUjF"}
@@ -1,4 +1,5 @@
1
- import { evaluate_axle_load } from './evaluate_axle_load.js';
1
+ import { calculate_weight_on_axles_physics } from '@jetta/axle-load-calculator';
2
+ import { map_contract_to_wire_output } from '../validation/contract/cargo_movement_wire_mapper.js';
2
3
  /**
3
4
  * @param final_kg - Loaded weight including tare.
4
5
  * @param max_kg - Axle supported max.
@@ -10,11 +11,29 @@ export function exceeds_with_folga(final_kg, max_kg, folga_pct) {
10
11
  }
11
12
  /**
12
13
  * Validates axle loads for an env using axle-load-calculator.
13
- * Layout overlap from the calculator is a failed gate, not a skip of kg checks.
14
14
  * @param env - Stabilizer env with containers and axles.
15
15
  * @param folga_pct - Axle load margin percent.
16
16
  * @returns True when all axles are within limits.
17
17
  */
18
18
  export function is_axle_load_valid(env, folga_pct) {
19
- return evaluate_axle_load(env, folga_pct).valid;
19
+ if (!env.axles || env.axles.length === 0) {
20
+ return true;
21
+ }
22
+ const output_env = parse_axle_calculator_output(env);
23
+ const containers = (output_env.containers ?? []);
24
+ return containers.every(container => container_axles_within_folga(container, folga_pct));
25
+ }
26
+ function parse_axle_calculator_output(env) {
27
+ const wire_cargo_state = map_contract_to_wire_output({ envs: [env] });
28
+ const request = { envs: wire_cargo_state.envs };
29
+ const output = JSON.parse(calculate_weight_on_axles_physics(JSON.stringify(request)));
30
+ return output.envs[0];
31
+ }
32
+ function container_axles_within_folga(container, folga_pct) {
33
+ const axles = (container.pesoEixos ?? []);
34
+ return axles.every(axle => {
35
+ const final_kg = Number(axle.pesoCarregadoFinal ?? 0);
36
+ const max_kg = Number(axle.pesoMaxFinal ?? 0);
37
+ return !exceeds_with_folga(final_kg, max_kg, folga_pct);
38
+ });
20
39
  }
@@ -15,7 +15,7 @@ export interface StabilityContainerPayload {
15
15
  item_list: StabilityItemPayload[];
16
16
  }
17
17
  /**
18
- * Maps contract coordinates onto cargo-stability axes (y = height, z = length).
18
+ * Maps contract coordinates to cargo-stability payload coordinates.
19
19
  * @param item - Stabilizer item record.
20
20
  * @returns Stability item payload entry.
21
21
  */
@@ -1,14 +1,14 @@
1
1
  import { item_to_box } from '../geometry/box_geometry.js';
2
2
  /**
3
- * Maps contract coordinates onto cargo-stability axes (y = height, z = length).
3
+ * Maps contract coordinates to cargo-stability payload coordinates.
4
4
  * @param item - Stabilizer item record.
5
5
  * @returns Stability item payload entry.
6
6
  */
7
7
  export function map_item_to_stability(item) {
8
8
  return {
9
9
  x: item.x,
10
- y: item.y,
11
- z: item.z,
10
+ y: item.z,
11
+ z: item.y,
12
12
  w: item.width,
13
13
  h: item.height,
14
14
  l: item.depth
@@ -1,7 +1,7 @@
1
1
  import type { MoveCandidate } from '../move/apply_move.js';
2
2
  import type { CandidateGenerationContext } from './candidate_context.js';
3
3
  /**
4
- * Generates ranked candidate slots from empty-space regions and supporter tops.
4
+ * Generates ranked candidate slots from empty-space regions for a loose item.
5
5
  * @param context - Candidate generation context.
6
6
  * @returns Candidate moves sorted floor-first, same container preferred.
7
7
  */
@@ -1,8 +1,8 @@
1
- import { collect_container_slots } from './collect_container_slots.js';
1
+ import { enumerate_empty_space_slots } from './enumerate_empty_space_slots.js';
2
2
  import { is_candidate_valid } from './candidate_validation.js';
3
3
  import { rank_candidates } from './rank_candidates.js';
4
4
  /**
5
- * Generates ranked candidate slots from empty-space regions and supporter tops.
5
+ * Generates ranked candidate slots from empty-space regions for a loose item.
6
6
  * @param context - Candidate generation context.
7
7
  * @returns Candidate moves sorted floor-first, same container preferred.
8
8
  */
@@ -11,32 +11,18 @@ export function generate_candidates(context) {
11
11
  return rank_candidates(candidates, context.loose.container_index);
12
12
  }
13
13
  function build_container_candidates(context, container, target_index) {
14
+ const slots = enumerate_empty_space_slots(container, context.loose.item, context.loose.item_id);
14
15
  const candidates = [];
15
- for (const tagged of collect_container_slots(container, context.loose.item, context.loose.item_id)) {
16
- if (!is_candidate_valid(context, target_index, tagged.position)) {
16
+ for (const position of slots) {
17
+ if (!is_candidate_valid(context, target_index, position)) {
17
18
  continue;
18
19
  }
19
20
  candidates.push({
20
21
  item_id: context.loose.item_id,
21
22
  source_container_index: context.loose.container_index,
22
23
  target_container_index: target_index,
23
- new_position: tagged.position,
24
- slot_kind: tagged.slot_kind
24
+ new_position: position
25
25
  });
26
26
  }
27
- return unique_kind_positions(candidates);
28
- }
29
- function unique_kind_positions(candidates) {
30
- const seen = new Set();
31
- const unique = [];
32
- for (const candidate of candidates) {
33
- const position = candidate.new_position;
34
- const key = `${position.x}:${position.y}:${position.z}:${candidate.target_container_index}`;
35
- if (seen.has(key)) {
36
- continue;
37
- }
38
- seen.add(key);
39
- unique.push(candidate);
40
- }
41
- return unique;
27
+ return candidates;
42
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"candidate_validation.d.ts","sourceRoot":"","sources":["../../../src/core/candidates/candidate_validation.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAIxE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAmBT"}
1
+ {"version":3,"file":"candidate_validation.d.ts","sourceRoot":"","sources":["../../../src/core/candidates/candidate_validation.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAExE;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,OAAO,CAWT"}
@@ -3,8 +3,6 @@ import { has_overlap, is_fully_supported, is_inside_container } from '../geometr
3
3
  import { is_position_in_zone } from '../waypoint/build_waypoint_zones.js';
4
4
  import { is_position_in_milkrun_reserved_band } from '../waypoint/milkrun_wall_reservation.js';
5
5
  import { resolve_item_waypoint_id } from '../waypoint/validate_waypoint_ids.js';
6
- import { is_elevated_on_supporter_origin } from './is_elevated_on_supporter_origin.js';
7
- import { is_candidate_stacking_valid } from './is_candidate_stacking_valid.js';
8
6
  /**
9
7
  * Validates geometry and waypoint constraints for a candidate position.
10
8
  * @param context - Candidate generation context.
@@ -16,15 +14,9 @@ export function is_candidate_valid(context, target_index, position) {
16
14
  if (!is_candidate_geometry_valid(context, target_index, position)) {
17
15
  return false;
18
16
  }
19
- if (!is_elevated_on_supporter_origin(context, target_index, position)) {
20
- return false;
21
- }
22
17
  if (!is_candidate_milkrun_valid(context, target_index, position)) {
23
18
  return false;
24
19
  }
25
- if (!is_candidate_stacking_valid(context, target_index, position)) {
26
- return false;
27
- }
28
20
  return is_candidate_waypoint_valid(context, target_index, position);
29
21
  }
30
22
  function is_candidate_milkrun_valid(context, target_index, position) {
@@ -1,8 +1,16 @@
1
1
  import type { StabilizerContainer } from '../validation/contract/stabilizer_domain_schema.js';
2
+ import { type StabilityEvaluation } from '../adapters/stability_adapter.js';
2
3
  import type { StateEvaluationContext } from './evaluation_context.js';
3
4
  import type { ReorderContext } from '../strategies/reorder/ReorderStrategy.js';
4
- import type { EvaluationResult } from './evaluation_result.js';
5
- export type { EvaluationResult };
5
+ export interface EvaluationResult {
6
+ stability: StabilityEvaluation;
7
+ objective: number;
8
+ transport_floor_valid: boolean;
9
+ axle_valid: boolean;
10
+ waypoint_valid: boolean;
11
+ milkrun_valid: boolean;
12
+ all_gates_pass: boolean;
13
+ }
6
14
  /**
7
15
  * Evaluates a container layout against all stabilizer gates.
8
16
  * @param containers - Container layout to evaluate.
@@ -1 +1 @@
1
- {"version":3,"file":"state_evaluator.d.ts","sourceRoot":"","sources":["../../../src/core/evaluation/state_evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAG7F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAI9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE9D,YAAY,EAAE,gBAAgB,EAAE,CAAA;AAEhC;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,sBAAsB,GAChC,gBAAgB,CAUlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,mBAAmB,EAAE,EAC5B,OAAO,EAAE,sBAAsB,GAChC,gBAAgB,CAGlB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,cAAc,GAAG,sBAAsB,CAU/F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAGvF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACvC,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,sBAAsB,GAChC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAMrD"}
1
+ {"version":3,"file":"state_evaluator.d.ts","sourceRoot":"","sources":["../../../src/core/evaluation/state_evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAGH,KAAK,mBAAmB,EAC3B,MAAM,kCAAkC,CAAA;AAKzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAE9E,MAAM,WAAW,gBAAgB;IAE7B,SAAS,EAAE,mBAAmB,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,UAAU,EAAE,OAAO,CAAA;IACnB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,sBAAsB,GAChC,gBAAgB,CAUlB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,mBAAmB,EAAE,EAC5B,OAAO,EAAE,sBAAsB,GAChC,gBAAgB,CAGlB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,cAAc,GAAG,sBAAsB,CAU/F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAGvF;AAwBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACvC,UAAU,EAAE,mBAAmB,EAAE,EACjC,OAAO,EAAE,sBAAsB,GAChC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAMrD"}
@@ -1,8 +1,8 @@
1
- import { try_evaluate_transport_stability } from '../adapters/stability_adapter.js';
2
- import { clone_containers } from '../move/apply_move.js';
3
- import { evaluate_search_gates } from './evaluate_search_gates.js';
4
- import { is_waypoint_order_valid } from './is_waypoint_order_valid.js';
1
+ import { try_evaluate_transport_stability, sum_loose_item_scores } from '../adapters/stability_adapter.js';
2
+ import { is_axle_load_valid } from '../adapters/axle_adapter.js';
3
+ import { preserves_waypoint_order } from '../waypoint/preserves_waypoint_order.js';
5
4
  import { is_layout_milkrun_valid } from '../waypoint/milkrun_wall_reservation.js';
5
+ import { clone_containers } from '../move/apply_move.js';
6
6
  /**
7
7
  * Evaluates a container layout against all stabilizer gates.
8
8
  * @param containers - Container layout to evaluate.
@@ -14,7 +14,7 @@ export function evaluate_state(containers, context) {
14
14
  if (!stability) {
15
15
  return invalid_evaluation_result();
16
16
  }
17
- const gates = evaluate_search_gates(containers, context, stability);
17
+ const gates = evaluate_gates(containers, context, stability);
18
18
  return { stability, objective: gates.objective, ...gates.flags, all_gates_pass: gates.pass };
19
19
  }
20
20
  /**
@@ -49,6 +49,19 @@ export function evaluation_context_from_reorder(context) {
49
49
  export function clone_baseline(containers) {
50
50
  return clone_containers(containers);
51
51
  }
52
+ function evaluate_gates(containers, context, stability) {
53
+ const objective = sum_loose_item_scores(stability, containers, context.loose_items);
54
+ const transport_floor_valid = stability.transport_score >= context.config.transport_stability_floor;
55
+ const axle_valid = is_axle_load_valid({ ...context.env, containers }, context.config.axle_load_margin_percent);
56
+ const waypoint_valid = is_waypoint_order_valid(containers, context);
57
+ const milkrun_valid = is_layout_milkrun_valid(containers, context.milkrun_reserved_z_bands);
58
+ const flags = { transport_floor_valid, axle_valid, waypoint_valid, milkrun_valid };
59
+ return {
60
+ objective,
61
+ pass: transport_floor_valid && axle_valid && waypoint_valid && milkrun_valid,
62
+ flags
63
+ };
64
+ }
52
65
  /**
53
66
  * Evaluates organization constraint gates without stability or axle checks.
54
67
  * @param containers - Container layout to evaluate.
@@ -61,6 +74,13 @@ export function evaluate_organization_gates(containers, context) {
61
74
  milkrun_valid: is_layout_milkrun_valid(containers, context.milkrun_reserved_z_bands)
62
75
  };
63
76
  }
77
+ function is_waypoint_order_valid(containers, context) {
78
+ if (context.waypoint_mode.kind === 'SINGLE_WAYPOINT' ||
79
+ !context.config.preserve_tie_block_organization) {
80
+ return true;
81
+ }
82
+ return preserves_waypoint_order(context.baseline_containers, containers, context.waypoint_mode);
83
+ }
64
84
  function invalid_evaluation_result() {
65
85
  return {
66
86
  stability: { item_scores: [], container_scores: [], transport_score: 0 },
@@ -69,7 +89,6 @@ function invalid_evaluation_result() {
69
89
  axle_valid: false,
70
90
  waypoint_valid: false,
71
91
  milkrun_valid: false,
72
- all_gates_pass: false,
73
- axle_excess_kg: Number.POSITIVE_INFINITY
92
+ all_gates_pass: false
74
93
  };
75
94
  }
@@ -1,11 +1,10 @@
1
1
  import { type StabilizerConfig } from '../validation/schemas/stabilizer_config_schema.js';
2
+ import type { StabilizerCargoState } from '../validation/contract/stabilizer_domain_schema.js';
2
3
  /**
3
4
  * Reads stabilizer config from cargo-movement config and cargo profile algoritmo maps.
4
5
  * @param config - Top-level stabilizer input config object.
5
6
  * @param cargo_state - Cargo profile (optional) for merged algoritmo keys.
6
7
  * @returns Parsed stabilizer configuration.
7
8
  */
8
- export declare function read_stabilizer_config(config: Record<string, unknown> | undefined, cargo_state?: {
9
- config?: unknown;
10
- }): StabilizerConfig;
9
+ export declare function read_stabilizer_config(config: Record<string, unknown> | undefined, cargo_state?: StabilizerCargoState): StabilizerConfig;
11
10
  //# sourceMappingURL=read_stabilizer_config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read_stabilizer_config.d.ts","sourceRoot":"","sources":["../../../src/core/factory/read_stabilizer_config.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,gBAAgB,EACxB,MAAM,mDAAmD,CAAA;AAG1D;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,WAAW,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACnC,gBAAgB,CAYlB"}
1
+ {"version":3,"file":"read_stabilizer_config.d.ts","sourceRoot":"","sources":["../../../src/core/factory/read_stabilizer_config.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,gBAAgB,EACxB,MAAM,mDAAmD,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AAG9F;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,WAAW,CAAC,EAAE,oBAAoB,GACnC,gBAAgB,CAYlB"}
@@ -1,23 +1,17 @@
1
- type CargoStateConfigHolder = {
2
- config?: unknown;
3
- };
1
+ import type { StabilizerCargoState } from '../validation/contract/stabilizer_domain_schema.js';
4
2
  /**
5
3
  * Merges root and cargo profile algoritmo maps (profile overrides root).
6
4
  * @param config - Root stabilizer input config.
7
5
  * @param cargo_state - Cargo profile state.
8
6
  * @returns Merged algoritmo map.
9
7
  */
10
- export declare function merge_algoritmo_maps(config: Record<string, unknown> | undefined, cargo_state?: CargoStateConfigHolder): Record<string, unknown>;
8
+ export declare function merge_algoritmo_maps(config: Record<string, unknown> | undefined, cargo_state?: StabilizerCargoState): Record<string, unknown>;
11
9
  /**
12
10
  * Reads raw stabilizer config fields from merged algoritmo map.
13
11
  * @param algoritmo - Merged algoritmo configuration map.
14
12
  * @returns Raw config object for schema parsing.
15
13
  */
16
14
  export declare function read_raw_stabilizer_config(algoritmo: Record<string, unknown>): {
17
- preserve_tie_block_organization: boolean;
18
- pin_tie_ratio_blocks: boolean;
19
- enforce_milkrun_wall_reservation: boolean;
20
- number_of_wall_to_allocate_from_last_waypoints: number;
21
15
  reorder_strategy: string;
22
16
  transport_stability_floor: number;
23
17
  max_iteration: number;
@@ -27,6 +21,8 @@ export declare function read_raw_stabilizer_config(algoritmo: Record<string, unk
27
21
  beam_width: number;
28
22
  beam_top_k: number;
29
23
  axle_load_margin_percent: number;
24
+ preserve_tie_block_organization: boolean;
25
+ enforce_milkrun_wall_reservation: boolean;
26
+ number_of_wall_to_allocate_from_last_waypoints: number;
30
27
  };
31
- export {};
32
28
  //# sourceMappingURL=read_stabilizer_config_helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read_stabilizer_config_helpers.d.ts","sourceRoot":"","sources":["../../../src/core/factory/read_stabilizer_config_helpers.ts"],"names":[],"mappings":"AAGA,KAAK,sBAAsB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAKlD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,WAAW,CAAC,EAAE,sBAAsB,GACrC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;;EAM5E"}
1
+ {"version":3,"file":"read_stabilizer_config_helpers.d.ts","sourceRoot":"","sources":["../../../src/core/factory/read_stabilizer_config_helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AAK9F;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,WAAW,CAAC,EAAE,oBAAoB,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;;;;;;;;;EAwB5E"}
@@ -19,12 +19,6 @@ export function merge_algoritmo_maps(config, cargo_state) {
19
19
  * @returns Raw config object for schema parsing.
20
20
  */
21
21
  export function read_raw_stabilizer_config(algoritmo) {
22
- return {
23
- ...read_search_raw(algoritmo),
24
- ...read_organization_raw(algoritmo)
25
- };
26
- }
27
- function read_search_raw(algoritmo) {
28
22
  return {
29
23
  reorder_strategy: read_config_string(algoritmo, 'reorder_strategy', REORDER_STRATEGY.GRAVITY),
30
24
  transport_stability_floor: read_config_number(algoritmo, 'transport_stability_floor', 0),
@@ -34,13 +28,8 @@ function read_search_raw(algoritmo) {
34
28
  genetic_mutation_rate: read_config_number(algoritmo, 'genetic_mutation_rate', 0.15),
35
29
  beam_width: read_config_number(algoritmo, 'beam_width', 5),
36
30
  beam_top_k: read_config_number(algoritmo, 'beam_top_k', 3),
37
- axle_load_margin_percent: read_config_number(algoritmo, 'folga_de_peso_nos_eixos', 0)
38
- };
39
- }
40
- function read_organization_raw(algoritmo) {
41
- return {
31
+ axle_load_margin_percent: read_config_number(algoritmo, 'folga_de_peso_nos_eixos', 0),
42
32
  preserve_tie_block_organization: read_config_boolean(algoritmo, 'preserve_tie_block_organization', true),
43
- pin_tie_ratio_blocks: read_config_boolean(algoritmo, 'pin_tie_ratio_blocks', false),
44
33
  enforce_milkrun_wall_reservation: read_config_boolean(algoritmo, 'enforce_milkrun_wall_reservation', false),
45
34
  number_of_wall_to_allocate_from_last_waypoints: read_milkrun_wall_count(algoritmo)
46
35
  };
@@ -1,5 +1,4 @@
1
1
  import type { StabilizerContainer } from '../validation/contract/stabilizer_domain_schema.js';
2
- export type CandidateSlotKind = 'empty_space' | 'supporter_top';
3
2
  export interface MoveCandidate {
4
3
  item_id: string;
5
4
  source_container_index: number;
@@ -9,7 +8,6 @@ export interface MoveCandidate {
9
8
  y: number;
10
9
  z: number;
11
10
  };
12
- slot_kind?: CandidateSlotKind;
13
11
  }
14
12
  /**
15
13
  * Applies a move candidate to containers (mutates arrays in place).
@@ -1 +1 @@
1
- {"version":3,"file":"apply_move.d.ts","sourceRoot":"","sources":["../../../src/core/move/apply_move.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,eAAe,CAAA;AAE/D,MAAM,WAAW,aAAa;IAE1B,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACjD,SAAS,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACtB,UAAU,EAAE,mBAAmB,EAAE,EACjC,SAAS,EAAE,aAAa,GACzB,IAAI,CAgBN;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAGzF"}
1
+ {"version":3,"file":"apply_move.d.ts","sourceRoot":"","sources":["../../../src/core/move/apply_move.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,WAAW,aAAa;IAE1B,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACpD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACtB,UAAU,EAAE,mBAAmB,EAAE,EACjC,SAAS,EAAE,aAAa,GACzB,IAAI,CAgBN;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAGzF"}
@@ -1 +1 @@
1
- {"version":3,"file":"StabilizerFlow.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/StabilizerFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AAO9F;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,oBAAoB,CAgBhF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,OAAO,GAAG,oBAAoB,CAI1F"}
1
+ {"version":3,"file":"StabilizerFlow.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/StabilizerFlow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AACxF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAA;AAO9F;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,oBAAoB,CAiBhF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,OAAO,GAAG,oBAAoB,CAI1F"}
@@ -9,7 +9,7 @@ import { stabilizer_logger } from '../logging/stabilizer_logger.js';
9
9
  * @returns Updated cargo_state.
10
10
  */
11
11
  export function run_stabilizer_flow(input) {
12
- const config = read_stabilizer_config(input.config);
12
+ const config = read_stabilizer_config(input.config, input.cargo_state);
13
13
  const context = build_reorder_context(input, config);
14
14
  stabilizer_logger.debug('reorder_strategy=' + config.reorder_strategy);
15
15
  stabilizer_logger.debug('container_count=' + context.containers.length +
@@ -1 +1 @@
1
- {"version":3,"file":"build_reorder_context.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/build_reorder_context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAQ9E;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACzB,cAAc,CAqBhB"}
1
+ {"version":3,"file":"build_reorder_context.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/build_reorder_context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAA;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mDAAmD,CAAA;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAQ9E;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACzB,cAAc,CAsBhB"}
@@ -1,4 +1,4 @@
1
- import { collect_movable_items } from '../filters/collect_movable_items.js';
1
+ import { collect_loose_items } from '../filters/loose_item_filter.js';
2
2
  import { validate_waypoint_ids } from '../waypoint/validate_waypoint_ids.js';
3
3
  import { build_waypoint_zones } from '../waypoint/build_waypoint_zones.js';
4
4
  import { build_milkrun_bands_from_config } from './build_milkrun_bands_from_config.js';
@@ -12,13 +12,15 @@ import { clone_containers } from '../move/apply_move.js';
12
12
  */
13
13
  export function build_reorder_context(input, config) {
14
14
  const env = read_primary_env(input);
15
- const waypoint_mode = validate_waypoint_ids(env.containers.flatMap(container => container.items));
15
+ const all_items = env.containers.flatMap(container => container.items);
16
+ const waypoint_mode = validate_waypoint_ids(all_items);
17
+ const loose_items = collect_loose_items(env.containers);
16
18
  const baseline_containers = clone_containers(env.containers);
17
19
  return {
18
20
  env,
19
21
  containers: env.containers,
20
22
  baseline_containers,
21
- loose_items: collect_movable_items(env.containers, config.pin_tie_ratio_blocks),
23
+ loose_items,
22
24
  config,
23
25
  waypoint_mode,
24
26
  waypoint_zones: build_waypoint_zones(baseline_containers, waypoint_mode),
@@ -1 +1 @@
1
- {"version":3,"file":"BeamSearchReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/BeamSearchReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;AAehG;;GAEG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IAErD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE;CAoBtD"}
1
+ {"version":3,"file":"BeamSearchReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/BeamSearchReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;AAYhG;;GAEG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IAErD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE;CAkBtD"}
@@ -1,11 +1,8 @@
1
1
  import { generate_candidates } from '../../candidates/candidate_generator.js';
2
2
  import { candidate_context_for_loose } from '../../candidates/build_candidate_context.js';
3
- import { select_beam_expansion_candidates } from './select_beam_expansion_candidates.js';
4
- import { clone_containers } from '../../move/apply_move.js';
3
+ import { apply_move, clone_containers } from '../../move/apply_move.js';
5
4
  import { evaluate_trial_layout, evaluation_context_from_reorder } from '../../evaluation/state_evaluator.js';
6
5
  import { read_item_score } from '../../adapters/stability_adapter.js';
7
- import { select_surviving_beam } from './select_surviving_beam.js';
8
- import { append_admitted_trial } from './append_admitted_trial.js';
9
6
  /**
10
7
  * Beam search reorder with configurable width and top-K expansion.
11
8
  */
@@ -13,11 +10,9 @@ export class BeamSearchReorder {
13
10
  run(context) {
14
11
  const eval_context = evaluation_context_from_reorder(context);
15
12
  const sorted = sort_loose_by_stability(context, eval_context);
16
- const root_eval = evaluate_trial_layout(context.containers, eval_context);
17
13
  let beam = [{
18
14
  containers: clone_containers(context.containers),
19
- objective: root_eval.objective,
20
- axle_excess_kg: root_eval.axle_excess_kg
15
+ objective: evaluate_trial_layout(context.containers, eval_context).objective
21
16
  }];
22
17
  for (const loose of sorted) {
23
18
  beam = expand_beam({ reorder: context, evaluation: eval_context, beam, loose });
@@ -38,15 +33,21 @@ function expand_beam(request) {
38
33
  loose: request.loose
39
34
  });
40
35
  }
41
- return select_surviving_beam(expanded, request.beam, request.reorder.config.beam_width);
36
+ expanded.sort((left, right) => right.objective - left.objective);
37
+ return expanded.slice(0, request.reorder.config.beam_width);
42
38
  }
43
39
  function append_beam_branches(beam_context) {
44
- const { reorder, evaluation, state, loose } = beam_context;
40
+ const { reorder, evaluation, expanded, state, loose } = beam_context;
45
41
  const loose_ref = { ...loose, container_index: find_container_index(state.containers, loose.item_id) };
46
- const parent_eval = evaluate_trial_layout(state.containers, evaluation);
47
- const candidates = select_beam_expansion_candidates(generate_candidates(candidate_context_for_loose(reorder, state.containers, loose_ref)), reorder.config.beam_top_k);
42
+ const candidates = generate_candidates(candidate_context_for_loose(reorder, state.containers, loose_ref)).slice(0, reorder.config.beam_top_k);
48
43
  for (const candidate of candidates) {
49
- append_admitted_trial(beam_context, parent_eval, candidate);
44
+ const trial = clone_containers(state.containers);
45
+ apply_move(trial, candidate);
46
+ const result = evaluate_trial_layout(trial, evaluation);
47
+ if (!result.all_gates_pass) {
48
+ continue;
49
+ }
50
+ expanded.push({ containers: trial, objective: result.objective });
50
51
  }
51
52
  }
52
53
  function sort_loose_by_stability(context, eval_context) {
@@ -1 +1 @@
1
- {"version":3,"file":"GeneticReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/GeneticReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;AAchG;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IAElD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE;CAgBtD"}
1
+ {"version":3,"file":"GeneticReorder.d.ts","sourceRoot":"","sources":["../../../../src/core/strategies/reorder/GeneticReorder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAA;AAahG;;GAEG;AACH,qBAAa,cAAe,YAAW,eAAe;IAElD,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,mBAAmB,EAAE;CAgBtD"}