factorysemantics-mes 0.4.0__tar.gz → 0.4.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 (1043) hide show
  1. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/doctor_writes_nothing_of_yours.py +2 -3
  2. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/plant_from_shape.py +16 -2
  3. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/plant_from_wheel.py +81 -6
  4. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/recover_a_half_dead_plant.py +26 -5
  5. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/ci.yml +4 -2
  6. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/scorecard.yml +1 -1
  7. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.gitignore +5 -0
  8. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/CHANGELOG.md +78 -2
  9. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/CITATION.cff +2 -2
  10. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/PKG-INFO +9 -3
  11. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/README.md +7 -1
  12. factorysemantics_mes-0.4.2/docker/docker-compose.record.yml +22 -0
  13. factorysemantics_mes-0.4.2/docs/assets/kill-a-node.gif +0 -0
  14. factorysemantics_mes-0.4.2/docs/assets/kill-a-node.mp4 +0 -0
  15. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/compatibility.md +9 -9
  16. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/redundancy.md +27 -0
  17. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/run-it-on-your-own-box.md +26 -5
  18. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/upgrade.md +96 -2
  19. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/releases/0.4.0.md +1 -5
  20. factorysemantics_mes-0.4.2/docs/releases/0.4.1.md +55 -0
  21. factorysemantics_mes-0.4.2/docs/releases/0.4.2.md +59 -0
  22. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/releases/index.md +2 -0
  23. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/mkdocs.yml +2 -0
  24. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/pyproject.toml +1 -1
  25. factorysemantics_mes-0.4.2/scripts/record-kill-a-node.html +104 -0
  26. factorysemantics_mes-0.4.2/scripts/record-kill-a-node.py +363 -0
  27. factorysemantics_mes-0.4.2/scripts/record-kill-a-node.sh +319 -0
  28. factorysemantics_mes-0.4.2/scripts/record-scene.py +1544 -0
  29. factorysemantics_mes-0.4.2/scripts/scenes/01-trace-the-lot.toml +168 -0
  30. factorysemantics_mes-0.4.2/scripts/scenes/02-spc-on-the-line.toml +217 -0
  31. factorysemantics_mes-0.4.2/scripts/scenes/04-work-orders-and-routings.toml +145 -0
  32. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/1-install.md +30 -29
  33. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/__init__.py +1 -1
  34. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/cli.py +18 -0
  35. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/firstrun.py +52 -8
  36. factorysemantics_mes-0.4.2/src/fsmes/migrations/versions/2c6e817b9faf_status_columns_are_plain_text_on_postgresql.py +99 -0
  37. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d7b4e92a1c58_the_maintenance_crew_and_its_rules.py +5 -4
  38. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/plant.py +134 -16
  39. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/shadow.py +3 -1
  40. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/adjustments.js +2 -7
  41. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/admin.js +3 -8
  42. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ai.js +20 -3
  43. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/analysis.js +2 -9
  44. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/app.js +2 -4
  45. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/coa.js +2 -7
  46. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/common.js +31 -2
  47. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/config.js +2 -7
  48. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/gauges.js +2 -7
  49. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/instructions.js +2 -7
  50. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/app.js +3 -8
  51. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line-page.js +5 -7
  52. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/machine.js +2 -7
  53. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/machines.js +2 -7
  54. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/maintenance.js +2 -7
  55. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/masterdata.js +2 -7
  56. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ops.js +3 -8
  57. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/orders.js +2 -7
  58. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/quality.js +2 -7
  59. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/reasons.js +2 -7
  60. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/schedule.js +2 -7
  61. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/severities.js +2 -7
  62. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/spc.js +3 -8
  63. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/station.js +2 -7
  64. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/tags.js +2 -7
  65. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/trace.js +5 -10
  66. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/triggers.js +2 -7
  67. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_can_run_as_two_nodes_on_one_box_and_the_fleet_knows_both.py +11 -13
  68. factorysemantics_mes-0.4.2/tests/test_a_postgresql_plant_upgraded_in_place_accepts_every_word_the_code_writes.py +173 -0
  69. factorysemantics_mes-0.4.2/tests/test_a_recorded_scene_keeps_its_badge_and_its_budget.py +242 -0
  70. factorysemantics_mes-0.4.2/tests/test_a_scene_says_exactly_what_its_script_file_says.py +289 -0
  71. factorysemantics_mes-0.4.2/tests/test_a_scene_scrolls_the_row_its_caption_names_into_view.py +100 -0
  72. factorysemantics_mes-0.4.2/tests/test_a_take_may_only_write_to_a_plant_on_this_box.py +127 -0
  73. factorysemantics_mes-0.4.2/tests/test_every_click_in_a_scene_says_where_on_the_frame_it_landed.py +273 -0
  74. factorysemantics_mes-0.4.2/tests/test_every_screen_header_dot_says_live.py +257 -0
  75. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_one_reader_at_a_time_is_a_lease_in_the_database.py +7 -3
  76. factorysemantics_mes-0.4.2/tests/test_stop_waits_for_the_ports_it_was_listening_on.py +234 -0
  77. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_demo_path_says_what_is_wrong_and_what_to_type.py +124 -0
  78. factorysemantics_mes-0.4.2/tests/test_the_trace_scene_rolls_on_finished_orders_and_writes_nothing.py +241 -0
  79. factorysemantics_mes-0.4.2/tests/test_the_work_orders_clip_leaves_finishing_the_step_to_a_person.py +305 -0
  80. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/uv.lock +137 -146
  81. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.dockerignore +0 -0
  82. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.env.example +0 -0
  83. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/CODEOWNERS +0 -0
  84. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  85. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  86. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/ISSUE_TEMPLATE/integration.yml +0 -0
  87. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/ISSUE_TEMPLATE/plant-pack.yml +0 -0
  88. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  89. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/dependabot.yml +0 -0
  90. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/assistant_folder_from_the_wheel.py +0 -0
  91. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/demo_from_wheel.sh +0 -0
  92. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/lab_starters.sh +0 -0
  93. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/release_notes.sh +0 -0
  94. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/two_nodes_on_one_box.py +0 -0
  95. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/scripts/upgrade_from_previous_release.sh +0 -0
  96. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/dco.yml +0 -0
  97. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/docs.yml +0 -0
  98. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/erpnext-live.yml +0 -0
  99. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/release.yml +0 -0
  100. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/.github/workflows/welcome.yml +0 -0
  101. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/CODE_OF_CONDUCT.md +0 -0
  102. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/CONTRIBUTING.md +0 -0
  103. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/GOVERNANCE.md +0 -0
  104. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/LICENSE +0 -0
  105. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/MAINTAINERS.md +0 -0
  106. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/NOTICE +0 -0
  107. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/ROADMAP.md +0 -0
  108. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/SECURITY.md +0 -0
  109. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/alembic.ini +0 -0
  110. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/inbound_mapping.json +0 -0
  111. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/inbound_sql.json +0 -0
  112. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/line_layout.json +0 -0
  113. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/tag_map.json +0 -0
  114. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/tag_map_kepsim.json +0 -0
  115. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/config/tag_map_kepware.json +0 -0
  116. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/deploy/README.md +0 -0
  117. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/deploy/fsmes-autoloop.service +0 -0
  118. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/deploy/fsmes-autoloop.timer +0 -0
  119. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/deploy/fsmes-prod-plant@.service +0 -0
  120. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/deploy/promote.sh +0 -0
  121. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/Dockerfile +0 -0
  122. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/docker-compose.redundant.yml +0 -0
  123. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/docker-compose.yml +0 -0
  124. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/nginx.conf +0 -0
  125. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/nginx.redundant.conf +0 -0
  126. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/redundant/fleet.toml +0 -0
  127. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docker/redundant/plant.toml +0 -0
  128. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ARCHITECTURE.md +0 -0
  129. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/LANDSCAPE.md +0 -0
  130. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/agents/connect-mcp-client.md +0 -0
  131. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/agents/evals.md +0 -0
  132. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/agents/index.md +0 -0
  133. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/agents/write-discipline.md +0 -0
  134. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/ASSIST-EVAL.md +0 -0
  135. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/BUDGET.md +0 -0
  136. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/JEV-CALIBRATION.md +0 -0
  137. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/JEV.md +0 -0
  138. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/JUDGMENT-IN-THE-BUILD-LOOP.md +0 -0
  139. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/OBSERVABILITY.md +0 -0
  140. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/assist-eval/2026-09-27-live-admin.md +0 -0
  141. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/assist-eval/2026-09-27-live-operator.md +0 -0
  142. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/assist-eval/2026-09-27-scripted.md +0 -0
  143. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/calibration.md +0 -0
  144. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/d1-against-truth.json +0 -0
  145. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/d1-component-stopped-reporting.svg +0 -0
  146. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/d1-counter-went-backwards.svg +0 -0
  147. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/p1-by-confidence.svg +0 -0
  148. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/full/p1-by-probability.svg +0 -0
  149. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/calibration.md +0 -0
  150. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-against-truth.json +0 -0
  151. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-component-stopped-reporting.svg +0 -0
  152. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-counter-went-backwards.svg +0 -0
  153. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-confidence.svg +0 -0
  154. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-probability.svg +0 -0
  155. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/assets/walk.gif +0 -0
  156. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0001-apache-2-with-dco.md +0 -0
  157. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0002-kernel-and-modules.md +0 -0
  158. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0003-one-mcp-server.md +0 -0
  159. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0004-never-invent-production.md +0 -0
  160. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0005-plain-html-no-build-step.md +0 -0
  161. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0006-sqlite-laptop-postgresql-plant.md +0 -0
  162. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0007-fresh-public-history.md +0 -0
  163. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0008-erp-connectors-are-modules.md +0 -0
  164. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0009-organisation-not-personal-account.md +0 -0
  165. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0010-github-discussions-only.md +0 -0
  166. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0011-mkdocs-material-generated-reference.md +0 -0
  167. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0012-contributor-covenant-3.md +0 -0
  168. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0013-governance-is-one-page.md +0 -0
  169. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0014-first-public-version-is-0-1-0.md +0 -0
  170. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0015-mcp-registry-name.md +0 -0
  171. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0016-no-trademark-registration.md +0 -0
  172. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0017-one-public-demo-gated-and-bounded.md +0 -0
  173. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0018-public-on-2026-09-08-and-the-pre-tag-check.md +0 -0
  174. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0019-count-everything-the-machine-counted.md +0 -0
  175. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0020-what-supported-means-for-an-erp-connector.md +0 -0
  176. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0021-one-database-per-plant.md +0 -0
  177. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0022-what-a-plant-pack-may-contain.md +0 -0
  178. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0023-the-fleet-console-observes.md +0 -0
  179. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0024-a-nonconformance-has-a-life.md +0 -0
  180. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0025-performance-is-measured-not-capped.md +0 -0
  181. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0026-counts-that-outrun-the-run-time.md +0 -0
  182. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0027-an-spc-signal-raises-a-hold.md +0 -0
  183. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0028-which-shift-a-minute-belongs-to.md +0 -0
  184. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0029-an-order-does-not-finish-itself.md +0 -0
  185. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0030-a-lost-connection-is-unknown-time.md +0 -0
  186. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0031-a-judgment-is-a-proposal.md +0 -0
  187. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0032-a-hosted-judgment-and-the-shadow.md +0 -0
  188. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0033-availability-is-a-share-of-what-was-watched.md +0 -0
  189. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0034-a-count-is-owed-until-it-is-booked.md +0 -0
  190. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0035-configuration-is-authored-by-roles-and-selected-by-operators.md +0 -0
  191. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0036-the-chart-draws-every-rule-the-plant-chooses-which-hold.md +0 -0
  192. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0038-an-agent-is-an-account-with-a-role-a-budget-and-a-cadence.md +0 -0
  193. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0039-an-analysis-is-recorded-code-that-can-only-read.md +0 -0
  194. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0040-the-chart-type-follows-the-sampling-plan.md +0 -0
  195. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0041-a-characteristic-the-plant-counts.md +0 -0
  196. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/0042-one-plant-many-nodes.md +0 -0
  197. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/TEMPLATE.md +0 -0
  198. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/decisions/index.md +0 -0
  199. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/STYLE.md +0 -0
  200. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/agentic-harness.md +0 -0
  201. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/README.md +0 -0
  202. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/admin-edit-roles.md +0 -0
  203. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/analysis-cards-scaling.md +0 -0
  204. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/assistant-submits-an-inspection.md +0 -0
  205. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/book-output-explicit-order.md +0 -0
  206. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/clickable-kpi-tiles.md +0 -0
  207. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/clickable-machine-breadcrumbs.md +0 -0
  208. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/floor-machines-paginate-and-filter.md +0 -0
  209. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/measurements-card-filtering.md +0 -0
  210. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/measurements-characteristic-filter.md +0 -0
  211. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/nonconformance-lifecycle.md +0 -0
  212. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/opc-integration-suite.md +0 -0
  213. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/order-card-search-finds-a-material.md +0 -0
  214. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/order-lifecycle-actions.md +0 -0
  215. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/orders-creatable-materials.md +0 -0
  216. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/orders-supervisor-filters.md +0 -0
  217. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/persistent-header-menu.md +0 -0
  218. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/review-orders.md +0 -0
  219. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/review-station.md +0 -0
  220. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/scrap-reason-codes.md +0 -0
  221. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/shop-floor-actions-strip.md +0 -0
  222. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/sixty-machine-plant.md +0 -0
  223. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/spc-capability-withheld.md +0 -0
  224. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/specifications-card-filtering.md +0 -0
  225. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/specifications-server-paged.md +0 -0
  226. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/station-quality-card.md +0 -0
  227. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/station-spc.md +0 -0
  228. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/station-view.md +0 -0
  229. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/supervisor-drill-down.md +0 -0
  230. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/backlog/ui-style-drift-bc58fb4f8e4d.md +0 -0
  231. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/config-assistance.md +0 -0
  232. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/config-audit-2026-09-21.md +0 -0
  233. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/deep-analysis.md +0 -0
  234. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/m8-packs-and-fleet.md +0 -0
  235. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/design/pack-in-pack.md +0 -0
  236. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/develop/erp-connectors.md +0 -0
  237. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/develop/experiments.md +0 -0
  238. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/develop/index.md +0 -0
  239. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/develop/your-first-module.md +0 -0
  240. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/history/private-era.md +0 -0
  241. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/hooks/generate.py +0 -0
  242. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/index.md +0 -0
  243. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/onboarding/GUIDE-ENGINEERING.md +0 -0
  244. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/onboarding/GUIDE-IT.md +0 -0
  245. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/onboarding/README.md +0 -0
  246. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/onboarding/worksheet-example.csv +0 -0
  247. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/onboarding/worksheet-template.csv +0 -0
  248. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/administration-numbers.md +0 -0
  249. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/ai.md +0 -0
  250. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/assistant-coverage.md +0 -0
  251. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/backup.md +0 -0
  252. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-with-a-lot.json +0 -0
  253. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-with-a-lot.xml +0 -0
  254. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-with-an-over-run.json +0 -0
  255. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-with-an-over-run.xml +0 -0
  256. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-without-a-lot.json +0 -0
  257. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/completion-without-a-lot.xml +0 -0
  258. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-clean.json +0 -0
  259. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-clean.xml +0 -0
  260. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-over-run.json +0 -0
  261. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-over-run.xml +0 -0
  262. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-with-scrap-and-components.json +0 -0
  263. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-examples/operation-with-scrap-and-components.xml +0 -0
  264. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/confirmation-files.md +0 -0
  265. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/coverage.md +0 -0
  266. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/deploy.md +0 -0
  267. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/doctor.md +0 -0
  268. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/engineering-numbers.md +0 -0
  269. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/erp-settings.md +0 -0
  270. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/erpnext.md +0 -0
  271. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/first-plant.md +0 -0
  272. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/first-week.md +0 -0
  273. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/fleet.md +0 -0
  274. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/images/review-walk-station.png +0 -0
  275. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/images/review-walkthrough.png +0 -0
  276. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/images/shape-equipment.png +0 -0
  277. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/images/shape-timeline.png +0 -0
  278. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/inbound.md +0 -0
  279. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/index.md +0 -0
  280. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/modules.md +0 -0
  281. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/opc-disconnections.md +0 -0
  282. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/opc-readonly.md +0 -0
  283. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/packs.md +0 -0
  284. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/plant-from-your-mes.md +0 -0
  285. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/quality-numbers.md +0 -0
  286. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/quality-severities.md +0 -0
  287. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/registry.md +0 -0
  288. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/releasing.md +0 -0
  289. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/security.md +0 -0
  290. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/shadow-mode.md +0 -0
  291. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/shadow-scorecard.md +0 -0
  292. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/the-simulated-floor.md +0 -0
  293. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/tls.md +0 -0
  294. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/uns.md +0 -0
  295. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/operate/who-names-the-reasons.md +0 -0
  296. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/first-line.md +0 -0
  297. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/images/spc-xbar-and-r.png +0 -0
  298. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/index.md +0 -0
  299. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/never-invent-production.md +0 -0
  300. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/quality-signals.md +0 -0
  301. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/reading-a-trend.md +0 -0
  302. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/reading-oee.md +0 -0
  303. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/plant/shifts.md +0 -0
  304. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/releases/0.2.0.md +0 -0
  305. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/releases/0.3.0.md +0 -0
  306. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/docs/releases/0.3.1.md +0 -0
  307. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/README.md +0 -0
  308. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/analysis/build_notebook.py +0 -0
  309. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/analysis/build_report.py +0 -0
  310. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/analysis/cutlery_run_analysis.ipynb +0 -0
  311. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/analysis/viz.py +0 -0
  312. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/build_config.py +0 -0
  313. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/fill_day.py +0 -0
  314. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/fleet.toml +0 -0
  315. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/init.py +0 -0
  316. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/line.json +0 -0
  317. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/make_tag_map.py +0 -0
  318. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/masterdata/downtime_reasons.json +0 -0
  319. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/masterdata/nc_severities.json +0 -0
  320. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/plant.toml +0 -0
  321. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/run_cutlery.py +0 -0
  322. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/tag_map.json +0 -0
  323. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/walkthroughs/install_walkthroughs.py +0 -0
  324. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/cutlery/walkthroughs/walkthroughs.json +0 -0
  325. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/erpnext/VERSIONS.md +0 -0
  326. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/erpnext/docker-compose.yml +0 -0
  327. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/erpnext/seed_erpnext.py +0 -0
  328. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/lost-connection.toml +0 -0
  329. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/one-line-bad-hour.toml +0 -0
  330. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/over-run.toml +0 -0
  331. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/scrap-burst.toml +0 -0
  332. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/starved-and-blocked.toml +0 -0
  333. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/experiments/two-plants-two-zones.toml +0 -0
  334. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/.env.example +0 -0
  335. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/README.md +0 -0
  336. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/kepware_setup.py +0 -0
  337. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/line.json +0 -0
  338. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/scenario.md +0 -0
  339. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/setup_dsn.ps1 +0 -0
  340. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/kepsim/verify_readback.py +0 -0
  341. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/build_config.py +0 -0
  342. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/fleet.toml +0 -0
  343. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/build_config.py +0 -0
  344. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/init.py +0 -0
  345. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/line.json +0 -0
  346. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/plant.toml +0 -0
  347. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/run_full.py +0 -0
  348. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/seed_breadth.py +0 -0
  349. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/surfaces.py +0 -0
  350. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/full/tag_map.json +0 -0
  351. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/init.py +0 -0
  352. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/line.json +0 -0
  353. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/make_tag_map.py +0 -0
  354. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/run_spike.py +0 -0
  355. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/seed_breadth.py +0 -0
  356. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/megafactory/tag_map.json +0 -0
  357. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/README.md +0 -0
  358. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/floor.json +0 -0
  359. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/line.json +0 -0
  360. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/README.md +0 -0
  361. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/bom.json +0 -0
  362. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/dispatch_rules.json +0 -0
  363. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/downtime_reasons.json +0 -0
  364. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/equipment.json +0 -0
  365. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/gauges.json +0 -0
  366. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/lots.json +0 -0
  367. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/maintenance_plans.json +0 -0
  368. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/materials.json +0 -0
  369. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/nc_severities.json +0 -0
  370. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/personnel.json +0 -0
  371. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/personnel_skills.json +0 -0
  372. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/quality_specs.json +0 -0
  373. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/roster.json +0 -0
  374. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/routings.json +0 -0
  375. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/shifts.json +0 -0
  376. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/skills.json +0 -0
  377. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/masterdata/work_orders.json +0 -0
  378. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/plant.toml +0 -0
  379. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/bottling/tag_map.json +0 -0
  380. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/README.md +0 -0
  381. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/floor.json +0 -0
  382. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/mappings/inbound_mapping.json +0 -0
  383. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/downtime_reasons.json +0 -0
  384. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/equipment.json +0 -0
  385. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/lots.json +0 -0
  386. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/materials.json +0 -0
  387. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/nc_severities.json +0 -0
  388. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/quality_specs.json +0 -0
  389. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/routings.json +0 -0
  390. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/masterdata/work_orders.json +0 -0
  391. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/plant.toml +0 -0
  392. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/finewire/tag_map.json +0 -0
  393. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/fleet.toml +0 -0
  394. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/floor.json +0 -0
  395. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/line.json +0 -0
  396. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/README.md +0 -0
  397. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/downtime_reasons.json +0 -0
  398. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/equipment.json +0 -0
  399. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/lots.json +0 -0
  400. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/materials.json +0 -0
  401. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/nc_severities.json +0 -0
  402. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/quality_specs.json +0 -0
  403. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/routings.json +0 -0
  404. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/masterdata/work_orders.json +0 -0
  405. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/plant.toml +0 -0
  406. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/labs/multiplant/machining/tag_map.json +0 -0
  407. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/scripts/kill-a-node.sh +0 -0
  408. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/0-how-to-help.md +0 -0
  409. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/2-your-plant.md +0 -0
  410. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/3-shadow-mode.md +0 -0
  411. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/4-migration.md +0 -0
  412. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/README.md +0 -0
  413. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/assistant/SKILL.md +0 -0
  414. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/FORMAT.md +0 -0
  415. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/SKILL.md +0 -0
  416. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/example/plant-shape-grouped.toml +0 -0
  417. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/example/plant-shape.toml +0 -0
  418. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/01_inventory.sql +0 -0
  419. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/01b_row_count.sql +0 -0
  420. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/02_columns.sql +0 -0
  421. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/03_window.sql +0 -0
  422. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/04_column_profile.sql +0 -0
  423. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/04b_column_sample.sql +0 -0
  424. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/05_assets.sql +0 -0
  425. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/05b_tag_samples.sql +0 -0
  426. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/05c_tag_samples_nostate.sql +0 -0
  427. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/05d_routings.sql +0 -0
  428. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06_states.sql +0 -0
  429. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06b_production.sql +0 -0
  430. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06c_quality.sql +0 -0
  431. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06d_orders.sql +0 -0
  432. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06e_shifts.sql +0 -0
  433. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/06f_documents.sql +0 -0
  434. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/mssql/07_erp.sql +0 -0
  435. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/01_inventory.sql +0 -0
  436. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/01b_row_count.sql +0 -0
  437. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/02_columns.sql +0 -0
  438. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/03_window.sql +0 -0
  439. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/04_column_profile.sql +0 -0
  440. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/04b_column_sample.sql +0 -0
  441. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/05_assets.sql +0 -0
  442. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/05b_tag_samples.sql +0 -0
  443. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/05c_tag_samples_nostate.sql +0 -0
  444. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/05d_routings.sql +0 -0
  445. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06_states.sql +0 -0
  446. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06b_production.sql +0 -0
  447. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06c_quality.sql +0 -0
  448. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06d_orders.sql +0 -0
  449. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06e_shifts.sql +0 -0
  450. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/06f_documents.sql +0 -0
  451. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/queries/sqlite/07_erp.sql +0 -0
  452. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/scripts/explain.py +0 -0
  453. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/scripts/leakcheck.py +0 -0
  454. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/skills/plant-from-your-mes/scripts/profile.py +0 -0
  455. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/__main__.py +0 -0
  456. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/__init__.py +0 -0
  457. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/app.py +0 -0
  458. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/deps.py +0 -0
  459. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/idempotency.py +0 -0
  460. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/paging.py +0 -0
  461. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/__init__.py +0 -0
  462. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/adjustments.py +0 -0
  463. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/admin.py +0 -0
  464. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/analysis.py +0 -0
  465. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/assist.py +0 -0
  466. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/auth.py +0 -0
  467. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/coa.py +0 -0
  468. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/dashboard.py +0 -0
  469. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/design.py +0 -0
  470. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/documents.py +0 -0
  471. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/equipment.py +0 -0
  472. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/erp.py +0 -0
  473. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/execution.py +0 -0
  474. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/kpis.py +0 -0
  475. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/line.py +0 -0
  476. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/maintenance.py +0 -0
  477. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/masterdata.py +0 -0
  478. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/ops.py +0 -0
  479. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/quality.py +0 -0
  480. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/reasons.py +0 -0
  481. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/scheduling.py +0 -0
  482. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/serialization.py +0 -0
  483. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/severities.py +0 -0
  484. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/system.py +0 -0
  485. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/triggers.py +0 -0
  486. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/api/routers/workorders.py +0 -0
  487. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/assist_coverage.py +0 -0
  488. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/backup.py +0 -0
  489. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/config.py +0 -0
  490. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/core/__init__.py +0 -0
  491. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/core/oplock.py +0 -0
  492. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/db.py +0 -0
  493. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/demo_feed.py +0 -0
  494. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/doctor/__init__.py +0 -0
  495. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/doctor/gather.py +0 -0
  496. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/doctor/leak.py +0 -0
  497. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/doctor/render.py +0 -0
  498. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/doctor/scrub.py +0 -0
  499. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/__init__.py +0 -0
  500. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/adjustments.py +0 -0
  501. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/ai_turns.py +0 -0
  502. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/audit.py +0 -0
  503. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/calendar.py +0 -0
  504. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/common.py +0 -0
  505. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/crew.py +0 -0
  506. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/documents.py +0 -0
  507. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/equipment.py +0 -0
  508. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/execution.py +0 -0
  509. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/gauges.py +0 -0
  510. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/idempotency.py +0 -0
  511. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/inbound.py +0 -0
  512. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/integration.py +0 -0
  513. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/leases.py +0 -0
  514. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/maintenance.py +0 -0
  515. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/masterdata.py +0 -0
  516. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/plant_settings.py +0 -0
  517. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/quality.py +0 -0
  518. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/reasons.py +0 -0
  519. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/scheduling.py +0 -0
  520. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/serialization.py +0 -0
  521. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/severities.py +0 -0
  522. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/timeseries.py +0 -0
  523. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/triggers.py +0 -0
  524. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/uns.py +0 -0
  525. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/domain/workorders.py +0 -0
  526. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/__init__.py +0 -0
  527. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/commands.py +0 -0
  528. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/console.py +0 -0
  529. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/logsink.py +0 -0
  530. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/observe.py +0 -0
  531. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/fleet/owned.py +0 -0
  532. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/identity.py +0 -0
  533. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/__init__.py +0 -0
  534. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/__init__.py +0 -0
  535. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/b2mml.py +0 -0
  536. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/base.py +0 -0
  537. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/conformance.py +0 -0
  538. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/contract.py +0 -0
  539. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/erpnext_adapter.py +0 -0
  540. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/erpnext_setup.py +0 -0
  541. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/examples.py +0 -0
  542. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/file_adapter.py +0 -0
  543. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/incumbent.py +0 -0
  544. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/mock_erp.py +0 -0
  545. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/rest_adapter.py +0 -0
  546. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/schema.py +0 -0
  547. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/scorecard.py +0 -0
  548. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/scorecard_html.py +0 -0
  549. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/sync.py +0 -0
  550. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/erp/validate.py +0 -0
  551. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/events.py +0 -0
  552. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/inbound/__init__.py +0 -0
  553. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/inbound/contract.py +0 -0
  554. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/inbound/folder.py +0 -0
  555. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/inbound/mqtt.py +0 -0
  556. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/inbound/sql.py +0 -0
  557. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/jev/__init__.py +0 -0
  558. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/jev/client.py +0 -0
  559. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/jev/transport.py +0 -0
  560. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/__init__.py +0 -0
  561. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/agent.py +0 -0
  562. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/csv_replay.py +0 -0
  563. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/inspect.py +0 -0
  564. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/security.py +0 -0
  565. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/simulator.py +0 -0
  566. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/tag_map.py +0 -0
  567. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/opc/worksheet.py +0 -0
  568. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/uns/__init__.py +0 -0
  569. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/uns/envelope.py +0 -0
  570. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/uns/publisher.py +0 -0
  571. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/uns/topics.py +0 -0
  572. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/integrations/uns/transport.py +0 -0
  573. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/kernel/__init__.py +0 -0
  574. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/kernel/common.py +0 -0
  575. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/kernel/tags.py +0 -0
  576. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/__init__.py +0 -0
  577. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/assist_eval.py +0 -0
  578. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/assist_fixtures.py +0 -0
  579. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/assist_seed.py +0 -0
  580. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/build.py +0 -0
  581. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/console.py +0 -0
  582. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/feedback.py +0 -0
  583. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/measure.py +0 -0
  584. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/observe.py +0 -0
  585. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/plan.py +0 -0
  586. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/report.py +0 -0
  587. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/review.py +0 -0
  588. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/run.py +0 -0
  589. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/lab/truth.py +0 -0
  590. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/logging.py +0 -0
  591. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/__init__.py +0 -0
  592. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/adjustments.py +0 -0
  593. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/analysis.py +0 -0
  594. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/coa.py +0 -0
  595. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/equipment.py +0 -0
  596. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/erp.py +0 -0
  597. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/maintenance.py +0 -0
  598. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/masterdata.py +0 -0
  599. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/quality.py +0 -0
  600. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/reasons.py +0 -0
  601. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/scheduling.py +0 -0
  602. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/serialization.py +0 -0
  603. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/settings.py +0 -0
  604. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/severities.py +0 -0
  605. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp/triggers.py +0 -0
  606. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/mcp_server.py +0 -0
  607. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migration.py +0 -0
  608. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/env.py +0 -0
  609. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/script.py.mako +0 -0
  610. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/153379d6cf19_merge_cutlery_and_walkthrough_chains.py +0 -0
  611. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/18af853fc5c4_initial_schema.py +0 -0
  612. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/7c1e5a9d2b4f_serial_sequences.py +0 -0
  613. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/9c4d2c836d05_add_user_passwords.py +0 -0
  614. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a1b2c3d4e5f6_agent_identity.py +0 -0
  615. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a1c47f8b2d93_what_a_maintenance_job_needs_of_the_line.py +0 -0
  616. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a1c5e70b2d94_plant_settings.py +0 -0
  617. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a1c5e83b7602_calendar_and_scheduling.py +0 -0
  618. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a3f6c81d09e2_unassigned_production.py +0 -0
  619. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a4d9c2e70f18_uns_publications.py +0 -0
  620. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a7c1e93b5f20_roles_as_data.py +0 -0
  621. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a7c2e5d1b9f0_document_kind_steps_needs_walkthroughs.py +0 -0
  622. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/a9c4e17b3d60_spc_signals_act.py +0 -0
  623. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b1f4c73a9e08_nonconformance_lifecycle.py +0 -0
  624. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b1f4c7a2e903_production_logs_equipment_ts_index.py +0 -0
  625. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b2c3d4e5f6a7_outbox_hardening.py +0 -0
  626. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b3f8d2a41c67_controlled_documents.py +0 -0
  627. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b3f9c07e51ad_ai_turns.py +0 -0
  628. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b5c1d09e73af_inbound_events_and_their_source.py +0 -0
  629. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b6f0c2a71d58_a_lease_and_a_counter_baseline.py +0 -0
  630. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b7d2e9f4a1c3_unit_inspections.py +0 -0
  631. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b8f4d27e1a53_serialisation.py +0 -0
  632. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/b9f31c7a4e50_a_characteristic_inspected_n_at_a_time.py +0 -0
  633. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c1e7a04b93d5_downtime_reasons.py +0 -0
  634. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c2e9b74a3f81_gauges_and_calibration.py +0 -0
  635. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c3d4e5f6a7b8_triggers.py +0 -0
  636. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c3d7e91a4b28_equipment_connections.py +0 -0
  637. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c4e8f1a2d5b6_serial_units_one_index.py +0 -0
  638. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c6a4b81f39d7_shift_attribution.py +0 -0
  639. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c7a2e94b16d3_five_facts_the_plant_was_dropping.py +0 -0
  640. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c8b1e40d7a92_erp_messages_direction_index.py +0 -0
  641. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/c9e2a4b71d38_material_at_a_station.py +0 -0
  642. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d2b7e51c9a04_nc_severities.py +0 -0
  643. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d4a1c7e5b902_equipment_cost_center.py +0 -0
  644. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d4a7f10c8b52_component_may_enter_twice.py +0 -0
  645. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d4e5f6a7b8c9_recommended_adjustments.py +0 -0
  646. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d4e8a1c93b70_a_characteristic_the_plant_counts.py +0 -0
  647. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/d9a3f61c48e0_inbound_sql_watermarks.py +0 -0
  648. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/e3c8a17d5b46_gauge_warning_and_pieces.py +0 -0
  649. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/e5f6a7b8c9d0_tag_values_latest_index.py +0 -0
  650. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/e6b3c92d4f17_drop_the_old_bom_constraint.py +0 -0
  651. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/e7b3c9d18a45_workorder_work_center.py +0 -0
  652. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/f0a1b2c3d4e5_equipment_states_ended_index.py +0 -0
  653. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/f2a8d31c6b74_routing_durations.py +0 -0
  654. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/migrations/versions/f7d1a58e2c94_preventive_maintenance.py +0 -0
  655. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/modules.py +0 -0
  656. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/__init__.py +0 -0
  657. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/apply.py +0 -0
  658. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/check.py +0 -0
  659. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/fleet.py +0 -0
  660. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/format.py +0 -0
  661. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/masterdata.py +0 -0
  662. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/migrate.py +0 -0
  663. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/plan.py +0 -0
  664. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/pack/repoint.py +0 -0
  665. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/py.typed +0 -0
  666. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/schema.py +0 -0
  667. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/seed.py +0 -0
  668. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/seed_kepsim.py +0 -0
  669. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/seed_line.py +0 -0
  670. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/__init__.py +0 -0
  671. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/adjustments.py +0 -0
  672. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/agent.py +0 -0
  673. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/ai_status.py +0 -0
  674. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/ai_trace.py +0 -0
  675. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/analysis.py +0 -0
  676. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/assist_eval.py +0 -0
  677. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/assistant.py +0 -0
  678. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/audit.py +0 -0
  679. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/auth.py +0 -0
  680. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/calendar.py +0 -0
  681. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/capabilities.py +0 -0
  682. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/coa.py +0 -0
  683. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/connection.py +0 -0
  684. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/counters.py +0 -0
  685. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/coverage.py +0 -0
  686. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/design.py +0 -0
  687. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/design_triage.py +0 -0
  688. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/dispatch.py +0 -0
  689. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/documents.py +0 -0
  690. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/drafting.py +0 -0
  691. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/equipment.py +0 -0
  692. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/erp.py +0 -0
  693. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/execution.py +0 -0
  694. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/gauges.py +0 -0
  695. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/inbound.py +0 -0
  696. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/leases.py +0 -0
  697. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/line.py +0 -0
  698. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/line_clock.py +0 -0
  699. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/maintenance.py +0 -0
  700. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/masterdata.py +0 -0
  701. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/moment.py +0 -0
  702. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/oee.py +0 -0
  703. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/outbox.py +0 -0
  704. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/plant_settings.py +0 -0
  705. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/quality.py +0 -0
  706. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/reasons.py +0 -0
  707. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/retention.py +0 -0
  708. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/review.py +0 -0
  709. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/scheduling.py +0 -0
  710. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/serialization.py +0 -0
  711. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/severities.py +0 -0
  712. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/spc.py +0 -0
  713. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/spc_point.py +0 -0
  714. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/staging.py +0 -0
  715. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/state_block.py +0 -0
  716. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/tags.py +0 -0
  717. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/trace_analysis.py +0 -0
  718. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/trend.py +0 -0
  719. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/triggers.py +0 -0
  720. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/uns.py +0 -0
  721. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/vocabulary.py +0 -0
  722. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/walkthroughs.py +0 -0
  723. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/services/workorders.py +0 -0
  724. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/shape/__init__.py +0 -0
  725. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/shape/model.py +0 -0
  726. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/shape/pack.py +0 -0
  727. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/shape/read.py +0 -0
  728. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/__init__.py +0 -0
  729. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/agent_eval.py +0 -0
  730. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/autoloop.py +0 -0
  731. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/calibration.py +0 -0
  732. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/config_audit.py +0 -0
  733. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/config_audit_curated.py +0 -0
  734. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/generate.py +0 -0
  735. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/labelled.py +0 -0
  736. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/mcp_server.py +0 -0
  737. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/measurement.py +0 -0
  738. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/operations.py +0 -0
  739. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/rollup.py +0 -0
  740. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/runner.py +0 -0
  741. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/score.py +0 -0
  742. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/store.py +0 -0
  743. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/sweep.py +0 -0
  744. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/triage.py +0 -0
  745. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/truth.py +0 -0
  746. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/sim/ui_check.py +0 -0
  747. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/skills.py +0 -0
  748. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/standalone.py +0 -0
  749. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/storage.py +0 -0
  750. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/adjustments.html +0 -0
  751. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/admin.css +0 -0
  752. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/admin.html +0 -0
  753. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ai.css +0 -0
  754. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ai.html +0 -0
  755. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/analysis.css +0 -0
  756. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/analysis.html +0 -0
  757. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/assist-record.js +0 -0
  758. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/assist.css +0 -0
  759. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/assist.js +0 -0
  760. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/coa.css +0 -0
  761. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/coa.html +0 -0
  762. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/config.html +0 -0
  763. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/demo/kepsim-hour.json +0 -0
  764. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/design.css +0 -0
  765. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/design.js +0 -0
  766. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/fleet.css +0 -0
  767. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/fleet.html +0 -0
  768. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/fleet.js +0 -0
  769. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/gauges.html +0 -0
  770. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/index.html +0 -0
  771. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/instructions.css +0 -0
  772. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/instructions.html +0 -0
  773. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/kit.js +0 -0
  774. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/feed.js +0 -0
  775. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/flow.js +0 -0
  776. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/parts.js +0 -0
  777. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/robot.js +0 -0
  778. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line/scene.js +0 -0
  779. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line.css +0 -0
  780. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line.html +0 -0
  781. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/line3d.html +0 -0
  782. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/machine.css +0 -0
  783. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/machine.html +0 -0
  784. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/machines.html +0 -0
  785. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/maintenance.css +0 -0
  786. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/maintenance.html +0 -0
  787. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/masterdata.html +0 -0
  788. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ops.css +0 -0
  789. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/ops.html +0 -0
  790. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/orders.css +0 -0
  791. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/orders.html +0 -0
  792. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/quality.css +0 -0
  793. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/quality.html +0 -0
  794. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/reasons.html +0 -0
  795. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/schedule.html +0 -0
  796. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/severities.html +0 -0
  797. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/spc.css +0 -0
  798. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/spc.html +0 -0
  799. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/station.css +0 -0
  800. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/station.html +0 -0
  801. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/styles.css +0 -0
  802. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/tags.html +0 -0
  803. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/themes.css +0 -0
  804. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/themes.js +0 -0
  805. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/trace.html +0 -0
  806. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/triggers.html +0 -0
  807. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/vendor/OrbitControls.js +0 -0
  808. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/vendor/README.md +0 -0
  809. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/vendor/three.core.min.js +0 -0
  810. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/src/fsmes/web/vendor/three.module.min.js +0 -0
  811. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/README.md +0 -0
  812. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/admin.toml +0 -0
  813. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/agent.toml +0 -0
  814. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/analyst.toml +0 -0
  815. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/operator.toml +0 -0
  816. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/assist_suite/supervisor.toml +0 -0
  817. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/conftest.py +0 -0
  818. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/line/bench.json +0 -0
  819. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/packs/bench/tag_map.json +0 -0
  820. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/recorded/bench-scorecard.json +0 -0
  821. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/Line.csv +0 -0
  822. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/Pack.csv +0 -0
  823. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/Press.csv +0 -0
  824. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/Trim.csv +0 -0
  825. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/Weld.csv +0 -0
  826. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/replay/bench/schema.ini +0 -0
  827. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-run/scores.json +0 -0
  828. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/fixtures/labelled-set.json +0 -0
  829. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/live_replies.py +0 -0
  830. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/page_anchors.py +0 -0
  831. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_block_on_the_state_timeline_carries_the_records_behind_it.py +0 -0
  832. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_characteristic_inspected_five_at_a_time.py +0 -0
  833. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_characteristic_the_plant_counts.py +0 -0
  834. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_chart_draws_only_what_the_api_measured.py +0 -0
  835. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_books_while_its_dashboard_is_read.py +0 -0
  836. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_from_the_package_writes_only_to_a_users_own_directory.py +0 -0
  837. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_logs_at_a_rate_a_year_can_stand.py +0 -0
  838. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_on_two_nodes_survives_one_of_them_dying.py +0 -0
  839. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_records_what_each_of_its_processes_is.py +0 -0
  840. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_shape_built_blind_from_an_unknown_sql_mes_is_the_bottling_line.py +0 -0
  841. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_plant_starts_and_stops_the_same_way_on_windows.py +0 -0
  842. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_point_on_the_control_chart_carries_the_records_behind_it.py +0 -0
  843. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_refusal_names_the_capability_and_who_holds_it.py +0 -0
  844. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_sample_on_the_control_chart_carries_the_five_bottles_behind_it.py +0 -0
  845. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_shift_of_stops_comes_out_in_the_plants_own_proportions.py +0 -0
  846. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_signature_they_hold_is_a_walk_and_not_a_refusal.py +0 -0
  847. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_a_walk_waits_for_a_control_the_page_is_still_drawing.py +0 -0
  848. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_adjustments.py +0 -0
  849. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_agent.py +0 -0
  850. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_agent_batching.py +0 -0
  851. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_agent_eval.py +0 -0
  852. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_ai_status.py +0 -0
  853. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_an_analysis_counts_people_before_it_names_one.py +0 -0
  854. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_an_exploration_draws_what_the_plant_measured.py +0 -0
  855. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_analysis.py +0 -0
  856. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_api.py +0 -0
  857. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_approval_review.py +0 -0
  858. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_assist_suite_scripted.py +0 -0
  859. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_assistant.py +0 -0
  860. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_auth.py +0 -0
  861. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_autoloop.py +0 -0
  862. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_backup.py +0 -0
  863. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_bottling_pack.py +0 -0
  864. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_capabilities.py +0 -0
  865. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_cli.py +0 -0
  866. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_clicking_a_block_on_the_state_timeline_opens_the_records_behind_it.py +0 -0
  867. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_clicking_a_lot_on_the_spc_chart_opens_which_defects.py +0 -0
  868. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_clicking_a_point_on_the_spc_chart_opens_the_records_behind_it.py +0 -0
  869. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_clicking_a_point_on_the_trend_graph_opens_the_records_behind_it.py +0 -0
  870. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_clicking_a_sample_on_the_spc_chart_opens_the_five_bottles.py +0 -0
  871. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_coa.py +0 -0
  872. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_config_audit.py +0 -0
  873. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_configuration_sections.py +0 -0
  874. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_core_oplock.py +0 -0
  875. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_core_purity.py +0 -0
  876. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_coverage_ledger.py +0 -0
  877. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_cutlery.py +0 -0
  878. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_demo_verdict.py +0 -0
  879. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_design.py +0 -0
  880. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_design_triage.py +0 -0
  881. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_doctor_writes_one_file_with_nothing_of_yours_in_it.py +0 -0
  882. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_documents.py +0 -0
  883. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_downtime_reasons.py +0 -0
  884. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_environments.py +0 -0
  885. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_equipment_oee.py +0 -0
  886. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erp_confirmation_files.py +0 -0
  887. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erp_conformance.py +0 -0
  888. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erp_contract.py +0 -0
  889. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erp_roundtrip.py +0 -0
  890. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erpnext.py +0 -0
  891. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_erpnext_live.py +0 -0
  892. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_browser_test_is_in_the_browser_tier.py +0 -0
  893. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_command_the_assistant_folder_tells_you_to_run_exists.py +0 -0
  894. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_settings_list_fits_in_one_tool_result.py +0 -0
  895. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_show_me_lands_on_the_real_control.py +0 -0
  896. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_write_route_has_a_tool_or_a_reason.py +0 -0
  897. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_every_write_tool_names_the_capability_its_route_demands.py +0 -0
  898. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_everything_the_model_said_in_one_turn_reaches_the_reply.py +0 -0
  899. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_execution.py +0 -0
  900. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_file_erp.py +0 -0
  901. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_fleet_console.py +0 -0
  902. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_fleet_create_makes_a_usable_plant.py +0 -0
  903. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_fleet_ownership.py +0 -0
  904. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_fleet_plan.py +0 -0
  905. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_fsmes_runs_as_a_module_when_it_is_not_on_the_path.py +0 -0
  906. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_hierarchy.py +0 -0
  907. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_hold.py +0 -0
  908. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_inbound.py +0 -0
  909. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_inbound_folder.py +0 -0
  910. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_inbound_mqtt.py +0 -0
  911. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_inbound_sql.py +0 -0
  912. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_agent_eval_scoring.py +0 -0
  913. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_calibration.py +0 -0
  914. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_fail_safe.py +0 -0
  915. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_labelled_set.py +0 -0
  916. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_run_log_triage.py +0 -0
  917. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_jev_sdk_surface.py +0 -0
  918. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_kepsim.py +0 -0
  919. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_kernel_common.py +0 -0
  920. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_kpi_budget.py +0 -0
  921. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_connection.py +0 -0
  922. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_console.py +0 -0
  923. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_experiments.py +0 -0
  924. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_feedback.py +0 -0
  925. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_latency.py +0 -0
  926. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_order_book.py +0 -0
  927. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_orders.py +0 -0
  928. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_lab_scenarios.py +0 -0
  929. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_line_api.py +0 -0
  930. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_line_scoping.py +0 -0
  931. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_live_admin_settings.py +0 -0
  932. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_live_engineering_settings.py +0 -0
  933. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_live_plant_settings.py +0 -0
  934. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_maintenance.py +0 -0
  935. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_maintenance_work_goes_to_the_right_trade.py +0 -0
  936. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_mcp_product.py +0 -0
  937. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_megafactory.py +0 -0
  938. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_migrations_have_one_head.py +0 -0
  939. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_module_wall.py +0 -0
  940. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_nc_severities.py +0 -0
  941. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_no_command_loses_a_word_of_its_help_to_the_painter.py +0 -0
  942. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_no_tenant_literals.py +0 -0
  943. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_onboarding.py +0 -0
  944. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_opc_disconnection.py +0 -0
  945. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_outbox_events.py +0 -0
  946. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_overproduction.py +0 -0
  947. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_pack_format.py +0 -0
  948. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_pack_third.py +0 -0
  949. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_packaged_config.py +0 -0
  950. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_paging.py +0 -0
  951. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_performance_at_replay_speed.py +0 -0
  952. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_plant_identity.py +0 -0
  953. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_plant_migrate.py +0 -0
  954. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_plant_scale_lists.py +0 -0
  955. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_plant_scale_ui.py +0 -0
  956. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_plant_serve_only.py +0 -0
  957. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_promote_script.py +0 -0
  958. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_quality.py +0 -0
  959. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_quality_numbers.py +0 -0
  960. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_read_never_waits.py +0 -0
  961. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_rollup.py +0 -0
  962. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_route_coverage.py +0 -0
  963. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_routing_depth.py +0 -0
  964. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_run_ports.py +0 -0
  965. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_scale.py +0 -0
  966. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_scheduling_trace.py +0 -0
  967. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_schema_upgrade.py +0 -0
  968. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_serial_scale.py +0 -0
  969. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_shadow_mode.py +0 -0
  970. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_shadow_scorecard.py +0 -0
  971. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_shift_attribution.py +0 -0
  972. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_sim.py +0 -0
  973. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_spc_gauges.py +0 -0
  974. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_spc_moving_range.py +0 -0
  975. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_spc_signals.py +0 -0
  976. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_sqlite_write_locks.py +0 -0
  977. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_status_names_its_database.py +0 -0
  978. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_store.py +0 -0
  979. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_supply_chain_settings.py +0 -0
  980. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_sweep_replay.py +0 -0
  981. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_tag_fabric.py +0 -0
  982. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_tag_fabric_review.py +0 -0
  983. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_tags.py +0 -0
  984. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_tags_grouped_the_way_a_real_opc_server_groups_them.py +0 -0
  985. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_ai_screen_shows_a_conversation_and_gates_itself.py +0 -0
  986. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_ai_tab_explores_and_draws_what_it_read.py +0 -0
  987. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_ai_tab_says_what_the_assistant_costs_without_local_ai.py +0 -0
  988. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_analyses_answer_an_agent_the_way_they_answer_a_screen.py +0 -0
  989. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_analysis_agent_is_a_kind_of_its_own.py +0 -0
  990. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_analysis_agent_is_asked_for_the_next_questions.py +0 -0
  991. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_assistant_proposes_rather_than_asking.py +0 -0
  992. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_assistant_reads_before_it_says_no.py +0 -0
  993. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_bottling_shift_leaves_a_chain_a_person_can_walk_back.py +0 -0
  994. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_calendar_tool_names_every_kind_its_api_accepts.py +0 -0
  995. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_chart_comes_into_the_chat_and_stays_clickable.py +0 -0
  996. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_chat_can_open_the_dossier_behind_a_charted_point.py +0 -0
  997. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_control_chart_the_chat_reads_leaves_the_bottles_out.py +0 -0
  998. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_conversation_is_cached_and_not_only_the_catalogue.py +0 -0
  999. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_dashboard_says_which_node_answered_and_who_reads_the_machines.py +0 -0
  1000. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_dispatcher_at_three_hundred_people.py +0 -0
  1001. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_docker_image_carries_the_packs.py +0 -0
  1002. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_gauges_screen_shows_the_two_scales_and_when_each_was_calibrated.py +0 -0
  1003. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_panel_can_ask_the_other_agent.py +0 -0
  1004. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_panel_keeps_one_brain_through_a_failed_turn.py +0 -0
  1005. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_plant_keeps_a_trace_of_what_its_ai_did.py +0 -0
  1006. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_plant_stops_dropping_five_facts_it_already_had.py +0 -0
  1007. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_release_body_github_will_accept.py +0 -0
  1008. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_screens_that_show_a_characteristic_inspected_five_at_a_time.py +0 -0
  1009. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_simulated_crew_does_the_work_it_was_given.py +0 -0
  1010. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_simulated_floor_plants_causes_an_engineer_can_find.py +0 -0
  1011. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_simulated_floor_signs_in_again_when_its_login_runs_out.py +0 -0
  1012. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_skills_zip_holds_exactly_what_it_says_and_nothing_else.py +0 -0
  1013. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_spc_chart_wears_the_accepted_chart_look.py +0 -0
  1014. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_sql_server_query_set_is_not_sqlite_in_disguise.py +0 -0
  1015. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_station_redraws_only_what_changed.py +0 -0
  1016. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_station_says_when_no_order_is_open_on_the_plant.py +0 -0
  1017. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_suite_knows_its_database.py +0 -0
  1018. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_supervisor_writes_a_rule_as_a_sentence.py +0 -0
  1019. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_supervisors_screen_reads_the_shift_and_writes_a_rule.py +0 -0
  1020. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_trend_graph_walks_link_three_of_the_chain.py +0 -0
  1021. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_wheel_ships_the_assistant_folder.py +0 -0
  1022. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_the_wheel_ships_the_lab_packs.py +0 -0
  1023. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_themes.py +0 -0
  1024. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_triage.py +0 -0
  1025. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_triggers.py +0 -0
  1026. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_two_plants_from_two_shapes_keep_each_plants_own_shape.py +0 -0
  1027. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_two_tags_on_one_axis_and_the_records_behind_a_point.py +0 -0
  1028. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_ui_check.py +0 -0
  1029. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_ui_lists_filter_at_scale.py +0 -0
  1030. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_ui_nav.py +0 -0
  1031. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_ui_oee_above_rated.py +0 -0
  1032. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_uns.py +0 -0
  1033. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_walkthroughs.py +0 -0
  1034. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_washer_story.py +0 -0
  1035. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_web.py +0 -0
  1036. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_what_a_maintenance_job_needs_of_the_line.py +0 -0
  1037. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_wip.py +0 -0
  1038. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/test_workorders.py +0 -0
  1039. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/ui/baselines/control-room.json +0 -0
  1040. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/ui/baselines/daylight.json +0 -0
  1041. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/ui/baselines/high-contrast.json +0 -0
  1042. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/ui/baselines/night-shift.json +0 -0
  1043. {factorysemantics_mes-0.4.0 → factorysemantics_mes-0.4.2}/tests/unknown_mes.py +0 -0
@@ -61,9 +61,9 @@ from plant_from_wheel import (
61
61
  PLANT,
62
62
  fail,
63
63
  install,
64
- port_answers,
65
64
  print_in_the_words_the_plant_used,
66
65
  say,
66
+ the_port_is_back,
67
67
  until,
68
68
  venv_bin,
69
69
  )
@@ -291,8 +291,7 @@ def main() -> int:
291
291
  stopped_command = run([fsmes, "demo", PLANT, "stop"], cwd=work, env=environment)
292
292
  if stopped_command.returncode != 0:
293
293
  fail(f"`fsmes demo {PLANT} stop` exited {stopped_command.returncode}")
294
- if port_answers(API):
295
- fail(f"something is still listening on {API[1]} after stop")
294
+ the_port_is_back(API, "the dashboard")
296
295
  logs = home / "logs" / PLANT
297
296
  # The console logs last, so that they are among the most recently written
298
297
  # and `doctor` reads them: a stopped plant has no record of its processes
@@ -301,6 +301,21 @@ def port_answers(where: tuple[str, int]) -> bool:
301
301
  return False
302
302
 
303
303
 
304
+ def the_port_is_back(where: tuple[str, int], what: str, *, ceiling: float = 30) -> None:
305
+ """Wait for a stopped plant's socket to close, the way the way up waits.
306
+
307
+ The same spelling as `plant_from_wheel.the_port_is_back`, kept here because
308
+ this script shares no code with that one on purpose. `stop` returning is
309
+ not the same thing as the socket being gone: on Windows a listening socket
310
+ can outlive the process that owned it by a moment, and one bare connect
311
+ straight after `stop` failed three CI jobs on 2026-10-16 on plants that had
312
+ stopped perfectly well. The ceiling is a grace period, not a measurement:
313
+ nothing here asserts a clock.
314
+ """
315
+ until(f"{what} has stopped listening on {where[1]}",
316
+ lambda: not port_answers(where), ceiling=ceiling, every=0.5)
317
+
318
+
304
319
  def what_is_on_screen(shape: dict, speed: float) -> None:
305
320
  """Every fact the handoff asks of a running plant, asked of this one."""
306
321
  until("the dashboard answers", lambda: ask("/health").get("status") == "ok",
@@ -475,8 +490,7 @@ def one_shape_all_the_way(shape: dict, *, repo: Path, work: Path, fsmes: Path,
475
490
  say("== stopping ==")
476
491
  run([str(fsmes), "demo", name, "stop"], cwd=work, env=started, timeout=600)
477
492
  for where, what in ((API, "the dashboard"), (OPC, "the OPC server")):
478
- if port_answers(where):
479
- fail(f"{what} is still listening on {where[1]} after stop")
493
+ the_port_is_back(where, what)
480
494
  say(" both ports are back")
481
495
 
482
496
 
@@ -25,7 +25,9 @@ What it asserts, in order, and why each one:
25
25
  there including the counted one, the OPC replay port answers, the floor is
26
26
  watching with every machine connected and a check recorded, and at least one
27
27
  counted lot has been inspected;
28
- * `fsmes demo bottling stop` puts the ports back.
28
+ * `fsmes demo bottling stop` puts the ports back **before it returns**, so
29
+ `fsmes demo bottling start` in the next breath starts the plant instead of
30
+ refusing on a port that is still closing.
29
31
 
30
32
  Facts, never seconds: every wait below is a poll for a state with a generous
31
33
  ceiling, and the times it prints are information for the Result, not gates. A
@@ -216,6 +218,80 @@ def port_answers(where: tuple[str, int]) -> bool:
216
218
  return False
217
219
 
218
220
 
221
+ def the_port_is_back(where: tuple[str, int], what: str, *, ceiling: float = 30) -> None:
222
+ """Wait for a stopped plant's socket to close, the way the way up waits.
223
+
224
+ `stop` returning is not the same thing as the socket being gone: on Windows
225
+ a listening socket can outlive the process that owned it by a moment, and
226
+ one bare connect straight after `stop` failed three CI jobs on 2026-10-16
227
+ on plants that had stopped perfectly well. So this is the same poll for a
228
+ state as everything on the way up. The ceiling is a grace period, not a
229
+ measurement: nothing here asserts a clock.
230
+
231
+ Since `fsmes.plant.ports_are_back` the product waits for its own ports, so
232
+ after a `stop` this now returns at once - `the_ports_are_back_already`
233
+ below is what holds it to that. This stays for the callers that ask after
234
+ something was *killed*, where nothing waited for anything.
235
+ """
236
+ until(f"{what} has stopped listening on {where[1]}",
237
+ lambda: not port_answers(where), ceiling=ceiling, every=0.5)
238
+
239
+
240
+ def the_ports_are_back_already(what_happened: str) -> None:
241
+ """Ask each port once, with no poll, straight after a command returned.
242
+
243
+ A poll would pass whether the product waited or not, which is the whole
244
+ question here: `fsmes.plant.stop` holds the command until the ports its
245
+ processes were listening on are free, because on Windows a listening
246
+ socket outlives its process by about two seconds and a start inside those
247
+ two seconds used to refuse - naming a program that no longer existed. One
248
+ connect each, now, is the only shape of check that can tell the difference.
249
+ """
250
+ still = [f"{where[0]}:{where[1]} ({what})"
251
+ for where, what in ((API, "the dashboard"), (OPC, "the OPC server"))
252
+ if port_answers(where)]
253
+ if still:
254
+ fail(f"{what_happened} returned while {', '.join(still)} was still listening. "
255
+ "`stop` is meant to wait for its own ports before it comes back, so that "
256
+ "the next start does not meet a port that is still closing.")
257
+ say(f" both ports were already free when {what_happened} returned")
258
+
259
+
260
+ def and_a_start_in_the_next_breath_works(fsmes: Path, work: Path, environment: dict,
261
+ speed: float) -> None:
262
+ """Stop, then start again at once - the thing a person actually types.
263
+
264
+ On 2026-10-21 every Windows cell of this project's CI waited about two
265
+ seconds after `stop` for the plant's socket to disappear, and every Linux
266
+ cell waited zero (PR #184). CI learned to wait; the product had not, so on
267
+ a Windows PC `fsmes demo bottling stop` followed by `fsmes demo bottling
268
+ start` said *127.0.0.1:8010 is already in use ... Stop that program* about
269
+ the plant that had just been stopped. This is that pair of commands, in
270
+ that order, with nothing between them.
271
+ """
272
+ say("== and a start in the next breath: fsmes demo bottling start ==")
273
+ again = subprocess.run([str(fsmes), "demo", PLANT, "start", "--speed", str(speed)],
274
+ cwd=work, env=environment, capture_output=True,
275
+ timeout=2700, **AS_WORDS)
276
+ said = (again.stdout or "") + (again.stderr or "")
277
+ say(said)
278
+ if "already in use" in said:
279
+ fail("the start refused a port that nothing is holding: this is the sentence "
280
+ "the whole change exists to remove")
281
+ if again.returncode != 0:
282
+ fail(f"`fsmes demo {PLANT} start` exited {again.returncode} straight after a stop")
283
+ until("the dashboard answers again", lambda: ask("/health").get("status") == "ok",
284
+ ceiling=300)
285
+
286
+ say("== stopping again ==")
287
+ last = subprocess.run([str(fsmes), "demo", PLANT, "stop"], cwd=work, env=environment,
288
+ capture_output=True, timeout=600, **AS_WORDS)
289
+ say((last.stdout or "") + (last.stderr or ""))
290
+ if last.returncode != 0:
291
+ fail(f"`fsmes demo {PLANT} stop` exited {last.returncode} the second time")
292
+ the_ports_are_back_already("the second stop")
293
+
294
+
219
295
  def the_plant_is_what_the_lab_runs(speed: float) -> None:
220
296
  """Every fact the handoff asks for, asked of the running plant."""
221
297
  until("the dashboard answers", lambda: ask("/health").get("status") == "ok",
@@ -341,12 +417,11 @@ def main() -> int:
341
417
  if stopped.returncode != 0:
342
418
  fail(f"`fsmes demo {PLANT} stop` exited {stopped.returncode}")
343
419
 
344
- for where, what in ((API, "the dashboard"), (OPC, "the OPC server")):
345
- if port_answers(where):
346
- fail(f"{what} is still listening on {where[1]} after stop")
347
- say(" both ports are back")
420
+ the_ports_are_back_already("the stop")
421
+ and_a_start_in_the_next_breath_works(fsmes, work, environment, args.speed)
348
422
 
349
- say(f"\nThe wheel brought {PLANT} up on {sys.platform} and put it back down.")
423
+ say(f"\nThe wheel brought {PLANT} up on {sys.platform}, put it back down, and "
424
+ "started it again in the next breath.")
350
425
  return 0
351
426
 
352
427
 
@@ -21,7 +21,10 @@ wheel, then kill the one process everything else needs, the dashboard and API
21
21
  plant, not a stopped one;
22
22
  * `fsmes demo bottling stop` recovers it with no flag, exits 0, and says what
23
23
  it found;
24
- * `fsmes demo bottling` brings the plant back up afterwards.
24
+ * `fsmes demo bottling` brings the plant back up afterwards;
25
+ * `fsmes demo bottling stop --force` - the flag `fsmes fleet stop` puts in a
26
+ person's head, and the one he typed on 2026-10-15 - is taken, answered in a
27
+ sentence that names the command it belongs to, and stops the plant anyway.
25
28
 
26
29
  And, because the same person's first question was that `fsmes` was not on
27
30
  PATH at all: `python -m fsmes --version` answers in the same venv.
@@ -65,6 +68,7 @@ from plant_from_wheel import (
65
68
  port_answers,
66
69
  print_in_the_words_the_plant_used,
67
70
  say,
71
+ the_port_is_back,
68
72
  until,
69
73
  venv_bin,
70
74
  )
@@ -191,8 +195,7 @@ def main() -> int:
191
195
  fail("stop recovered the plant without saying what it found; a command that "
192
196
  f"silently does more than it was asked is worse: {recovery!r}")
193
197
  for where, what in ((API, "the dashboard"), (OPC, "the OPC server")):
194
- if port_answers(where):
195
- fail(f"{what} is still listening on {where[1]} after stop")
198
+ the_port_is_back(where, what)
196
199
  say(" both ports are back")
197
200
 
198
201
  say(f"== and again: fsmes demo {PLANT} --speed {args.speed:g} ==")
@@ -202,10 +205,28 @@ def main() -> int:
202
205
  try:
203
206
  until("the dashboard answers again", health_says_ok, ceiling=300)
204
207
  finally:
205
- run([fsmes, "demo", PLANT, "stop"], cwd=work, env=environment)
208
+ # Taken down with the word he actually typed on 2026-10-15. The plant
209
+ # is up and answering here, so the flag is the only thing under test.
210
+ say(f"== the word he typed: fsmes demo {PLANT} stop --force ==")
211
+ last = run([fsmes, "demo", PLANT, "stop", "--force"], cwd=work, env=environment)
212
+
213
+ guessed = (last.stdout or "") + (last.stderr or "")
214
+ if last.returncode != 0:
215
+ fail(f"`fsmes demo {PLANT} stop --force` exited {last.returncode}; the flag is "
216
+ "taken and answered, never refused - refusing it is what cost him "
217
+ "2026-10-13 and again 2026-10-15")
218
+ if "No such option" in guessed:
219
+ fail(f"typer refused the flag `fsmes fleet stop` had put in his head: {guessed!r}")
220
+ if "stop needs no --force here" not in guessed:
221
+ fail("the flag was swallowed and nothing said why it was not needed; the "
222
+ f"sentence is the whole reason for accepting it: {guessed!r}")
223
+ for where, what in ((API, "the dashboard"), (OPC, "the OPC server")):
224
+ the_port_is_back(where, what)
225
+ say(" the flag was answered in a sentence and the plant still went down")
206
226
 
207
227
  say(f"\nA half-dead {PLANT} on {sys.platform} was described, recovered and started "
208
- "again, with no flag and nothing killed by hand.")
228
+ "again, with no flag and nothing killed by hand - and the flag he guessed was "
229
+ "answered in words instead of refused.")
209
230
  return 0
210
231
 
211
232
 
@@ -297,7 +297,9 @@ jobs:
297
297
  # kill the API process and nothing else - and proves the product talks a
298
298
  # person out of it: `status` names the process that is gone and the log
299
299
  # that says why, `stop` recovers it with no flag, and the plant starts
300
- # again afterwards.
300
+ # again afterwards - and `stop --force`, the flag `fsmes fleet stop` puts
301
+ # in a person's head and the one he typed on 2026-10-15, is answered in a
302
+ # sentence rather than refused with `No such option`.
301
303
  #
302
304
  # Beside `wheel-plant` and on both runners for the same reason: it is all
303
305
  # processes, pids and console output, which is exactly where Windows
@@ -315,7 +317,7 @@ jobs:
315
317
  python-version: "3.12"
316
318
  - run: python -m pip install --upgrade pip build
317
319
  - run: python -m build --wheel
318
- - name: A half-dead plant is described, recovered with no flag, and started again
320
+ - name: A half-dead plant is described, recovered with no flag, started again, and stopped with the flag people guess
319
321
  shell: bash
320
322
  run: python .github/scripts/recover_a_half_dead_plant.py --wheel "$(ls dist/*.whl)" --speed 60
321
323
 
@@ -18,7 +18,7 @@ jobs:
18
18
  - uses: actions/checkout@v7
19
19
  with:
20
20
  persist-credentials: false
21
- - uses: ossf/scorecard-action@v2.4.4
21
+ - uses: ossf/scorecard-action@v2.5.0
22
22
  with:
23
23
  results_file: results.sarif
24
24
  results_format: sarif
@@ -78,3 +78,8 @@ lab-results/
78
78
  # Skill zips, built by `fsmes skills-zip` and attached to a release.
79
79
  /skills-dist/
80
80
  /*.zip
81
+
82
+ # Where `scripts/record-kill-a-node.sh` writes. A recording is a file made on
83
+ # one machine on one day; what belongs in the repository is the script that
84
+ # makes it, and the one GIF under docs/assets/ that a page points at.
85
+ recordings/
@@ -10,7 +10,81 @@ goes under Honesty with a migration line, so plant people can find it.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
- Nothing yet.
13
+ ## [0.4.2] — 2026-10-26
14
+
15
+ ### Fixed
16
+
17
+ - **The Maintenance screen loads again on a PostgreSQL plant.** Early
18
+ migrations had made nine status and kind columns native PostgreSQL enums;
19
+ when `assigned` became a maintenance status (0.3.0), no migration added it,
20
+ so every PostgreSQL plant whose schema came from `fsmes init-db` - new or
21
+ upgraded - refused the word, and
22
+ `/maintenance/due`, `/shift` and `/roster` answered 500 - the screen said
23
+ "reconnecting..." for good and the dispatcher could not assign work. A new
24
+ migration turns those columns into plain text, as the code always declared
25
+ them; run `fsmes init-db` (or `fsmes plant migrate`) after upgrading. No
26
+ data changes. SQLite plants were never affected. A
27
+ test now runs the shipped migrations on PostgreSQL and fails if the database
28
+ would refuse any value the code can write.
29
+ - **The AI tab's header dot says "live" now, not "connecting…" forever.**
30
+ The page never told the dot anything, so it kept the words it was born
31
+ with. Every screen now sets the dot through one shared `FS.live`; the AI
32
+ tab sets it when a tab's list comes back, and "reconnecting…" when one
33
+ fails. Six other screens (Orders, Station, Quality, Ops, Admin,
34
+ Instructions) and Analysis said "live" with a grey dot; it is green now
35
+ like the rest.
36
+ - **The orders page opens with the New-order form closed.** The permission
37
+ check that hides what a person may not use also *showed* everything they
38
+ may use, the closed form included. It now only takes away what it hid
39
+ itself.
40
+
41
+ ## [0.4.1] — 2026-10-23
42
+
43
+ ### Added
44
+
45
+ - **A recording of a node being killed, on the README and the redundancy
46
+ page.** Two nodes of the bottling plant side by side, `docker kill` on the
47
+ one holding the `reader` lease, and the other one reading the machines a few
48
+ seconds later. `bash scripts/record-kill-a-node.sh` makes it again from a
49
+ checkout, so the picture can be of the version people install rather than of
50
+ whatever the box looked like the day it was first made. A developer tool: it
51
+ needs Docker, `ffmpeg` and a Python with Playwright, it is not in the wheel,
52
+ it is not in CI, and it is not asked to run on Windows.
53
+
54
+ ### Fixed
55
+
56
+ - **`fsmes demo <plant> stop --force` answers in words instead of refusing.**
57
+ `fsmes fleet stop` names `--force` when it will not touch a plant that is
58
+ not answering, so that is the word people arrive with — and typed on the
59
+ demo command it printed typer's bare `No such option: --force` and stopped
60
+ nothing. The demo path has passed `--force` to the fleet by itself for two
61
+ releases, so the flag is unnecessary rather than missing. It is now accepted
62
+ (hidden, not advertised) and answered in one sentence naming the command it
63
+ belongs to, and the plant stops either way. The gate is unchanged: `--force`
64
+ gives up liveness, never ownership, and `fsmes fleet stop` keeps asking
65
+ for it.
66
+ - **The upgrade pages say what to do when two Pythons disagree.** After
67
+ `py -m pip install --upgrade factorysemantics-mes`, `fsmes --version` can
68
+ still print the old version, because the `fsmes` on PATH belongs to pipx or
69
+ to another Python. [Upgrading between versions](docs/operate/upgrade.md),
70
+ [run it on your own box](docs/operate/run-it-on-your-own-box.md) and the
71
+ assistant folder's install page now say how to tell (`py -m fsmes --version`
72
+ against `fsmes --version`; `where fsmes`, or `which`) and the rule: upgrade
73
+ the one that owns the command you type.
74
+ - **On Windows, stopping a plant and starting it again in the next breath
75
+ works.** `fsmes demo <plant> stop` no longer comes back while the plant's
76
+ ports are still closing. A listening socket there outlives the process that
77
+ owned it by about two seconds — every Windows cell of this project's CI
78
+ measured that, and every Linux cell measured zero — and a start inside those
79
+ two seconds refused with *127.0.0.1:8010 is already in use … Stop that
80
+ program*, about the plant that had just been stopped and a process that no
81
+ longer existed. `stop` now holds the command until the ports its own
82
+ processes were listening on are free, with an eight-second grace period, and
83
+ says which port it waited on only when it had to wait: on Linux the output
84
+ is unchanged. If the grace period is not enough, it says which port is still
85
+ closing rather than claiming it is done, and a start that meets a plant's own
86
+ closing socket now says to wait a moment rather than to go and stop a
87
+ program that is not there.
14
88
 
15
89
  ## [0.4.0] — 2026-10-16
16
90
 
@@ -5064,7 +5138,9 @@ number in it comes from a simulated plant.
5064
5138
  MES was not watching. Unlabelled downtime is reported as unlabelled. These
5065
5139
  are the house rules and they are tested.
5066
5140
 
5067
- [Unreleased]: https://github.com/factorysemantics/factorysemantics-mes/compare/v0.4.0...HEAD
5141
+ [Unreleased]: https://github.com/factorysemantics/factorysemantics-mes/compare/v0.4.2...HEAD
5142
+ [0.4.2]: https://github.com/factorysemantics/factorysemantics-mes/releases/tag/v0.4.2
5143
+ [0.4.1]: https://github.com/factorysemantics/factorysemantics-mes/releases/tag/v0.4.1
5068
5144
  [0.4.0]: https://github.com/factorysemantics/factorysemantics-mes/releases/tag/v0.4.0
5069
5145
  [0.3.1]: https://github.com/factorysemantics/factorysemantics-mes/releases/tag/v0.3.1
5070
5146
  [0.3.0]: https://github.com/factorysemantics/factorysemantics-mes/releases/tag/v0.3.0
@@ -8,6 +8,6 @@ authors:
8
8
  repository-code: https://github.com/factorysemantics/factorysemantics-mes
9
9
  url: https://factorysemantics.com
10
10
  license: Apache-2.0
11
- version: 0.4.0
12
- date-released: "2026-10-16"
11
+ version: 0.4.2
12
+ date-released: "2026-10-26"
13
13
  abstract: An open-source, modular, agent-native Manufacturing Execution System with OPC UA connectivity, honest OEE, quality with SPC and gauges, scheduling, traceability, an ERPNext connector and an MCP agent surface.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: factorysemantics-mes
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: An open-source, modular, agent-native Manufacturing Execution System
5
5
  Project-URL: Homepage, https://factorysemantics.com
6
6
  Project-URL: Documentation, https://docs.factorysemantics.com
@@ -241,7 +241,7 @@ Provides-Extra: dev
241
241
  Requires-Dist: playwright>=1.49; extra == 'dev'
242
242
  Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
243
243
  Requires-Dist: pytest>=8; extra == 'dev'
244
- Requires-Dist: ruff==0.16.10; extra == 'dev'
244
+ Requires-Dist: ruff==0.17.1; extra == 'dev'
245
245
  Provides-Extra: docs
246
246
  Requires-Dist: mike>=2.1; extra == 'docs'
247
247
  Requires-Dist: mkdocs-material>=9.6; extra == 'docs'
@@ -267,12 +267,18 @@ Run one module on a laptop for a five-person shop, or the full suite across a fl
267
267
 
268
268
  ![A walk through a running plant: the floor, losses by machine, a stop on the filler's timeline, the SPC sample behind a low fill height, and the rule trace behind a maintenance job](docs/assets/walk.gif)
269
269
 
270
- > **Status: pre-alpha, 0.4.0, running simulated plants only (as of 2026-10-16).** Orders and routings, OPC UA execution, OEE, quality with SPC and gauges, maintenance, finite-capacity scheduling, serialisation and genealogy, a 95-tool MCP agent surface, an ERPNext connector, and a scoring harness that measures whether the MES told the truth about its plant. **New since 0.2.0:** the plant packs travel inside the package, so `pipx install factorysemantics-mes` and then `fsmes demo bottling` bring up a bottling plant on a machine with no checkout, on Linux and on Windows; an SPC tab with I-MR, X̄/R and p charts where a point can be pressed for the reading, the rules it broke, the gauge, the machine's state and the rest of the line; count data — how many units a lot sent back and what for; maintenance work that reaches the right trade by itself, and a supervisor's screen that reads like a plant; a chat on the AI tab that explains the chart in front of it (it needs `ANTHROPIC_API_KEY` and costs about $0.12 a question; the floor assistant needs a local [Ollama](https://ollama.com)); every floor row carrying the shift it happened on; and a simulated line that plays a whole eight-hour shift with a four-link chain of cause in it — a chiller order nobody started, its outlet climbing, the product reaching the filler colder, fill heights a millimetre and a half low — with no limit broken anywhere, which is the test. [The release page](docs/releases/0.3.0.md) is the whole of it. **New in 0.3.1:** the first run on a Windows PC recovers itself — `py -m fsmes` when the installer's folder is not on PATH, a half-dead plant named process by process by `status`, and `stop` clearing it with no flag; a simulated plant shaped like your own, three commands from a pip install; one folder of plain pages that lets whatever AI assistant you already use walk you through install and shadow mode, with no access to your machine; and `fsmes doctor`, one file to paste when something is wrong, with every value in it replaced by its shape. [The 0.3.1 release page](docs/releases/0.3.1.md) is the whole of that. **New in 0.4.0:** a plant can run as two copies on two boxes against one PostgreSQL and keep counting when one of them dies — the jobs that must run once (reading the machines, the simulated floor, pruning the history) are held one at a time by a lease in the database, the counts carry on rather than starting over, nobody signs in again, and `bash scripts/kill-a-node.sh` brings the whole thing up in Docker and pulls the plug on a node so you can watch it. [The 0.4.0 release page](docs/releases/0.4.0.md) is the whole of that. **Not yet:** a real plant — none has run this, and making a first one possible in shadow mode, beside the MES already in charge, is what shadow mode is for; [the guide](docs/operate/first-plant.md) is written and untried. Also not yet: ERPNext Job Card confirmations — whether Job Card is the right place at all is a question put to the ERPNext community on 2026-09-10 and not yet answered; the thin Frappe app that would list the connector on the Marketplace ([decision 0008](docs/decisions/0008-erp-connectors-are-modules.md)); and PLC write-back beyond a guarded recommendation queue. See [ROADMAP.md](ROADMAP.md) for what has landed and what is next, [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the design, [docs/LANDSCAPE.md](docs/LANDSCAPE.md) for why this project should exist at all, [docs/operate/compatibility.md](docs/operate/compatibility.md) for what has been tested against what and when, and [docs.factorysemantics.com](https://docs.factorysemantics.com) for the documentation.
270
+ > **Status: pre-alpha, 0.4.2, running simulated plants only (as of 2026-10-26).** Orders and routings, OPC UA execution, OEE, quality with SPC and gauges, maintenance, finite-capacity scheduling, serialisation and genealogy, a 95-tool MCP agent surface, an ERPNext connector, and a scoring harness that measures whether the MES told the truth about its plant. **New since 0.2.0:** the plant packs travel inside the package, so `pipx install factorysemantics-mes` and then `fsmes demo bottling` bring up a bottling plant on a machine with no checkout, on Linux and on Windows; an SPC tab with I-MR, X̄/R and p charts where a point can be pressed for the reading, the rules it broke, the gauge, the machine's state and the rest of the line; count data — how many units a lot sent back and what for; maintenance work that reaches the right trade by itself, and a supervisor's screen that reads like a plant; a chat on the AI tab that explains the chart in front of it (it needs `ANTHROPIC_API_KEY` and costs about $0.12 a question; the floor assistant needs a local [Ollama](https://ollama.com)); every floor row carrying the shift it happened on; and a simulated line that plays a whole eight-hour shift with a four-link chain of cause in it — a chiller order nobody started, its outlet climbing, the product reaching the filler colder, fill heights a millimetre and a half low — with no limit broken anywhere, which is the test. [The release page](docs/releases/0.3.0.md) is the whole of it. **New in 0.3.1:** the first run on a Windows PC recovers itself — `py -m fsmes` when the installer's folder is not on PATH, a half-dead plant named process by process by `status`, and `stop` clearing it with no flag; a simulated plant shaped like your own, three commands from a pip install; one folder of plain pages that lets whatever AI assistant you already use walk you through install and shadow mode, with no access to your machine; and `fsmes doctor`, one file to paste when something is wrong, with every value in it replaced by its shape. [The 0.3.1 release page](docs/releases/0.3.1.md) is the whole of that. **New in 0.4.0:** a plant can run as two copies on two boxes against one PostgreSQL and keep counting when one of them dies — the jobs that must run once (reading the machines, the simulated floor, pruning the history) are held one at a time by a lease in the database, the counts carry on rather than starting over, nobody signs in again, and `bash scripts/kill-a-node.sh` brings the whole thing up in Docker and pulls the plug on a node so you can watch it. [The 0.4.0 release page](docs/releases/0.4.0.md) is the whole of that. **New in 0.4.1:** an evening on a Windows PC that goes cleanly — `stop` waits until the plant's own ports are free so a start in the next breath works, `stop --force` is answered in a sentence instead of refused, and three pages say how to tell which Python owns the `fsmes` you type; nothing in the plant changed. [The 0.4.1 release page](docs/releases/0.4.1.md) is the whole of that. **New in 0.4.2:** the Maintenance screen loads again on a plant that runs on PostgreSQL — since 0.3.0 the database refused one word the screen needs — after the upgrade and one `fsmes init-db`; SQLite plants never had the fault. [The 0.4.2 release page](docs/releases/0.4.2.md) is the whole of that. **Not yet:** a real plant — none has run this, and making a first one possible in shadow mode, beside the MES already in charge, is what shadow mode is for; [the guide](docs/operate/first-plant.md) is written and untried. Also not yet: ERPNext Job Card confirmations — whether Job Card is the right place at all is a question put to the ERPNext community on 2026-09-10 and not yet answered; the thin Frappe app that would list the connector on the Marketplace ([decision 0008](docs/decisions/0008-erp-connectors-are-modules.md)); and PLC write-back beyond a guarded recommendation queue. See [ROADMAP.md](ROADMAP.md) for what has landed and what is next, [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the design, [docs/LANDSCAPE.md](docs/LANDSCAPE.md) for why this project should exist at all, [docs/operate/compatibility.md](docs/operate/compatibility.md) for what has been tested against what and when, and [docs.factorysemantics.com](https://docs.factorysemantics.com) for the documentation.
271
271
  >
272
272
  > **Nothing on this page is measured on a real plant.** Every number in this repository comes from a simulated line and says so where it appears.
273
273
 
274
274
  ---
275
275
 
276
+ **One plant on two boxes: a real `docker kill` on the node reading the machines, and the other one picks them up.**
277
+
278
+ ![One bottling plant running as two nodes side by side, each on its own address; a real docker kill on node a, which is reading the machines; node b taking the machines over seven seconds later with the counts carried across; node a started again and answering, as a standby](docs/assets/kill-a-node.gif)
279
+
280
+ Node a held the machines and was killed; node b was reading them 6.6 seconds later; node a answered again 1.2 seconds after it was started, holding nothing. Two things in it are staged and nothing else is: the yellow line is the dashboard's own header line, enlarged so it can be read at this size, and the grey "no answer" panel is drawn by the recorder over a page that is really greying itself and saying "reconnecting". `bash scripts/record-kill-a-node.sh` makes the whole recording again from a checkout — kill included — so this can be a picture of the version you install. [What a failover costs](docs/operate/redundancy.md#what-a-failover-costs).
281
+
276
282
  ## Why this exists
277
283
 
278
284
  Three facts, verified 2026-08-28 (sources in [docs/LANDSCAPE.md](docs/LANDSCAPE.md)):
@@ -8,12 +8,18 @@ Run one module on a laptop for a five-person shop, or the full suite across a fl
8
8
 
9
9
  ![A walk through a running plant: the floor, losses by machine, a stop on the filler's timeline, the SPC sample behind a low fill height, and the rule trace behind a maintenance job](docs/assets/walk.gif)
10
10
 
11
- > **Status: pre-alpha, 0.4.0, running simulated plants only (as of 2026-10-16).** Orders and routings, OPC UA execution, OEE, quality with SPC and gauges, maintenance, finite-capacity scheduling, serialisation and genealogy, a 95-tool MCP agent surface, an ERPNext connector, and a scoring harness that measures whether the MES told the truth about its plant. **New since 0.2.0:** the plant packs travel inside the package, so `pipx install factorysemantics-mes` and then `fsmes demo bottling` bring up a bottling plant on a machine with no checkout, on Linux and on Windows; an SPC tab with I-MR, X̄/R and p charts where a point can be pressed for the reading, the rules it broke, the gauge, the machine's state and the rest of the line; count data — how many units a lot sent back and what for; maintenance work that reaches the right trade by itself, and a supervisor's screen that reads like a plant; a chat on the AI tab that explains the chart in front of it (it needs `ANTHROPIC_API_KEY` and costs about $0.12 a question; the floor assistant needs a local [Ollama](https://ollama.com)); every floor row carrying the shift it happened on; and a simulated line that plays a whole eight-hour shift with a four-link chain of cause in it — a chiller order nobody started, its outlet climbing, the product reaching the filler colder, fill heights a millimetre and a half low — with no limit broken anywhere, which is the test. [The release page](docs/releases/0.3.0.md) is the whole of it. **New in 0.3.1:** the first run on a Windows PC recovers itself — `py -m fsmes` when the installer's folder is not on PATH, a half-dead plant named process by process by `status`, and `stop` clearing it with no flag; a simulated plant shaped like your own, three commands from a pip install; one folder of plain pages that lets whatever AI assistant you already use walk you through install and shadow mode, with no access to your machine; and `fsmes doctor`, one file to paste when something is wrong, with every value in it replaced by its shape. [The 0.3.1 release page](docs/releases/0.3.1.md) is the whole of that. **New in 0.4.0:** a plant can run as two copies on two boxes against one PostgreSQL and keep counting when one of them dies — the jobs that must run once (reading the machines, the simulated floor, pruning the history) are held one at a time by a lease in the database, the counts carry on rather than starting over, nobody signs in again, and `bash scripts/kill-a-node.sh` brings the whole thing up in Docker and pulls the plug on a node so you can watch it. [The 0.4.0 release page](docs/releases/0.4.0.md) is the whole of that. **Not yet:** a real plant — none has run this, and making a first one possible in shadow mode, beside the MES already in charge, is what shadow mode is for; [the guide](docs/operate/first-plant.md) is written and untried. Also not yet: ERPNext Job Card confirmations — whether Job Card is the right place at all is a question put to the ERPNext community on 2026-09-10 and not yet answered; the thin Frappe app that would list the connector on the Marketplace ([decision 0008](docs/decisions/0008-erp-connectors-are-modules.md)); and PLC write-back beyond a guarded recommendation queue. See [ROADMAP.md](ROADMAP.md) for what has landed and what is next, [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the design, [docs/LANDSCAPE.md](docs/LANDSCAPE.md) for why this project should exist at all, [docs/operate/compatibility.md](docs/operate/compatibility.md) for what has been tested against what and when, and [docs.factorysemantics.com](https://docs.factorysemantics.com) for the documentation.
11
+ > **Status: pre-alpha, 0.4.2, running simulated plants only (as of 2026-10-26).** Orders and routings, OPC UA execution, OEE, quality with SPC and gauges, maintenance, finite-capacity scheduling, serialisation and genealogy, a 95-tool MCP agent surface, an ERPNext connector, and a scoring harness that measures whether the MES told the truth about its plant. **New since 0.2.0:** the plant packs travel inside the package, so `pipx install factorysemantics-mes` and then `fsmes demo bottling` bring up a bottling plant on a machine with no checkout, on Linux and on Windows; an SPC tab with I-MR, X̄/R and p charts where a point can be pressed for the reading, the rules it broke, the gauge, the machine's state and the rest of the line; count data — how many units a lot sent back and what for; maintenance work that reaches the right trade by itself, and a supervisor's screen that reads like a plant; a chat on the AI tab that explains the chart in front of it (it needs `ANTHROPIC_API_KEY` and costs about $0.12 a question; the floor assistant needs a local [Ollama](https://ollama.com)); every floor row carrying the shift it happened on; and a simulated line that plays a whole eight-hour shift with a four-link chain of cause in it — a chiller order nobody started, its outlet climbing, the product reaching the filler colder, fill heights a millimetre and a half low — with no limit broken anywhere, which is the test. [The release page](docs/releases/0.3.0.md) is the whole of it. **New in 0.3.1:** the first run on a Windows PC recovers itself — `py -m fsmes` when the installer's folder is not on PATH, a half-dead plant named process by process by `status`, and `stop` clearing it with no flag; a simulated plant shaped like your own, three commands from a pip install; one folder of plain pages that lets whatever AI assistant you already use walk you through install and shadow mode, with no access to your machine; and `fsmes doctor`, one file to paste when something is wrong, with every value in it replaced by its shape. [The 0.3.1 release page](docs/releases/0.3.1.md) is the whole of that. **New in 0.4.0:** a plant can run as two copies on two boxes against one PostgreSQL and keep counting when one of them dies — the jobs that must run once (reading the machines, the simulated floor, pruning the history) are held one at a time by a lease in the database, the counts carry on rather than starting over, nobody signs in again, and `bash scripts/kill-a-node.sh` brings the whole thing up in Docker and pulls the plug on a node so you can watch it. [The 0.4.0 release page](docs/releases/0.4.0.md) is the whole of that. **New in 0.4.1:** an evening on a Windows PC that goes cleanly — `stop` waits until the plant's own ports are free so a start in the next breath works, `stop --force` is answered in a sentence instead of refused, and three pages say how to tell which Python owns the `fsmes` you type; nothing in the plant changed. [The 0.4.1 release page](docs/releases/0.4.1.md) is the whole of that. **New in 0.4.2:** the Maintenance screen loads again on a plant that runs on PostgreSQL — since 0.3.0 the database refused one word the screen needs — after the upgrade and one `fsmes init-db`; SQLite plants never had the fault. [The 0.4.2 release page](docs/releases/0.4.2.md) is the whole of that. **Not yet:** a real plant — none has run this, and making a first one possible in shadow mode, beside the MES already in charge, is what shadow mode is for; [the guide](docs/operate/first-plant.md) is written and untried. Also not yet: ERPNext Job Card confirmations — whether Job Card is the right place at all is a question put to the ERPNext community on 2026-09-10 and not yet answered; the thin Frappe app that would list the connector on the Marketplace ([decision 0008](docs/decisions/0008-erp-connectors-are-modules.md)); and PLC write-back beyond a guarded recommendation queue. See [ROADMAP.md](ROADMAP.md) for what has landed and what is next, [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the design, [docs/LANDSCAPE.md](docs/LANDSCAPE.md) for why this project should exist at all, [docs/operate/compatibility.md](docs/operate/compatibility.md) for what has been tested against what and when, and [docs.factorysemantics.com](https://docs.factorysemantics.com) for the documentation.
12
12
  >
13
13
  > **Nothing on this page is measured on a real plant.** Every number in this repository comes from a simulated line and says so where it appears.
14
14
 
15
15
  ---
16
16
 
17
+ **One plant on two boxes: a real `docker kill` on the node reading the machines, and the other one picks them up.**
18
+
19
+ ![One bottling plant running as two nodes side by side, each on its own address; a real docker kill on node a, which is reading the machines; node b taking the machines over seven seconds later with the counts carried across; node a started again and answering, as a standby](docs/assets/kill-a-node.gif)
20
+
21
+ Node a held the machines and was killed; node b was reading them 6.6 seconds later; node a answered again 1.2 seconds after it was started, holding nothing. Two things in it are staged and nothing else is: the yellow line is the dashboard's own header line, enlarged so it can be read at this size, and the grey "no answer" panel is drawn by the recorder over a page that is really greying itself and saying "reconnecting". `bash scripts/record-kill-a-node.sh` makes the whole recording again from a checkout — kill included — so this can be a picture of the version you install. [What a failover costs](docs/operate/redundancy.md#what-a-failover-costs).
22
+
17
23
  ## Why this exists
18
24
 
19
25
  Three facts, verified 2026-08-28 (sources in [docs/LANDSCAPE.md](docs/LANDSCAPE.md)):
@@ -0,0 +1,22 @@
1
+ # Recording only. Lay this over `docker-compose.redundant.yml` to give each
2
+ # node its own address on the host, so one browser page can watch both at
3
+ # once:
4
+ #
5
+ # docker compose -p mes-record \
6
+ # -f docker/docker-compose.redundant.yml \
7
+ # -f docker/docker-compose.record.yml up -d node-a node-b
8
+ #
9
+ # The demo itself keeps the one address on :8000 and hides which node answers,
10
+ # which is the point of it — and the wrong thing for a recording that has to
11
+ # show a node dying. `bash scripts/record-kill-a-node.sh` uses this file and
12
+ # its own project name; nothing here is part of the product.
13
+ #
14
+ # The ports come from the environment so two recordings, or a recording beside
15
+ # the plain `mes-two-nodes` demo, do not fight over them.
16
+ services:
17
+ node-a:
18
+ ports:
19
+ - "127.0.0.1:${FSMES_RECORD_PORT_A:-8001}:8010"
20
+ node-b:
21
+ ports:
22
+ - "127.0.0.1:${FSMES_RECORD_PORT_B:-8002}:8010"
@@ -1,6 +1,6 @@
1
1
  # Compatibility
2
2
 
3
- *Explanation. What has actually been tested against what, as of 2026-10-12 — the state of `main` that 0.3.0 is cut from. "Untested" is a fact, not a warning label.*
3
+ *Explanation. What has actually been tested against what, as of 2026-10-26 — the state of `main` that 0.4.2 is cut from. "Untested" is a fact, not a warning label.*
4
4
 
5
5
  **Every row states the date it was last checked and what was run on that
6
6
  date.** A row with no date is a row nobody can age.
@@ -8,18 +8,18 @@ date.** A row with no date is a row nobody can age.
8
8
  | Neighbour | Status | Last checked | Evidence |
9
9
  |---|---|---|---|
10
10
  | **KEPServerEX** (OPC UA) | tested in the lab | **before 2026-09-08, exact date not recorded** | `labs/kepsim`: a trial server fed by ODBC from generated line data; `fsmes opc-verify` against it; certificate exchange and SignAndEncrypt. It was run in the private era and has not been run since the repository went public — nothing in CI touches it |
11
- | **The bundled OPC UA replay server** | tested continuously | 2026-10-12 | every scored run, and CI on every pull request |
11
+ | **The bundled OPC UA replay server** | tested continuously | 2026-10-26 | every scored run, and CI on every pull request |
12
12
  | Other OPC UA servers (Ignition, Siemens, Prosys) | **untested** | never | nothing here has been on the other end of one. The client is `asyncua`; the tag map is the only server-specific part |
13
13
  | **ERP connectors** | see the table below | see below | they have rules of their own, and each row carries its own date |
14
- | **PostgreSQL 16.15** | tested continuously | 2026-10-12 | the `postgres` cell in CI: `alembic upgrade head` from an empty database and then the whole suite, against a PostgreSQL 16.15 service container pinned by digest, on every pull request. Also the Compose file and the cutlery plant's public demo |
15
- | **SQLite** | tested continuously | 2026-10-12 | the default. The whole suite runs on in-memory SQLite on every pull request, on Ubuntu and Windows, Python 3.12 and 3.13; `wheel-demo` runs `fsmes demo` on a SQLite file from the built wheel, and `upgrade_from_previous_release.sh` upgrades a database made by whatever wheel PyPI serves that day, which is 0.2.0 until 0.3.0 is tagged; `wheel-plant` starts the bottling plant on a SQLite file from the built wheel on Ubuntu and on Windows. Version: whatever CPython ships |
16
- | **Claude Code** as an MCP client | tested | scoring 2026-10-12; **the live-model run's date is not recorded** | the agent evals drive it headless. `tests/test_agent_eval.py` scores them on every pull request; the run that puts a real model against the live tool surface is `fsmes agent-eval`, a command a person types, and nothing records when it last ran |
14
+ | **PostgreSQL 16.15** | tested continuously | 2026-10-26 | the `postgres` cell in CI: `alembic upgrade head` from an empty database and then the whole suite, against a PostgreSQL 16.15 service container pinned by digest, on every pull request. The suite builds its own schema from the model, so until 2026-10-25 nothing checked that the schema the migrations build accepts every word the code writes — and from 0.3.0 to 0.4.1 it did not, which cost every PostgreSQL plant its Maintenance screen. Since [#200](https://github.com/factorysemantics/factorysemantics-mes/pull/200) two tests in that cell build the schema with the shipped migrations and write every such word into it. Also the Compose file and the cutlery plant's public demo |
15
+ | **SQLite** | tested continuously | 2026-10-26 | the default. The whole suite runs on in-memory SQLite on every pull request, on Ubuntu and Windows, Python 3.12 and 3.13; `wheel-demo` runs `fsmes demo` on a SQLite file from the built wheel, and `upgrade_from_previous_release.sh` upgrades a database made by whatever wheel PyPI serves that day, which is 0.4.1 until 0.4.2 is published; `wheel-plant` starts the bottling plant on a SQLite file from the built wheel on Ubuntu and on Windows. Version: whatever CPython ships |
16
+ | **Claude Code** as an MCP client | tested | scoring 2026-10-26; **the live-model run's date is not recorded** | the agent evals drive it headless. `tests/test_agent_eval.py` scores them on every pull request; the run that puts a real model against the live tool surface is `fsmes agent-eval`, a command a person types, and nothing records when it last ran |
17
17
  | Claude Desktop, other MCP clients | **untested** | never | the server is streamable HTTP over the standard SDK |
18
18
  | **Jev** (TypeSafe), as a judgment model | **untested**; nothing in this repository calls it | never called; the vendor's answers in this row are dated **2026-09-17** | No request has been made to it from this repository and no accuracy number has been produced here, so there is nothing measured to report. What is known is what TypeSafe answered in writing to the maintainer on 2026-09-17, and it is the vendor's statement rather than this project's measurement: **hosted API only** — no on-premises, VPC or edge option now or planned; **United States only** — no public EU region, and no subprocessor list was given; **a version can be pinned**, with no fixed forced-retirement window; **250,000 tokens per second and 1,200 requests per minute**, with no availability commitment beyond those limits; **zero data retention is available on the enterprise tier only**, and no retention period was given for any other tier. The consequence for a plant is on the survey's preconditions ([`docs/ai/JEV.md`](../ai/JEV.md)): every state class above `catalogue` in decision [0032](../decisions/0032-a-hosted-judgment-and-the-shadow.md) is gated on the enterprise tier or on that plant accepting retention it has no stated period for, and an air-gapped site cannot use it at any tier |
19
19
  | **MQTT brokers** (Mosquitto, HiveMQ, EMQX) | **untested** | never | **no broker has been on the other end of either direction.** Both directions are built — `fsmes uns publish` and `fsmes inbound subscribe` — and both are driven by a fake transport in the suite. No broker has run against either; this repository does not start brokers on the machine it is developed on. The publisher has one opt-in test against a real broker (`MES_UNS_TEST_BROKER`) |
20
20
  | Node-RED, United Manufacturing Hub, Grafana | **untested**; the MQTT halves exist | never | the namespace is published and subscribed to over plain MQTT-JSON under an ISA-95 tree; no UMH or Node-RED deployment has been on the other end of it |
21
- | Windows (plant PCs) | tested continuously | 2026-10-12 | CI runs `ruff` and the whole suite on `windows-latest`, Python 3.12 and 3.13, on every pull request — and, since [#163](https://github.com/factorysemantics/factorysemantics-mes/pull/163) on 2026-10-12, the `wheel-plant` job (`.github/scripts/plant_from_wheel.py`) installs the built wheel on `windows-latest` in a directory holding none of this repository's files, starts the bottling plant and asks it whether sign-in works, the specifications are there, the OPC port answers, the floor is watching and a lot has been counted. That job is why three Windows-only bugs are fixed — a detach flag ignored, a signal that does not exist on Windows, a console script looked for in `bin` — none of which the green suite could see, because the suite never starts a plant. `tzdata` is a Windows-only dependency so `zoneinfo` can resolve a plant's zone. **No plant PC in a real plant has run it**: the only Windows this has started on is GitHub's runner, with no domain policy and no antivirus |
22
- | Python | 3.12, 3.13 | 2026-10-12 | CI, both on Ubuntu and on Windows. 3.11 and earlier are not supported; 3.14 is untested |
21
+ | Windows (plant PCs) | tested continuously | 2026-10-26 | CI runs `ruff` and the whole suite on `windows-latest`, Python 3.12 and 3.13, on every pull request — and, since [#163](https://github.com/factorysemantics/factorysemantics-mes/pull/163) on 2026-10-12, the `wheel-plant` job (`.github/scripts/plant_from_wheel.py`) installs the built wheel on `windows-latest` in a directory holding none of this repository's files, starts the bottling plant and asks it whether sign-in works, the specifications are there, the OPC port answers, the floor is watching and a lot has been counted. Since 2026-10-22 it also stops the plant and starts it again with nothing in between, which is how a fourth Windows-only fault was found: a listening socket there outlives the process that owned it by about two seconds — every Windows cell measured that and every Linux cell measured zero — so a start inside those two seconds refused on a port that nothing was holding. That job is why four Windows-only bugs are fixed — a detach flag ignored, a signal that does not exist on Windows, a console script looked for in `bin`, and a stop that came back before its ports did — none of which the green suite could see, because the suite never starts a plant. `tzdata` is a Windows-only dependency so `zoneinfo` can resolve a plant's zone. **No plant PC in a real plant has run it**: the only Windows this has started on is GitHub's runner, with no domain policy and no antivirus |
22
+ | Python | 3.12, 3.13 | 2026-10-26 | CI, both on Ubuntu and on Windows. 3.11 and earlier are not supported; 3.14 is untested |
23
23
 
24
24
  When a row changes, it changes here first, with the date and what was run.
25
25
 
@@ -51,6 +51,6 @@ rather than read is a table that misleads.
51
51
  |---|---|---|---|---|
52
52
  | **ERPNext** | supported | v15.120.0 (Frappe v15, MariaDB 10.6) | 2026-09-10, and on every pull request that touches the connector, its tests or its fixture since | the `ERPNext (live)` job: a clean container from `labs/erpnext/docker-compose.yml`, images pinned by digest, seeded and put through the whole round trip in `tests/test_erpnext_live.py`, asserting against ERPNext's own documents. Includes what ERPNext does with an over-run, measured 2026-09-10: inside its own over-production allowance it books every unit, beyond it it refuses the stock entry whole and books nothing ([what the connector does about it](erpnext.md#when-the-line-made-more-than-the-order-asked-for)). Also passes the conformance suite |
53
53
  | ERPNext v16 | experimental | **no live test** | — | nothing here claims anything about it; the live job pins v15 |
54
- | **file exchange** (B2MML-lite) | supported | not applicable — the far side is a folder | 2026-10-12 | `tests/test_file_erp.py`, `tests/test_erp_confirmation_files.py` and the conformance suite. The folder layout, the published schema and `fsmes erp validate` are on [the confirmation handoff](confirmation-files.md) |
55
- | **REST** (against the bundled mock ERP) | supported | not applicable — the far side ships with it | 2026-10-12 | `tests/test_erp_contract.py` and the conformance suite. Against a *real* ERP's REST API it is **untested**, and the three endpoints it needs are in `fsmes erp requirements` |
54
+ | **file exchange** (B2MML-lite) | supported | not applicable — the far side is a folder | 2026-10-26 | `tests/test_file_erp.py`, `tests/test_erp_confirmation_files.py` and the conformance suite. The folder layout, the published schema and `fsmes erp validate` are on [the confirmation handoff](confirmation-files.md) |
55
+ | **REST** (against the bundled mock ERP) | supported | not applicable — the far side ships with it | 2026-10-26 | `tests/test_erp_contract.py` and the conformance suite. Against a *real* ERP's REST API it is **untested**, and the three endpoints it needs are in `fsmes erp requirements` |
56
56
  | Odoo, SAP, Oracle, NetSuite | not written | — | — | the contract exists (`contract.py`), the conformance suite exists (`conformance.py`), the connectors do not. The confirmations are SAP-*shaped* and now [published with a schema and worked example files](confirmation-files.md), but no SAP has consumed one. [How to write one](../develop/erp-connectors.md) |
@@ -353,6 +353,33 @@ one PostgreSQL with `lease_seconds = 4` and the line replayed at 6x: the
353
353
  counters' own movement exactly, per machine. Your numbers will differ; the
354
354
  shape will not.
355
355
 
356
+ Or watch it cost something. One plant as two nodes side by side, each on its
357
+ own address, and a real `docker kill` on the one holding the machines:
358
+
359
+ ![One bottling plant running as two nodes side by side, each on its own address; a real docker kill on node a, which is reading the machines; node b taking the machines over seven seconds later with the counts carried across; node a started again and answering, as a standby](../assets/kill-a-node.gif)
360
+
361
+ Node a held the machines and was killed; node b was reading them 6.6
362
+ seconds later; node a answered again 1.2 seconds after `docker start`,
363
+ holding nothing. Two things in it are staged and nothing else is: the
364
+ yellow line is the dashboard's own header line, enlarged so it can be read
365
+ at this size, and the grey "no answer" panel is drawn by the recorder over
366
+ a page that is really greying itself and saying "reconnecting". The seconds
367
+ are the ones measured on the machine it was recorded on, and they are
368
+ printed by the script that records it: `bash scripts/record-kill-a-node.sh`
369
+ from a checkout makes the whole thing again, so the picture can be of the
370
+ version you are running rather than of the day it was first made. ([The
371
+ same minute as an mp4](../assets/kill-a-node.mp4), if a loop is
372
+ distracting.)
373
+
374
+ One thing in it is worth reading twice. For the few seconds between the kill
375
+ and the takeover the machine cards go idle and the line reads `0/6 running`,
376
+ and then they are all running again. That is this being a *simulated* plant:
377
+ the floor that moves those machines is itself one of the jobs held by a lease,
378
+ so it stops while its lease moves, exactly as the reader does. On a real plant
379
+ the machines are machines and do not pause — what pauses is the MES reading
380
+ them, and the counters are absolute, so the units made in the gap are booked
381
+ when the new holder catches up rather than lost.
382
+
356
383
  A node that comes back comes back as a standby. It does not take a role the
357
384
  other node is holding.
358
385